diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b027d3ca3c480..922db7330cb2b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,6 +3,9 @@ contact_links: - name: Report an API Docs Issue on the Node.js Website url: https://github.com/nodejs/node/issues/new?assignees=&labels=doc&template=3-api-ref-docs-problem.yml about: 'Is something wrong with the API Docs? Did you face a bug with the API Docs?' + - name: Report an issue with downloading Node.js + url: https://github.com/nodejs/release-cloudflare-worker/issues/new + about: 'Is something wrong with Node.js downloads?' - name: Report a Translation Issue on the Node.js Website url: https://crowdin.com/project/nodejs-web about: 'Is something wrong in a specific translation? Do you believe a language can get improved? Do you have suggestions?' diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4e45488126dad..053bfad342f18 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -26,7 +26,7 @@ You can check the items by adding an `x` between the brackets, like this: `[x]` --> - [ ] I have read the [Contributing Guidelines](https://github.com/nodejs/nodejs.org/blob/main/CONTRIBUTING.md) and made commit messages that follow the guideline. -- [ ] I have run `npx turbo format` to ensure the code follows the style guide. -- [ ] I have run `npx turbo test` to check if all tests are passing. +- [ ] I have run `npm run format` to ensure the code follows the style guide. +- [ ] I have run `npm run test` to check if all tests are passing. - [ ] I have run `npx turbo build` to check if the website builds without errors. - [ ] I've covered new added functionality with unit tests if necessary. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1a59e94f0c124..681348845926f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit @@ -65,7 +65,7 @@ jobs: run: echo C:\Program Files\Git\usr\bin>>"%GITHUB_PATH%" - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # Since we checkout the HEAD of the current Branch, if the Pull Request comes from a Fork # we want to clone the fork's repository instead of the base repository @@ -125,6 +125,9 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' - name: Sync Orama Cloud + env: + ORAMA_INDEX_ID: ${{ secrets.ORAMA_INDEX_ID }} + ORAMA_SECRET_KEY: ${{ secrets.ORAMA_SECRET_KEY }} if: github.ref == 'refs/heads/main' run: | npm run sync-orama diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index aeffcd359ad03..6170aa724a4a1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,16 +41,16 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/init@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -60,7 +60,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/autobuild@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -73,6 +73,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/analyze@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 96d9044dcd93c..aaf55c12cf6b7 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -21,12 +21,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Review Dependencies - uses: actions/dependency-review-action@9129d7d40b8c12c1ed0f60400d00c92d437adcce # v4.1.3 + uses: actions/dependency-review-action@0c155c5e8556a497adf53f2c18edabf945ed8e70 # v4.3.2 diff --git a/.github/workflows/lighthouse.yml b/.github/workflows/lighthouse.yml index a2be790c5261f..049336b7fe4f2 100644 --- a/.github/workflows/lighthouse.yml +++ b/.github/workflows/lighthouse.yml @@ -38,12 +38,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # Since we checkout the HEAD of the current Branch, if the Pull Request comes from a Fork # we want to clone the fork's repository instead of the base repository diff --git a/.github/workflows/lint-and-tests.yml b/.github/workflows/lint-and-tests.yml index 0853864144d8e..941adca8e3361 100644 --- a/.github/workflows/lint-and-tests.yml +++ b/.github/workflows/lint-and-tests.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit @@ -60,18 +60,18 @@ jobs: (github.event_name == 'pull_request_target' && github.event.label.name == 'github_actions:pull-request') - name: Lint + name: Quality checks runs-on: ubuntu-latest needs: [base] steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # Since we checkout the HEAD of the current Branch, if the Pull Request comes from a Fork # we want to clone the fork's repository instead of the base repository @@ -85,7 +85,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref || github.ref }} - name: Restore Lint Cache - uses: actions/cache/restore@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .turbo/cache @@ -116,8 +116,7 @@ jobs: # We also use `npm i` instead of `npm ci` so that the node_modules/.cache folder doesn't get deleted run: npm i --no-audit --no-fund --ignore-scripts --userconfig=/dev/null - - name: Run `turbo lint` - id: eslint-step + - name: Run quality checks with `turbo` # We run the ESLint and Prettier commands on all Workflow triggers of the `Lint` job, besides if # the Pull Request comes from a Crowdin Branch, as we don't want to run ESLint and Prettier on Crowdin PRs # Note: Linting and Prettifying of files on Crowdin PRs is handled by the `translations-pr.yml` Workflow @@ -127,13 +126,7 @@ jobs: github.event.pull_request.head.ref != 'chore/crowdin') # We want to enforce that the actual `turbo@latest` package is used instead of a possible hijack from the user # the `${{ needs.base.outputs.turbo_args }}` is a string substitution happening from the base job - run: npx --package=turbo@latest -- turbo lint ${{ needs.base.outputs.turbo_args }} - - - name: Run `turbo prettier` - if: steps.eslint-step.outcome == 'success' - # We want to enforce that the actual `turbo@latest` package is used instead of a possible hijack from the user - # the `${{ needs.base.outputs.turbo_args }}` is a string substitution happening from the base job - run: npx --package=turbo@latest -- turbo prettier ${{ needs.base.outputs.turbo_args }} + run: npx --package=turbo@latest -- turbo lint:js lint:md lint:css prettier ${{ needs.base.outputs.turbo_args }} - name: Run `tsc build` # We want to ensure that the whole codebase is passing and successfully compiles with TypeScript @@ -150,7 +143,7 @@ jobs: (github.event_name == 'pull_request_target' && startsWith(github.event.pull_request.head.ref, 'dependabot/') == false && github.event.pull_request.head.ref != 'chore/crowdin') - uses: actions/cache/save@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .turbo/cache @@ -181,12 +174,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # Since we checkout the HEAD of the current Branch, if the Pull Request comes from a Fork # we want to clone the fork's repository instead of the base repository @@ -232,7 +225,7 @@ jobs: startsWith(github.event.pull_request.head.ref, 'dependabot/') == false && github.event.pull_request.head.ref != 'chore/crowdin') # sha reference has no stable git tag reference or URL. see https://github.com/chromaui/chromatic-cli/issues/797 - uses: chromaui/action@807600692d28833b717c155e15ed20905cdc865c + uses: chromaui/action@5f6574e351eb055223ae8ea9e1a734d1d695ea9c with: buildScriptName: storybook:build projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} @@ -246,7 +239,7 @@ jobs: if: steps.chromatic-deploy.outcome == 'success' # This comments the current Jest Coverage Report containing JUnit XML reports # and a Code Coverage Summary - uses: MishaKav/jest-coverage-comment@c2d5cfd6c32e8799c6deb0fd76a8e2d9ad8b35c2 # v1.0.25 + uses: MishaKav/jest-coverage-comment@434e6d2d37116d23d812809b61d499639842fa3b # v1.0.26 with: title: 'Unit Test Coverage Report' junitxml-path: ./junit.xml diff --git a/.github/workflows/pull-request-label.yml b/.github/workflows/pull-request-label.yml index 873a2c8bd7201..ece9615652e09 100644 --- a/.github/workflows/pull-request-label.yml +++ b/.github/workflows/pull-request-label.yml @@ -31,7 +31,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 7f950c7a75016..b0b57a74ad4f5 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -32,17 +32,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: persist-credentials: false - name: Run Scorecard Analysis - uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3 with: results_file: results.sarif results_format: sarif @@ -51,7 +51,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload Artifacts - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: SARIF file path: results.sarif @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload Scan Results - uses: github/codeql-action/upload-sarif@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/upload-sarif@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7 with: sarif_file: results.sarif diff --git a/.github/workflows/translations-pr.yml b/.github/workflows/translations-pr.yml index dd6ca73ea0eb1..ca7a35613ecd1 100644 --- a/.github/workflows/translations-pr.yml +++ b/.github/workflows/translations-pr.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit @@ -65,12 +65,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 # v2.8.0 with: egress-policy: audit - name: Git Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # By default Git Checkout on `pull-request-target` will checkout # the `default` branch of the Pull Request. We want to checkout @@ -78,7 +78,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref }} - name: Restore Lint Cache - uses: actions/cache/restore@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .eslintmdcache @@ -116,13 +116,13 @@ jobs: run: npx prettier "{pages,i18n}/**/*.{json,md,mdx}" --check --write --cache --cache-strategy=metadata --cache-location=.prettiercache - name: Push Changes back to Pull Request - uses: stefanzweifel/git-auto-commit-action@8756aa072ef5b4a080af5dc8fef36c5d586e521d # v5.0.0 + uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # v5.0.1 with: commit_options: '--no-verify --signoff' commit_message: 'chore: automated format of translated files' - name: Save Lint Cache - uses: actions/cache/save@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .eslintmdcache diff --git a/.gitignore b/.gitignore index 7f47879b973a9..aef8ec50a2dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ node_modules npm-debug.log .npm -.env.local +.env.* # Next.js Build Output .next diff --git a/.prettierrc.json b/.prettierrc.json index ede5abb88a3bb..c69d55a94d950 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -8,5 +8,6 @@ "bracketSpacing": true, "bracketSameLine": false, "arrowParens": "avoid", - "plugins": ["prettier-plugin-tailwindcss"] + "plugins": ["prettier-plugin-tailwindcss"], + "tailwindPreserveWhitespace": true } diff --git a/COLLABORATOR_GUIDE.md b/COLLABORATOR_GUIDE.md index a8849666a90c6..ddb826925700b 100644 --- a/COLLABORATOR_GUIDE.md +++ b/COLLABORATOR_GUIDE.md @@ -277,7 +277,7 @@ Unit Tests are fundamental to ensure that code changes do not disrupt the functi - We also recommend mocking external dependencies, if unsure about how to mock a particular dependency, raise the question on your Pull Request. - We recommend using [Jest's Mock Functions](https://jestjs.io/docs/en/mock-functions) for mocking dependencies. - We recommend using [Jest's Mock Modules](https://jestjs.io/docs/en/manual-mocks) for mocking dependencies unavailable on the Node.js runtime. - - Common Providers and Contexts from the lifecycle of our App, such as [`react-intl`][] should not be mocked but given an empty or fake context whenever possible. + - Common Providers and Contexts from the lifecycle of our App, such as [`next-intl`][] should not be mocked but given an empty or fake context whenever possible. - We recommend reading previous unit tests from the codebase for inspiration and code guidelines. ### General Guidelines for Storybooks @@ -340,7 +340,7 @@ This custom render uses `getStaticPaths` and [Incremental Static Generation](htt For example, this allows us to generate Localized Pages for every page that is not translated, by telling Next.js to create a localised path. `next.dynamic.mjs` is responsible for getting a full list of the source pages (`pages/en`) and identifying which pages have been translated. -Non-translated pages will have their Localized contexts and translated React message-bags (`react-intl`) but the content will be the same as the source page (English). +Non-translated pages will have their Localized contexts and translated React message-bags (`next-intl`) but the content will be the same as the source page (English). Whereas localized pages will have localized context and content. This custom solution is also able to decide what paths should be compiled during runtime. @@ -491,7 +491,7 @@ If you're unfamiliar or curious about something, we recommend opening a Discussi [Jest]: https://jestjs.io/ [React Testing Library]: https://testing-library.com/docs/react-testing-library/intro/ [Storybook]: https://storybook.js.org/ -[`react-intl`]: https://formatjs.io/docs/react-intl/ +[`next-intl`]: https://next-intl-docs.vercel.app [Next.js]: https://nextjs.org/ [MDX]: https://mdxjs.com/ [PostCSS]: https://postcss.org/ @@ -499,4 +499,3 @@ If you're unfamiliar or curious about something, we recommend opening a Discussi [Shiki]: https://github.com/shikijs/shiki [Tailwind]: https://tailwindcss.com/ [Radix UI]: https://www.radix-ui.com/ -[`next-intl`]: https://www.npmjs.com/package/next-intl diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1c8b1347ca211..e6e8b2814319c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -91,7 +91,7 @@ for getting things done and landing your contribution. ```bash npm ci # installs this project's dependencies - npx turbo serve # starts a preview of your local changes + npx turbo dev # starts a development environment ``` 7. Perform your changes. In case you're unfamiliar with the structure of this repository, we recommend a read on the [Collaborator Guide](./COLLABORATOR_GUIDE.md) @@ -118,14 +118,8 @@ for getting things done and landing your contribution. git push -u origin name-of-your-branch ``` - > [!NOTE]\ - > By default if you run the Website (either via `npm run serve` or `npm run build`) two files on the `public` folder will be generated. - > - > You don't need to reset/discard these files, as by default we use Git Hooks that simply ignore these files during commit. - > Note that these files are generated and should **not** be committed. (`public/node-release-data.json` and `public/blog-posts-data.json`) - - > [!IMPORTANT]\ - > Before committing and opening a Pull Request, please go first through our [Commit](#commit-guidelines) and [Pull Request](#pull-request-policy) guidelines outlined below. +> [!IMPORTANT]\ +> Before committing and opening a Pull Request, please go first through our [Commit](#commit-guidelines) and [Pull Request](#pull-request-policy) guidelines outlined below. 11. Create a Pull Request. @@ -134,7 +128,7 @@ for getting things done and landing your contribution. > We use [GitHub Merge Queues](https://github.blog/2023-07-12-github-merge-queue-is-generally-available/) > which means that before merge the PRs get automatically updated and checked against the latest changes on the base branch. > -> This also reduces the amount of times we need to run our CI checks, as every new push requires freshly new CI-checks. +> This also reduces the amount of times we need to run our CI checks, as every new push requires fresh new CI-checks. ### CLI Commands @@ -143,7 +137,7 @@ This repository contains several scripts and commands for performing numerous ta
Commands for Running & Building the Website -- `npx turbo serve` runs Next.js's Local Development Server, listening by default on `http://localhost:3000/`. +- `npx turbo dev` runs Next.js's Local Development Server, listening by default on `http://localhost:3000/`. - `npx turbo build` builds the Application on Production mode. The output is by default within `.next` folder. - This is used for the Node.js Vercel Deployments (Preview & Production) - `npx turbo deploy` builds the Application on Export Production Mode. The output is by default within `build` folder. diff --git a/DEPENDENCY_PINNING.md b/DEPENDENCY_PINNING.md index 57da5ec043cf3..cde3f59b9041b 100644 --- a/DEPENDENCY_PINNING.md +++ b/DEPENDENCY_PINNING.md @@ -21,7 +21,7 @@ When adding dependencies, you should consider if that dependency should be saved - A dependency, in general, should be pinned to its exact dependency if it's either a tooling or a CLI dependency. Examples include `husky`, `prettier`, `jest` and others. - A dependency should generally use `~` if we're interested in patch updates (such as hot-fixes and bug-fixes) and the package is part of the Development or Testing Environment. (Such as `storybook`, for example) -- A dependency should generally use `^` if they're part of the Website Application itself, such as `react`, `react-intl` etc. This is done because we intentionally want to get these dependencies' latest features and bug-fixes. +- A dependency should generally use `^` if they're part of the Website Application itself, such as `react`, `next-intl` etc. This is done because we intentionally want to get these dependencies' latest features and bug-fixes. - If we're not interested in getting the latest features and bug fixes, we should consider using `~` instead. - Node. js-only dependencies used in scripts or during the build process of the Website (not used within actual Application code) should use `~` instead. Examples include `glob`, `@nodevu/core` - TypeScript type packages of corresponding packages should follow the same `semver` of their respective packages diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 837b3716cae9b..6f6d463030dbc 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -2,6 +2,13 @@ The Node.js Web Team (@nodejs/web) is a team in the Node.js Project that is composed by a set of subteams. Each containing specific responsibilities and goals. +### TSC Oversight + +Any website change that expresses a position about a global event or group of people requires explicit +[TSC](https://github.com/nodejs/TSC/blob/main/TSC-Charter.md#section-4-responsibilities-of-the-tsc) +approval. This can be obtained by pinging `@nodejs/tsc` and receive no objections after seven days, +or by sending an email to `tsc@iojs.org` and receive at least one approval and no objections after seven days. + ### Node.js Website Team (`@nodejs/nodejs-website`) The Node.js Website Team is responsible for the day-to-day technical development of the Node.js Website. This is primarily the development of the website itself, adding new features, pages and components, but also fixing any security issues in the website code, handling operational maintenance, and so on. diff --git a/README.md b/README.md index 5de339f58fb61..0740cdd8e1211 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@
- - + +

- Node.js Website built using Next.js with TypeScript, SCSS and MDXv2 + Node.js Website built using Next.js with TypeScript, CSS Modules/Tailwind, and MDXv3

@@ -40,7 +40,7 @@ ```bash npm ci -npx turbo serve +npx turbo dev # listening at localhost:3000 ``` @@ -111,6 +111,7 @@ These are maintained in different repositories and we urge users to open **issue - A really warm thank you to Cloudflare as we would not be able to serve our community without their immense support. - Thanks to [Sentry](https://sentry.io/welcome/) for providing an open source license for their error reporting, monitoring and diagnostic tools. - Thanks to [Crowdin](https://crowdin.com/) for providing a platform that allows us to localize the Node.js Website and collaborate with translators. +- Thanks to [Orama](https://docs.oramasearch.com/) for providing a search platform that indexes our expansive content and provides lightning-fast results for our users. [code of conduct]: https://github.com/nodejs/admin/blob/main/CODE_OF_CONDUCT.md [contribution guidelines]: https://github.com/nodejs/nodejs.org/blob/main/CONTRIBUTING.md diff --git a/TRANSLATION.md b/TRANSLATION.md index f94f9152dcddf..710edf3281332 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -18,6 +18,12 @@ If you have any questions or feedbacks on current translations, you can [start a ## How to add a new language +Open discussion on the [Crowdin project](https://crowdin.com/project/nodejs-web) to request a new language. After wait for the language to be added to the project by the Crowdin manager + +After that, one of the member of the Node.js Website team should add the new language to the project. + +### Adding a new language to the project + Go on `/i18n/config.json` and add the new language to the `locales` array. Fill the language object with the following fields: @@ -44,8 +50,6 @@ Fill the language object with the following fields: | `hrefLang` | The language code in [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format | `fr` | | `enabled` | If the language is enabled or not | `true` | -Please also add the new locale file to the locales folder `/i18n/locales`. - ## Adding new Translation Keys If you're making a new Component and adding Translation Keys for your Component, they should follow these guidelines: diff --git a/app/[locale]/[[...path]]/page.tsx b/app/[locale]/[[...path]]/page.tsx index 2bb864c8ee455..14aff4e2d41b4 100644 --- a/app/[locale]/[[...path]]/page.tsx +++ b/app/[locale]/[[...path]]/page.tsx @@ -1,5 +1,5 @@ import { setContext, setTags } from '@sentry/nextjs'; -import { notFound } from 'next/navigation'; +import { notFound, redirect } from 'next/navigation'; import { unstable_setRequestLocale } from 'next-intl/server'; import type { FC } from 'react'; @@ -9,7 +9,11 @@ import WithLayout from '@/components/withLayout'; import { ENABLE_STATIC_EXPORT, VERCEL_REVALIDATE } from '@/next.constants.mjs'; import { PAGE_VIEWPORT, DYNAMIC_ROUTES } from '@/next.dynamic.constants.mjs'; import { dynamicRouter } from '@/next.dynamic.mjs'; -import { availableLocaleCodes, defaultLocale } from '@/next.locales.mjs'; +import { + allLocaleCodes, + availableLocaleCodes, + defaultLocale, +} from '@/next.locales.mjs'; import { MatterProvider } from '@/providers/matterProvider'; type DynamicStaticPaths = { path: Array; locale: string }; @@ -67,7 +71,14 @@ const getPage: FC = async ({ params }) => { // Forces the current locale to be the Default Locale unstable_setRequestLocale(defaultLocale.code); - return notFound(); + if (!allLocaleCodes.includes(locale)) { + // when the locale is not listed in the locales, return NotFound + return notFound(); + } + + // Redirect to the default locale path + const pathname = dynamicRouter.getPathname(path); + return redirect(`/${defaultLocale.code}/${pathname}`); } // Configures the current Locale to be the given Locale of the Request @@ -78,7 +89,7 @@ const getPage: FC = async ({ params }) => { const staticGeneratedLayout = DYNAMIC_ROUTES.get(pathname); - // If the current patname is a statically generated route + // If the current pathname is a statically generated route // it means it does not have a Markdown file nor exists under the filesystem // but it is a valid route with an assigned layout that should be rendered if (staticGeneratedLayout !== undefined) { diff --git a/app/[locale]/error.tsx b/app/[locale]/error.tsx index 96a35835e0b45..8f642ae363cc6 100644 --- a/app/[locale]/error.tsx +++ b/app/[locale]/error.tsx @@ -6,6 +6,7 @@ import { useTranslations } from 'next-intl'; import type { FC } from 'react'; import Button from '@/components/Common/Button'; +import GlowingBackdrop from '@/components/Common/GlowingBackdrop'; import CenteredLayout from '@/layouts/Centered'; const ErrorPage: FC<{ error: Error }> = ({ error }) => { @@ -14,7 +15,7 @@ const ErrorPage: FC<{ error: Error }> = ({ error }) => { return ( -

+
500 diff --git a/app/[locale]/feed/[feed]/route.ts b/app/[locale]/feed/[feed]/route.ts index 9ba74061e0992..a77e9d9ccd3b4 100644 --- a/app/[locale]/feed/[feed]/route.ts +++ b/app/[locale]/feed/[feed]/route.ts @@ -29,7 +29,9 @@ export const GET = async (_: Request, { params }: StaticParams) => { export const generateStaticParams = async () => siteConfig.rssFeeds.map(feed => ({ feed: feed.file, locale })); -// Forces that only the paths from `generateStaticParams` are allowed, giving 404 on the contrary +// In this case we want to catch-all possible requests. This is so that if a non defined feed is +// requested we can manually return a 404 response for it instead of having Next.js handle it +// and return our top level custom 404 html page instead // @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamicparams export const dynamicParams = true; diff --git a/app/[locale]/next-data/api-data/route.ts b/app/[locale]/next-data/api-data/route.ts index 4798aad101ac8..16e243d62c9db 100644 --- a/app/[locale]/next-data/api-data/route.ts +++ b/app/[locale]/next-data/api-data/route.ts @@ -16,8 +16,8 @@ const getPathnameForApiFile = (name: string, version: string) => export const GET = async () => { const releases = provideReleaseData(); - const { versionWithPrefix } = releases.find(release => - ['Active LTS', 'Maintenance LTS'].includes(release.status) + const { versionWithPrefix } = releases.find( + release => release.status === 'LTS' )!; const gitHubApiResponse = await fetch(getGitHubApiDocsUrl(versionWithPrefix)); diff --git a/app/[locale]/next-data/changelog-data/[version]/route.ts b/app/[locale]/next-data/changelog-data/[version]/route.ts new file mode 100644 index 0000000000000..9184ee68af578 --- /dev/null +++ b/app/[locale]/next-data/changelog-data/[version]/route.ts @@ -0,0 +1,44 @@ +import { provideChangelogData } from '@/next-data/providers/changelogData'; +import provideReleaseData from '@/next-data/providers/releaseData'; +import { VERCEL_REVALIDATE } from '@/next.constants.mjs'; +import { defaultLocale } from '@/next.locales.mjs'; + +type StaticParams = { + params: { version: string }; +}; + +// This is the Route Handler for the `GET` method which handles the request +// for generating static data related to the Node.js Changelog Data +// @see https://nextjs.org/docs/app/building-your-application/routing/router-handlers +export const GET = async (_: Request, { params }: StaticParams) => { + const changelogData = await provideChangelogData(params.version); + + return Response.json(changelogData); +}; + +// This function generates the static paths that come from the dynamic segments +// `[locale]/next-data/changelog-data/[version]` and returns an array of all available static paths +// This is used for ISR static validation and generation +export const generateStaticParams = async () => { + const releases = provideReleaseData(); + + const mappedParams = releases.map(release => ({ + locale: defaultLocale.code, + version: String(release.versionWithPrefix), + })); + + return mappedParams; +}; + +// Enforces that only the paths from `generateStaticParams` are allowed, giving 404 on the contrary +// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamicparams +export const dynamicParams = false; + +// Enforces that this route is used as static rendering +// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic +export const dynamic = 'error'; + +// Ensures that this endpoint is invalidated and re-executed every X minutes +// so that when new deployments happen, the data is refreshed +// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate +export const revalidate = VERCEL_REVALIDATE; diff --git a/app/[locale]/next-data/og/route.tsx b/app/[locale]/next-data/og/route.tsx index 6c0626c2011c6..481826099722c 100644 --- a/app/[locale]/next-data/og/route.tsx +++ b/app/[locale]/next-data/og/route.tsx @@ -64,7 +64,8 @@ export const generateStaticParams = async () => [ // @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#runtime export const runtime = VERCEL_ENV ? 'edge' : 'nodejs'; -// Enforces that only the paths from `generateStaticParams` are allowed, giving 404 on the contrary +// In this case we want to catch-all possible requests. This ensures that we always generate and +// serve the OpenGrapgh images independently on the locale // @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamicparams export const dynamicParams = true; diff --git a/app/[locale]/not-found.tsx b/app/[locale]/not-found.tsx index 4435d6427e127..bb7b53628c709 100644 --- a/app/[locale]/not-found.tsx +++ b/app/[locale]/not-found.tsx @@ -1,10 +1,12 @@ 'use client'; import { ArrowRightIcon } from '@heroicons/react/24/solid'; +import Image from 'next/image'; import { useTranslations } from 'next-intl'; import type { FC } from 'react'; import Button from '@/components/Common/Button'; +import GlowingBackdrop from '@/components/Common/GlowingBackdrop'; import CenteredLayout from '@/layouts/Centered'; const NotFoundPage: FC = () => { @@ -12,11 +14,19 @@ const NotFoundPage: FC = () => { return ( -
+
404

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

+
+ The Node.js mascot +

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

diff --git a/app/global-error.tsx b/app/global-error.tsx index 97828d5af1912..20d1cb618a735 100644 --- a/app/global-error.tsx +++ b/app/global-error.tsx @@ -5,6 +5,7 @@ import { captureException } from '@sentry/nextjs'; import type { FC } from 'react'; import Button from '@/components/Common/Button'; +import GlowingBackdrop from '@/components/Common/GlowingBackdrop'; import BaseLayout from '@/layouts/Base'; import CenteredLayout from '@/layouts/Centered'; @@ -16,7 +17,7 @@ const GlobalErrorPage: FC<{ error: Error }> = ({ error }) => { -
+
500 diff --git a/authors.json b/authors.json new file mode 100644 index 0000000000000..94713f4f4c006 --- /dev/null +++ b/authors.json @@ -0,0 +1,252 @@ +{ + "Timothy J Fontaine": { + "id": "tjfontaine", + "name": "Timothy J Fontaine", + "website": "https://github.com/tjfontaine" + }, + "Node.js Advisory Board": { + "id": "advisory-board", + "name": "Node.js Advisory Board" + }, + "Shelley Vohr": { + "id": "codebytere", + "name": "Shelley Vohr", + "website": "https://github.com/codebytere" + }, + "The Node.js Project": { + "id": "nodejs", + "name": "The Node.js Project", + "website": "https://github.com/nodejs" + }, + "Tierney Cyren": { + "id": "bnb", + "name": "Tierney Cyren", + "website": "https://github.com/bnb" + }, + "Joe Sepi": { + "id": "joesepi", + "name": "Joe Sepi", + "website": "https://github.com/joesepi" + }, + "Richard Lau": { + "id": "richardlau", + "name": "Richard Lau", + "website": "https://github.com/richardlau" + }, + "Scott Hammond": { + "id": "scott-hammond", + "name": "Scott Hammond" + }, + "Mike Dolan": { + "id": "mike-dolan", + "name": "Mike Dolan" + }, + "Mikeal Rogers": { + "id": "mikeal", + "name": "Mikeal Rogers", + "website": "https://github.com/mikeal" + }, + "Rod Vagg": { + "id": "rvagg", + "name": "Rod Vagg", + "website": "https://github.com/rvagg" + }, + "Michaël Zasso": { + "id": "targos", + "name": "Michaël Zasso", + "website": "https://github.com/targos" + }, + "Tracy Hinds": { + "id": "tracy-hinds", + "name": "Tracy Hinds" + }, + "Michael Dawson": { + "id": "mhdawson", + "name": "Michael Dawson", + "website": "https://github.com/mhdawson" + }, + "Myles Borins": { + "id": "mylesborins", + "name": "Myles Borins", + "website": "https://github.com/mylesborins" + }, + "Isaac Schlueter": { + "id": "isaacs", + "name": "Isaac Schlueter", + "website": "https://github.com/isaacs" + }, + "Dave Pacheco": { + "id": "dave-pacheco", + "name": "Dave Pacheco" + }, + "Domenic Denicola": { + "id": "domenic", + "name": "Domenic Denicola", + "website": "https://github.com/domenic" + }, + "Charlie Robbins": { + "id": "indexzero", + "name": "Charlie Robbins", + "website": "https://github.com/indexzero" + }, + "Ryan Dahl": { + "id": "ry", + "name": "Ryan Dahl", + "website": "https://github.com/ry" + }, + "ryandahl": { + "id": "ry", + "name": "Ryan Dahl", + "website": "https://github.com/ry" + }, + "Ben Noordhuis": { + "id": "bennoordhuis", + "name": "Ben Noordhuis", + "website": "https://github.com/bnoordhuis" + }, + "Bert Belder": { + "id": "piscisaureus", + "name": "Bert Belder", + "website": "https://github.com/piscisaureus" + }, + "Jeremiah Senkpiel": { + "id": "Fishrock123", + "name": "Jeremiah Senkpiel", + "website": "https://github.com/Fishrock123" + }, + "Colin Ihrig": { + "id": "cjihrig", + "name": "Colin Ihrig", + "website": "https://github.com/cjihrig" + }, + "Evan Lucas": { + "id": "evanlucas", + "name": "Evan Lucas", + "website": "https://github.com/evanlucas" + }, + "James M Snell": { + "id": "jasnell", + "name": "James M Snell", + "website": "https://github.com/jasnell" + }, + "Italo Casas": { + "id": "italoacasas", + "name": "Italo Casas", + "website": "https://github.com/italoacasas" + }, + "Anna Henningsen": { + "id": "addaleax", + "name": "Anna Henningsen", + "website": "https://github.com/addaleax" + }, + "Gibson Fahnestock": { + "id": "gibfahn", + "name": "Gibson Fahnestock", + "website": "https://github.com/gibfahn" + }, + "Ruben Bridgewater": { + "id": "BridgeAR", + "name": "Ruben Bridgewater", + "website": "https://github.com/BridgeAR" + }, + "Bethany Nicolle Griggs": { + "id": "BethGriggs", + "name": "Bethany Nicolle Griggs", + "website": "https://github.com/BethGriggs" + }, + "Ruy Adorno": { + "id": "ruyadorno", + "name": "Ruy Adorno", + "website": "https://github.com/ruyadorno" + }, + "Danielle Adams": { + "id": "danielleadams", + "name": "Danielle Adams", + "website": "https://github.com/danielleadams" + }, + "Bryan English": { + "id": "bengl", + "name": "Bryan English", + "website": "https://github.com/bengl" + }, + "Stewart X Addison": { + "id": "sxa", + "name": "Stewart X Addison", + "website": "https://github.com/sxa" + }, + "Emily Rose": { + "id": "emilyrose", + "name": "Emily Rose", + "website": "https://github.com/emilyrose" + }, + "Julián Duque": { + "id": "julianduque", + "name": "Julián Duque", + "website": "https://github.com/julianduque" + }, + "Giovanny Gongora": { + "id": "Gioyik", + "name": "Giovanny Gongora", + "website": "https://github.com/Gioyik" + }, + "Yosuke Furukawa": { + "id": "yosuke-furukawa", + "name": "Yosuke Furukawa", + "website": "https://github.com/yosuke-furukawa" + }, + "Steven Sinatra": { + "id": "diagramatics", + "name": "Steven Sinatra", + "website": "https://github.com/diagramatics" + }, + "Minwoo Jung": { + "id": "minwoo-jung", + "name": "Minwoo Jung", + "website": "https://github.com/minwoo-jung" + }, + "Rafael Gonzaga": { + "id": "RafaelGSS", + "name": "Rafael Gonzaga", + "website": "https://github.com/RafaelGSS" + }, + "Joyee Cheung": { + "id": "joyeecheung", + "name": "Joyee Cheung", + "website": "https://github.com/joyeecheung" + }, + "Juan José Arboleda": { + "id": "juanarbol", + "name": "Juan José Arboleda", + "website": "https://github.com/juanarbol" + }, + "Juan José": { + "id": "juanarbol", + "name": "Juan José Arboleda", + "website": "https://github.com/juanarbol" + }, + "Brian Muenzenmeyer": { + "id": "bmuenzenmeyer", + "name": "Brian Muenzenmeyer", + "website": "https://github.com/bmuenzenmeyer" + }, + "Marco Ippolito": { + "id": "marco-ippolito", + "name": "Marco Ippolito", + "website": "https://github.com/marco-ippolito" + }, + "Ulises Gascón": { + "id": "UlisesGascon", + "name": "Ulises Gascón", + "website": "https://github.com/UlisesGascon" + }, + "Claudio Wunder": { + "id": "ovflowd", + "name": "Claudio Wunder", + "website": "https://github.com/ovflowd" + }, + "Matt Cowley": { + "id": "MattIPv4", + "name": "Matt Cowley", + "website": "https://github.com/MattIPv4" + } +} diff --git a/components/Common/AvatarGroup/Avatar/index.tsx b/components/Common/AvatarGroup/Avatar/index.tsx index fd3e4bef6f3d8..36122f839126f 100644 --- a/components/Common/AvatarGroup/Avatar/index.tsx +++ b/components/Common/AvatarGroup/Avatar/index.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react'; import styles from './index.module.css'; -type AvatarProps = { +export type AvatarProps = { src: string; alt: string; }; diff --git a/components/Common/AvatarGroup/index.module.css b/components/Common/AvatarGroup/index.module.css index 38efcc06d07db..3e01660bddc07 100644 --- a/components/Common/AvatarGroup/index.module.css +++ b/components/Common/AvatarGroup/index.module.css @@ -1,5 +1,7 @@ .avatarGroup { - @apply flex - h-8 - items-center; + @apply -mb-4 + flex + items-center + overflow-x-auto + pb-4; } diff --git a/components/Common/Badge/index.module.css b/components/Common/Badge/index.module.css index 421d38f5f95fe..40c28b3285188 100644 --- a/components/Common/Badge/index.module.css +++ b/components/Common/Badge/index.module.css @@ -20,6 +20,7 @@ border px-2.5 py-0.5 + text-center text-white; } diff --git a/components/Common/Badge/index.tsx b/components/Common/Badge/index.tsx index 258b32312b07d..8463fccf52e62 100644 --- a/components/Common/Badge/index.tsx +++ b/components/Common/Badge/index.tsx @@ -19,7 +19,7 @@ const Badge: FC> = ({ {badgeText && {badgeText}} {children} - + {args.href && } ); diff --git a/components/Common/Breadcrumbs/index.tsx b/components/Common/Breadcrumbs/index.tsx index ce74dc88188ff..13c796305cb47 100644 --- a/components/Common/Breadcrumbs/index.tsx +++ b/components/Common/Breadcrumbs/index.tsx @@ -8,7 +8,7 @@ import BreadcrumbRoot from '@/components/Common/Breadcrumbs/BreadcrumbRoot'; import BreadcrumbTruncatedItem from '@/components/Common/Breadcrumbs/BreadcrumbTruncatedItem'; import type { FormattedMessage } from '@/types'; -type BreadcrumbLink = { +export type BreadcrumbLink = { label: FormattedMessage; href: string | undefined; }; diff --git a/components/Common/Button/index.module.css b/components/Common/Button/index.module.css index 6d6009b267348..2b9071dcb1e0c 100644 --- a/components/Common/Button/index.module.css +++ b/components/Common/Button/index.module.css @@ -22,7 +22,7 @@ text-white dark:text-neutral-200; - &:hover { + &:hover:not([aria-disabled='true']) { @apply bg-neutral-800; } @@ -44,7 +44,7 @@ text-white shadow-sm; - &:hover { + &:hover:not([aria-disabled='true']) { @apply border-green-700 bg-green-700 text-white; @@ -66,7 +66,7 @@ text-neutral-800 dark:text-neutral-200; - &:hover { + &:hover:not([aria-disabled='true']) { @apply bg-neutral-100 text-neutral-800 dark:bg-neutral-900 @@ -127,7 +127,7 @@ @apply opacity-50; } - &:hover { + &:hover:not([aria-disabled='true']) { @apply bg-green-600/20; } diff --git a/components/Common/CodeBox/index.module.css b/components/Common/CodeBox/index.module.css index abd0c30b5a080..74221978d5721 100644 --- a/components/Common/CodeBox/index.module.css +++ b/components/Common/CodeBox/index.module.css @@ -11,6 +11,7 @@ & > code { @apply grid + overflow-x-auto bg-transparent p-0 font-ibm-plex-mono @@ -25,11 +26,6 @@ min-w-0 pl-8; - & > span { - @apply whitespace-break-spaces - break-words; - } - &:not(:empty:last-child)::before { @apply inline-block content-['']; diff --git a/components/Common/CodeBox/index.tsx b/components/Common/CodeBox/index.tsx index 36dd82cef54fc..0b6d97df48ca1 100644 --- a/components/Common/CodeBox/index.tsx +++ b/components/Common/CodeBox/index.tsx @@ -4,6 +4,7 @@ import { DocumentDuplicateIcon, CodeBracketIcon, } from '@heroicons/react/24/outline'; +import classNames from 'classnames'; import { useTranslations } from 'next-intl'; import type { FC, PropsWithChildren, ReactNode } from 'react'; import { Fragment, isValidElement, useRef } from 'react'; @@ -63,12 +64,17 @@ const transformCode = (code: ReactNode, language: string): ReactNode => { ); }; -type CodeBoxProps = { language: string; showCopyButton?: boolean }; +type CodeBoxProps = { + language: string; + showCopyButton?: boolean; + className?: string; +}; const CodeBox: FC> = ({ children, language, showCopyButton = true, + className, }) => { const ref = useRef(null); @@ -94,7 +100,12 @@ const CodeBox: FC> = ({ return (
-
+      
         {transformCode(children, language)}
       
diff --git a/components/Common/CodeTabs/index.module.css b/components/Common/CodeTabs/index.module.css index 4b188b741e4c0..e6e0110ad45d1 100644 --- a/components/Common/CodeTabs/index.module.css +++ b/components/Common/CodeTabs/index.module.css @@ -10,11 +10,11 @@ border-t border-neutral-900 bg-neutral-950 - px-4 + px-2 pt-3 - xs:px-2; + md:px-4; - > button { + .trigger { @apply border-b border-b-transparent px-1 diff --git a/components/Common/CodeTabs/index.tsx b/components/Common/CodeTabs/index.tsx index a6971808d11aa..614db0017079b 100644 --- a/components/Common/CodeTabs/index.tsx +++ b/components/Common/CodeTabs/index.tsx @@ -23,6 +23,7 @@ const CodeTabs: FC> = ({ ; +type Meta = MetaObj; + +export const Default: Story = {}; + +export default { component: GlowingBackdrop } as Meta; diff --git a/components/Common/GlowingBackdrop/index.tsx b/components/Common/GlowingBackdrop/index.tsx new file mode 100644 index 0000000000000..e5b10fe51abb0 --- /dev/null +++ b/components/Common/GlowingBackdrop/index.tsx @@ -0,0 +1,13 @@ +import type { FC } from 'react'; + +import HexagonGrid from '@/components/Icons/HexagonGrid'; + +import styles from './index.module.css'; + +const GlowingBackdrop: FC = () => ( +
+ +
+); + +export default GlowingBackdrop; diff --git a/components/Common/LinkTabs/index.module.css b/components/Common/LinkTabs/index.module.css index 99e8fc02bfddf..19f425c0b6713 100644 --- a/components/Common/LinkTabs/index.module.css +++ b/components/Common/LinkTabs/index.module.css @@ -7,7 +7,7 @@ border-b-neutral-200 font-open-sans dark:border-b-neutral-800 - xs:hidden; + max-xs:hidden; .tabsTrigger { @apply border-b-2 @@ -36,6 +36,6 @@ @apply my-6 hidden w-full - xs:flex; + max-xs:flex; } } diff --git a/components/Common/LinkTabs/index.stories.tsx b/components/Common/LinkTabs/index.stories.tsx new file mode 100644 index 0000000000000..a8bf1cef29079 --- /dev/null +++ b/components/Common/LinkTabs/index.stories.tsx @@ -0,0 +1,33 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import LinkTabs from '@/components/Common/LinkTabs'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = { + args: { + label: 'Select Tab', + tabs: [ + { + key: 'package', + label: 'Package Manager', + link: '/package-manager', + }, + { + key: 'prebuilt', + label: 'Prebuilt Installer', + link: '/prebuilt-installer', + }, + { + key: 'source', + label: 'Source Code', + link: '/source-code', + }, + ], + activeTab: 'prebuilt', + children:

Tab content goes here

, + }, +}; + +export default { component: LinkTabs } as Meta; diff --git a/components/Common/NodejsLogo/index.module.css b/components/Common/NodejsLogo/index.module.css new file mode 100644 index 0000000000000..7899c8c8e92e4 --- /dev/null +++ b/components/Common/NodejsLogo/index.module.css @@ -0,0 +1,12 @@ +.nodejsLogoDark { + @apply h-6 + w-20 + dark:hidden; +} + +.nodejsLogoLight { + @apply hidden + h-6 + w-20 + dark:block; +} diff --git a/components/Common/NodejsLogo/index.stories.tsx b/components/Common/NodejsLogo/index.stories.tsx new file mode 100644 index 0000000000000..691b885d1d283 --- /dev/null +++ b/components/Common/NodejsLogo/index.stories.tsx @@ -0,0 +1,14 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import NodejsLogo from '@/components/Common/NodejsLogo'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = {}; + +export const WithPride: Story = { + args: { variant: 'pride' }, +}; + +export default { component: NodejsLogo } as Meta; diff --git a/components/Common/NodejsLogo/index.tsx b/components/Common/NodejsLogo/index.tsx new file mode 100644 index 0000000000000..6fead1ab85adc --- /dev/null +++ b/components/Common/NodejsLogo/index.tsx @@ -0,0 +1,32 @@ +import type { FC } from 'react'; + +import NodejsDark from '@/components/Icons/Logos/NodejsDark'; +import NodejsDarkPride from '@/components/Icons/Logos/NodejsDarkPride'; +import NodejsLight from '@/components/Icons/Logos/NodejsLight'; +import NodejsLightPride from '@/components/Icons/Logos/NodejsLightPride'; +import type { LogoVariant } from '@/types'; + +import style from './index.module.css'; + +type NodejsLogoProps = { + variant?: LogoVariant; +}; + +const NodejsLogo: FC = ({ variant = 'default' }) => ( + <> + {variant === 'pride' && ( + <> + + + + )} + {variant === 'default' && ( + <> + + + + )} + +); + +export default NodejsLogo; diff --git a/components/Common/Pagination/Ellipsis/index.stories.tsx b/components/Common/Pagination/Ellipsis/index.stories.tsx new file mode 100644 index 0000000000000..0949bcc20cf72 --- /dev/null +++ b/components/Common/Pagination/Ellipsis/index.stories.tsx @@ -0,0 +1,10 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import Ellipsis from '@/components/Common/Pagination/Ellipsis'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = {}; + +export default { component: Ellipsis } as Meta; diff --git a/components/Common/Pagination/Ellipsis/index.tsx b/components/Common/Pagination/Ellipsis/index.tsx index 92caba2d6ff19..6cb1c7a01409b 100644 --- a/components/Common/Pagination/Ellipsis/index.tsx +++ b/components/Common/Pagination/Ellipsis/index.tsx @@ -1,6 +1,8 @@ +import type { FC } from 'react'; + import styles from './index.module.css'; -const Ellipsis = () => ( +const Ellipsis: FC = () => ( diff --git a/components/Common/Pagination/PaginationListItem/index.stories.tsx b/components/Common/Pagination/PaginationListItem/index.stories.tsx new file mode 100644 index 0000000000000..ed4de699b966e --- /dev/null +++ b/components/Common/Pagination/PaginationListItem/index.stories.tsx @@ -0,0 +1,40 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import PaginationListItem from '@/components/Common/Pagination/PaginationListItem'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = { + args: { + url: '#', + pageNumber: 1, + currentPage: 2, + totalPages: 2, + }, + decorators: [ + Story => ( +
    + +
+ ), + ], +}; + +export const CurrentPage: Story = { + args: { + url: '#', + pageNumber: 1, + currentPage: 1, + totalPages: 1, + }, + decorators: [ + Story => ( +
    + +
+ ), + ], +}; + +export default { component: PaginationListItem } as Meta; diff --git a/components/Common/Preview/index.module.css b/components/Common/Preview/index.module.css index a8181112822a5..1819679deed12 100644 --- a/components/Common/Preview/index.module.css +++ b/components/Common/Preview/index.module.css @@ -7,9 +7,6 @@ border border-neutral-900 bg-neutral-950 - bg-[url('/static/images/patterns/hexagon-grid.svg')] - bg-contain - bg-center @container/preview; &::after { @@ -58,6 +55,21 @@ @xl/preview:text-2xl @2xl/preview:text-3xl; + .hexagon { + @apply absolute + inset-0 + m-auto + size-full + @md/preview:h-3/5 + @md/preview:w-3/5 + @lg/preview:h-2/3 + @lg/preview:w-2/3 + @xl/preview:h-3/5 + @xl/preview:w-3/5 + @2xl/preview:h-2/3 + @2xl/preview:w-2/3; + } + .logo { @apply mx-auto size-6 diff --git a/components/Common/Preview/index.tsx b/components/Common/Preview/index.tsx index 33c81d40758fe..489fdc01b18a4 100644 --- a/components/Common/Preview/index.tsx +++ b/components/Common/Preview/index.tsx @@ -1,6 +1,7 @@ import classNames from 'classnames'; import type { FC } from 'react'; +import HexagonGrid from '@/components/Icons/HexagonGrid'; import JsIconWhite from '@/components/Icons/Logos/JsIconWhite'; import type { BlogPreviewType } from '@/types'; @@ -14,6 +15,7 @@ type PreviewProps = { const Preview: FC = ({ type = 'announcements', title }) => (
+ {title}
diff --git a/components/Common/ProgressionSidebar/index.module.css b/components/Common/ProgressionSidebar/index.module.css index 7e497da5120c4..0e968e12d4c9b 100644 --- a/components/Common/ProgressionSidebar/index.module.css +++ b/components/Common/ProgressionSidebar/index.module.css @@ -1,28 +1,28 @@ .wrapper { @apply flex + w-full flex-col gap-8 overflow-auto - border-r + border-r-0 border-neutral-200 bg-white px-4 py-6 dark:border-neutral-900 dark:bg-neutral-950 + sm:border-r md:max-w-xs - lg:px-6 - xs:w-full - xs:border-r-0; + lg:px-6; > section { - @apply flex - xs:hidden; + @apply hidden + sm:flex; } > span { - @apply hidden + @apply flex w-full - xs:flex; + sm:hidden; } } diff --git a/components/Common/ProgressionSidebar/index.tsx b/components/Common/ProgressionSidebar/index.tsx index 6f897e3dfc4f4..fde4076f4fcb9 100644 --- a/components/Common/ProgressionSidebar/index.tsx +++ b/components/Common/ProgressionSidebar/index.tsx @@ -1,9 +1,10 @@ import { useTranslations } from 'next-intl'; import type { ComponentProps, FC } from 'react'; +import { useRef } from 'react'; import ProgressionSidebarGroup from '@/components/Common/ProgressionSidebar/ProgressionSidebarGroup'; import WithRouterSelect from '@/components/withRouterSelect'; -import { useClientContext } from '@/hooks/react-server'; +import { useClientContext, useNavigationState } from '@/hooks'; import styles from './index.module.css'; @@ -14,6 +15,9 @@ type ProgressionSidebarProps = { const ProgressionSidebar: FC = ({ groups }) => { const t = useTranslations(); const { pathname } = useClientContext(); + const ref = useRef(null); + + useNavigationState('progressionSidebar', ref); const selectItems = groups.map(({ items, groupName }) => ({ label: groupName, @@ -26,7 +30,7 @@ const ProgressionSidebar: FC = ({ groups }) => { .find(item => pathname === item.value); return ( -
- {Object.keys(facets).map((facetName, idx) => ( - - ))} + ({ + key: facetName, + label: facetName, + secondaryLabel: `(${facets[facetName].toLocaleString('en')})`, + value: idx.toString(), + }))} + onValueChange={changeFacet} + />
-
+
{searchError && } - {!searchError && !searchTerm && } - - {!searchError && searchTerm && ( + {!searchError && ( <> {searchResults && searchResults.count > 0 && - searchResults.hits.map(hit => ( + searchResults.hits.map((hit, idx) => ( ))} diff --git a/components/Common/Search/States/WithSearchResult.tsx b/components/Common/Search/States/WithSearchResult.tsx index 0a60f351a5e23..05e0dd47ef051 100644 --- a/components/Common/Search/States/WithSearchResult.tsx +++ b/components/Common/Search/States/WithSearchResult.tsx @@ -1,32 +1,43 @@ import type { Result } from '@orama/orama'; -import type { FC } from 'react'; +import { useEffect, type FC, useRef } from 'react'; import { pathToBreadcrumbs } from '@/components/Common/Search/utils'; import Link from '@/components/Link'; -import { BASE_URL } from '@/next.constants.mjs'; import { highlighter } from '@/next.orama.mjs'; import type { SearchDoc } from '@/types'; +import { searchHitToLinkPath } from '@/util/searchUtils'; import styles from './index.module.css'; type SearchResultProps = { hit: Result; searchTerm: string; + selected: boolean; + idx: number; }; export const WithSearchResult: FC = props => { - const isAPIResult = props.hit.document.siteSection.toLowerCase() === 'docs'; - const basePath = isAPIResult ? BASE_URL : ''; - const path = `${basePath}/${props.hit.document.path}`; + const divRef = useRef(null); + const path = searchHitToLinkPath(props.hit); + + useEffect(() => { + if (props.selected && divRef.current) { + divRef.current.scrollIntoView({ block: 'center' }); + } + }, [props.selected]); return (
{ } }); + const { os } = useDetectOS(); + + const osCommandKey = os === 'MAC' ? '⌘' : 'Ctrl'; + const isOSLoading = os === 'LOADING'; + return ( <> {isOpen ? : null} diff --git a/components/Common/Select/__tests__/index.test.mjs b/components/Common/Select/__tests__/index.test.mjs index 6360b03617db0..463bd67334338 100644 --- a/components/Common/Select/__tests__/index.test.mjs +++ b/components/Common/Select/__tests__/index.test.mjs @@ -10,6 +10,12 @@ describe('Select', () => { const label = 'Option label'; const onChange = jest.fn(); + global.ResizeObserver = jest.fn().mockImplementation(() => ({ + observe: jest.fn(), + unobserve: jest.fn(), + disconnect: jest.fn(), + })); + it('renders the label when provided', () => { const { getByLabelText } = render( setBitness(parseNumericBitness(bitness))} className="w-28" diff --git a/components/Downloads/Release/ChangelogLink.tsx b/components/Downloads/Release/ChangelogLink.tsx new file mode 100644 index 0000000000000..8fde7046bfe4b --- /dev/null +++ b/components/Downloads/Release/ChangelogLink.tsx @@ -0,0 +1,24 @@ +'use client'; + +import type { FC, PropsWithChildren } from 'react'; +import { useContext } from 'react'; + +import LinkWithArrow from '@/components/Downloads/Release/LinkWithArrow'; +import { ReleaseContext } from '@/providers/releaseProvider'; + +const ChangelogLink: FC = ({ children }) => { + const { modalOpen, setModalOpen } = useContext(ReleaseContext); + + return ( + + + + ); +}; + +export default ChangelogLink; diff --git a/components/Downloads/Release/LinkWithArrow.tsx b/components/Downloads/Release/LinkWithArrow.tsx index 05100f5de47a5..4910383ad52d3 100644 --- a/components/Downloads/Release/LinkWithArrow.tsx +++ b/components/Downloads/Release/LinkWithArrow.tsx @@ -1,17 +1,29 @@ import { ArrowUpRightIcon } from '@heroicons/react/24/solid'; -import type { FC, PropsWithChildren } from 'react'; +import type { SlotProps } from '@radix-ui/react-slot'; +import { Slot } from '@radix-ui/react-slot'; +import type { ComponentProps, FC, PropsWithChildren } from 'react'; import Link from '@/components/Link'; -type AccessibleAnchorProps = { href?: string }; +type LinkWithArrowProps = + | ({ asChild?: false } & ComponentProps) + | ({ asChild: true } & SlotProps); -const LinkWithArrow: FC> = ({ +const LinkWithArrow: FC> = ({ children, + asChild = false, ...props -}) => ( - - {children} - - -); +}) => { + const Comp = asChild ? Slot : Link; + + return ( + + <> + {children} + + + + ); +}; + export default LinkWithArrow; diff --git a/components/Downloads/Release/NpmLink.tsx b/components/Downloads/Release/NpmLink.tsx new file mode 100644 index 0000000000000..bdf65fe1d40b3 --- /dev/null +++ b/components/Downloads/Release/NpmLink.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { useContext } from 'react'; +import type { FC } from 'react'; + +import LinkWithArrow from '@/components/Downloads/Release/LinkWithArrow'; +import { ReleaseContext } from '@/providers/releaseProvider'; + +const NpmLink: FC = () => { + const { release } = useContext(ReleaseContext); + + return ( + + npm ({release.npm}) + + ); +}; + +export default NpmLink; diff --git a/components/Downloads/Release/NpmVersion.tsx b/components/Downloads/Release/NpmVersion.tsx deleted file mode 100644 index c4070563874e8..0000000000000 --- a/components/Downloads/Release/NpmVersion.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import { useContext } from 'react'; -import type { FC } from 'react'; - -import { ReleaseContext } from '@/providers/releaseProvider'; - -const NpmVersion: FC = () => { - const { - release: { npm }, - } = useContext(ReleaseContext); - - return <>{npm}; -}; - -export default NpmVersion; diff --git a/components/Downloads/Release/OperatingSystemDropdown.tsx b/components/Downloads/Release/OperatingSystemDropdown.tsx index 3b602cb5f637c..7cf9933a89432 100644 --- a/components/Downloads/Release/OperatingSystemDropdown.tsx +++ b/components/Downloads/Release/OperatingSystemDropdown.tsx @@ -1,11 +1,12 @@ 'use client'; import { useTranslations } from 'next-intl'; -import { useContext, useEffect, useMemo } from 'react'; +import { useContext, useEffect } from 'react'; import type { FC } from 'react'; import Select from '@/components/Common/Select'; import Apple from '@/components/Icons/Platform/Apple'; +import Aix from '@/components/Icons/Platform/Generic'; import Linux from '@/components/Icons/Platform/Linux'; import Microsoft from '@/components/Icons/Platform/Microsoft'; import { useDetectOS } from '@/hooks/react-client'; @@ -22,61 +23,44 @@ const OperatingSystemDropdown: FC = ({ exclude = [], }) => { const { os: userOS } = useDetectOS(); - const { platform, os, setOS } = useContext(ReleaseContext); + const { os, setOS } = useContext(ReleaseContext); const t = useTranslations(); // we shouldn't react when "actions" change // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => setOS(userOS), [userOS]); - // @TODO: We should have a proper utility that gives - // disabled OSs, Platforms, based on specific criteria - // this can be an optimisation for the future - // to remove this logic from this component - const disabledItems = useMemo(() => { - const disabledItems = exclude; - - if (platform === 'BREW') { - disabledItems.push('WIN'); - } - - if (platform === 'DOCKER') { - disabledItems.push('LINUX'); - } - - return disabledItems; - }, [exclude, platform]); - // @TODO: We should have a proper utility that gives // disabled OSs, Platforms, based on specific criteria // this can be an optimisation for the future // to remove this logic from this component useEffect(() => { - const currentOSExcluded = disabledItems.includes(os); + const currentOSExcluded = exclude.includes(os); const nonExcludedOS = operatingSystemItems .map(({ value }) => value) - .find(os => !disabledItems.includes(os)); + .find(os => !exclude.includes(os)); if (currentOSExcluded && nonExcludedOS) { setOS(nonExcludedOS); } // we shouldn't react when "actions" change // eslint-disable-next-line react-hooks/exhaustive-deps - }, [os, disabledItems]); + }, [os, exclude]); return ( , + FNM: , BREW: , DOCKER: , CHOCO: , }, disabledItems, })} + ariaLabel={t('layouts.download.dropdown.platform')} defaultValue={platform} onChange={platform => setPlatform(platform as PackageManager)} className="w-28" diff --git a/components/Downloads/Release/ReleaseCodeBox.tsx b/components/Downloads/Release/ReleaseCodeBox.tsx index ec979df13ba49..def4ba6299c92 100644 --- a/components/Downloads/Release/ReleaseCodeBox.tsx +++ b/components/Downloads/Release/ReleaseCodeBox.tsx @@ -32,16 +32,18 @@ const ReleaseCodeBox: FC = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [release.versionWithPrefix, os, platform]); + const codeLanguage = os === 'WIN' ? 'PowerShell' : 'Bash'; + return ( -
- {code && ( - - - - )} +
+ + + {t('layouts.download.codeBox.communityWarning')} +
+ {t('layouts.download.codeBox.communityWarningReport')}
); diff --git a/components/Downloads/Release/VersionDropdown.tsx b/components/Downloads/Release/VersionDropdown.tsx index 5333780899822..6701792817e12 100644 --- a/components/Downloads/Release/VersionDropdown.tsx +++ b/components/Downloads/Release/VersionDropdown.tsx @@ -8,7 +8,7 @@ import Select from '@/components/Common/Select'; import { ReleaseContext } from '@/providers/releaseProvider'; const getDropDownStatus = (version: string, status: string) => { - if (status === 'Active LTS') { + if (status === 'LTS') { return `${version} (LTS)`; } @@ -25,7 +25,7 @@ const VersionDropdown: FC = () => { return ( = ({ navKey }) => { ]; return ( -
+
{(previousCrossLink && ( { + it('should call the callback when the scroll reaches the bottom', () => { + const callback = jest.fn(); + renderHook(() => useBottomScrollListener(callback)); + + act(() => { + fireEvent.scroll(window, { + target: { scrollY: 100, innerHeight: 200, scrollHeight: 200 }, + }); + }); + + // timout is needed because the callback is called in the next tick + setTimeout(() => { + expect(callback).toHaveBeenCalled(); + }, 1); + }); + + it('should not call the callback when the scroll does not reach the bottom', () => { + const callback = jest.fn(); + renderHook(() => useBottomScrollListener(callback)); + + act(() => { + fireEvent.scroll(window, { + target: { scrollY: 100, innerHeight: 200, scrollHeight: 300 }, + }); + }); + + // timout is needed because the callback is called in the next tick + setTimeout(() => { + expect(callback).not.toHaveBeenCalled(); + }, 1); + }); +}); diff --git a/hooks/react-client/__tests__/useClickOutside.test.mjs b/hooks/react-client/__tests__/useClickOutside.test.mjs new file mode 100644 index 0000000000000..9bcb82fd092de --- /dev/null +++ b/hooks/react-client/__tests__/useClickOutside.test.mjs @@ -0,0 +1,45 @@ +import { renderHook, act } from '@testing-library/react'; + +import useClickOutside from '@/hooks/react-client/useClickOutside'; + +describe('useClickOutside', () => { + it('should call the callback function when clicked outside the element', () => { + const fn = jest.fn(); + const { rerender } = renderHook(() => + useClickOutside({ current: null }, fn) + ); + + const mockEvent = new MouseEvent('click', { bubbles: true }); + const mockElement = document.createElement('div'); + + rerender({ current: mockElement }, fn); + + act(() => { + document.dispatchEvent(mockEvent); + }); + + setTimeout(() => { + expect(fn).toHaveBeenCalledTimes(1); + }, 1); + }); + + it('should not call the callback function when clicked inside the element', () => { + const fn = jest.fn(); + const { rerender } = renderHook(() => + useClickOutside({ current: null }, fn) + ); + + const mockEvent = new MouseEvent('click', { bubbles: true }); + const mockElement = document.createElement('div'); + const mockChildElement = document.createElement('button'); + mockElement.appendChild(mockChildElement); + + rerender({ current: mockElement }, fn); + + act(() => { + mockChildElement.dispatchEvent(mockEvent); + }); + + expect(fn).not.toHaveBeenCalled(); + }); +}); diff --git a/hooks/react-client/__tests__/useClientContext.test.mjs b/hooks/react-client/__tests__/useClientContext.test.mjs new file mode 100644 index 0000000000000..d51d016d67cb2 --- /dev/null +++ b/hooks/react-client/__tests__/useClientContext.test.mjs @@ -0,0 +1,26 @@ +import { renderHook } from '@testing-library/react'; + +import useClientContext from '@/hooks/react-client/useClientContext'; +import { MatterContext } from '@/providers/matterProvider'; + +describe('useClientContext', () => { + it('should return client context values', () => { + const mockContextValue = { + pathname: '/example-path', + frontmatter: { title: 'Example Title', date: '2024-02-17' }, + headings: ['Heading 1', 'Heading 2'], + readingTime: 5, + filename: 'example.md', + }; + + const wrapper = ({ children }) => ( + + {children} + + ); + + const { result } = renderHook(() => useClientContext(), { wrapper }); + + expect(result.current).toEqual(mockContextValue); + }); +}); diff --git a/hooks/react-client/__tests__/useCopyToClipboard.test.mjs b/hooks/react-client/__tests__/useCopyToClipboard.test.mjs index 8b9b8df04057c..9b7b7f62b877f 100644 --- a/hooks/react-client/__tests__/useCopyToClipboard.test.mjs +++ b/hooks/react-client/__tests__/useCopyToClipboard.test.mjs @@ -1,6 +1,6 @@ import { render, fireEvent, screen, act } from '@testing-library/react'; -import { useCopyToClipboard } from '..'; +import useCopyToClipboard from '@/hooks/react-client/useCopyToClipboard'; const mockWriteText = jest.fn(); const originalNavigator = { ...window.navigator }; diff --git a/hooks/react-client/__tests__/useDetectOS.test.mjs b/hooks/react-client/__tests__/useDetectOS.test.mjs index 86f6136aa1f18..f8129be8cbdc3 100644 --- a/hooks/react-client/__tests__/useDetectOS.test.mjs +++ b/hooks/react-client/__tests__/useDetectOS.test.mjs @@ -1,6 +1,6 @@ import { renderHook, waitFor } from '@testing-library/react'; -import { useDetectOS } from '..'; +import useDetectOS from '@/hooks/react-client/useDetectOS'; const windowsUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'; @@ -35,6 +35,7 @@ describe('useDetectOS', () => { expect(result.current).toStrictEqual({ os: 'WIN', bitness: 64, + architecture: '', }); }); }); @@ -53,6 +54,7 @@ describe('useDetectOS', () => { expect(result.current).toStrictEqual({ os: 'WIN', bitness: 64, + architecture: '', }); }); }); @@ -71,6 +73,7 @@ describe('useDetectOS', () => { expect(result.current).toStrictEqual({ os: 'MAC', bitness: 86, + architecture: '', }); }); }); diff --git a/hooks/react-client/__tests__/useKeyboardCommands.test.mjs b/hooks/react-client/__tests__/useKeyboardCommands.test.mjs new file mode 100644 index 0000000000000..dc52ed2acf454 --- /dev/null +++ b/hooks/react-client/__tests__/useKeyboardCommands.test.mjs @@ -0,0 +1,51 @@ +import { renderHook, act, fireEvent } from '@testing-library/react'; + +import useKeyboardCommands from '@/hooks/react-client/useKeyboardCommands'; + +describe('useKeyboardCommands', () => { + it('should call the callback function with the correct command', () => { + const fn = jest.fn(); + renderHook(props => useKeyboardCommands(props), { initialProps: fn }); + + act(() => { + fireEvent.keyDown(document, { key: 'k', metaKey: true }); + }); + expect(fn).toHaveBeenCalledWith('cmd-k'); + fn.mockClear(); + + act(() => { + fireEvent.keyDown(document, { key: 'Escape' }); + }); + expect(fn).toHaveBeenCalledWith('escape'); + fn.mockClear(); + + act(() => { + fireEvent.keyDown(document, { key: 'Enter' }); + }); + expect(fn).toHaveBeenCalledWith('enter'); + fn.mockClear(); + + act(() => { + fireEvent.keyDown(document, { key: 'ArrowDown' }); + }); + expect(fn).toHaveBeenCalledWith('down'); + fn.mockClear(); + + act(() => { + fireEvent.keyDown(document, { key: 'ArrowUp' }); + }); + expect(fn).toHaveBeenCalledWith('up'); + fn.mockClear(); + }); + + it('should not call the callback function for unsupported keys', () => { + const fn = jest.fn(); + renderHook(props => useKeyboardCommands(props), { initialProps: fn }); + + act(() => { + fireEvent.keyDown(document, { key: 'a' }); + }); + + expect(fn).not.toHaveBeenCalled(); + }); +}); diff --git a/hooks/react-client/__tests__/useMediaQuery.test.mjs b/hooks/react-client/__tests__/useMediaQuery.test.mjs index 6576853b75ac6..2b3024ebdecba 100644 --- a/hooks/react-client/__tests__/useMediaQuery.test.mjs +++ b/hooks/react-client/__tests__/useMediaQuery.test.mjs @@ -1,6 +1,6 @@ import { renderHook } from '@testing-library/react'; -import { useMediaQuery } from '..'; +import useMediaQuery from '@/hooks/react-client/useMediaQuery'; describe('useMediaQuery', () => { it('should check for matchMedia support', () => { diff --git a/hooks/react-client/__tests__/useNotification.test.mjs b/hooks/react-client/__tests__/useNotification.test.mjs index aa73f757082c3..92a26bf03bc0f 100644 --- a/hooks/react-client/__tests__/useNotification.test.mjs +++ b/hooks/react-client/__tests__/useNotification.test.mjs @@ -1,9 +1,8 @@ import { render } from '@testing-library/react'; +import useNotification from '@/hooks/react-client/useNotification'; import { NotificationProvider } from '@/providers/notificationProvider'; -import useNotification from '../useNotification'; - describe('useNotification', () => { it('should return the notification dispatch function', () => { // Arrange diff --git a/hooks/react-client/index.ts b/hooks/react-client/index.ts index a4423177fef31..c78f8d3cfbc38 100644 --- a/hooks/react-client/index.ts +++ b/hooks/react-client/index.ts @@ -6,3 +6,4 @@ export { default as useClientContext } from './useClientContext'; export { default as useKeyboardCommands } from './useKeyboardCommands'; export { default as useClickOutside } from './useClickOutside'; export { default as useBottomScrollListener } from './useBottomScrollListener'; +export { default as useNavigationState } from './useNavigationState'; diff --git a/hooks/react-client/useDetectOS.ts b/hooks/react-client/useDetectOS.ts index c0f2102c94812..aaf96bc149c68 100644 --- a/hooks/react-client/useDetectOS.ts +++ b/hooks/react-client/useDetectOS.ts @@ -4,33 +4,42 @@ import { useEffect, useState } from 'react'; import type { UserOS } from '@/types/userOS'; import { detectOS } from '@/util/detectOS'; +import { getArchitecture } from '@/util/getArchitecture'; import { getBitness } from '@/util/getBitness'; type UserOSState = { os: UserOS; bitness: number; + architecture: string; }; const useDetectOS = () => { const [userOSState, setUserOSState] = useState({ - os: 'OTHER', + os: 'LOADING', bitness: 86, + architecture: 'ARM', }); useEffect(() => { - getBitness().then(bitness => { - const userAgent = navigator?.userAgent; - - setUserOSState({ - os: detectOS(), - bitness: - bitness === '64' || - userAgent?.includes('WOW64') || - userAgent?.includes('Win64') - ? 64 - : 86, - }); - }); + Promise.all([getBitness(), getArchitecture()]).then( + ([bitness, architecture]) => { + const userAgent: string | undefined = + (typeof navigator === 'object' && navigator.userAgent) || ''; + // Default bitness if unable to determine + const defaultBitness: number = 86; + // Regex to detect 64-bit architecture in user agent + const bitnessRegex = /WOW64|Win64|x86_64|x86-64|x64_64|x64;|AMD64/; + + setUserOSState({ + os: detectOS(), + bitness: + bitness === '64' || bitnessRegex.test(userAgent) + ? 64 + : defaultBitness, + architecture: architecture ? architecture : '', + }); + } + ); }, []); return userOSState; diff --git a/hooks/react-client/useKeyboardCommands.ts b/hooks/react-client/useKeyboardCommands.ts index e6f9326fcf055..89b4513edbd85 100644 --- a/hooks/react-client/useKeyboardCommands.ts +++ b/hooks/react-client/useKeyboardCommands.ts @@ -6,7 +6,7 @@ type KeyboardCommandCallback = (key: KeyboardCommand) => void; const useKeyboardCommands = (fn: KeyboardCommandCallback) => { useEffect(() => { - document.addEventListener('keydown', event => { + const handleKeyDown = (event: KeyboardEvent) => { // Detect ⌘ + k on Mac, Ctrl + k on Windows if ((event.metaKey || event.ctrlKey) && event.key === 'k') { event.preventDefault(); @@ -27,9 +27,11 @@ const useKeyboardCommands = (fn: KeyboardCommandCallback) => { fn('up'); break; } - }); + }; - return () => document.removeEventListener('keydown', () => {}); + document.addEventListener('keydown', handleKeyDown); + + return () => document.removeEventListener('keydown', handleKeyDown); }, [fn]); }; diff --git a/hooks/react-client/useNavigationState.ts b/hooks/react-client/useNavigationState.ts new file mode 100644 index 0000000000000..bda6893d0ac76 --- /dev/null +++ b/hooks/react-client/useNavigationState.ts @@ -0,0 +1,41 @@ +'use client'; + +import type { RefObject } from 'react'; +import { useContext, useEffect } from 'react'; + +import { NavigationStateContext } from '@/providers/navigationStateProvider'; +import { debounce } from '@/util/debounce'; + +const useNavigationState = ( + id: string, + ref: RefObject, + debounceTime = 300 +) => { + const navigationState = useContext(NavigationStateContext); + + const handleScroll = debounce(() => { + if (ref.current) { + navigationState[id] = { + x: ref.current.scrollLeft, + y: ref.current.scrollTop, + }; + } + }, debounceTime); + + useEffect(() => { + const element = ref.current; + if (element) { + if (navigationState[id] && navigationState[id].y !== element.scrollTop) { + element.scroll({ top: navigationState[id].y, behavior: 'instant' }); + } + + element.addEventListener('scroll', handleScroll, { passive: true }); + + return () => element.removeEventListener('scroll', handleScroll); + } + // We need this effect to run only on mount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +}; + +export default useNavigationState; diff --git a/hooks/react-generic/useSiteNavigation.ts b/hooks/react-generic/useSiteNavigation.ts index ff08da9967b71..83b5403a4a883 100644 --- a/hooks/react-generic/useSiteNavigation.ts +++ b/hooks/react-generic/useSiteNavigation.ts @@ -1,5 +1,6 @@ import { useTranslations } from 'next-intl'; import type { RichTranslationValues } from 'next-intl'; +import type { HTMLAttributeAnchorTarget } from 'react'; import { siteNavigation } from '@/next.json.mjs'; import type { @@ -15,6 +16,7 @@ interface MappedNavigationEntry { items: Array<[string, MappedNavigationEntry]>; label: FormattedMessage; link: string; + target?: HTMLAttributeAnchorTarget | undefined; } // Provides Context replacement for variables within the Link. This is also something that is not going @@ -40,9 +42,13 @@ const useSiteNavigation = () => { t.rich(label, context[key] || {}); return Object.entries(entries).map( - ([key, { label, link, items }]): [string, MappedNavigationEntry] => [ + ([key, { label, link, items, target }]): [ + string, + MappedNavigationEntry, + ] => [ key, { + target, label: label ? getFormattedMessage(label, key) : '', link: link ? replaceLinkWithContext(link, context[key]) : '', items: items ? mapNavigationEntries(items, context) : [], diff --git a/i18n/config.json b/i18n/config.json index 9e453d74863bb..1e18243ff53ea 100644 --- a/i18n/config.json +++ b/i18n/config.json @@ -119,6 +119,16 @@ "enabled": false, "default": false }, + { + "code": "ro", + "localName": "Română", + "name": "Romanian", + "langDir": "ltr", + "dateFormat": "DD-MM-YYYY", + "hrefLang": "ro", + "enabled": false, + "default": false + }, { "code": "ru", "localName": "Русский", @@ -168,5 +178,15 @@ "hrefLang": "zh-Hant", "enabled": false, "default": false + }, + { + "code": "pl", + "localName": "Polski", + "name": "Polish", + "langDir": "ltr", + "dateFormat": "DD/MM/YYYY", + "hrefLang": "pl", + "enabled": false, + "default": false } ] diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/ar.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/de.json b/i18n/locales/de.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/de.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 17ab912257839..6d3f200f7ff38 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -49,8 +49,8 @@ "asynchronousFlowControl": "Asynchronous flow control", "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", + "discoverJavascriptTimers": "Discover JavaScript Timers", + "eventLoopTimersAndNexttick": "The Node.js Event Loop", "theNodejsEventEmitter": "The Node.js Event Emitter", "understandingProcessnexttick": "Understanding process.nextTick()", "understandingSetimmediate": "Understanding setImmediate()", @@ -66,7 +66,7 @@ "readingFilesWithNodejs": "Reading files with Node.js", "writingFilesWithNodejs": "Writing files with Node.js", "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" + "workingWithDifferentFilesystems": "How to work with Different Filesystems" } }, "commandLine": { @@ -97,21 +97,29 @@ "poorPerformance": "Poor Performance", "flameGraphs": "Flame Graphs" } + }, + "testRunner": { + "links": { + "testRunner": "Test Runner", + "introduction": "Discovering Node.js's test runner", + "usingTestRunner": "Using Node.js's test runner" + } } }, "about": { "links": { "about": "About Node.js", "aboutSide": "About Node.js®", + "branding": "Branding of Node.js", "governance": "Project Governance", - "releases": "Previous Releases", + "releases": "Node.js Releases", "security": "Security Reporting" } }, "getInvolved": { "links": { "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", + "collabSummit": "Collaboration Summit", "upcomingEvents": "Upcoming Events", "contribute": "Contribute to Node.js", "codeOfConduct": "Code of Conduct" @@ -120,7 +128,7 @@ }, "downloadList": { "links": { - "previousReleases": "Previous Releases", + "previousReleases": "Node.js Releases", "packageManager": "Installing Node.js via package manager", "shaSums": { "title": "Signed SHASUMS for release files", @@ -267,7 +275,7 @@ "download": { "selectCategory": "Categories", "categories": { - "download": "Prebuilt Installer", + "prebuilt-installer": "Prebuilt Installer", "prebuilt-binaries": "Prebuilt Binaries", "package-manager": "Package Manager", "source-code": "Source Code" @@ -283,7 +291,9 @@ "platform": "Platform" }, "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." + "systemManagerWarning": "is not a Node.js package manager. Please ensure you already have {packageManager} installed.", + "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project.", + "communityWarningReport": "If you encounter issues, please reach out to the package manager's maintainers." } } } diff --git a/i18n/locales/es.json b/i18n/locales/es.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/es.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/fa.json b/i18n/locales/fa.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/fa.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/fr.json b/i18n/locales/fr.json index 8029b86ecee00..8160a9b407efb 100644 --- a/i18n/locales/fr.json +++ b/i18n/locales/fr.json @@ -49,8 +49,8 @@ "asynchronousFlowControl": "Contrôle de l'exécution asynchrone", "overviewOfBlockingVsNonBlocking": "Vue d'ensemble des opérations bloquantes vs non bloquantes", "javascriptAsynchronousProgrammingAndCallbacks": "Programmation asynchrone en JavaScript et Callbacks", - "discoverJavaScriptTimers": "Découvrez les minuteurs JavaScript", - "theNodejsEventLoop": "La boucle d'évènement Node.js", + "discoverJavascriptTimers": "Découvrez les minuteurs JavaScript", + "eventLoopTimersAndNexttick": "La boucle d'évènement Node.js", "theNodejsEventEmitter": "L'émetteur d'événement Node.js", "understandingProcessnexttick": "Comprendre process.nextTick()", "understandingSetimmediate": "Comprendre setImmediate()", @@ -66,7 +66,7 @@ "readingFilesWithNodejs": "Lire des fichiers avec Node.js", "writingFilesWithNodejs": "Écrire des fichiers avec Node.js", "workingWithFoldersInNodejs": "Travailler avec des dossiers dans Node.js", - "howToWorkWithFileSystems": "Comment travailler avec différents systèmes de fichiers" + "workingWithDifferentFilesystems": "Comment travailler avec différents systèmes de fichiers" } }, "commandLine": { @@ -97,14 +97,22 @@ "poorPerformance": "Live debugging", "flameGraphs": "Flame Graphs" } + }, + "testRunner": { + "links": { + "testRunner": "Exécuteur de test", + "introduction": "Découverte de l'exécuteur de tests de Node.js", + "usingTestRunner": "Utilisation de l'exécuteur de tests de Node.js" + } } }, "about": { "links": { "about": "À propos de Node.js", "aboutSide": "À propos de Node.js®", + "branding": "L'image de marque de Node.js", "governance": "Gouvernance du Projet", - "releases": "Versions antérieures", + "releases": "Versions de Node.js", "security": "Rapport de sécurité" } }, @@ -120,7 +128,7 @@ }, "downloadList": { "links": { - "previousReleases": "Versions antérieures", + "previousReleases": "Versions de Node.js", "packageManager": "Installer Node.js via le gestionnaire de paquets", "shaSums": { "title": "SHASUMS signés pour les fichiers des versions", @@ -267,7 +275,7 @@ "download": { "selectCategory": "Catégories", "categories": { - "download": "Installateur pré-construit", + "prebuilt-installer": "Installateur préconstruit", "prebuilt-binaries": "Binaires préconstruits", "package-manager": "Gestionnaire de paquets", "source-code": "Code source" @@ -283,7 +291,9 @@ "platform": "Plateforme" }, "codeBox": { - "communityWarning": "Les gestionnaires de paquets et leurs scripts d'installation ne sont pas maintenus par le projet Node.js." + "systemManagerWarning": "n'est pas un gestionnaire de paquets Node.js. Veuillez vous assurer que {packageManager} est déjà installé.", + "communityWarning": "Les gestionnaires de paquets et leurs scripts d'installation ne sont pas maintenus par le projet Node.js.", + "communityWarningReport": "Si vous rencontrez des problèmes, veuillez contacter les responsables du gestionnaire de paquets." } } } diff --git a/i18n/locales/id.json b/i18n/locales/id.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/id.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/it.json b/i18n/locales/it.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/it.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/ja.json b/i18n/locales/ja.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/ja.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/ka.json b/i18n/locales/ka.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/ka.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/ko.json b/i18n/locales/ko.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/ko.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/pt-br.json b/i18n/locales/pt-br.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/pt-br.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/ru.json b/i18n/locales/ru.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/ru.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/tr.json b/i18n/locales/tr.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/tr.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/uk.json b/i18n/locales/uk.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/uk.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/vi.json b/i18n/locales/vi.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/vi.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/i18n/locales/zh-cn.json b/i18n/locales/zh-cn.json deleted file mode 100644 index 17ab912257839..0000000000000 --- a/i18n/locales/zh-cn.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "components": { - "containers": { - "footer": { - "links": { - "trademarkPolicy": "Trademark Policy", - "privacyPolicy": "Privacy Policy", - "codeOfConduct": "Code of Conduct", - "security": "Security Policy", - "openJS": "OpenJS Foundation" - } - }, - "navBar": { - "links": { - "about": "About", - "download": "Download", - "docs": "Docs", - "guides": "Guides", - "learn": "Learn", - "security": "Security", - "certification": "Certification", - "blog": "Blog" - } - } - }, - "navigation": { - "learn": { - "gettingStarted": { - "links": { - "gettingStarted": "Getting Started", - "introductionToNodejs": "Introduction to Node.js", - "howToInstallNodejs": "How to install Node.js", - "howMuchJavascriptDoYouNeedToKnowToUseNodejs": "How much JavaScript do you need to know to use Node.js?", - "differencesBetweenNodejsAndTheBrowser": "Differences between Node.js and the Browser", - "theV8JavascriptEngine": "The V8 JavaScript Engine", - "anIntroductionToTheNpmPackageManager": "An introduction to the npm package manager", - "ecmascript2015Es6AndBeyond": "ECMAScript 2015 (ES6) and beyond", - "nodejsTheDifferenceBetweenDevelopmentAndProduction": "Node.js, the difference between development and production", - "nodejsWithTypescript": "Node.js with TypeScript", - "nodejsWithWebassembly": "Node.js with WebAssembly", - "debugging": "Debugging Node.js", - "profiling": "Profiling Node.js Applications", - "securityBestPractices": "Security Best Practices" - } - }, - "asynchronousWork": { - "links": { - "asynchronousWork": "Asynchronous Work", - "asynchronousFlowControl": "Asynchronous flow control", - "overviewOfBlockingVsNonBlocking": "Overview of Blocking vs Non-Blocking", - "javascriptAsynchronousProgrammingAndCallbacks": "JavaScript Asynchronous Programming and Callbacks", - "discoverJavaScriptTimers": "Discover JavaScript Timers", - "theNodejsEventLoop": "The Node.js Event Loop", - "theNodejsEventEmitter": "The Node.js Event Emitter", - "understandingProcessnexttick": "Understanding process.nextTick()", - "understandingSetimmediate": "Understanding setImmediate()", - "dontBlockTheEventLoop": "Don't Block the Event Loop" - } - }, - "manipulatingFiles": { - "links": { - "manipulatingFiles": "Manipulating Files", - "nodejsFileStats": "Node.js file stats", - "nodejsFilePaths": "Node.js File Paths", - "workingWithFileDescriptorsInNodejs": "Working with file descriptors in Node.js", - "readingFilesWithNodejs": "Reading files with Node.js", - "writingFilesWithNodejs": "Writing files with Node.js", - "workingWithFoldersInNodejs": "Working with folders in Node.js", - "howToWorkWithFileSystems": "How to work with Different Filesystems" - } - }, - "commandLine": { - "links": { - "commandLine": "Command Line", - "runNodejsScriptsFromTheCommandLine": "Run Node.js scripts from the command line", - "howToReadEnvironmentVariablesFromNodejs": "How to read environment variables from Node.js", - "howToUseTheNodejsRepl": "How to use the Node.js REPL", - "outputToTheCommandLineUsingNodejs": "Output to the command line using Node.js", - "acceptInputFromTheCommandLineInNodejs": "Accept input from the command line in Node.js" - } - }, - "modules": { - "links": { - "modules": "Modules", - "publishingNodeApiModules": "How to publish a Node-API package", - "anatomyOfAnHttpTransaction": "Anatomy of an HTTP Transaction", - "abiStability": "ABI Stability", - "backpressuringInStreams": "Backpressuring in Streams" - } - }, - "diagnostics": { - "links": { - "diagnostics": "Diagnostics", - "userJourney": "User Journey", - "memory": "Memory", - "liveDebugging": "Live Debugging", - "poorPerformance": "Poor Performance", - "flameGraphs": "Flame Graphs" - } - } - }, - "about": { - "links": { - "about": "About Node.js", - "aboutSide": "About Node.js®", - "governance": "Project Governance", - "releases": "Previous Releases", - "security": "Security Reporting" - } - }, - "getInvolved": { - "links": { - "getInvolved": "Get Involved", - "collabSummit": "Collaborator Summit", - "upcomingEvents": "Upcoming Events", - "contribute": "Contribute to Node.js", - "codeOfConduct": "Code of Conduct" - } - } - }, - "downloadList": { - "links": { - "previousReleases": "Previous Releases", - "packageManager": "Installing Node.js via package manager", - "shaSums": { - "title": "Signed SHASUMS for release files", - "howToVerify": " (How to verify)" - }, - "allDownloads": "All download options", - "nightlyReleases": "Nightly builds", - "unofficialBuilds": "Unofficial builds", - "buildingFromSource": "Building Node.js from source on supported platforms", - "installingOnLinux": "Installing Node.js via binary archive", - "installingOnWsl": "Install on Windows Subsystem for Linux (WSL)" - } - }, - "downloadReleasesTable": { - "changelog": "Changelog", - "releases": "Releases", - "docs": "Docs" - }, - "pagination": { - "next": "Next", - "previous": "Previous" - }, - "common": { - "breadcrumbs": { - "navigateToHome": "Navigate to Home" - }, - "crossLink": { - "previous": "Prev", - "next": "Next" - }, - "codebox": { - "copy": "Copy to clipboard", - "copied": "Copied to clipboard!" - }, - "pagination": { - "prev": "Previous", - "prevAriaLabel": "Previous page", - "next": "Next", - "nextAriaLabel": "Next page", - "defaultLabel": "Pagination", - "pageLabel": "Go to page {pageNumber}" - }, - "sidebar": { - "title": "Change page" - }, - "languageDropdown": { - "label": "Choose Language" - }, - "themeToggle": { - "label": "Toggle Dark Mode" - } - }, - "mdx": { - "upcomingEvents": { - "defaultTitle": "No Upcoming Event" - } - }, - "metabar": { - "lastUpdated": "Last Updated", - "readingTime": "Reading Time", - "addedIn": "Added In", - "author": "Author", - "authors": "Authors", - "contribute": "Contribute", - "contributeText": "Edit this page", - "viewAs": "View as", - "tableOfContents": "Table of Contents" - }, - "downloads": { - "changelogModal": { - "startContributing": "Start Contributing" - } - }, - "search": { - "searchBox": { - "placeholder": "Start typing..." - }, - "seeAll": { - "text": "See all {count} results" - }, - "searchError": { - "text": "An error occurred while searching. Please try again later." - }, - "poweredBy": { - "text": "Powered by" - }, - "noResults": { - "text": "No results found for \"{query}\"." - }, - "emptyState": { - "text": "Search something..." - }, - "searchPage": { - "title": "You're searching: {query}" - } - }, - "blog": { - "blogHeader": { - "subtitle": "The latest Node.js news, case studies, tutorials, and resources.", - "rssLink": "RSS feed" - } - } - }, - "layouts": { - "blogPost": { - "author": { - "byLine": "{author, select, null {} other {By {author}, }}" - } - }, - "blogIndex": { - "categoryName": "{category, select, all {Blog} other {{category} Blog Posts}}" - }, - "blog": { - "title": "Blog", - "selectCategory": "Categories", - "categories": { - "all": "Everything", - "announcements": "Announcements", - "release": "Releases", - "vulnerability": "Vulnerabilities", - "advisory-board": "Advisory Board", - "community": "Community", - "feature": "Feature", - "module": "Module", - "npm": "npm", - "uncategorized": "Uncategorized", - "video": "Video", - "weekly": "Weekly Updates", - "wg": "Working Groups", - "events": "Events" - } - }, - "error": { - "notFound": { - "title": "Page could not be found", - "description": "Sorry, we couldn't find the page you're after! Try starting again from the homepage." - }, - "internalServerError": { - "title": "Internal Server Error", - "description": "This page has thrown a non-recoverable error." - }, - "backToHome": "Back to Home" - }, - "download": { - "selectCategory": "Categories", - "categories": { - "download": "Prebuilt Installer", - "prebuilt-binaries": "Prebuilt Binaries", - "package-manager": "Package Manager", - "source-code": "Source Code" - }, - "buttons": { - "prebuilt": "Download Node.js {version}", - "source": "Download Node.js {version} source" - }, - "dropdown": { - "bitness": "Bitness", - "os": "Operating System", - "version": "Version", - "platform": "Platform" - }, - "codeBox": { - "communityWarning": "Package managers and their installation scripts are not maintained by the Node.js project." - } - } - } -} diff --git a/instrumentation.ts b/instrumentation.ts new file mode 100644 index 0000000000000..dba20061819cd --- /dev/null +++ b/instrumentation.ts @@ -0,0 +1,20 @@ +import { init } from '@sentry/nextjs'; + +import { + SENTRY_CAPTURE_RATE, + SENTRY_DSN, + SENTRY_ENABLE, +} from '@/sentry.constants.mjs'; + +export function register() { + if (process.env.NEXT_RUNTIME === 'nodejs') { + init({ + // Only run Sentry on Vercel Environment + enabled: SENTRY_ENABLE, + // Provide Sentry's Secret Key + dsn: SENTRY_DSN, + // Percentage of events to send to Sentry (1% of them) (for performance metrics) + tracesSampleRate: SENTRY_CAPTURE_RATE, + }); + } +} diff --git a/layouts/About.tsx b/layouts/About.tsx index bbb4623284ed6..ef2258cab5999 100644 --- a/layouts/About.tsx +++ b/layouts/About.tsx @@ -13,11 +13,13 @@ const AboutLayout: FC = ({ children }) => ( -
{children}
+
+
{children}
- + +
- +
); diff --git a/layouts/Base.tsx b/layouts/Base.tsx index 1d93321cb23dc..7176b805e5206 100644 --- a/layouts/Base.tsx +++ b/layouts/Base.tsx @@ -2,13 +2,16 @@ import type { FC, PropsWithChildren } from 'react'; +import { NavigationStateProvider } from '@/providers/navigationStateProvider'; import { NotificationProvider } from '@/providers/notificationProvider'; import styles from './layouts.module.css'; const BaseLayout: FC = ({ children }) => ( - -
{children}
+ + +
{children}
+
); diff --git a/layouts/Default.tsx b/layouts/Default.tsx index 3c538cba716c1..ad903411dadca 100644 --- a/layouts/Default.tsx +++ b/layouts/Default.tsx @@ -12,7 +12,9 @@ const DefaultLayout: FC = ({ children }) => ( -
{children}
+
+
{children}
+
diff --git a/layouts/Home.tsx b/layouts/Home.tsx index a94928a064e87..9a95e136b6c05 100644 --- a/layouts/Home.tsx +++ b/layouts/Home.tsx @@ -1,12 +1,13 @@ import type { FC, PropsWithChildren } from 'react'; +import GlowingBackdrop from '@/components/Common/GlowingBackdrop'; import CenteredLayout from '@/layouts/Centered'; import styles from './layouts.module.css'; const HomeLayout: FC = ({ children }) => ( -
+
{children}
diff --git a/layouts/Learn.tsx b/layouts/Learn.tsx index 8cb881c885707..6b4f6763f1925 100644 --- a/layouts/Learn.tsx +++ b/layouts/Learn.tsx @@ -14,15 +14,17 @@ const LearnLayout: FC = ({ children }) => ( -
- {children} +
+
+ {children} - -
+ +
- + +
- + ); diff --git a/layouts/Post.tsx b/layouts/Post.tsx index c2f735207a97a..23a3d7d0c3b54 100644 --- a/layouts/Post.tsx +++ b/layouts/Post.tsx @@ -19,6 +19,7 @@ const PostLayout: FC = ({ children }) => { const { frontmatter } = useClientContext(); const authors = mapAuthorToCardAuthors(frontmatter.author); + const type = mapBlogCategoryToPreviewType(frontmatter.category); return ( diff --git a/layouts/layouts.module.css b/layouts/layouts.module.css index 5c6071756eb5f..5c2197b363535 100644 --- a/layouts/layouts.module.css +++ b/layouts/layouts.module.css @@ -7,40 +7,54 @@ .articleLayout { @apply mx-auto - grid + block w-full max-w-8xl - grid-rows-[1fr] - overflow-hidden - grid-areas-[sidebar_main_metabar,sidebar_footer_metabar] - sm:grid-cols-[theme(spacing.52)_1fr_theme(spacing.52)] - xl:grid-cols-[theme(spacing.80)_1fr_theme(spacing.80)] - xs:m-0 - xs:block - xs:overflow-auto; + overflow-auto + sm:grid + sm:grid-cols-[theme(spacing.52)_1fr] + sm:grid-rows-[1fr] + sm:overflow-hidden + sm:grid-areas-[sidebar_main,sidebar_footer] + md:grid-cols-[theme(spacing.64)_1fr] + lg:grid-cols-[theme(spacing.52)_1fr_theme(spacing.52)] + lg:grid-areas-[sidebar_main_metabar,sidebar_footer_metabar] + xl:grid-cols-[theme(spacing.80)_1fr_theme(spacing.80)]; > *:nth-child(1) { @apply grid-in-[sidebar]; } > *:nth-child(2) { - @apply overflow-y-auto - overflow-x-hidden - bg-gradient-subtle - p-12 - grid-in-[main] - dark:bg-gradient-subtle-dark - xl:px-18 - xs:bg-none - xs:p-4 - xs:dark:bg-none; - } + @apply contents + overflow-y-scroll + sm:max-lg:block; - > *:nth-child(3) { - @apply grid-in-[metabar]; + > *:first-child { + @apply overflow-y-auto + overflow-x-hidden + p-4 + grid-in-[main] + motion-safe:scroll-smooth + sm:bg-gradient-subtle + sm:bg-fixed + sm:p-12 + sm:dark:bg-gradient-subtle-dark + xl:px-18; + } + + > *:last-child { + @apply mt-8 + border-t + grid-in-[metabar] + sm:mt-0 + lg:max-w-xs + lg:border-l + lg:border-t-0; + } } - > *:nth-child(4) { + > *:nth-child(3) { @apply sticky bottom-0 flex @@ -61,6 +75,7 @@ .centeredLayout { @apply flex w-full + min-w-0 items-center justify-center px-4 @@ -105,7 +120,7 @@ text-sm text-neutral-800 dark:text-neutral-400 - xs:text-xs; + max-xs:text-xs; sup { @apply cursor-help; @@ -116,7 +131,8 @@ &:nth-of-type(2) { @apply flex - max-w-md + min-w-0 + max-w-full flex-[1_1] flex-col items-center @@ -125,7 +141,9 @@ lg:max-w-3xl; > div { - @apply w-fit; + @apply w-full + max-w-md + md:max-w-full; } > p { @@ -145,8 +163,8 @@ justify-center bg-gradient-subtle dark:bg-gradient-subtle-dark - xs:bg-none - xs:dark:bg-none; + max-xs:bg-none + max-xs:dark:bg-none; main { @apply max-w-5xl @@ -185,10 +203,10 @@ w-full max-w-8xl grid-rows-[1fr] + max-xs:m-0 + max-xs:block sm:grid-cols-[1fr_theme(spacing.52)] - xl:grid-cols-[1fr_theme(spacing.80)] - xs:m-0 - xs:block; + xl:grid-cols-[1fr_theme(spacing.80)]; > *:nth-child(1) { @apply flex @@ -201,18 +219,29 @@ py-14 dark:border-l-neutral-900 dark:bg-gradient-subtle-dark + max-xs:border-l-0 + max-xs:bg-none + max-xs:pb-4 + max-xs:dark:bg-none md:px-14 - lg:px-28 - xs:border-l-0 - xs:bg-none - xs:pb-4 - xs:dark:bg-none; + lg:px-28; main { @apply max-w-[660px] - gap-4; + gap-4 + break-all + lg:break-normal; } } + + > *:nth-child(2) { + @apply mt-8 + border-t + xs:mt-0 + xs:max-w-xs + xs:border-l + xs:border-t-0; + } } .postLayout { diff --git a/navigation.json b/navigation.json index 3b5b9baac3064..d99f32cc3cf2b 100644 --- a/navigation.json +++ b/navigation.json @@ -18,11 +18,13 @@ }, "docs": { "link": "https://nodejs.org/docs/latest/api/", - "label": "components.containers.navBar.links.docs" + "label": "components.containers.navBar.links.docs", + "target": "_blank" }, "certification": { "link": "https://openjsf.org/certification", - "label": "components.containers.navBar.links.certification" + "label": "components.containers.navBar.links.certification", + "target": "_blank" } }, "footerLinks": [ @@ -39,7 +41,7 @@ "text": "components.containers.footer.links.codeOfConduct" }, { - "link": "https://github.com/nodejs/node/blob/HEAD/SECURITY.md#security", + "link": "https://github.com/nodejs/node/security/policy", "text": "components.containers.footer.links.security" }, { @@ -65,7 +67,7 @@ }, { "icon": "slack", - "link": "https://openjs-foundation.slack.com/join/shared_invite/zt-238w9sb83-Qk9NcsrEMomq94Y~3gW8EQ#/shared-invite/email", + "link": "https://slack-invite.openjsf.org/", "alt": "Slack" }, { @@ -82,15 +84,19 @@ "link": "/about", "label": "components.navigation.about.links.aboutSide" }, + "branding": { + "link": "/about/branding", + "label": "components.navigation.about.links.branding" + }, "governance": { "link": "/about/governance", "label": "components.navigation.about.links.governance" }, - "releases": { + "previousReleases": { "link": "/about/previous-releases", "label": "components.navigation.about.links.releases" }, - "security": { + "securityReporting": { "link": "/about/security-reporting", "label": "components.navigation.about.links.security" } @@ -107,7 +113,7 @@ "link": "/about/get-involved/collab-summit", "label": "components.navigation.getInvolved.links.collabSummit" }, - "upcomingEvents": { + "events": { "link": "/about/get-involved/events", "label": "components.navigation.getInvolved.links.upcomingEvents" }, @@ -116,7 +122,7 @@ "label": "components.navigation.getInvolved.links.contribute" }, "codeOfConduct": { - "link": "https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md", + "link": "https://github.com/nodejs/admin/blob/main/CODE_OF_CONDUCT.md", "label": "components.navigation.getInvolved.links.codeOfConduct" } } @@ -195,13 +201,13 @@ "link": "/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks", "label": "components.navigation.learn.asynchronousWork.links.javascriptAsynchronousProgrammingAndCallbacks" }, - "discoverJavaScriptTimers": { + "discoverJavascriptTimers": { "link": "/learn/asynchronous-work/discover-javascript-timers", - "label": "components.navigation.learn.asynchronousWork.links.discoverJavaScriptTimers" + "label": "components.navigation.learn.asynchronousWork.links.discoverJavascriptTimers" }, - "theNodejsEventLoop": { + "eventLoopTimersAndNexttick": { "link": "/learn/asynchronous-work/event-loop-timers-and-nexttick", - "label": "components.navigation.learn.asynchronousWork.links.theNodejsEventLoop" + "label": "components.navigation.learn.asynchronousWork.links.eventLoopTimersAndNexttick" }, "theNodejsEventEmitter": { "link": "/learn/asynchronous-work/the-nodejs-event-emitter", @@ -248,9 +254,9 @@ "link": "/learn/manipulating-files/working-with-folders-in-nodejs", "label": "components.navigation.learn.manipulatingFiles.links.workingWithFoldersInNodejs" }, - "howToWorkWithFileSystems": { + "workingWithDifferentFilesystems": { "link": "/learn/manipulating-files/working-with-different-filesystems", - "label": "components.navigation.learn.manipulatingFiles.links.howToWorkWithFileSystems" + "label": "components.navigation.learn.manipulatingFiles.links.workingWithDifferentFilesystems" } } }, @@ -324,48 +330,61 @@ "label": "components.navigation.learn.diagnostics.links.flameGraphs" } } - } - } - }, - "download": { - "items": { - "shaSums": { - "link": "https://nodejs.org/dist/{nodeVersion}/SHASUMS256.txt.asc", - "label": "components.downloadList.links.shaSums.title" - }, - "allDownloads": { - "link": "https://nodejs.org/dist/{nodeVersion}/", - "label": "components.downloadList.links.allDownloads" - }, - "packageManager": { - "link": "/download/package-manager", - "label": "components.downloadList.links.packageManager" - }, - "previousReleases": { - "link": "/about/previous-releases", - "label": "components.downloadList.links.previousReleases" }, - "nightlyReleases": { - "link": "https://nodejs.org/download/nightly/", - "label": "components.downloadList.links.nightlyReleases" - }, - "unofficialBuilds": { - "link": "https://unofficial-builds.nodejs.org/download/", - "label": "components.downloadList.links.unofficialBuilds" - }, - "buildingFromSource": { - "link": "https://github.com/nodejs/node/blob/main/BUILDING.md#building-nodejs-on-supported-platforms", - "label": "components.downloadList.links.buildingFromSource" - }, - "installingOnLinux": { - "link": "https://github.com/nodejs/help/wiki/Installation", - "label": "components.downloadList.links.installingOnLinux" - }, - "installingOnWsl": { - "link": "https://github.com/nodejs/node/blob/main/BUILDING.md#building-nodejs-on-supported-platforms", - "label": "components.downloadList.links.installingOnWsl" + "testRunner": { + "label": "components.navigation.learn.testRunner.links.testRunner", + "items": { + "introduction": { + "link": "/learn/test-runner/introduction", + "label": "components.navigation.learn.testRunner.links.introduction" + }, + "usingTestRunner": { + "link": "/learn/test-runner/using-test-runner", + "label": "components.navigation.learn.testRunner.links.usingTestRunner" + } + } } } } + }, + "download": { + "items": { + "shaSums": { + "link": "https://nodejs.org/dist/{nodeVersion}/SHASUMS256.txt.asc", + "label": "components.downloadList.links.shaSums.title" + }, + "allDownloads": { + "link": "https://nodejs.org/dist/{nodeVersion}/", + "label": "components.downloadList.links.allDownloads" + }, + "packageManager": { + "link": "/download/package-manager", + "label": "components.downloadList.links.packageManager" + }, + "previousReleases": { + "link": "/about/previous-releases", + "label": "components.downloadList.links.previousReleases" + }, + "nightlyReleases": { + "link": "https://nodejs.org/download/nightly/", + "label": "components.downloadList.links.nightlyReleases" + }, + "unofficialBuilds": { + "link": "https://unofficial-builds.nodejs.org/download/", + "label": "components.downloadList.links.unofficialBuilds" + }, + "buildingFromSource": { + "link": "https://github.com/nodejs/node/blob/main/BUILDING.md#building-nodejs-on-supported-platforms", + "label": "components.downloadList.links.buildingFromSource" + }, + "installingOnLinux": { + "link": "https://github.com/nodejs/help/wiki/Installation", + "label": "components.downloadList.links.installingOnLinux" + }, + "installingOnWsl": { + "link": "https://github.com/nodejs/node/blob/main/BUILDING.md#building-nodejs-on-supported-platforms", + "label": "components.downloadList.links.installingOnWsl" + } + } } } diff --git a/next-data/changelogData.ts b/next-data/changelogData.ts new file mode 100644 index 0000000000000..1d3db6f8f18bf --- /dev/null +++ b/next-data/changelogData.ts @@ -0,0 +1,25 @@ +import { + ENABLE_STATIC_EXPORT, + IS_DEVELOPMENT, + NEXT_DATA_URL, + VERCEL_ENV, +} from '@/next.constants.mjs'; + +const getChangelogData = (version: string): Promise => { + // When we're using Static Exports the Next.js Server is not running (during build-time) + // hence the self-ingestion APIs will not be available. In this case we want to load + // the data directly within the current thread, which will anyways be loaded only once + // We use lazy-imports to prevent `provideChangelogData` from executing on import + if (ENABLE_STATIC_EXPORT || (!IS_DEVELOPMENT && !VERCEL_ENV)) { + return import('@/next-data/providers/changelogData').then( + ({ provideChangelogData }) => provideChangelogData(version) + ); + } + + // When we're on RSC with Server capabilities we prefer using Next.js Data Fetching + // as this will load cached data from the server instead of generating data on the fly + // this is extremely useful for ISR and SSG as it will not generate this data on every request + return fetch(`${NEXT_DATA_URL}changelog-data/${version}`).then(r => r.json()); +}; + +export default getChangelogData; diff --git a/next-data/generators/__tests__/releaseData.test.mjs b/next-data/generators/__tests__/releaseData.test.mjs new file mode 100644 index 0000000000000..0cdfb5b47b0f9 --- /dev/null +++ b/next-data/generators/__tests__/releaseData.test.mjs @@ -0,0 +1,53 @@ +/** + * Force jest to run this test in a Node.js environment + * 'cause we will have "ReferenceError: TextEncoder is not defined" + * @jest-environment node + */ +import nodevu from '@nodevu/core'; + +import generateReleaseData from '@/next-data/generators/releaseData.mjs'; + +jest.mock('@nodevu/core'); + +describe('generateReleaseData', () => { + test('generates release data with correct status', async () => { + const mockNodevuOutput = { + 14: { + releases: { + '14.0.0': { + semver: { major: 14, raw: '14.0.0' }, + dependencies: { npm: '6.14.10', v8: '8.0.276.20' }, + releaseDate: '2021-04-20', + modules: { version: '83' }, + }, + }, + support: { + phases: { + dates: { + start: '2021-10-26', + lts: '2022-10-18', + maintenance: '2023-10-18', + end: '2024-10-18', + }, + }, + }, + }, + }; + nodevu.mockResolvedValue(mockNodevuOutput); + + const result = await generateReleaseData(); + expect(result).toHaveLength(1); + const release = result[0]; + + expect(release.major).toBe(14); + expect(release.version).toBe('14.0.0'); + expect(release.versionWithPrefix).toBe('v14.0.0'); + expect(release.codename).toBe(''); + expect(release.isLts).toBe(true); + expect(release.npm).toBe('6.14.10'); + expect(release.v8).toBe('8.0.276.20'); + expect(release.releaseDate).toBe('2021-04-20'); + expect(release.modules).toBe('83'); + expect(release.status).toBe('LTS'); + }); +}); diff --git a/next-data/generators/__tests__/websiteFeeds.test.mjs b/next-data/generators/__tests__/websiteFeeds.test.mjs new file mode 100644 index 0000000000000..c3d5e1feaadc9 --- /dev/null +++ b/next-data/generators/__tests__/websiteFeeds.test.mjs @@ -0,0 +1,53 @@ +import generateWebsiteFeeds from '@/next-data/generators/websiteFeeds'; + +describe('generateWebsiteFeeds', () => { + jest.mock('feed'); + jest.mock('../../../next.constants.mjs', () => ({ + BASE_URL: 'https://example.com', + BASE_PATH: '/example', + })); + jest.mock('../../../next.json.mjs', () => ({ + siteConfig: { + rssFeeds: [ + { + category: 'all', + title: 'Node.js Blog', + description: 'Node.js Blog Feed', + file: 'blog.xml', + }, + ], + }, + })); + + it('generates website feeds with correct data', () => { + const blogData = { + posts: [ + { + slug: '/post-1', + title: 'Post 1', + author: 'Author 1', + date: '2024-02-18', + categories: ['all'], + }, + ], + }; + + const result = generateWebsiteFeeds(blogData); + expect(result.size).toBe(3); + + const blogFeed = result.get('blog.xml'); + + expect(blogFeed.options.id).toBe('blog.xml'); + expect(blogFeed.options.title).toBe('Node.js Blog'); + expect(blogFeed.options.language).toBe('en'); + expect(blogFeed.options.link).toBe('https://nodejs.org/en/feed/blog.xml'); + + expect(blogFeed.items.length).toBe(1); + const feedItem = blogFeed.items[0]; + expect(feedItem.id).toBe('/post-1'); + expect(feedItem.title).toBe('Post 1'); + expect(feedItem.author).toBe('Author 1'); + expect(feedItem.date).toEqual(new Date('2024-02-18')); + expect(feedItem.link).toBe('https://nodejs.org/en/post-1'); + }); +}); diff --git a/next-data/generators/blogData.mjs b/next-data/generators/blogData.mjs index a084a212402e1..c03e23c62a48a 100644 --- a/next-data/generators/blogData.mjs +++ b/next-data/generators/blogData.mjs @@ -27,6 +27,7 @@ const getFrontMatter = (filename, source) => { const { title = 'Untitled', author = 'The Node.js Project', + username, date = new Date(), category = 'uncategorized', } = graymatter(source).data; @@ -47,7 +48,7 @@ const getFrontMatter = (filename, source) => { // this is the url used for the blog post it based on the category and filename const slug = `/blog/${category}/${basename(filename, extname(filename))}`; - return { title, author, date: new Date(date), categories, slug }; + return { title, author, username, date: new Date(date), categories, slug }; }; /** diff --git a/next-data/generators/changelogData.mjs b/next-data/generators/changelogData.mjs new file mode 100644 index 0000000000000..f0cb12f3dac75 --- /dev/null +++ b/next-data/generators/changelogData.mjs @@ -0,0 +1,18 @@ +'use strict'; + +import { fetchNodeJsChangelog } from '@/util/fetchNodeJsChangelog'; + +/** + * This method is used to generate the Node.js Changelog Data + * for self-consumption during RSC and Static Builds + * + * @returns {Promise} + */ +const generateChangelogData = async version => { + // Get the raw changelog for the latest minor for a given major + const changelog = await fetchNodeJsChangelog(version); + + return changelog; +}; + +export default generateChangelogData; diff --git a/next-data/generators/releaseData.mjs b/next-data/generators/releaseData.mjs index 8162fbdcdf983..2beea90861c1e 100644 --- a/next-data/generators/releaseData.mjs +++ b/next-data/generators/releaseData.mjs @@ -4,18 +4,14 @@ import nodevu from '@nodevu/core'; // Gets the appropriate release status for each major release const getNodeReleaseStatus = (now, support) => { - const { endOfLife, maintenanceStart, ltsStart, currentStart } = support; + const { endOfLife, ltsStart, currentStart } = support; - if (endOfLife && now > new Date(endOfLife)) { + if (endOfLife && now >= new Date(endOfLife)) { return 'End-of-life'; } - if (maintenanceStart && now > new Date(maintenanceStart)) { - return 'Maintenance LTS'; - } - - if (ltsStart && now > new Date(ltsStart)) { - return 'Active LTS'; + if (ltsStart && now >= new Date(ltsStart)) { + return 'LTS'; } if (currentStart && now >= new Date(currentStart)) { @@ -37,32 +33,35 @@ const generateReleaseData = () => { // Basically those not in schedule.json const majors = Object.values(nodevuOutput).filter(major => !!major.support); - const nodeReleases = majors.map(major => { - const [latestVersion] = Object.values(major.releases); + const nodeReleases = Promise.all( + majors.map(async major => { + const [latestVersion] = Object.values(major.releases); - const support = { - currentStart: major.support.phases.dates.start, - ltsStart: major.support.phases.dates.lts, - maintenanceStart: major.support.phases.dates.maintenance, - endOfLife: major.support.phases.dates.end, - }; + const support = { + currentStart: major.support.phases.dates.start, + ltsStart: major.support.phases.dates.lts, + maintenanceStart: major.support.phases.dates.maintenance, + endOfLife: major.support.phases.dates.end, + }; - const status = getNodeReleaseStatus(new Date(), support); + // Get the major release status based on our Release Schedule + const status = getNodeReleaseStatus(new Date(), support); - return { - ...support, - status, - major: latestVersion.semver.major, - version: latestVersion.semver.raw, - versionWithPrefix: `v${latestVersion.semver.raw}`, - codename: major.support.codename || '', - isLts: status === 'Active LTS' || status === 'Maintenance LTS', - npm: latestVersion.dependencies.npm || '', - v8: latestVersion.dependencies.v8 || '', - releaseDate: latestVersion.releaseDate || '', - modules: latestVersion.modules.version || '', - }; - }); + return { + ...support, + status, + major: latestVersion.semver.major, + version: latestVersion.semver.raw, + versionWithPrefix: `v${latestVersion.semver.raw}`, + codename: major.support.codename || '', + isLts: status === 'LTS', + npm: latestVersion.dependencies.npm || '', + v8: latestVersion.dependencies.v8 || '', + releaseDate: latestVersion.releaseDate || '', + modules: latestVersion.modules.version || '', + }; + }) + ); // nodevu returns duplicated v0.x versions (v0.12, v0.10, ...). // This behavior seems intentional as the case is hardcoded in nodevu, @@ -70,7 +69,9 @@ const generateReleaseData = () => { // This line ignores those duplicated versions and takes the latest // v0.x version (v0.12.18). It is also consistent with the legacy // nodejs.org implementation. - return nodeReleases.filter(r => r.major !== 0 || r.version === '0.12.18'); + return nodeReleases.then(releases => + releases.filter(r => r.major !== 0 || r.version === '0.12.18') + ); }); }; diff --git a/next-data/providers/changelogData.ts b/next-data/providers/changelogData.ts new file mode 100644 index 0000000000000..8a07bab07fd2e --- /dev/null +++ b/next-data/providers/changelogData.ts @@ -0,0 +1,9 @@ +import { cache } from 'react'; + +import generateChangelogData from '@/next-data/generators/changelogData.mjs'; + +export const provideChangelogData = cache((version: string) => { + const changelog = generateChangelogData(version); + + return changelog; +}); diff --git a/next-data/providers/websiteFeeds.ts b/next-data/providers/websiteFeeds.ts index 93f30e1886463..fff1eb6af6c10 100644 --- a/next-data/providers/websiteFeeds.ts +++ b/next-data/providers/websiteFeeds.ts @@ -3,7 +3,7 @@ import { cache } from 'react'; import generateWebsiteFeeds from '@/next-data/generators/websiteFeeds.mjs'; import { provideBlogPosts } from '@/next-data/providers/blogData'; -const websiteFeeds = await generateWebsiteFeeds(provideBlogPosts('all')); +const websiteFeeds = generateWebsiteFeeds(provideBlogPosts('all')); const provideWebsiteFeeds = cache((feed: string) => { if (feed.includes('.xml') && websiteFeeds.has(feed)) { diff --git a/next.config.mjs b/next.config.mjs index be1f1400025fd..8b00d6d489e72 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -14,6 +14,8 @@ import { /** @type {import('next').NextConfig} */ const nextConfig = { + // Just to ensure that React is always on strict mode + reactStrictMode: true, // We intentionally disable Next.js's built-in i18n support // as we dom have our own i18n and internationalisation engine i18n: null, @@ -27,8 +29,33 @@ const nextConfig = { // We allow the BASE_PATH to be overridden in case that the Website // is being built on a subdirectory (e.g. /nodejs-website) basePath: BASE_PATH, - // We disable image optimisation during static export builds - images: { unoptimized: ENABLE_STATIC_EXPORT }, + images: { + // We disable image optimisation during static export builds + unoptimized: ENABLE_STATIC_EXPORT, + // We allow SVGs to be used as images + dangerouslyAllowSVG: true, + // We add it to the remote pattern for the static images we use from GitHub + remotePatterns: [ + { + protocol: 'https', + hostname: 'raw.githubusercontent.com', + port: '', + pathname: '/nodejs/**', + }, + { + protocol: 'https', + hostname: 'user-images.githubusercontent.com', + port: '', + pathname: '/**', + }, + { + protocol: 'https', + hostname: 'website-assets.oramasearch.com', + port: '', + pathname: '/**', + }, + ], + }, // On static export builds we want the output directory to be "build" distDir: ENABLE_STATIC_EXPORT ? 'build' : '.next', // On static export builds we want to enable the export feature @@ -59,6 +86,15 @@ const nextConfig = { // Tree-shakes modules from Sentry Bundle config.plugins.push(new webpack.DefinePlugin(SENTRY_EXTENSIONS)); + // Ignore Sentry's Critical Dependency from Open Telemetry + // (which is genuinely a cause of concern, but there is no work around at the moment) + config.ignoreWarnings = [ + { + module: /@opentelemetry\/instrumentation/, + message: /Critical dependency/, + }, + ]; + return config; }, experimental: { @@ -73,9 +109,12 @@ const nextConfig = { '@radix-ui/react-select', '@radix-ui/react-toast', 'tailwindcss', + 'shiki', ], // Removes the warning regarding the WebPack Build Worker webpackBuildWorker: false, + // Enables Next.js's Instrumentation Hook + instrumentationHook: true, }, }; @@ -112,10 +151,8 @@ const nextWithIntl = withNextIntl('./i18n.tsx')(nextConfig); const nextWithSentry = withSentryConfig( // Next.js Config with i18n Configuration nextWithIntl, - // Default Sentry Settings - sentrySettings, - // Default Sentry Extension Configuration - sentryConfig + // Sentrz SDK and WebPack Settings + { ...sentrySettings, ...sentryConfig } ); // Decides whether enabling Sentry or not diff --git a/next.constants.mjs b/next.constants.mjs index c099291d1daa7..22421552b28cf 100644 --- a/next.constants.mjs +++ b/next.constants.mjs @@ -25,7 +25,7 @@ export const VERCEL_REVALIDATE = Number( ); /** - * This is used for telling Next.js to to a Static Export Build of the Website + * This is used for telling Next.js to do a Static Export Build of the Website * * This is used for static/without a Node.js server hosting, such as on our * legacy Website Build Environment on Node.js's DigitalOcean Droplet. diff --git a/next.dynamic.constants.mjs b/next.dynamic.constants.mjs index 670d9cdcc6a77..3233d5a6940df 100644 --- a/next.dynamic.constants.mjs +++ b/next.dynamic.constants.mjs @@ -91,4 +91,5 @@ export const PAGE_VIEWPORT = { ], width: 'device-width', initialScale: 1, + maximumScale: 2, }; diff --git a/next.dynamic.mjs b/next.dynamic.mjs index eb5c1645d0c80..c7879e2783a70 100644 --- a/next.dynamic.mjs +++ b/next.dynamic.mjs @@ -79,7 +79,7 @@ const getDynamicRouter = async () => { * This method returns a list of all routes that exist for a given locale * * @param {string} locale - * @returns {Array} + * @returns {Promise>} */ const getRoutesByLanguage = async (locale = defaultLocale.code) => { const shouldIgnoreStaticRoute = pathname => @@ -187,7 +187,7 @@ const getDynamicRouter = async () => { * * @param {string} locale * @param {string} path - * @returns {import('next').Metadata} + * @returns {Promise} */ const _getPageMetadata = async (locale = defaultLocale.code, path = '') => { const pageMetadata = { ...PAGE_METADATA }; @@ -212,13 +212,32 @@ const getDynamicRouter = async () => { path ); + const blogMatch = path.match(/^blog\/(release|vulnerability)(\/|$)/); + if (blogMatch) { + const category = blogMatch[1]; + const currentFile = siteConfig.rssFeeds.find( + item => item.category === category + )?.file; + // Use getUrlForPathname to dynamically construct the XML path for blog/release and blog/vulnerability + pageMetadata.alternates.types['application/rss+xml'] = getUrlForPathname( + locale, + `feed/${currentFile}` + ); + } else { + // Use getUrlForPathname for the default blog XML feed path + pageMetadata.alternates.types['application/rss+xml'] = getUrlForPathname( + locale, + 'feed/blog.xml' + ); + } + availableLocaleCodes.forEach(currentLocale => { pageMetadata.alternates.languages[currentLocale] = getUrlForPathname( currentLocale, path ); pageMetadata.openGraph.images = [ - `${currentLocale}/next-data/og?title=${data.title}&type=${data.category ?? 'announcement'}`, + `${currentLocale}/next-data/og?title=${pageMetadata.title}&type=${data.category ?? 'announcement'}`, ]; }); diff --git a/next.json.mjs b/next.json.mjs index 28df7849e101b..2cd98d02c16f7 100644 --- a/next.json.mjs +++ b/next.json.mjs @@ -1,9 +1,13 @@ 'use strict'; +import _authors from './authors.json' assert { type: 'json' }; import _siteNavigation from './navigation.json' assert { type: 'json' }; import _siteRedirects from './redirects.json' assert { type: 'json' }; import _siteConfig from './site.json' assert { type: 'json' }; +/** @type {Record} */ +export const authors = _authors; + /** @type {import('./types').SiteNavigation} */ export const siteNavigation = _siteNavigation; diff --git a/next.locales.mjs b/next.locales.mjs index a851101466aa6..4805361a7424b 100644 --- a/next.locales.mjs +++ b/next.locales.mjs @@ -20,7 +20,11 @@ const availableLocalesMap = Object.fromEntries( localeConfig.map(locale => [locale.code, locale]) ); +// Creates all supported locales +const allLocaleCodes = localeConfig.map(locale => locale.code); + export { + allLocaleCodes, availableLocales, availableLocaleCodes, availableLocalesMap, diff --git a/next.mdx.compiler.mjs b/next.mdx.compiler.mjs index 1bc2ebc96f83f..6fcdf963cdd39 100644 --- a/next.mdx.compiler.mjs +++ b/next.mdx.compiler.mjs @@ -35,7 +35,6 @@ export async function compileMDX(source, fileExtension) { rehypePlugins: NEXT_REHYPE_PLUGINS, remarkPlugins: NEXT_REMARK_PLUGINS, format: fileExtension, - baseUrl: import.meta.url, ...reactRuntime, }); diff --git a/next.mdx.mjs b/next.mdx.mjs index 3e06f6ab54605..be5d28a9e9fac 100644 --- a/next.mdx.mjs +++ b/next.mdx.mjs @@ -17,10 +17,7 @@ export const NEXT_REHYPE_PLUGINS = [ // Generates `id` attributes for headings (H1, ...) rehypeSlug, // Automatically add anchor links to headings (H1, ...) - [ - rehypeAutolinkHeadings, - { properties: { ariaHidden: true, tabIndex: -1, class: 'anchor' } }, - ], + [rehypeAutolinkHeadings, { behavior: 'wrap' }], // Transforms sequential code elements into code tabs and // adds our syntax highlighter (Shikiji) to Codeboxes rehypeShikiji, diff --git a/next.mdx.shiki.mjs b/next.mdx.shiki.mjs index aeeb67254bebf..b3253f6646cfc 100644 --- a/next.mdx.shiki.mjs +++ b/next.mdx.shiki.mjs @@ -10,11 +10,6 @@ import { getShiki, highlightToHast } from './util/getHighlighter'; // to attribute the current language of the
 element
 const languagePrefix = 'language-';
 
-// We do a top-level await, since the Unist-tree visitor
-// is synchronous, and it makes more sense to do a top-level
-// await, rather than an await inside the visitor function
-const memoizedShiki = await getShiki();
-
 /**
  * Retrieve the value for the given meta key.
  *
@@ -60,6 +55,11 @@ function isCodeBlock(node) {
 
 export default function rehypeShikiji() {
   return async function (tree) {
+    // We do a top-level await, since the Unist-tree visitor
+    // is synchronous, and it makes more sense to do a top-level
+    // await, rather than an await inside the visitor function
+    const memoizedShiki = await getShiki();
+
     visit(tree, 'element', (_, index, parent) => {
       const languages = [];
       const displayNames = [];
diff --git a/next.mdx.use.client.mjs b/next.mdx.use.client.mjs
new file mode 100644
index 0000000000000..9c75bf92355ff
--- /dev/null
+++ b/next.mdx.use.client.mjs
@@ -0,0 +1,39 @@
+'use strict';
+
+import Blockquote from './components/Common/Blockquote';
+import Button from './components/Common/Button';
+import LinkWithArrow from './components/Downloads/Release/LinkWithArrow';
+import Link from './components/Link';
+import MDXCodeBox from './components/MDX/CodeBox';
+import MDXCodeTabs from './components/MDX/CodeTabs';
+import MDXImage from './components/MDX/Image';
+
+/**
+ * A full list of React Components that we want to pass through to MDX
+ *
+ * @satisfies {import('mdx/types').MDXComponents}
+ */
+export const clientMdxComponents = {
+  // Renders MDX CodeTabs
+  CodeTabs: MDXCodeTabs,
+  // Renders a Button Component for `button` tags
+  Button: Button,
+  // Links with External Arrow
+  LinkWithArrow: LinkWithArrow,
+};
+
+/**
+ * A full list of wired HTML elements into custom React Components
+ *
+ * @type {import('mdx/types').MDXComponents}
+ */
+export const htmlComponents = {
+  // Renders a Link Component for `a` tags
+  a: Link,
+  // Renders a Blockquote Component for `blockquote` tags
+  blockquote: Blockquote,
+  // Renders a CodeBox Component for `pre` tags
+  pre: MDXCodeBox,
+  // Renders an Image Component for `img` tags
+  img: MDXImage,
+};
diff --git a/next.mdx.use.mjs b/next.mdx.use.mjs
index a28a3d1d88d5b..54191ff55b952 100644
--- a/next.mdx.use.mjs
+++ b/next.mdx.use.mjs
@@ -1,15 +1,13 @@
 'use strict';
 
-import Blockquote from './components/Common/Blockquote';
-import Button from './components/Common/Button';
 import DownloadButton from './components/Downloads/DownloadButton';
 import DownloadLink from './components/Downloads/DownloadLink';
 import DownloadReleasesTable from './components/Downloads/DownloadReleasesTable';
 import BitnessDropdown from './components/Downloads/Release/BitnessDropdown';
 import BlogPostLink from './components/Downloads/Release/BlogPostLink';
+import ChangelogLink from './components/Downloads/Release/ChangelogLink';
 import ReleaseDownloadButton from './components/Downloads/Release/DownloadButton';
-import LinkWithArrow from './components/Downloads/Release/LinkWithArrow';
-import NpmVersion from './components/Downloads/Release/NpmVersion';
+import NpmLink from './components/Downloads/Release/NpmLink';
 import OperatingSystemDropdown from './components/Downloads/Release/OperatingSystemDropdown';
 import PlatformDropdown from './components/Downloads/Release/PlatformDropdown';
 import ReleaseCodeBox from './components/Downloads/Release/ReleaseCodeBox';
@@ -18,10 +16,7 @@ import ReleaseVersion from './components/Downloads/Release/ReleaseVersion';
 import SourceButton from './components/Downloads/Release/SourceButton';
 import VerifyingBinariesLink from './components/Downloads/Release/VerifyingBinariesLink';
 import VersionDropdown from './components/Downloads/Release/VersionDropdown';
-import Link from './components/Link';
 import UpcomingMeetings from './components/MDX/Calendar/UpcomingMeetings';
-import MDXCodeBox from './components/MDX/CodeBox';
-import MDXCodeTabs from './components/MDX/CodeTabs';
 import SearchPage from './components/MDX/SearchPage';
 import WithBadge from './components/withBadge';
 import WithBanner from './components/withBanner';
@@ -40,20 +35,14 @@ export const mdxComponents = {
   WithBanner: WithBanner,
   // HOC for providing Badge Data
   WithBadge: WithBadge,
-  // Renders MDX CodeTabs
-  CodeTabs: MDXCodeTabs,
   // Renders a Download Button
   DownloadButton: DownloadButton,
   // Renders a Download Link
   DownloadLink: DownloadLink,
-  // Renders a Button Component for `button` tags
-  Button: Button,
   // Renders a Search Page
   SearchPage: SearchPage,
   // Renders an container for Upcoming Node.js Meetings
   UpcomingMeetings: UpcomingMeetings,
-  // Links with External Arrow
-  LinkWithArrow: LinkWithArrow,
   // Group of components that enable you to select versions for Node.js
   // releases and download selected versions. Uses `releaseProvider` as a provider
   Release: {
@@ -65,8 +54,8 @@ export const mdxComponents = {
     BitnessDropdown: BitnessDropdown,
     // Renders a drop-down menu from which the operating system can select
     OperatingSystemDropdown: OperatingSystemDropdown,
-    // Renders a npm version of the selected release
-    NpmVersion: NpmVersion,
+    // Renders a link to the npm version of the selected release
+    NpmLink: NpmLink,
     // Renders a release version of the selected release
     Version: ReleaseVersion,
     // Renders a release status of the selected release
@@ -81,19 +70,7 @@ export const mdxComponents = {
     SourceButton: SourceButton,
     // Renders a Release CodeBox
     ReleaseCodeBox: ReleaseCodeBox,
+    // Renders a Changelog Modal Link Button
+    ChangelogLink: ChangelogLink,
   },
 };
-
-/**
- * A full list of wired HTML elements into custom React Components
- *
- * @type {import('mdx/types').MDXComponents}
- */
-export const htmlComponents = {
-  // Renders a Link Component for `a` tags
-  a: Link,
-  // Renders a Blockquote Component for `blockquote` tags
-  blockquote: Blockquote,
-  // Renders a CodeBox Component for `pre` tags
-  pre: MDXCodeBox,
-};
diff --git a/package-lock.json b/package-lock.json
index b93534d1b3485..6cd0e34e10c85 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,81 +1,83 @@
 {
-  "name": "nodejs.org",
+  "name": "@nodejs/website",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
+      "name": "@nodejs/website",
       "license": "MIT",
       "dependencies": {
         "@heroicons/react": "~2.1.1",
         "@mdx-js/mdx": "^3.0.1",
         "@nodevu/core": "~0.1.0",
-        "@orama/highlight": "^0.1.3",
-        "@oramacloud/client": "^1.0.9",
+        "@orama/highlight": "^0.1.5",
+        "@oramacloud/client": "^1.0.13",
         "@radix-ui/react-accessible-icon": "^1.0.3",
         "@radix-ui/react-avatar": "^1.0.4",
         "@radix-ui/react-dialog": "^1.0.5",
         "@radix-ui/react-dropdown-menu": "^2.0.6",
         "@radix-ui/react-label": "^2.0.2",
+        "@radix-ui/react-scroll-area": "^1.0.5",
         "@radix-ui/react-select": "^2.0.0",
+        "@radix-ui/react-slot": "^1.0.2",
         "@radix-ui/react-tabs": "^1.0.4",
         "@radix-ui/react-toast": "^1.1.5",
         "@savvywombat/tailwindcss-grid-areas": "~4.0.0",
-        "@sentry/nextjs": "~7.93.0",
+        "@sentry/nextjs": "~8.7.0",
         "@tailwindcss/container-queries": "~0.1.1",
-        "@types/node": "20.11.24",
+        "@types/node": "20.14.0",
         "@vcarl/remark-headings": "~0.1.0",
-        "@vercel/analytics": "~1.2.2",
+        "@vercel/analytics": "~1.3.1",
         "@vercel/speed-insights": "~1.0.10",
         "autoprefixer": "~10.4.18",
         "classnames": "~2.5.1",
         "cross-env": "7.0.3",
-        "dedent": "1.5.1",
+        "dedent": "1.5.3",
         "feed": "~4.2.2",
         "github-slugger": "~2.0.0",
-        "glob": "~10.3.10",
+        "glob": "~10.4.1",
         "gray-matter": "~4.0.3",
-        "husky": "8.0.3",
-        "lint-staged": "15.2.0",
-        "next": "~14.1.1",
-        "next-intl": "~3.4.0",
-        "next-themes": "~0.2.1",
-        "postcss": "~8.4.35",
-        "postcss-calc": "~9.0.1",
-        "postcss-import": "~16.0.0",
-        "postcss-mixins": "~9.0.4",
+        "husky": "9.0.11",
+        "lint-staged": "15.2.5",
+        "next": "~14.2.3",
+        "next-intl": "~3.14.1",
+        "next-themes": "~0.3.0",
+        "postcss": "~8.4.38",
+        "postcss-calc": "~10.0.0",
+        "postcss-import": "~16.1.0",
+        "postcss-mixins": "~10.0.1",
         "postcss-simple-vars": "~7.0.1",
-        "react": "^18.2.0",
-        "react-dom": "^18.2.0",
+        "react": "^18.3.1",
+        "react-dom": "^18.3.1",
         "rehype-autolink-headings": "~7.1.0",
         "rehype-slug": "~6.0.0",
         "remark-gfm": "~4.0.0",
         "remark-reading-time": "~2.0.1",
-        "semver": "~7.5.4",
-        "shiki": "~1.1.2",
-        "tailwindcss": "^3.4.0",
-        "turbo": "1.12.4",
-        "typescript": "~5.3.2",
+        "semver": "~7.6.0",
+        "shiki": "~1.6.2",
+        "tailwindcss": "^3.4.3",
+        "typescript": "~5.4.2",
         "unist-util-visit": "~5.0.0",
         "vfile": "~6.0.1",
         "vfile-matter": "~5.0.0"
       },
       "devDependencies": {
-        "@storybook/addon-controls": "~7.6.17",
-        "@storybook/addon-interactions": "~7.6.17",
-        "@storybook/addon-themes": "~7.6.17",
-        "@storybook/addon-viewport": "~7.6.17",
-        "@storybook/nextjs": "~7.6.17",
-        "@testing-library/jest-dom": "~6.4.2",
-        "@testing-library/react": "~14.2.1",
+        "@storybook/addon-controls": "~8.1.5",
+        "@storybook/addon-interactions": "~8.1.5",
+        "@storybook/addon-themes": "~8.1.5",
+        "@storybook/addon-viewport": "~8.1.5",
+        "@storybook/nextjs": "~8.1.5",
+        "@testing-library/jest-dom": "~6.4.5",
+        "@testing-library/react": "~15.0.7",
         "@testing-library/user-event": "~14.5.2",
         "@types/jest": "29.5.12",
-        "@types/react": "^18.2.61",
-        "@types/react-dom": "^18.2.19",
-        "@types/semver": "~7.5.5",
-        "@typescript-eslint/eslint-plugin": "7.1.0",
-        "@typescript-eslint/parser": "7.1.0",
+        "@types/react": "^18.3.1",
+        "@types/react-dom": "^18.3.0",
+        "@types/semver": "~7.5.8",
+        "@typescript-eslint/eslint-plugin": "7.11.0",
+        "@typescript-eslint/parser": "7.11.0",
         "eslint": "8.57.0",
-        "eslint-config-next": "~14.1.1",
+        "eslint-config-next": "~14.2.3",
         "eslint-config-prettier": "9.1.0",
         "eslint-plugin-mdx": "3.1.5",
         "eslint-plugin-no-relative-import-paths": "^1.5.3",
@@ -84,34 +86,26 @@
         "jest": "29.7.0",
         "jest-environment-jsdom": "29.7.0",
         "jest-junit": "16.0.0",
-        "prettier": "3.2.5",
-        "prettier-plugin-tailwindcss": "0.5.11",
+        "prettier": "3.3.0",
+        "prettier-plugin-tailwindcss": "0.6.1",
         "remark-frontmatter": "5.0.0",
-        "remark-preset-lint-node": "5.0.0",
-        "storybook": "~7.6.17",
-        "stylelint": "16.2.1",
+        "remark-preset-lint-node": "5.0.2",
+        "storybook": "~8.1.5",
+        "stylelint": "16.6.1",
         "stylelint-config-standard": "36.0.0",
         "stylelint-order": "6.0.4",
         "stylelint-selector-bem-pattern": "4.0.0",
+        "turbo": "2.0.1",
         "user-agent-data-types": "0.4.2"
       },
       "engines": {
         "node": "v20"
       }
     },
-    "node_modules/@aashutoshrathi/word-wrap": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
-      "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/@adobe/css-tools": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz",
-      "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==",
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz",
+      "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==",
       "dev": true
     },
     "node_modules/@alloc/quick-lru": {
@@ -126,13 +120,12 @@
       }
     },
     "node_modules/@ampproject/remapping": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
-      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
-      "dev": true,
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
       "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.0",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
       },
       "engines": {
         "node": ">=6.0.0"
@@ -151,114 +144,40 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-      "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz",
+      "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==",
       "dependencies": {
-        "@babel/highlight": "^7.23.4",
-        "chalk": "^2.4.2"
+        "@babel/highlight": "^7.24.6",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
-    },
-    "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/@babel/compat-data": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
-      "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz",
+      "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
-      "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz",
+      "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helpers": "^7.23.7",
-        "@babel/parser": "^7.23.6",
-        "@babel/template": "^7.22.15",
-        "@babel/traverse": "^7.23.7",
-        "@babel/types": "^7.23.6",
+        "@babel/code-frame": "^7.24.6",
+        "@babel/generator": "^7.24.6",
+        "@babel/helper-compilation-targets": "^7.24.6",
+        "@babel/helper-module-transforms": "^7.24.6",
+        "@babel/helpers": "^7.24.6",
+        "@babel/parser": "^7.24.6",
+        "@babel/template": "^7.24.6",
+        "@babel/traverse": "^7.24.6",
+        "@babel/types": "^7.24.6",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -277,20 +196,18 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
-      "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz",
+      "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==",
       "dependencies": {
-        "@babel/types": "^7.23.6",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
+        "@babel/types": "^7.24.6",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
       },
       "engines": {
@@ -298,37 +215,36 @@
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
-      "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz",
+      "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
-      "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz",
+      "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.15"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
-      "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz",
+      "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==",
       "dependencies": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-validator-option": "^7.23.5",
+        "@babel/compat-data": "^7.24.6",
+        "@babel/helper-validator-option": "^7.24.6",
         "browserslist": "^4.22.2",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
@@ -341,25 +257,24 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz",
-      "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-member-expression-to-functions": "^7.23.0",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.20",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz",
+      "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-function-name": "^7.24.6",
+        "@babel/helper-member-expression-to-functions": "^7.24.6",
+        "@babel/helper-optimise-call-expression": "^7.24.6",
+        "@babel/helper-replace-supers": "^7.24.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
+        "@babel/helper-split-export-declaration": "^7.24.6",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -379,12 +294,12 @@
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
-      "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz",
+      "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.6",
         "regexpu-core": "^5.3.1",
         "semver": "^6.3.1"
       },
@@ -405,9 +320,9 @@
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz",
-      "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
       "dev": true,
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
@@ -421,74 +336,69 @@
       }
     },
     "node_modules/@babel/helper-environment-visitor": {
-      "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,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz",
+      "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-function-name": {
-      "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,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz",
+      "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==",
       "dependencies": {
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.23.0"
+        "@babel/template": "^7.24.6",
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz",
+      "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
-      "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz",
+      "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.23.0"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
-      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz",
+      "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==",
       "dependencies": {
-        "@babel/types": "^7.22.15"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
-      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz",
+      "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-module-imports": "^7.24.6",
+        "@babel/helper-simple-access": "^7.24.6",
+        "@babel/helper-split-export-declaration": "^7.24.6",
+        "@babel/helper-validator-identifier": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -498,35 +408,35 @@
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
-      "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz",
+      "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
-      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz",
+      "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
-      "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz",
+      "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-wrap-function": "^7.22.20"
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-wrap-function": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -536,14 +446,14 @@
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
-      "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz",
+      "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-member-expression-to-functions": "^7.22.15",
-        "@babel/helper-optimise-call-expression": "^7.22.5"
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-member-expression-to-functions": "^7.24.6",
+        "@babel/helper-optimise-call-expression": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -553,105 +463,98 @@
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz",
+      "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
-      "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz",
+      "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.22.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
-      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz",
+      "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
-      "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz",
+      "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz",
+      "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
-      "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz",
+      "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
-      "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz",
+      "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.22.19"
+        "@babel/helper-function-name": "^7.24.6",
+        "@babel/template": "^7.24.6",
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.23.8",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz",
-      "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz",
+      "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==",
       "dependencies": {
-        "@babel/template": "^7.22.15",
-        "@babel/traverse": "^7.23.7",
-        "@babel/types": "^7.23.6"
+        "@babel/template": "^7.24.6",
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-      "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz",
+      "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.22.20",
+        "@babel/helper-validator-identifier": "^7.24.6",
         "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0"
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -661,7 +564,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -673,7 +575,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -687,7 +588,6 @@
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -695,14 +595,12 @@
     "node_modules/@babel/highlight/node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
     },
     "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "dev": true,
       "engines": {
         "node": ">=0.8.0"
       }
@@ -711,7 +609,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -720,7 +617,6 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -729,9 +625,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
-      "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz",
+      "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -739,13 +635,29 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz",
+      "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
     "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
-      "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz",
+      "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -755,14 +667,14 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
-      "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz",
+      "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/plugin-transform-optional-chaining": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
+        "@babel/plugin-transform-optional-chaining": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -772,13 +684,13 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
-      "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz",
+      "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -875,12 +787,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-flow": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz",
-      "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.6.tgz",
+      "integrity": "sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -890,12 +802,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
-      "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz",
+      "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -905,12 +817,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
-      "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz",
+      "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -944,12 +856,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
-      "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz",
+      "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1061,12 +973,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
-      "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz",
+      "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1092,12 +1004,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
-      "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz",
+      "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1107,14 +1019,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz",
-      "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz",
+      "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.20",
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-remap-async-to-generator": "^7.24.6",
         "@babel/plugin-syntax-async-generators": "^7.8.4"
       },
       "engines": {
@@ -1125,14 +1037,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
-      "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz",
+      "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.20"
+        "@babel/helper-module-imports": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-remap-async-to-generator": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1142,12 +1054,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
-      "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz",
+      "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1157,12 +1069,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
-      "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz",
+      "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1172,13 +1084,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
-      "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz",
+      "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-class-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1188,13 +1100,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
-      "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz",
+      "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-create-class-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
@@ -1205,18 +1117,18 @@
       }
     },
     "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.23.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz",
-      "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.20",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz",
+      "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-compilation-targets": "^7.24.6",
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-function-name": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-replace-supers": "^7.24.6",
+        "@babel/helper-split-export-declaration": "^7.24.6",
         "globals": "^11.1.0"
       },
       "engines": {
@@ -1227,13 +1139,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
-      "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz",
+      "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/template": "^7.22.15"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/template": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1243,12 +1155,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
-      "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz",
+      "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1258,13 +1170,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
-      "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz",
+      "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1274,12 +1186,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
-      "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz",
+      "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1289,12 +1201,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
-      "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz",
+      "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
@@ -1305,13 +1217,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
-      "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz",
+      "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1321,12 +1233,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
-      "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz",
+      "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
@@ -1337,13 +1249,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-flow-strip-types": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz",
-      "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.6.tgz",
+      "integrity": "sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-flow": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/plugin-syntax-flow": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1353,13 +1265,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
-      "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz",
+      "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1369,14 +1281,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
-      "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz",
+      "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-compilation-targets": "^7.24.6",
+        "@babel/helper-function-name": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1386,12 +1298,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
-      "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz",
+      "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
@@ -1402,12 +1314,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
-      "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz",
+      "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1417,12 +1329,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
-      "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz",
+      "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
@@ -1433,12 +1345,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
-      "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz",
+      "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1448,13 +1360,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
-      "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz",
+      "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1464,14 +1376,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
-      "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz",
+      "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-simple-access": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-simple-access": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1481,15 +1393,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz",
-      "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz",
+      "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-hoist-variables": "^7.24.6",
+        "@babel/helper-module-transforms": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-validator-identifier": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1499,13 +1411,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
-      "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz",
+      "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1515,13 +1427,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
-      "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz",
+      "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1531,12 +1443,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
-      "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz",
+      "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1546,12 +1458,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
-      "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz",
+      "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
@@ -1562,12 +1474,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
-      "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz",
+      "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
@@ -1578,16 +1490,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
-      "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz",
+      "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.23.3",
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.23.3"
+        "@babel/plugin-transform-parameters": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1597,13 +1508,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
-      "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz",
+      "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.20"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-replace-supers": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1613,12 +1524,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
-      "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz",
+      "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
@@ -1629,13 +1540,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
-      "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz",
+      "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
@@ -1646,12 +1557,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
-      "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz",
+      "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1661,13 +1572,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
-      "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz",
+      "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-class-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1677,14 +1588,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
-      "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz",
+      "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-create-class-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
@@ -1695,12 +1606,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
-      "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz",
+      "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1710,12 +1621,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-display-name": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz",
-      "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz",
+      "integrity": "sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1725,16 +1636,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
-      "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz",
+      "integrity": "sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-jsx": "^7.23.3",
-        "@babel/types": "^7.23.4"
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-module-imports": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/plugin-syntax-jsx": "^7.24.6",
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1744,12 +1655,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx-development": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
-      "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.6.tgz",
+      "integrity": "sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==",
       "dev": true,
       "dependencies": {
-        "@babel/plugin-transform-react-jsx": "^7.22.5"
+        "@babel/plugin-transform-react-jsx": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1759,13 +1670,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz",
-      "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.6.tgz",
+      "integrity": "sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1775,12 +1686,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
-      "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz",
+      "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.6",
         "regenerator-transform": "^0.15.2"
       },
       "engines": {
@@ -1791,12 +1702,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
-      "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz",
+      "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1806,16 +1717,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-runtime": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz",
-      "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz",
+      "integrity": "sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "babel-plugin-polyfill-corejs2": "^0.4.7",
-        "babel-plugin-polyfill-corejs3": "^0.8.7",
-        "babel-plugin-polyfill-regenerator": "^0.5.4",
+        "@babel/helper-module-imports": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.1",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -1835,12 +1746,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
-      "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz",
+      "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1850,13 +1761,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
-      "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz",
+      "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1866,12 +1777,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
-      "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz",
+      "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1881,12 +1792,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
-      "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz",
+      "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1896,12 +1807,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
-      "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz",
+      "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1911,15 +1822,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz",
-      "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz",
+      "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-typescript": "^7.23.3"
+        "@babel/helper-annotate-as-pure": "^7.24.6",
+        "@babel/helper-create-class-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/plugin-syntax-typescript": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1929,12 +1840,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
-      "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz",
+      "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1944,13 +1855,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
-      "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz",
+      "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1960,13 +1871,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
-      "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz",
+      "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1976,13 +1887,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
-      "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz",
+      "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1992,26 +1903,27 @@
       }
     },
     "node_modules/@babel/preset-env": {
-      "version": "7.23.8",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz",
-      "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.23.5",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
-        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz",
+      "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.24.6",
+        "@babel/helper-compilation-targets": "^7.24.6",
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-validator-option": "^7.24.6",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6",
         "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
         "@babel/plugin-syntax-class-static-block": "^7.14.5",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-import-assertions": "^7.23.3",
-        "@babel/plugin-syntax-import-attributes": "^7.23.3",
+        "@babel/plugin-syntax-import-assertions": "^7.24.6",
+        "@babel/plugin-syntax-import-attributes": "^7.24.6",
         "@babel/plugin-syntax-import-meta": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.3",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
@@ -2023,58 +1935,58 @@
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
         "@babel/plugin-syntax-top-level-await": "^7.14.5",
         "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
-        "@babel/plugin-transform-arrow-functions": "^7.23.3",
-        "@babel/plugin-transform-async-generator-functions": "^7.23.7",
-        "@babel/plugin-transform-async-to-generator": "^7.23.3",
-        "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
-        "@babel/plugin-transform-block-scoping": "^7.23.4",
-        "@babel/plugin-transform-class-properties": "^7.23.3",
-        "@babel/plugin-transform-class-static-block": "^7.23.4",
-        "@babel/plugin-transform-classes": "^7.23.8",
-        "@babel/plugin-transform-computed-properties": "^7.23.3",
-        "@babel/plugin-transform-destructuring": "^7.23.3",
-        "@babel/plugin-transform-dotall-regex": "^7.23.3",
-        "@babel/plugin-transform-duplicate-keys": "^7.23.3",
-        "@babel/plugin-transform-dynamic-import": "^7.23.4",
-        "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
-        "@babel/plugin-transform-export-namespace-from": "^7.23.4",
-        "@babel/plugin-transform-for-of": "^7.23.6",
-        "@babel/plugin-transform-function-name": "^7.23.3",
-        "@babel/plugin-transform-json-strings": "^7.23.4",
-        "@babel/plugin-transform-literals": "^7.23.3",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
-        "@babel/plugin-transform-member-expression-literals": "^7.23.3",
-        "@babel/plugin-transform-modules-amd": "^7.23.3",
-        "@babel/plugin-transform-modules-commonjs": "^7.23.3",
-        "@babel/plugin-transform-modules-systemjs": "^7.23.3",
-        "@babel/plugin-transform-modules-umd": "^7.23.3",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
-        "@babel/plugin-transform-new-target": "^7.23.3",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
-        "@babel/plugin-transform-numeric-separator": "^7.23.4",
-        "@babel/plugin-transform-object-rest-spread": "^7.23.4",
-        "@babel/plugin-transform-object-super": "^7.23.3",
-        "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
-        "@babel/plugin-transform-optional-chaining": "^7.23.4",
-        "@babel/plugin-transform-parameters": "^7.23.3",
-        "@babel/plugin-transform-private-methods": "^7.23.3",
-        "@babel/plugin-transform-private-property-in-object": "^7.23.4",
-        "@babel/plugin-transform-property-literals": "^7.23.3",
-        "@babel/plugin-transform-regenerator": "^7.23.3",
-        "@babel/plugin-transform-reserved-words": "^7.23.3",
-        "@babel/plugin-transform-shorthand-properties": "^7.23.3",
-        "@babel/plugin-transform-spread": "^7.23.3",
-        "@babel/plugin-transform-sticky-regex": "^7.23.3",
-        "@babel/plugin-transform-template-literals": "^7.23.3",
-        "@babel/plugin-transform-typeof-symbol": "^7.23.3",
-        "@babel/plugin-transform-unicode-escapes": "^7.23.3",
-        "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
-        "@babel/plugin-transform-unicode-regex": "^7.23.3",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
+        "@babel/plugin-transform-arrow-functions": "^7.24.6",
+        "@babel/plugin-transform-async-generator-functions": "^7.24.6",
+        "@babel/plugin-transform-async-to-generator": "^7.24.6",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.6",
+        "@babel/plugin-transform-block-scoping": "^7.24.6",
+        "@babel/plugin-transform-class-properties": "^7.24.6",
+        "@babel/plugin-transform-class-static-block": "^7.24.6",
+        "@babel/plugin-transform-classes": "^7.24.6",
+        "@babel/plugin-transform-computed-properties": "^7.24.6",
+        "@babel/plugin-transform-destructuring": "^7.24.6",
+        "@babel/plugin-transform-dotall-regex": "^7.24.6",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.6",
+        "@babel/plugin-transform-dynamic-import": "^7.24.6",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.6",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.6",
+        "@babel/plugin-transform-for-of": "^7.24.6",
+        "@babel/plugin-transform-function-name": "^7.24.6",
+        "@babel/plugin-transform-json-strings": "^7.24.6",
+        "@babel/plugin-transform-literals": "^7.24.6",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.6",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.6",
+        "@babel/plugin-transform-modules-amd": "^7.24.6",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.6",
+        "@babel/plugin-transform-modules-systemjs": "^7.24.6",
+        "@babel/plugin-transform-modules-umd": "^7.24.6",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6",
+        "@babel/plugin-transform-new-target": "^7.24.6",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6",
+        "@babel/plugin-transform-numeric-separator": "^7.24.6",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.6",
+        "@babel/plugin-transform-object-super": "^7.24.6",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.6",
+        "@babel/plugin-transform-optional-chaining": "^7.24.6",
+        "@babel/plugin-transform-parameters": "^7.24.6",
+        "@babel/plugin-transform-private-methods": "^7.24.6",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.6",
+        "@babel/plugin-transform-property-literals": "^7.24.6",
+        "@babel/plugin-transform-regenerator": "^7.24.6",
+        "@babel/plugin-transform-reserved-words": "^7.24.6",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.6",
+        "@babel/plugin-transform-spread": "^7.24.6",
+        "@babel/plugin-transform-sticky-regex": "^7.24.6",
+        "@babel/plugin-transform-template-literals": "^7.24.6",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.6",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.6",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.6",
+        "@babel/plugin-transform-unicode-regex": "^7.24.6",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.6",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
-        "babel-plugin-polyfill-corejs2": "^0.4.7",
-        "babel-plugin-polyfill-corejs3": "^0.8.7",
-        "babel-plugin-polyfill-regenerator": "^0.5.4",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.4",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
         "core-js-compat": "^3.31.0",
         "semver": "^6.3.1"
       },
@@ -2095,14 +2007,14 @@
       }
     },
     "node_modules/@babel/preset-flow": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz",
-      "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.6.tgz",
+      "integrity": "sha512-huoe0T1Qs9fQhMWbmqE/NHUeZbqmHDsN6n/jYvPcUUHfuKiPV32C9i8tDhMbQ1DEKTjbBP7Rjm3nSLwlB2X05g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.15",
-        "@babel/plugin-transform-flow-strip-types": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-validator-option": "^7.24.6",
+        "@babel/plugin-transform-flow-strip-types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2126,17 +2038,17 @@
       }
     },
     "node_modules/@babel/preset-react": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz",
-      "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.6.tgz",
+      "integrity": "sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.15",
-        "@babel/plugin-transform-react-display-name": "^7.23.3",
-        "@babel/plugin-transform-react-jsx": "^7.22.15",
-        "@babel/plugin-transform-react-jsx-development": "^7.22.5",
-        "@babel/plugin-transform-react-pure-annotations": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-validator-option": "^7.24.6",
+        "@babel/plugin-transform-react-display-name": "^7.24.6",
+        "@babel/plugin-transform-react-jsx": "^7.24.6",
+        "@babel/plugin-transform-react-jsx-development": "^7.24.6",
+        "@babel/plugin-transform-react-pure-annotations": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2146,16 +2058,16 @@
       }
     },
     "node_modules/@babel/preset-typescript": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz",
-      "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz",
+      "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.15",
-        "@babel/plugin-syntax-jsx": "^7.23.3",
-        "@babel/plugin-transform-modules-commonjs": "^7.23.3",
-        "@babel/plugin-transform-typescript": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.6",
+        "@babel/helper-validator-option": "^7.24.6",
+        "@babel/plugin-syntax-jsx": "^7.24.6",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.6",
+        "@babel/plugin-transform-typescript": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2165,9 +2077,9 @@
       }
     },
     "node_modules/@babel/register": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
-      "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
+      "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
       "dev": true,
       "dependencies": {
         "clone-deep": "^4.0.1",
@@ -2327,9 +2239,9 @@
       "dev": true
     },
     "node_modules/@babel/runtime": {
-      "version": "7.23.8",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz",
-      "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz",
+      "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==",
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -2338,33 +2250,31 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
-      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz",
+      "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==",
       "dependencies": {
-        "@babel/code-frame": "^7.22.13",
-        "@babel/parser": "^7.22.15",
-        "@babel/types": "^7.22.15"
+        "@babel/code-frame": "^7.24.6",
+        "@babel/parser": "^7.24.6",
+        "@babel/types": "^7.24.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
-      "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
-        "@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.23.6",
-        "@babel/types": "^7.23.6",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz",
+      "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.6",
+        "@babel/generator": "^7.24.6",
+        "@babel/helper-environment-visitor": "^7.24.6",
+        "@babel/helper-function-name": "^7.24.6",
+        "@babel/helper-hoist-variables": "^7.24.6",
+        "@babel/helper-split-export-declaration": "^7.24.6",
+        "@babel/parser": "^7.24.6",
+        "@babel/types": "^7.24.6",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2373,13 +2283,12 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
-      "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
-      "dev": true,
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz",
+      "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.23.4",
-        "@babel/helper-validator-identifier": "^7.22.20",
+        "@babel/helper-string-parser": "^7.24.6",
+        "@babel/helper-validator-identifier": "^7.24.6",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
@@ -2409,9 +2318,9 @@
       }
     },
     "node_modules/@csstools/css-parser-algorithms": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.5.0.tgz",
-      "integrity": "sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==",
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz",
+      "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==",
       "dev": true,
       "funding": [
         {
@@ -2427,13 +2336,13 @@
         "node": "^14 || ^16 || >=18"
       },
       "peerDependencies": {
-        "@csstools/css-tokenizer": "^2.2.3"
+        "@csstools/css-tokenizer": "^2.3.1"
       }
     },
     "node_modules/@csstools/css-tokenizer": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz",
-      "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==",
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz",
+      "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==",
       "dev": true,
       "funding": [
         {
@@ -2450,9 +2359,9 @@
       }
     },
     "node_modules/@csstools/media-query-list-parser": {
-      "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.7.tgz",
-      "integrity": "sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==",
+      "version": "2.1.11",
+      "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz",
+      "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==",
       "dev": true,
       "funding": [
         {
@@ -2468,14 +2377,14 @@
         "node": "^14 || ^16 || >=18"
       },
       "peerDependencies": {
-        "@csstools/css-parser-algorithms": "^2.5.0",
-        "@csstools/css-tokenizer": "^2.2.3"
+        "@csstools/css-parser-algorithms": "^2.6.3",
+        "@csstools/css-tokenizer": "^2.3.1"
       }
     },
     "node_modules/@csstools/selector-specificity": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
-      "integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+      "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
       "dev": true,
       "funding": [
         {
@@ -2503,6 +2412,26 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/@dual-bundle/import-meta-resolve": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+      "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz",
+      "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
@@ -2512,10 +2441,26 @@
         "react": ">=16.8.0"
       }
     },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+      "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
-      "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+      "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
       "cpu": [
         "arm"
       ],
@@ -2529,9 +2474,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
-      "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+      "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
       "cpu": [
         "arm64"
       ],
@@ -2545,9 +2490,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
-      "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+      "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
       "cpu": [
         "x64"
       ],
@@ -2561,9 +2506,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
-      "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+      "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
       "cpu": [
         "arm64"
       ],
@@ -2577,9 +2522,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
-      "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+      "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
       "cpu": [
         "x64"
       ],
@@ -2593,9 +2538,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
-      "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+      "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
       "cpu": [
         "arm64"
       ],
@@ -2609,9 +2554,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
-      "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+      "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
       "cpu": [
         "x64"
       ],
@@ -2625,9 +2570,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
-      "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+      "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
       "cpu": [
         "arm"
       ],
@@ -2641,9 +2586,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
-      "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+      "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
       "cpu": [
         "arm64"
       ],
@@ -2657,9 +2602,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
-      "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+      "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
       "cpu": [
         "ia32"
       ],
@@ -2673,9 +2618,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
-      "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+      "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
       "cpu": [
         "loong64"
       ],
@@ -2689,9 +2634,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
-      "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+      "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
       "cpu": [
         "mips64el"
       ],
@@ -2705,9 +2650,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
-      "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+      "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
       "cpu": [
         "ppc64"
       ],
@@ -2721,9 +2666,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
-      "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+      "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
       "cpu": [
         "riscv64"
       ],
@@ -2737,9 +2682,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
-      "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+      "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
       "cpu": [
         "s390x"
       ],
@@ -2753,9 +2698,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
-      "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+      "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
       "cpu": [
         "x64"
       ],
@@ -2769,9 +2714,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+      "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
       "cpu": [
         "x64"
       ],
@@ -2785,9 +2730,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+      "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
       "cpu": [
         "x64"
       ],
@@ -2801,9 +2746,9 @@
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
-      "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+      "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
       "cpu": [
         "x64"
       ],
@@ -2817,9 +2762,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
-      "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+      "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
       "cpu": [
         "arm64"
       ],
@@ -2833,9 +2778,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
-      "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+      "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
       "cpu": [
         "ia32"
       ],
@@ -2849,9 +2794,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
-      "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+      "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
       "cpu": [
         "x64"
       ],
@@ -2976,36 +2921,36 @@
       "dev": true
     },
     "node_modules/@fastify/busboy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
-      "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+      "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
       "engines": {
         "node": ">=14"
       }
     },
     "node_modules/@floating-ui/core": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz",
-      "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==",
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
+      "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
       "dependencies": {
         "@floating-ui/utils": "^0.2.0"
       }
     },
     "node_modules/@floating-ui/dom": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz",
-      "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==",
+      "version": "1.6.5",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
+      "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
       "dependencies": {
-        "@floating-ui/core": "^1.5.3",
+        "@floating-ui/core": "^1.0.0",
         "@floating-ui/utils": "^0.2.0"
       }
     },
     "node_modules/@floating-ui/react-dom": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.6.tgz",
-      "integrity": "sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz",
+      "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==",
       "dependencies": {
-        "@floating-ui/dom": "^1.5.4"
+        "@floating-ui/dom": "^1.0.0"
       },
       "peerDependencies": {
         "react": ">=16.8.0",
@@ -3013,14 +2958,14 @@
       }
     },
     "node_modules/@floating-ui/utils": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
-      "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
+      "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
     },
     "node_modules/@formatjs/ecma402-abstract": {
-      "version": "1.18.2",
-      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz",
-      "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==",
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.3.tgz",
+      "integrity": "sha512-J961RbhyjHWeCIv+iOceNxpoZ/qomJOs5lH+rUJCeKNa59gME4KC0LJVMeWODjHsnv/hTH8Hvd6sevzcAzjuaQ==",
       "dependencies": {
         "@formatjs/intl-localematcher": "0.5.4",
         "tslib": "^2.4.0"
@@ -3035,64 +2980,64 @@
       }
     },
     "node_modules/@formatjs/fast-memoize": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz",
-      "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz",
+      "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==",
       "dependencies": {
-        "tslib": "^2.1.0"
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-messageformat-parser": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz",
-      "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==",
+      "version": "2.7.8",
+      "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz",
+      "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==",
       "dependencies": {
-        "@formatjs/ecma402-abstract": "1.11.4",
-        "@formatjs/icu-skeleton-parser": "1.3.6",
-        "tslib": "^2.1.0"
+        "@formatjs/ecma402-abstract": "2.0.0",
+        "@formatjs/icu-skeleton-parser": "1.8.2",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-messageformat-parser/node_modules/@formatjs/ecma402-abstract": {
-      "version": "1.11.4",
-      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
-      "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz",
+      "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==",
       "dependencies": {
-        "@formatjs/intl-localematcher": "0.2.25",
-        "tslib": "^2.1.0"
+        "@formatjs/intl-localematcher": "0.5.4",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-messageformat-parser/node_modules/@formatjs/intl-localematcher": {
-      "version": "0.2.25",
-      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
-      "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz",
+      "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==",
       "dependencies": {
-        "tslib": "^2.1.0"
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-skeleton-parser": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz",
-      "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==",
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz",
+      "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==",
       "dependencies": {
-        "@formatjs/ecma402-abstract": "1.11.4",
-        "tslib": "^2.1.0"
+        "@formatjs/ecma402-abstract": "2.0.0",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-skeleton-parser/node_modules/@formatjs/ecma402-abstract": {
-      "version": "1.11.4",
-      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
-      "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz",
+      "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==",
       "dependencies": {
-        "@formatjs/intl-localematcher": "0.2.25",
-        "tslib": "^2.1.0"
+        "@formatjs/intl-localematcher": "0.5.4",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/icu-skeleton-parser/node_modules/@formatjs/intl-localematcher": {
-      "version": "0.2.25",
-      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
-      "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz",
+      "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==",
       "dependencies": {
-        "tslib": "^2.1.0"
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/@formatjs/intl-localematcher": {
@@ -3104,9 +3049,9 @@
       }
     },
     "node_modules/@heroicons/react": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz",
-      "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz",
+      "integrity": "sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==",
       "peerDependencies": {
         "react": ">= 16"
       }
@@ -3161,396 +3106,804 @@
       }
     },
     "node_modules/@humanwhocodes/object-schema": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
-      "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
       "dev": true
     },
-    "node_modules/@isaacs/cliui": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
-      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
-      "dependencies": {
-        "string-width": "^5.1.2",
-        "string-width-cjs": "npm:string-width@^4.2.0",
-        "strip-ansi": "^7.0.1",
-        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
-        "wrap-ansi": "^8.1.0",
-        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+    "node_modules/@img/sharp-darwin-arm64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz",
+      "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
       "engines": {
-        "node": ">=12"
+        "glibc": ">=2.26",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-arm64": "1.0.2"
       }
     },
-    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
+    "node_modules/@img/sharp-darwin-x64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz",
+      "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
       "engines": {
-        "node": ">=12"
+        "glibc": ">=2.26",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-x64": "1.0.2"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+    "node_modules/@img/sharp-libvips-darwin-arm64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz",
+      "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      },
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
       "engines": {
-        "node": ">=8"
+        "macos": ">=11",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+    "node_modules/@img/sharp-libvips-darwin-x64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz",
+      "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "macos": ">=10.13",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+    "node_modules/@img/sharp-libvips-linux-arm": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz",
+      "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=8"
+        "glibc": ">=2.28",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+    "node_modules/@img/sharp-libvips-linux-arm64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz",
+      "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "glibc": ">=2.26",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+    "node_modules/@img/sharp-libvips-linux-s390x": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz",
+      "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==",
+      "cpu": [
+        "s390x"
+      ],
       "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=8"
+        "glibc": ">=2.28",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+    "node_modules/@img/sharp-libvips-linux-x64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz",
+      "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=6"
+        "glibc": ">=2.26",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz",
+      "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=8"
+        "musl": ">=1.2.2",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@istanbuljs/schema": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz",
+      "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=8"
+        "musl": ">=1.2.2",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@jest/console": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
-      "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+    "node_modules/@img/sharp-linux-arm": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz",
+      "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^29.7.0",
-        "jest-util": "^29.7.0",
-        "slash": "^3.0.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "glibc": ">=2.28",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm": "1.0.2"
       }
     },
-    "node_modules/@jest/console/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+    "node_modules/@img/sharp-linux-arm64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz",
+      "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "glibc": ">=2.26",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm64": "1.0.2"
+      }
+    },
+    "node_modules/@img/sharp-linux-s390x": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz",
+      "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=10"
+        "glibc": ">=2.31",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-s390x": "1.0.2"
       }
     },
-    "node_modules/@jest/core": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
-      "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+    "node_modules/@img/sharp-linux-x64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz",
+      "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "dependencies": {
-        "@jest/console": "^29.7.0",
-        "@jest/reporters": "^29.7.0",
-        "@jest/test-result": "^29.7.0",
-        "@jest/transform": "^29.7.0",
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.7.0",
-        "jest-config": "^29.7.0",
-        "jest-haste-map": "^29.7.0",
-        "jest-message-util": "^29.7.0",
-        "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.7.0",
-        "jest-resolve-dependencies": "^29.7.0",
-        "jest-runner": "^29.7.0",
-        "jest-runtime": "^29.7.0",
-        "jest-snapshot": "^29.7.0",
-        "jest-util": "^29.7.0",
-        "jest-validate": "^29.7.0",
-        "jest-watcher": "^29.7.0",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^29.7.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "glibc": ">=2.26",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-x64": "1.0.2"
       }
     },
-    "node_modules/@jest/core/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+    "node_modules/@img/sharp-linuxmusl-arm64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz",
+      "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "musl": ">=1.2.2",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-arm64": "1.0.2"
+      }
+    },
+    "node_modules/@img/sharp-linuxmusl-x64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz",
+      "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
       "engines": {
-        "node": ">=10"
+        "musl": ">=1.2.2",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-x64": "1.0.2"
       }
     },
-    "node_modules/@jest/core/node_modules/pretty-format": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
-      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+    "node_modules/@img/sharp-wasm32": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz",
+      "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==",
+      "cpu": [
+        "wasm32"
+      ],
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^18.0.0"
+        "@emnapi/runtime": "^1.1.1"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+    "node_modules/@img/sharp-win32-ia32": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz",
+      "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==",
+      "cpu": [
+        "ia32"
+      ],
       "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
       "engines": {
-        "node": ">=10"
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@jest/core/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
-      "dev": true
-    },
-    "node_modules/@jest/environment": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
-      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+    "node_modules/@img/sharp-win32-x64": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz",
+      "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "dependencies": {
-        "@jest/fake-timers": "^29.7.0",
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-mock": "^29.7.0"
-      },
+      "optional": true,
+      "os": [
+        "win32"
+      ],
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
+        "npm": ">=9.6.5",
+        "pnpm": ">=7.1.0",
+        "yarn": ">=3.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@jest/environment/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
-      "dev": true,
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
       "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/@jest/expect": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
-      "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
-      "dev": true,
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dependencies": {
-        "expect": "^29.7.0",
-        "jest-snapshot": "^29.7.0"
+        "ansi-regex": "^6.0.1"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "node_modules/@jest/expect-utils": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
-      "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+    "node_modules/@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.6.3"
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/fake-timers": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
-      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@sinonjs/fake-timers": "^10.0.2",
-        "@types/node": "*",
-        "jest-message-util": "^29.7.0",
-        "jest-mock": "^29.7.0",
-        "jest-util": "^29.7.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "sprintf-js": "~1.0.2"
       }
     },
-    "node_modules/@jest/fake-timers/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/globals": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
-      "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.7.0",
-        "@jest/expect": "^29.7.0",
-        "@jest/types": "^29.6.3",
-        "jest-mock": "^29.7.0"
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
       },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/@jest/globals/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
+        "p-locate": "^4.1.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/reporters": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@istanbuljs/schema": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/console": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+      "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+      "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/console/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/@jest/core": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+      "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+      "dev": true,
+      "dependencies": {
+        "@jest/console": "^29.7.0",
+        "@jest/reporters": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "jest-changed-files": "^29.7.0",
+        "jest-config": "^29.7.0",
+        "jest-haste-map": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-resolve-dependencies": "^29.7.0",
+        "jest-runner": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "jest-watcher": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^29.7.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@jest/core/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/@jest/core/node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@jest/core/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "dev": true
+    },
+    "node_modules/@jest/environment": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+      "dev": true,
+      "dependencies": {
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/expect": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+      "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+      "dev": true,
+      "dependencies": {
+        "expect": "^29.7.0",
+        "jest-snapshot": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/expect-utils": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+      "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+      "dev": true,
+      "dependencies": {
+        "jest-get-type": "^29.6.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/fake-timers": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@sinonjs/fake-timers": "^10.0.2",
+        "@types/node": "*",
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/globals": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+      "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/environment": "^29.7.0",
+        "@jest/expect": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "jest-mock": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/reporters": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
       "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
       "dev": true,
       "dependencies": {
@@ -3621,6 +3974,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -3781,42 +4135,41 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
-      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dependencies": {
-        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/trace-mapping": "^0.3.24"
       },
       "engines": {
         "node": ">=6.0.0"
       }
     },
     "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
-      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
       "engines": {
         "node": ">=6.0.0"
       }
     },
     "node_modules/@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "engines": {
         "node": ">=6.0.0"
       }
     },
     "node_modules/@jridgewell/source-map": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
-      "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
-      "devOptional": true,
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
       "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.0",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25"
       }
     },
     "node_modules/@jridgewell/sourcemap-codec": {
@@ -3825,20 +4178,14 @@
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.21",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz",
-      "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==",
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
-    "node_modules/@juggle/resize-observer": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
-      "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
-      "dev": true
-    },
     "node_modules/@mdx-js/mdx": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz",
@@ -3885,38 +4232,78 @@
       }
     },
     "node_modules/@next/env": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.1.tgz",
-      "integrity": "sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA=="
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz",
+      "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA=="
     },
     "node_modules/@next/eslint-plugin-next": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.1.tgz",
-      "integrity": "sha512-NP1WoGFnFLpqqCWgGFjnn/sTwUExdPyjeFKRdQP1X/bL/tjAQ/TXDmYqw6vzGaP5NaZ2u6xzg+N/0nd7fOPOGQ==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz",
+      "integrity": "sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==",
       "dev": true,
       "dependencies": {
         "glob": "10.3.10"
       }
     },
-    "node_modules/@next/swc-darwin-arm64": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz",
-      "integrity": "sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
+    "node_modules/@next/eslint-plugin-next/node_modules/glob": {
+      "version": "10.3.10",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+      "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.3.5",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+        "path-scurry": "^1.10.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@next/eslint-plugin-next/node_modules/jackspeak": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "dev": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz",
+      "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
         "node": ">= 10"
       }
     },
     "node_modules/@next/swc-darwin-x64": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz",
-      "integrity": "sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz",
+      "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==",
       "cpu": [
         "x64"
       ],
@@ -3929,9 +4316,9 @@
       }
     },
     "node_modules/@next/swc-linux-arm64-gnu": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz",
-      "integrity": "sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz",
+      "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==",
       "cpu": [
         "arm64"
       ],
@@ -3944,9 +4331,9 @@
       }
     },
     "node_modules/@next/swc-linux-arm64-musl": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz",
-      "integrity": "sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz",
+      "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==",
       "cpu": [
         "arm64"
       ],
@@ -3959,9 +4346,9 @@
       }
     },
     "node_modules/@next/swc-linux-x64-gnu": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz",
-      "integrity": "sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz",
+      "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==",
       "cpu": [
         "x64"
       ],
@@ -3974,9 +4361,9 @@
       }
     },
     "node_modules/@next/swc-linux-x64-musl": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz",
-      "integrity": "sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz",
+      "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==",
       "cpu": [
         "x64"
       ],
@@ -3989,9 +4376,9 @@
       }
     },
     "node_modules/@next/swc-win32-arm64-msvc": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz",
-      "integrity": "sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz",
+      "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==",
       "cpu": [
         "arm64"
       ],
@@ -4004,9 +4391,9 @@
       }
     },
     "node_modules/@next/swc-win32-ia32-msvc": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz",
-      "integrity": "sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz",
+      "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==",
       "cpu": [
         "ia32"
       ],
@@ -4019,9 +4406,9 @@
       }
     },
     "node_modules/@next/swc-win32-x64-msvc": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz",
-      "integrity": "sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz",
+      "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==",
       "cpu": [
         "x64"
       ],
@@ -4034,9 +4421,9 @@
       }
     },
     "node_modules/@noble/hashes": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz",
-      "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+      "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
       "engines": {
         "node": ">= 16"
       },
@@ -4093,16 +4480,16 @@
       "integrity": "sha512-IjwkVqA2SlH8XweoAw7EJkeyPGk7gW9imlvhpywrKiPCLP1H0meG/blNAF5X38pirsmvhxPe/BCyywT7Exwuow=="
     },
     "node_modules/@npmcli/config": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.1.0.tgz",
-      "integrity": "sha512-61LNEybTFaa9Z/f8y6X9s2Blc75aijZK67LxqC5xicBcfkw8M/88nYrRXGXxAUKm6GRlxTZ216dp1UK2+TbaYw==",
+      "version": "8.3.3",
+      "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.3.tgz",
+      "integrity": "sha512-sIMKHiiYr91ALiHjhPq64F5P/SCaiSyDfpNmgYHtlIJtLY445+3+r3VoREzpdDrOwIqwQ6iEHinbTfaocL0UgA==",
       "dev": true,
       "dependencies": {
         "@npmcli/map-workspaces": "^3.0.2",
         "ci-info": "^4.0.0",
-        "ini": "^4.1.0",
-        "nopt": "^7.0.0",
-        "proc-log": "^3.0.0",
+        "ini": "^4.1.2",
+        "nopt": "^7.2.1",
+        "proc-log": "^4.2.0",
         "read-package-json-fast": "^3.0.2",
         "semver": "^7.3.5",
         "walk-up-path": "^3.0.1"
@@ -4127,18 +4514,18 @@
       }
     },
     "node_modules/@npmcli/config/node_modules/ini": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
-      "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+      "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
       "dev": true,
       "engines": {
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/@npmcli/map-workspaces": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz",
-      "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz",
+      "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==",
       "dev": true,
       "dependencies": {
         "@npmcli/name-from-folder": "^2.0.0",
@@ -4159,34 +4546,400 @@
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
+    "node_modules/@opentelemetry/api": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz",
+      "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/@opentelemetry/api-logs": {
+      "version": "0.51.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.51.1.tgz",
+      "integrity": "sha512-E3skn949Pk1z2XtXu/lxf6QAZpawuTM/IUEXcAzpiUkTd73Hmvw26FiN3cJuTmkpM5hZzHwkomVdtrh/n/zzwA==",
+      "dependencies": {
+        "@opentelemetry/api": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@opentelemetry/context-async-hooks": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.24.1.tgz",
+      "integrity": "sha512-R5r6DO4kgEOVBxFXhXjwospLQkv+sYxwCfjvoZBe7Zm6KKXAV9kDSJhi/D1BweowdZmO+sdbENLs374gER8hpQ==",
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.9.0"
+      }
+    },
+    "node_modules/@opentelemetry/core": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.1.tgz",
+      "integrity": "sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==",
+      "dependencies": {
+        "@opentelemetry/semantic-conventions": "1.24.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.9.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation": {
+      "version": "0.51.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.51.1.tgz",
+      "integrity": "sha512-JIrvhpgqY6437QIqToyozrUG1h5UhwHkaGK/WAX+fkrpyPtc+RO5FkRtUd9BH0MibabHHvqsnBGKfKVijbmp8w==",
+      "dependencies": {
+        "@opentelemetry/api-logs": "0.51.1",
+        "@types/shimmer": "^1.0.2",
+        "import-in-the-middle": "1.7.4",
+        "require-in-the-middle": "^7.1.1",
+        "semver": "^7.5.2",
+        "shimmer": "^1.2.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-connect": {
+      "version": "0.36.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.36.1.tgz",
+      "integrity": "sha512-xI5Q/CMmzBmHshPnzzjD19ptFaYO/rQWzokpNio4QixZYWhJsa35QgRvN9FhPkwgtuJIbt/CWWAufJ3egJNHEA==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0",
+        "@types/connect": "3.4.36"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-express": {
+      "version": "0.39.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.39.0.tgz",
+      "integrity": "sha512-AG8U7z7D0JcBu/7dDcwb47UMEzj9/FMiJV2iQZqrsZnxR3FjB9J9oIH2iszJYci2eUdp2WbdvtpD9RV/zmME5A==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-fastify": {
+      "version": "0.36.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.36.1.tgz",
+      "integrity": "sha512-3Nfm43PI0I+3EX+1YbSy6xbDu276R1Dh1tqAk68yd4yirnIh52Kd5B+nJ8CgHA7o3UKakpBjj6vSzi5vNCzJIA==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-graphql": {
+      "version": "0.40.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.40.0.tgz",
+      "integrity": "sha512-LVRdEHWACWOczv2imD+mhUrLMxsEjPPi32vIZJT57zygR5aUiA4em8X3aiGOCycgbMWkIu8xOSGSxdx3JmzN+w==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-hapi": {
+      "version": "0.38.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.38.0.tgz",
+      "integrity": "sha512-ZcOqEuwuutTDYIjhDIStix22ECblG/i9pHje23QGs4Q4YS4RMaZ5hKCoQJxW88Z4K7T53rQkdISmoXFKDV8xMg==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-http": {
+      "version": "0.51.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.51.1.tgz",
+      "integrity": "sha512-6b3nZnFFEz/3xZ6w8bVxctPUWIPWiXuPQ725530JgxnN1cvYFd8CJ75PrHZNjynmzSSnqBkN3ef4R9N+RpMh8Q==",
+      "dependencies": {
+        "@opentelemetry/core": "1.24.1",
+        "@opentelemetry/instrumentation": "0.51.1",
+        "@opentelemetry/semantic-conventions": "1.24.1",
+        "semver": "^7.5.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-ioredis": {
+      "version": "0.40.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.40.0.tgz",
+      "integrity": "sha512-Jv/fH7KhpWe4KBirsiqeUJIYrsdR2iu2l4nWhfOlRvaZ+zYIiLEzTQR6QhBbyRoAbU4OuYJzjWusOmmpGBnwng==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/redis-common": "^0.36.2",
+        "@opentelemetry/semantic-conventions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-koa": {
+      "version": "0.40.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.40.0.tgz",
+      "integrity": "sha512-dJc3H/bKMcgUYcQpLF+1IbmUKus0e5Fnn/+ru/3voIRHwMADT3rFSUcGLWSczkg68BCgz0vFWGDTvPtcWIFr7A==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0",
+        "@types/koa": "2.14.0",
+        "@types/koa__router": "12.0.3"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-mongodb": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.43.0.tgz",
+      "integrity": "sha512-bMKej7Y76QVUD3l55Q9YqizXybHUzF3pujsBFjqbZrRn2WYqtsDtTUlbCK7fvXNPwFInqZ2KhnTqd0gwo8MzaQ==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/sdk-metrics": "^1.9.1",
+        "@opentelemetry/semantic-conventions": "^1.22.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-mongoose": {
+      "version": "0.38.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.38.1.tgz",
+      "integrity": "sha512-zaeiasdnRjXe6VhYCBMdkmAVh1S5MmXC/0spet+yqoaViGnYst/DOxPvhwg3yT4Yag5crZNWsVXnA538UjP6Ow==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.8.0",
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-mysql": {
+      "version": "0.38.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.38.1.tgz",
+      "integrity": "sha512-+iBAawUaTfX/HAlvySwozx0C2B6LBfNPXX1W8Z2On1Uva33AGkw2UjL9XgIg1Pj4eLZ9R4EoJ/aFz+Xj4E/7Fw==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0",
+        "@types/mysql": "2.15.22"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-mysql2": {
+      "version": "0.38.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.38.1.tgz",
+      "integrity": "sha512-qkpHMgWSDTYVB1vlZ9sspf7l2wdS5DDq/rbIepDwX5BA0N0068JTQqh0CgAh34tdFqSCnWXIhcyOXC2TtRb0sg==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0",
+        "@opentelemetry/sql-common": "^0.40.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-nestjs-core": {
+      "version": "0.37.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.37.1.tgz",
+      "integrity": "sha512-ebYQjHZEmGHWEALwwDGhSQVLBaurFnuLIkZD5igPXrt7ohfF4lc5/4al1LO+vKc0NHk8SJWStuRueT86ISA8Vg==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation-pg": {
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.41.0.tgz",
+      "integrity": "sha512-BSlhpivzBD77meQNZY9fS4aKgydA8AJBzv2dqvxXFy/Hq64b7HURgw/ztbmwFeYwdF5raZZUifiiNSMLpOJoSA==",
+      "dependencies": {
+        "@opentelemetry/instrumentation": "^0.51.0",
+        "@opentelemetry/semantic-conventions": "^1.22.0",
+        "@opentelemetry/sql-common": "^0.40.1",
+        "@types/pg": "8.6.1",
+        "@types/pg-pool": "2.0.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/redis-common": {
+      "version": "0.36.2",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz",
+      "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@opentelemetry/resources": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.1.tgz",
+      "integrity": "sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==",
+      "dependencies": {
+        "@opentelemetry/core": "1.24.1",
+        "@opentelemetry/semantic-conventions": "1.24.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.9.0"
+      }
+    },
+    "node_modules/@opentelemetry/sdk-metrics": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.1.tgz",
+      "integrity": "sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==",
+      "dependencies": {
+        "@opentelemetry/core": "1.24.1",
+        "@opentelemetry/resources": "1.24.1",
+        "lodash.merge": "^4.6.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.3.0 <1.9.0"
+      }
+    },
+    "node_modules/@opentelemetry/sdk-trace-base": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.24.1.tgz",
+      "integrity": "sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==",
+      "dependencies": {
+        "@opentelemetry/core": "1.24.1",
+        "@opentelemetry/resources": "1.24.1",
+        "@opentelemetry/semantic-conventions": "1.24.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.9.0"
+      }
+    },
+    "node_modules/@opentelemetry/semantic-conventions": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.1.tgz",
+      "integrity": "sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@opentelemetry/sql-common": {
+      "version": "0.40.1",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz",
+      "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==",
+      "dependencies": {
+        "@opentelemetry/core": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.1.0"
+      }
+    },
     "node_modules/@orama/highlight": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@orama/highlight/-/highlight-0.1.3.tgz",
-      "integrity": "sha512-KmqMkSaGZxKnS2UiK1/nacu7+D+wadT+irgBdIBoda5BkDVPPsIXwIta0ISKmZRaM3GnUs2oKx3KteYojBkIVA==",
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/@orama/highlight/-/highlight-0.1.6.tgz",
+      "integrity": "sha512-6Va8paStIoVy5algYDQu1hU0NUCkcrBx7FSt+0Lllp4d2VA1aVi6ACQ7xoINYls8sDZqg6vXf2lj4YDlVamBtw==",
       "dependencies": {
         "@orama/orama": "^2.0.0-beta.1"
       }
     },
     "node_modules/@orama/orama": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-2.0.3.tgz",
-      "integrity": "sha512-8BXTrXqP+kcyIExipZyf6voB3pzGPREh1BUrIqEP7V4PJwN/SnEcLJsafyPiPFM23fPSyH9krwLrXzvisLL19A==",
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-2.0.19.tgz",
+      "integrity": "sha512-9nlF5iYUghewRt2TDmAJO5TN4hYFPhql4d2ZAdJYJtGSIi2BZjMNQIqQ874w0q/rur67wp0AWLb020EakEN0aA==",
       "engines": {
         "node": ">= 16.0.0"
       }
     },
     "node_modules/@oramacloud/client": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@oramacloud/client/-/client-1.0.9.tgz",
-      "integrity": "sha512-qBYzppjtFfINYHoBRito8hLKJO5KbYswzZYvldBrLZoxSLrPluqt+vW4Ex8E0VhyvqPaezu8koYc79aqBLLEHA==",
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/@oramacloud/client/-/client-1.1.6.tgz",
+      "integrity": "sha512-TocXGSqoIA9MvKd094XcJWVtQcZu0/x0zXZfTjzlLJLhBQdr4R1xQkJ69GHlooD+r/6umlgpaWs+7J711XQZ2Q==",
       "dependencies": {
-        "@orama/orama": "^2.0.1",
+        "@orama/orama": "^2.0.16",
         "@paralleldrive/cuid2": "^2.2.1",
         "lodash": "^4.17.21",
-        "lodash.debounce": "^4.0.8",
-        "lodash.throttle": "^4.1.1",
+        "openai": "^4.24.1",
         "react": "^18.2.0",
-        "vue": "^3.3.4"
+        "vue": "^3.4.25"
       }
     },
     "node_modules/@paralleldrive/cuid2": {
@@ -4219,19 +4972,17 @@
       }
     },
     "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
-      "version": "0.5.11",
-      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz",
-      "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==",
+      "version": "0.5.15",
+      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
+      "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
       "dev": true,
       "dependencies": {
-        "ansi-html-community": "^0.0.8",
-        "common-path-prefix": "^3.0.0",
+        "ansi-html": "^0.0.9",
         "core-js-pure": "^3.23.3",
         "error-stack-parser": "^2.0.6",
-        "find-up": "^5.0.0",
         "html-entities": "^2.1.0",
         "loader-utils": "^2.0.4",
-        "schema-utils": "^3.0.0",
+        "schema-utils": "^4.2.0",
         "source-map": "^0.7.3"
       },
       "engines": {
@@ -4243,7 +4994,7 @@
         "sockjs-client": "^1.4.0",
         "type-fest": ">=0.17.0 <5.0.0",
         "webpack": ">=4.43.0 <6.0.0",
-        "webpack-dev-server": "3.x || 4.x",
+        "webpack-dev-server": "3.x || 4.x || 5.x",
         "webpack-hot-middleware": "2.x",
         "webpack-plugin-serve": "0.x || 1.x"
       },
@@ -4282,6 +5033,16 @@
         "node": ">=8.9.0"
       }
     },
+    "node_modules/@prisma/instrumentation": {
+      "version": "5.14.0",
+      "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.14.0.tgz",
+      "integrity": "sha512-DeybWvIZzu/mUsOYP9MVd6AyBj+MP7xIMrcuIn25MX8FiQX39QBnET5KhszTAip/ToctUuDwSJ46QkIoyo3RFA==",
+      "dependencies": {
+        "@opentelemetry/api": "^1.8",
+        "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51",
+        "@opentelemetry/sdk-trace-base": "^1.22"
+      }
+    },
     "node_modules/@radix-ui/number": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz",
@@ -4795,33 +5556,21 @@
         }
       }
     },
-    "node_modules/@radix-ui/react-select": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz",
-      "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==",
+    "node_modules/@radix-ui/react-scroll-area": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz",
+      "integrity": "sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==",
       "dependencies": {
         "@babel/runtime": "^7.13.10",
         "@radix-ui/number": "1.0.1",
         "@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-slot": "1.0.2",
         "@radix-ui/react-use-callback-ref": "1.0.1",
-        "@radix-ui/react-use-controllable-state": "1.0.1",
-        "@radix-ui/react-use-layout-effect": "1.0.1",
-        "@radix-ui/react-use-previous": "1.0.1",
-        "@radix-ui/react-visually-hidden": "1.0.3",
-        "aria-hidden": "^1.1.1",
-        "react-remove-scroll": "2.5.5"
+        "@radix-ui/react-use-layout-effect": "1.0.1"
       },
       "peerDependencies": {
         "@types/react": "*",
@@ -4838,14 +5587,33 @@
         }
       }
     },
-    "node_modules/@radix-ui/react-separator": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz",
-      "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==",
-      "dev": true,
+    "node_modules/@radix-ui/react-select": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz",
+      "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==",
       "dependencies": {
         "@babel/runtime": "^7.13.10",
-        "@radix-ui/react-primitive": "1.0.3"
+        "@radix-ui/number": "1.0.1",
+        "@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-primitive": "1.0.3",
+        "@radix-ui/react-slot": "1.0.2",
+        "@radix-ui/react-use-callback-ref": "1.0.1",
+        "@radix-ui/react-use-controllable-state": "1.0.1",
+        "@radix-ui/react-use-layout-effect": "1.0.1",
+        "@radix-ui/react-use-previous": "1.0.1",
+        "@radix-ui/react-visually-hidden": "1.0.3",
+        "aria-hidden": "^1.1.1",
+        "react-remove-scroll": "2.5.5"
       },
       "peerDependencies": {
         "@types/react": "*",
@@ -4944,92 +5712,6 @@
         }
       }
     },
-    "node_modules/@radix-ui/react-toggle": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz",
-      "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/primitive": "1.0.1",
-        "@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-toggle-group": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz",
-      "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/primitive": "1.0.1",
-        "@radix-ui/react-context": "1.0.1",
-        "@radix-ui/react-direction": "1.0.1",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-roving-focus": "1.0.4",
-        "@radix-ui/react-toggle": "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-toolbar": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz",
-      "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/primitive": "1.0.1",
-        "@radix-ui/react-context": "1.0.1",
-        "@radix-ui/react-direction": "1.0.1",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-roving-focus": "1.0.4",
-        "@radix-ui/react-separator": "1.0.3",
-        "@radix-ui/react-toggle-group": "1.0.4"
-      },
-      "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-use-callback-ref": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
@@ -5217,6 +5899,7 @@
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
       "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -5269,9 +5952,9 @@
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "node_modules/@rushstack/eslint-patch": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.0.tgz",
-      "integrity": "sha512-Jh4t/593gxs0lJZ/z3NnasKlplXT2f+4y/LZYuaKZW5KAaiVFL/fThhs+17EbUd53jUVJ0QudYCBGbN/psvaqg==",
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz",
+      "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==",
       "dev": true
     },
     "node_modules/@savvywombat/tailwindcss-grid-areas": {
@@ -5285,56 +5968,149 @@
         "tailwindcss": "^3.0.1"
       }
     },
+    "node_modules/@sentry-internal/browser-utils": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.7.0.tgz",
+      "integrity": "sha512-RFBK1sYBwV5qGMEwWF0rjOTqQpp4/SvE+qHkOJNRUTVYmfjM+Y9lcxwn4B6lu3aboxePpBw/i1PlP6XwX4UnGA==",
+      "dependencies": {
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
+      },
+      "engines": {
+        "node": ">=14.18"
+      }
+    },
     "node_modules/@sentry-internal/feedback": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.93.0.tgz",
-      "integrity": "sha512-4G7rMeQbYGfCHxEoFroABX+UREYc2BSbFqjLmLbIcWowSpgzcwweLLphWHKOciqK6f7DnNDK0jZzx3u7NrkWHw==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.7.0.tgz",
+      "integrity": "sha512-qcGtWCtRB4eP7NVQoxW936oPkU4qu9otMLYELPGmOJPnuAG0lujlJXW7BucaM7ADyJgJTE75hG849bHecfnbmQ==",
       "dependencies": {
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=14.18"
       }
     },
-    "node_modules/@sentry-internal/tracing": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz",
-      "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==",
+    "node_modules/@sentry-internal/replay": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.7.0.tgz",
+      "integrity": "sha512-bQzOkWplaWTe3u+aDBhxWY3Qy0aT7ss2A3VR8iC6N8ZIEP9PxqyJwTNoouhinfgmlnCguI7RDOO4f3r3e2M80Q==",
       "dependencies": {
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
+        "@sentry-internal/browser-utils": "8.7.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
+      }
+    },
+    "node_modules/@sentry-internal/replay-canvas": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.7.0.tgz",
+      "integrity": "sha512-FOnvBPbq6MJVHPduc0hcsdE3PeeovQ2z5WJnZDGhvp/Obehxqe+XgX7K/595vRIknv4EokRn/3Kw0mFwG8E+ZQ==",
+      "dependencies": {
+        "@sentry-internal/replay": "8.7.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
+      },
+      "engines": {
+        "node": ">=14.18"
+      }
+    },
+    "node_modules/@sentry/babel-plugin-component-annotate": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.0.tgz",
+      "integrity": "sha512-+uy1qPkA5MSNgJ0L9ur/vNTydfdHwHnBX2RQ+0thsvkqf90fU788YjkkXwUiBBNuqNyI69JiOW6frixAWy7oUg==",
+      "engines": {
+        "node": ">= 14"
       }
     },
     "node_modules/@sentry/browser": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.93.0.tgz",
-      "integrity": "sha512-MtLTcQ7y3rfk+aIvnnwCfSJvYhTJnIJi+Mf6y/ap6SKObdlsKMbQoJLlRViglGLq+nKxHLAvU0fONiCEmKfV6A==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.7.0.tgz",
+      "integrity": "sha512-4EEp+PlcktsMN0p+MdCPl/lghTkq7eOtZjQG9NGhWzfyWrJ3tuL1nsDr2SSivJ1V277F01KtKYo6BFwP2NtBZA==",
+      "dependencies": {
+        "@sentry-internal/browser-utils": "8.7.0",
+        "@sentry-internal/feedback": "8.7.0",
+        "@sentry-internal/replay": "8.7.0",
+        "@sentry-internal/replay-canvas": "8.7.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
+      },
+      "engines": {
+        "node": ">=14.18"
+      }
+    },
+    "node_modules/@sentry/bundler-plugin-core": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.16.0.tgz",
+      "integrity": "sha512-dhgIZsIR3L9KnE2OO5JJm6hPtStAjEPYKQsZzxRr69uVhd9xAvfXeXr0afKVNVEcIDksas6yMgHqwQ2wOXFIAg==",
+      "dependencies": {
+        "@babel/core": "^7.18.5",
+        "@sentry/babel-plugin-component-annotate": "2.16.0",
+        "@sentry/cli": "^2.22.3",
+        "dotenv": "^16.3.1",
+        "find-up": "^5.0.0",
+        "glob": "^9.3.2",
+        "magic-string": "0.27.0",
+        "unplugin": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/@sentry/bundler-plugin-core/node_modules/glob": {
+      "version": "9.3.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+      "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "minimatch": "^8.0.2",
+        "minipass": "^4.2.4",
+        "path-scurry": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": {
+      "version": "8.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+      "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
       "dependencies": {
-        "@sentry-internal/feedback": "7.93.0",
-        "@sentry-internal/tracing": "7.93.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/replay": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+      "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/@sentry/cli": {
-      "version": "1.77.1",
-      "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.77.1.tgz",
-      "integrity": "sha512-OtJ7U9LeuPUAY/xow9wwcjM9w42IJIpDtClTKI/RliE685vd/OJUIpiAvebHNthDYpQynvwb/0iuF4fonh+CKw==",
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.32.1.tgz",
+      "integrity": "sha512-MWkbkzZfnlE7s2pPbg4VozRSAeMlIObfZlTIou9ye6XnPt6ZmmxCLOuOgSKMv4sXg6aeqKNzMNiadThxCWyvPg==",
       "hasInstallScript": true,
       "dependencies": {
         "https-proxy-agent": "^5.0.0",
-        "mkdirp": "^0.5.5",
         "node-fetch": "^2.6.7",
         "progress": "^2.0.3",
         "proxy-from-env": "^1.1.0",
@@ -5344,61 +6120,165 @@
         "sentry-cli": "bin/sentry-cli"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">= 10"
+      },
+      "optionalDependencies": {
+        "@sentry/cli-darwin": "2.32.1",
+        "@sentry/cli-linux-arm": "2.32.1",
+        "@sentry/cli-linux-arm64": "2.32.1",
+        "@sentry/cli-linux-i686": "2.32.1",
+        "@sentry/cli-linux-x64": "2.32.1",
+        "@sentry/cli-win32-i686": "2.32.1",
+        "@sentry/cli-win32-x64": "2.32.1"
+      }
+    },
+    "node_modules/@sentry/cli-darwin": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.32.1.tgz",
+      "integrity": "sha512-z/lEwANTYPCzbWTZ2+eeeNYxRLllC8knd0h+vtAKlhmGw/fyc/N39cznIFyFu+dLJ6tTdjOWOeikHtKuS/7onw==",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/@sentry/core": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz",
-      "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==",
-      "dependencies": {
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
-      },
+    "node_modules/@sentry/cli-linux-arm": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.32.1.tgz",
+      "integrity": "sha512-m0lHkn+o4YKBq8KptGZvpT64FAwSl9mYvHZO9/ChnEGIJ/WyJwiN1X1r9JHVaW4iT5lD0Y5FAyq3JLkk0m0XHg==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux",
+        "freebsd"
+      ],
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      }
+    },
+    "node_modules/@sentry/cli-linux-arm64": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.32.1.tgz",
+      "integrity": "sha512-hsGqHYuecUl1Yhq4MhiRejfh1gNlmhyNPcQEoO/DDRBnGnJyEAdiDpKXJcc2e/lT9k40B55Ob2CP1SeY040T2w==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux",
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@sentry/cli-linux-i686": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.32.1.tgz",
+      "integrity": "sha512-SuMLN1/ceFd3Q/B0DVyh5igjetTAF423txiABAHASenEev0lG0vZkRDXFclfgDtDUKRPmOXW7VDMirM3yZWQHQ==",
+      "cpu": [
+        "x86",
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "linux",
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@sentry/cli-linux-x64": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.32.1.tgz",
+      "integrity": "sha512-x4FGd6xgvFddz8V/dh6jii4wy9qjWyvYLBTz8Fhi9rIP+b8wQ3oxwHIdzntareetZP7C1ggx+hZheiYocNYVwA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux",
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@sentry/cli-win32-i686": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.32.1.tgz",
+      "integrity": "sha512-i6aZma9mFzR+hqMY5VliQZEX6ypP/zUjPK0VtIMYWs5cC6PsQLRmuoeJmy3Z7d4nlh0CdK5NPC813Ej6RY6/vg==",
+      "cpu": [
+        "x86",
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@sentry/cli-win32-x64": {
+      "version": "2.32.1",
+      "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.32.1.tgz",
+      "integrity": "sha512-B58w/lRHLb4MUSjJNfMMw2cQykfimDCMLMmeK+1EiT2RmSeNQliwhhBxYcKk82a8kszH6zg3wT2vCea7LyPUyA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/@sentry/integrations": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.93.0.tgz",
-      "integrity": "sha512-uGQ8+DiqUr6SbhdJJHyIqDJ6kHnFuSv8nZWtj2tJ1I8q8u8MX8t8Om6R/R4ap45gCkWg/zqZq7B+gQV6TYewjQ==",
+    "node_modules/@sentry/core": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.7.0.tgz",
+      "integrity": "sha512-Sq/46B+5nWmgnCD6dEMZ6HTkKbV/KAdgaSvT8oXDb9OWoPy1jJ/gbLrhLs62KbjuDQk4/vWnOgHiKQbcslSzMw==",
       "dependencies": {
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0",
-        "localforage": "^1.8.1"
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       }
     },
     "node_modules/@sentry/nextjs": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-7.93.0.tgz",
-      "integrity": "sha512-/O4Xl+hMSEM6/sVfmKXCZhLUUGNJbi+L0tasTiw4wB4EQQeMDKf4cBfx8e4mNBMzhA2SZnfQZAwJGqhvFJniPQ==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-8.7.0.tgz",
+      "integrity": "sha512-aD+iDPUy5eC1XqPiFfRU09mlK3iCwxSGMg3y/z3GXrUlR9DLI7lMz90l6qaDGFFnjsCT75JrG37dYWVqILAx3g==",
       "dependencies": {
+        "@opentelemetry/instrumentation-http": "0.51.1",
         "@rollup/plugin-commonjs": "24.0.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/integrations": "7.93.0",
-        "@sentry/node": "7.93.0",
-        "@sentry/react": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0",
-        "@sentry/vercel-edge": "7.93.0",
-        "@sentry/webpack-plugin": "1.21.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/node": "8.7.0",
+        "@sentry/opentelemetry": "8.7.0",
+        "@sentry/react": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0",
+        "@sentry/vercel-edge": "8.7.0",
+        "@sentry/webpack-plugin": "2.16.0",
         "chalk": "3.0.0",
         "resolve": "1.22.8",
-        "rollup": "2.78.0",
+        "rollup": "3.29.4",
         "stacktrace-parser": "^0.1.10"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       },
       "peerDependencies": {
-        "next": "^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0",
+        "next": "^13.2.0 || ^14.0",
         "react": "16.x || 17.x || 18.x",
-        "webpack": ">= 4.0.0"
+        "webpack": ">= 5.0.0"
       },
       "peerDependenciesMeta": {
         "webpack": {
@@ -5407,101 +6287,134 @@
       }
     },
     "node_modules/@sentry/node": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.93.0.tgz",
-      "integrity": "sha512-nUXPCZQm5Y9Ipv7iWXLNp5dbuyi1VvbJ3RtlwD7utgsNkRYB4ixtKE9w2QU8DZZAjaEF6w2X94OkYH6C932FWw==",
-      "dependencies": {
-        "@sentry-internal/tracing": "7.93.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0",
-        "https-proxy-agent": "^5.0.0"
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.7.0.tgz",
+      "integrity": "sha512-El1LmXGVe8Ahi5oUdlrE5s3Or23/iGnnntNvaYymXk4BmL4dJtv7ttlQ94ZrI9QWs8VnfM7eHqCd+OPjTh0XJQ==",
+      "dependencies": {
+        "@opentelemetry/api": "^1.8.0",
+        "@opentelemetry/context-async-hooks": "^1.24.1",
+        "@opentelemetry/core": "^1.24.1",
+        "@opentelemetry/instrumentation": "^0.51.1",
+        "@opentelemetry/instrumentation-connect": "0.36.1",
+        "@opentelemetry/instrumentation-express": "0.39.0",
+        "@opentelemetry/instrumentation-fastify": "0.36.1",
+        "@opentelemetry/instrumentation-graphql": "0.40.0",
+        "@opentelemetry/instrumentation-hapi": "0.38.0",
+        "@opentelemetry/instrumentation-http": "0.51.1",
+        "@opentelemetry/instrumentation-ioredis": "0.40.0",
+        "@opentelemetry/instrumentation-koa": "0.40.0",
+        "@opentelemetry/instrumentation-mongodb": "0.43.0",
+        "@opentelemetry/instrumentation-mongoose": "0.38.1",
+        "@opentelemetry/instrumentation-mysql": "0.38.1",
+        "@opentelemetry/instrumentation-mysql2": "0.38.1",
+        "@opentelemetry/instrumentation-nestjs-core": "0.37.1",
+        "@opentelemetry/instrumentation-pg": "0.41.0",
+        "@opentelemetry/resources": "^1.23.0",
+        "@opentelemetry/sdk-trace-base": "^1.23.0",
+        "@opentelemetry/semantic-conventions": "^1.23.0",
+        "@prisma/instrumentation": "5.14.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/opentelemetry": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
+      },
+      "optionalDependencies": {
+        "opentelemetry-instrumentation-fetch-node": "1.2.0"
       }
     },
-    "node_modules/@sentry/react": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.93.0.tgz",
-      "integrity": "sha512-B0bzziV1lEyN7xd0orUPyJdpoK6CtcyodmQkfY0WsHLm/1d9xi95M05lObHnsMWO1js6c9B9d9kO8RlKFz947A==",
-      "dependencies": {
-        "@sentry/browser": "7.93.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0",
-        "hoist-non-react-statics": "^3.3.2"
+    "node_modules/@sentry/opentelemetry": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.7.0.tgz",
+      "integrity": "sha512-I9JEXnqXDBPr5MtgEYRvmcolmpugSgH1QV+SFnfOPc40Mu/npNsJq7oqbGzhlCe4H45XD6LJzFlc7BfoCzwAsQ==",
+      "dependencies": {
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       },
       "peerDependencies": {
-        "react": "15.x || 16.x || 17.x || 18.x"
+        "@opentelemetry/api": "^1.8.0",
+        "@opentelemetry/core": "^1.24.1",
+        "@opentelemetry/instrumentation": "^0.51.1",
+        "@opentelemetry/sdk-trace-base": "^1.23.0",
+        "@opentelemetry/semantic-conventions": "^1.23.0"
       }
     },
-    "node_modules/@sentry/replay": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.93.0.tgz",
-      "integrity": "sha512-dMlLU8v+OkUeGCrPvTu5NriH7BGj3el4rGHWWAYicfJ2QXqTTq50vfasQBP1JeVNcFqnf1y653TdEIvo4RH4tw==",
-      "dependencies": {
-        "@sentry-internal/tracing": "7.93.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
+    "node_modules/@sentry/react": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.7.0.tgz",
+      "integrity": "sha512-JFo8QW8JB4eaFC8RdkOBO96JvlGgstywmyMZ39qWfFbD735vGl8PnOa0AnrC/5Auc86dZ98/I4OEPboqUE9q1w==",
+      "dependencies": {
+        "@sentry/browser": "8.7.0",
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0",
+        "hoist-non-react-statics": "^3.3.2"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=14.18"
+      },
+      "peerDependencies": {
+        "react": "^16.14.0 || 17.x || 18.x || 19.x"
       }
     },
     "node_modules/@sentry/types": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz",
-      "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.7.0.tgz",
+      "integrity": "sha512-11KLOKumP6akugVGLvSoEig+JlP0ZEzW3nN9P+ppgdIx9HAxMIh6UvumbieG4/DWjAh2kh6NPNfUw3gk2Gfq1A==",
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       }
     },
     "node_modules/@sentry/utils": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz",
-      "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.7.0.tgz",
+      "integrity": "sha512-aWmcbSoOmrbzll/FkNQFJcCtLAuJLvTYbRKiCSkV3FScA7UaA742HkTZAPFiioALFIESWk/fcGZqtN0s4I281Q==",
       "dependencies": {
-        "@sentry/types": "7.93.0"
+        "@sentry/types": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       }
     },
     "node_modules/@sentry/vercel-edge": {
-      "version": "7.93.0",
-      "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-7.93.0.tgz",
-      "integrity": "sha512-3jddd6gVUpGX8Sis9gxODL7zPR+lZohYYvOJVhf8UMglZSiWa3/xYJQ5VISj3UH6sVSxvfMxgssmQEHcvuubHQ==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-8.7.0.tgz",
+      "integrity": "sha512-Ggx/en7Agzi4PHsgT91nbEXuv1LIHT2BVSY2ggkD6Uy0xBkwRy2zfSlMaK98BEmVf+pPEGZTEuoYFuBtUsShHw==",
       "dependencies": {
-        "@sentry-internal/tracing": "7.93.0",
-        "@sentry/core": "7.93.0",
-        "@sentry/types": "7.93.0",
-        "@sentry/utils": "7.93.0"
+        "@sentry/core": "8.7.0",
+        "@sentry/types": "8.7.0",
+        "@sentry/utils": "8.7.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14.18"
       }
     },
     "node_modules/@sentry/webpack-plugin": {
-      "version": "1.21.0",
-      "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.21.0.tgz",
-      "integrity": "sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==",
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.16.0.tgz",
+      "integrity": "sha512-BeKLmtK4OD9V3j92fm/lm6yp+++s2U5Uf17HwNFGt39PEOq+wUDISsx0dhXA5Qls2Bg3WhguDK71blCaVefMeg==",
       "dependencies": {
-        "@sentry/cli": "^1.77.1",
-        "webpack-sources": "^2.0.0 || ^3.0.0"
+        "@sentry/bundler-plugin-core": "2.16.0",
+        "unplugin": "1.0.1",
+        "uuid": "^9.0.0"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">= 14"
+      },
+      "peerDependencies": {
+        "webpack": ">=4.40.0"
       }
     },
     "node_modules/@shikijs/core": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.1.2.tgz",
-      "integrity": "sha512-ERVzNQz88ZkDqUpWeC57Kp+Kmx5RjqeDBR1M8AGWGom4yrkITiTfXCGmjchlDSw12MhDTuPYR4HVFW8uT61RaQ=="
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.6.2.tgz",
+      "integrity": "sha512-guW5JeDzZ7uwOjTfCOFZ2VtVXk5tmkMzBYbKGfXsmAH1qYOej49L5jQDcGmwd6/OgvpmWhzO2GNJkQIFnbwLPQ=="
     },
     "node_modules/@sinclair/typebox": {
       "version": "0.27.8",
@@ -5509,10 +6422,22 @@
       "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
       "dev": true
     },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@sinonjs/commons": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
-      "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+      "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
       "dev": true,
       "dependencies": {
         "type-detect": "4.0.8"
@@ -5527,31 +6452,14 @@
         "@sinonjs/commons": "^3.0.0"
       }
     },
-    "node_modules/@storybook/addon-actions": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.17.tgz",
-      "integrity": "sha512-TBphs4v6LRfyTpFo/WINF0TkMaE3rrNog7wW5mbz6n0j8o53kDN4o9ZEcygSL5zQX43CAaghQTeDCss7ueG7ZQ==",
-      "dev": true,
-      "dependencies": {
-        "@storybook/core-events": "7.6.17",
-        "@storybook/global": "^5.0.0",
-        "@types/uuid": "^9.0.1",
-        "dequal": "^2.0.2",
-        "polished": "^4.2.2",
-        "uuid": "^9.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/storybook"
-      }
-    },
     "node_modules/@storybook/addon-controls": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.17.tgz",
-      "integrity": "sha512-zR0aLaUF7FtV/nMRyfniFbCls/e0DAAoXACuOAUAwNAv0lbIS8AyZZiHSmKucCvziUQ6WceeCC7+du3C+9y0rQ==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.1.5.tgz",
+      "integrity": "sha512-O0796G3+772kohYOsR98puROgkEakNXZ9n3FXVsQQ57Ww/CIP7gFRv5VM5z+Jw0a+HQI5be6504hDeAOHrd8qQ==",
       "dev": true,
       "dependencies": {
-        "@storybook/blocks": "7.6.17",
+        "@storybook/blocks": "8.1.5",
+        "dequal": "^2.0.2",
         "lodash": "^4.17.21",
         "ts-dedent": "^2.0.0"
       },
@@ -5561,14 +6469,15 @@
       }
     },
     "node_modules/@storybook/addon-interactions": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.17.tgz",
-      "integrity": "sha512-6zlX+RDQ1PlA6fp7C+hun8t7h2RXfCGs5dGrhEenp2lqnR/rYuUJRC0tmKpkZBb8kZVcbSChzkB/JYkBjBCzpQ==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.1.5.tgz",
+      "integrity": "sha512-jhDpqttch0XhRiCY9rfrs8xQpAH5KcAGAesqfaHaCnCZnZs6jqlGfJgCJAJWzA5PM+IdsK/RJ6abIgD1GAzNyw==",
       "dev": true,
       "dependencies": {
         "@storybook/global": "^5.0.0",
-        "@storybook/types": "7.6.17",
-        "jest-mock": "^27.0.6",
+        "@storybook/instrumenter": "8.1.5",
+        "@storybook/test": "8.1.5",
+        "@storybook/types": "8.1.5",
         "polished": "^4.2.2",
         "ts-dedent": "^2.2.0"
       },
@@ -5578,9 +6487,9 @@
       }
     },
     "node_modules/@storybook/addon-themes": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-7.6.17.tgz",
-      "integrity": "sha512-i/dI3GKlJmQv0Di9HM3fKJvFIab55kvva0vXCGBkqSw3wYoZuq++npkWeDnjjZUvggV12H2RTdGqYwMCXB/GHg==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.1.5.tgz",
+      "integrity": "sha512-B+qJW52ZATuH57SWHIAw4S8bxrLoWKKKTtMeEmhgtlsLYZL31/i+uYpsTTqpkkLx9JK6ofZAV/cjGKWDbsh3Eg==",
       "dev": true,
       "dependencies": {
         "ts-dedent": "^2.0.0"
@@ -5591,9 +6500,9 @@
       }
     },
     "node_modules/@storybook/addon-viewport": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.17.tgz",
-      "integrity": "sha512-sA0QCcf4QAMixWvn8uvRYPfkKCSl6JajJaAspoPqXSxHEpK7uwOlpg3kqFU5XJJPXD0X957M+ONgNvBzYqSpEw==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.1.5.tgz",
+      "integrity": "sha512-kHaYdaAiv7107GSi4TsS1wEDN4I7cdYWSaCBBSvJlvvYvULKFVMkhsDJlSioskICx6OchkIKY5LJgLZ72fxdVA==",
       "dev": true,
       "dependencies": {
         "memoizerific": "^1.11.3"
@@ -5604,27 +6513,28 @@
       }
     },
     "node_modules/@storybook/blocks": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.17.tgz",
-      "integrity": "sha512-PsNVoe0bX1mMn4Kk3nbKZ0ItDZZ0YJnYAFJ6toAbsyBAbgzg1sce88sQinzvbn58/RT9MPKeWMPB45ZS7ggiNg==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.1.5.tgz",
+      "integrity": "sha512-rq8Ej5feS2BlfXOpNLDwdASkIIZJtKzLy9cUpuGftTiu06HiWAk3wpNpnn/kuunDYlZUa+qHEOSiIkTrdduwYw==",
       "dev": true,
       "dependencies": {
-        "@storybook/channels": "7.6.17",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/components": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/csf": "^0.1.2",
-        "@storybook/docs-tools": "7.6.17",
+        "@storybook/channels": "8.1.5",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/components": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/csf": "^0.1.7",
+        "@storybook/docs-tools": "8.1.5",
         "@storybook/global": "^5.0.0",
-        "@storybook/manager-api": "7.6.17",
-        "@storybook/preview-api": "7.6.17",
-        "@storybook/theming": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/icons": "^1.2.5",
+        "@storybook/manager-api": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
+        "@storybook/theming": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/lodash": "^4.14.167",
         "color-convert": "^2.0.1",
         "dequal": "^2.0.2",
         "lodash": "^4.17.21",
-        "markdown-to-jsx": "^7.1.8",
+        "markdown-to-jsx": "7.3.2",
         "memoizerific": "^1.11.3",
         "polished": "^4.2.2",
         "react-colorful": "^5.1.2",
@@ -5638,29 +6548,35 @@
         "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
       }
     },
     "node_modules/@storybook/builder-manager": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.17.tgz",
-      "integrity": "sha512-Sj8hcDYiPCCMfeLzus37czl0zdrAxAz4IyYam2jBjVymrIrcDAFyL1OCZvnq33ft179QYQWhUs9qwzVmlR/ZWg==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.1.5.tgz",
+      "integrity": "sha512-wDiHLV+UPaUN+765WwXkocVRB2QnJ61CjLHbpWaLiJvryFJt+JQ6nAvgSalCRnZxI046ztbS9T6okhpFI011IA==",
       "dev": true,
       "dependencies": {
         "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/manager": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/manager": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
         "@types/ejs": "^3.1.1",
-        "@types/find-cache-dir": "^3.2.1",
         "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
         "browser-assert": "^1.2.1",
-        "ejs": "^3.1.8",
-        "esbuild": "^0.18.0",
+        "ejs": "^3.1.10",
+        "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
         "esbuild-plugin-alias": "^0.2.1",
         "express": "^4.17.3",
-        "find-cache-dir": "^3.0.0",
         "fs-extra": "^11.1.0",
         "process": "^0.11.10",
         "util": "^0.12.4"
@@ -5671,30 +6587,27 @@
       }
     },
     "node_modules/@storybook/builder-webpack5": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.17.tgz",
-      "integrity": "sha512-GMaBd8/RzivuAmWrYSt9Rga3j8WLcu5LCMYiPVs+XKXsKAC8lTkV0WRWh8Nk6wTmfzsRQ2acwFjSG5oE4ClZKA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.23.2",
-        "@storybook/channels": "7.6.17",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/core-webpack": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/preview": "7.6.17",
-        "@storybook/preview-api": "7.6.17",
-        "@swc/core": "^1.3.82",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.1.5.tgz",
+      "integrity": "sha512-gGVlApa0JVu0q7Ws37Kubh9e8wDKoJh23DXGIeK3EHVloL2XU9+wgP2NcUoiySvTIKPtDB7Zljg1/BXgqeOJ4w==",
+      "dev": true,
+      "dependencies": {
+        "@storybook/channels": "8.1.5",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/core-webpack": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/preview": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
         "@types/node": "^18.0.0",
         "@types/semver": "^7.3.4",
-        "babel-loader": "^9.0.0",
         "browser-assert": "^1.2.1",
         "case-sensitive-paths-webpack-plugin": "^2.4.0",
         "cjs-module-lexer": "^1.2.3",
         "constants-browserify": "^1.0.0",
         "css-loader": "^6.7.1",
-        "es-module-lexer": "^1.4.1",
+        "es-module-lexer": "^1.5.0",
         "express": "^4.17.3",
         "fork-ts-checker-webpack-plugin": "^8.0.0",
         "fs-extra": "^11.1.0",
@@ -5704,14 +6617,13 @@
         "process": "^0.11.10",
         "semver": "^7.3.7",
         "style-loader": "^3.3.1",
-        "swc-loader": "^0.2.3",
         "terser-webpack-plugin": "^5.3.1",
         "ts-dedent": "^2.0.0",
         "url": "^0.11.0",
         "util": "^0.12.4",
         "util-deprecate": "^1.0.2",
         "webpack": "5",
-        "webpack-dev-middleware": "^6.1.1",
+        "webpack-dev-middleware": "^6.1.2",
         "webpack-hot-middleware": "^2.25.1",
         "webpack-virtual-modules": "^0.5.0"
       },
@@ -5726,36 +6638,32 @@
       }
     },
     "node_modules/@storybook/builder-webpack5/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
     "node_modules/@storybook/builder-webpack5/node_modules/magic-string": {
-      "version": "0.30.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
-      "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dev": true,
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
-      },
-      "engines": {
-        "node": ">=12"
       }
     },
     "node_modules/@storybook/channels": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz",
-      "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.1.5.tgz",
+      "integrity": "sha512-R+puP4tWYzQUbpIp8sX6U5oI+ZUevVOaFxXGaAN3PRXjIRC38oKTVWzj/G6GdziVFzN6rDn+JsYPmiRMYo1sYg==",
       "dev": true,
       "dependencies": {
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-events": "7.6.17",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-events": "8.1.5",
         "@storybook/global": "^5.0.0",
-        "qs": "^6.10.0",
         "telejson": "^7.2.0",
         "tiny-invariant": "^1.3.1"
       },
@@ -5765,23 +6673,22 @@
       }
     },
     "node_modules/@storybook/cli": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.17.tgz",
-      "integrity": "sha512-1sCo+nCqyR+nKfTcEidVu8XzNoECC7Y1l+uW38/r7s2f/TdDorXaIGAVrpjbSaXSoQpx5DxYJVaKCcQuOgqwcA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.1.5.tgz",
+      "integrity": "sha512-VEYluZEMleNEnD5wTD90KTh03pwjvQwEEmzHAJQJdLbWTAcgBxZ3Gb45nbUPauSqBL+HdJx0QXF8Ielk+iBttw==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.23.2",
-        "@babel/preset-env": "^7.23.2",
-        "@babel/types": "^7.23.0",
+        "@babel/core": "^7.24.4",
+        "@babel/types": "^7.24.0",
         "@ndelangen/get-tarball": "^3.0.7",
-        "@storybook/codemod": "7.6.17",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/core-server": "7.6.17",
-        "@storybook/csf-tools": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/telemetry": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/codemod": "8.1.5",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/core-server": "8.1.5",
+        "@storybook/csf-tools": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/telemetry": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/semver": "^7.3.4",
         "@yarnpkg/fslib": "2.10.3",
         "@yarnpkg/libzip": "2.3.0",
@@ -5791,25 +6698,22 @@
         "detect-indent": "^6.1.0",
         "envinfo": "^7.7.3",
         "execa": "^5.0.0",
-        "express": "^4.17.3",
         "find-up": "^5.0.0",
         "fs-extra": "^11.1.0",
         "get-npm-tarball-url": "^2.0.3",
-        "get-port": "^5.1.1",
         "giget": "^1.0.0",
-        "globby": "^11.0.2",
+        "globby": "^14.0.1",
         "jscodeshift": "^0.15.1",
         "leven": "^3.1.0",
         "ora": "^5.4.1",
-        "prettier": "^2.8.0",
+        "prettier": "^3.1.1",
         "prompts": "^2.4.0",
-        "puppeteer-core": "^2.1.1",
         "read-pkg-up": "^7.0.1",
         "semver": "^7.3.7",
         "strip-json-comments": "^3.0.1",
-        "tempy": "^1.0.1",
-        "ts-dedent": "^2.0.0",
-        "util-deprecate": "^1.0.2"
+        "tempy": "^3.1.0",
+        "tiny-invariant": "^1.3.1",
+        "ts-dedent": "^2.0.0"
       },
       "bin": {
         "getstorybook": "bin/index.js",
@@ -5845,25 +6749,54 @@
         "node": ">= 6"
       }
     },
-    "node_modules/@storybook/cli/node_modules/prettier": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
-      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+    "node_modules/@storybook/cli/node_modules/globby": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz",
+      "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==",
       "dev": true,
-      "bin": {
-        "prettier": "bin-prettier.js"
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.2",
+        "ignore": "^5.2.4",
+        "path-type": "^5.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.1.0"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/prettier/prettier?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/cli/node_modules/path-type": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+      "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/cli/node_modules/slash": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/@storybook/client-logger": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz",
-      "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.1.5.tgz",
+      "integrity": "sha512-zd+aENXnOHsxBATppELmhw/UywLzCxQjz/8i/xkUjeTRB4Ggp0hJlOUdJUEdIJz631ydyytfvM70ktBj9gMl1w==",
       "dev": true,
       "dependencies": {
         "@storybook/global": "^5.0.0"
@@ -5874,61 +6807,91 @@
       }
     },
     "node_modules/@storybook/codemod": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.17.tgz",
-      "integrity": "sha512-JuTmf2u3C4fCnjO7o3dqRgrq3ozNYfWlrRP8xuIdvT7niMap7a396hJtSKqS10FxCgKFcMAOsRgrCalH1dWxUg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.23.2",
-        "@babel/preset-env": "^7.23.2",
-        "@babel/types": "^7.23.0",
-        "@storybook/csf": "^0.1.2",
-        "@storybook/csf-tools": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/types": "7.6.17",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.1.5.tgz",
+      "integrity": "sha512-eGoYozT2XPfsIFrzm4cJo9tRTX0yuK1y4uTYmKvnomezHu5kiY8qo2fUzQa5DHxiAzRDTpGlQTzb0PsxHOxYoA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.24.4",
+        "@babel/preset-env": "^7.24.4",
+        "@babel/types": "^7.24.0",
+        "@storybook/csf": "^0.1.7",
+        "@storybook/csf-tools": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/cross-spawn": "^6.0.2",
         "cross-spawn": "^7.0.3",
-        "globby": "^11.0.2",
+        "globby": "^14.0.1",
         "jscodeshift": "^0.15.1",
         "lodash": "^4.17.21",
-        "prettier": "^2.8.0",
-        "recast": "^0.23.1"
+        "prettier": "^3.1.1",
+        "recast": "^0.23.5",
+        "tiny-invariant": "^1.3.1"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
       }
     },
-    "node_modules/@storybook/codemod/node_modules/prettier": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
-      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+    "node_modules/@storybook/codemod/node_modules/globby": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz",
+      "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==",
       "dev": true,
-      "bin": {
-        "prettier": "bin-prettier.js"
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.2",
+        "ignore": "^5.2.4",
+        "path-type": "^5.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.1.0"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/prettier/prettier?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/codemod/node_modules/path-type": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+      "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/codemod/node_modules/slash": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/@storybook/components": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.17.tgz",
-      "integrity": "sha512-lbh7GynMidA+CZcJnstVku6Nhs+YkqjYaZ+mKPugvlVhGVWv0DaaeQFVuZ8cJtUGJ/5FFU4Y+n+gylYUHkGBMA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.1.5.tgz",
+      "integrity": "sha512-IxoT2pH7V98gF0zDAMUuq9sUZPg0vvQ9Y+A13HeYHvaY25XdesXVMbdzEd6SpeLYmfPykMPIAEcADfqeM6eXfA==",
       "dev": true,
       "dependencies": {
-        "@radix-ui/react-select": "^1.2.2",
-        "@radix-ui/react-toolbar": "^1.0.4",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/csf": "^0.1.2",
+        "@radix-ui/react-dialog": "^1.0.5",
+        "@radix-ui/react-slot": "^1.0.2",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/csf": "^0.1.7",
         "@storybook/global": "^5.0.0",
-        "@storybook/theming": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/icons": "^1.2.5",
+        "@storybook/theming": "8.1.5",
+        "@storybook/types": "8.1.5",
         "memoizerific": "^1.11.3",
-        "use-resize-observer": "^9.1.0",
         "util-deprecate": "^1.0.2"
       },
       "funding": {
@@ -5936,274 +6899,115 @@
         "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
       }
     },
-    "node_modules/@storybook/components/node_modules/@radix-ui/react-dismissable-layer": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz",
-      "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==",
+    "node_modules/@storybook/core-common": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.1.5.tgz",
+      "integrity": "sha512-1QDOT6KPZ9KV7Gs1yyqzvSwGBmNSUB33gckUldSBF4aqP+tZ7W5JIQ6/YTtp3V02sEokZGdL9Ud4LczQxTgy3A==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/primitive": "1.0.1",
-        "@radix-ui/react-compose-refs": "1.0.1",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-use-callback-ref": "1.0.1",
-        "@radix-ui/react-use-escape-keydown": "1.0.3"
-      },
-      "peerDependencies": {
-        "@types/react": "*",
-        "@types/react-dom": "*",
-        "react": "^16.8 || ^17.0 || ^18.0",
-        "react-dom": "^16.8 || ^17.0 || ^18.0"
+        "@storybook/core-events": "8.1.5",
+        "@storybook/csf-tools": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/types": "8.1.5",
+        "@yarnpkg/fslib": "2.10.3",
+        "@yarnpkg/libzip": "2.3.0",
+        "chalk": "^4.1.0",
+        "cross-spawn": "^7.0.3",
+        "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
+        "esbuild-register": "^3.5.0",
+        "execa": "^5.0.0",
+        "file-system-cache": "2.3.0",
+        "find-cache-dir": "^3.0.0",
+        "find-up": "^5.0.0",
+        "fs-extra": "^11.1.0",
+        "glob": "^10.0.0",
+        "handlebars": "^4.7.7",
+        "lazy-universal-dotenv": "^4.0.0",
+        "node-fetch": "^2.0.0",
+        "picomatch": "^2.3.0",
+        "pkg-dir": "^5.0.0",
+        "prettier-fallback": "npm:prettier@^3",
+        "pretty-hrtime": "^1.0.3",
+        "resolve-from": "^5.0.0",
+        "semver": "^7.3.7",
+        "tempy": "^3.1.0",
+        "tiny-invariant": "^1.3.1",
+        "ts-dedent": "^2.0.0",
+        "util": "^0.12.4"
       },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "@types/react-dom": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@storybook/components/node_modules/@radix-ui/react-focus-scope": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz",
-      "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/react-compose-refs": "1.0.1",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-use-callback-ref": "1.0.1"
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "@types/react": "*",
-        "@types/react-dom": "*",
-        "react": "^16.8 || ^17.0 || ^18.0",
-        "react-dom": "^16.8 || ^17.0 || ^18.0"
+        "prettier": "^2 || ^3"
       },
       "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "@types/react-dom": {
+        "prettier": {
           "optional": true
         }
       }
     },
-    "node_modules/@storybook/components/node_modules/@radix-ui/react-popper": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz",
-      "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==",
+    "node_modules/@storybook/core-common/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@floating-ui/react-dom": "^2.0.0",
-        "@radix-ui/react-arrow": "1.0.3",
-        "@radix-ui/react-compose-refs": "1.0.1",
-        "@radix-ui/react-context": "1.0.1",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-use-callback-ref": "1.0.1",
-        "@radix-ui/react-use-layout-effect": "1.0.1",
-        "@radix-ui/react-use-rect": "1.0.1",
-        "@radix-ui/react-use-size": "1.0.1",
-        "@radix-ui/rect": "1.0.1"
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
       },
-      "peerDependencies": {
-        "@types/react": "*",
-        "@types/react-dom": "*",
-        "react": "^16.8 || ^17.0 || ^18.0",
-        "react-dom": "^16.8 || ^17.0 || ^18.0"
+      "engines": {
+        "node": ">=10"
       },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "@types/react-dom": {
-          "optional": true
-        }
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/@storybook/components/node_modules/@radix-ui/react-portal": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz",
-      "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==",
+    "node_modules/@storybook/core-events": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.1.5.tgz",
+      "integrity": "sha512-fgwbrHoLtSX6kfmamTGJqD+KfuEgun8cc4mWKZK094ByaqbSjhnOyeYO1sfVk8qst7QTFlOfhLAUe4cz1z149A==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/react-primitive": "1.0.3"
-      },
-      "peerDependencies": {
-        "@types/react": "*",
-        "@types/react-dom": "*",
-        "react": "^16.8 || ^17.0 || ^18.0",
-        "react-dom": "^16.8 || ^17.0 || ^18.0"
+        "@storybook/csf": "^0.1.7",
+        "ts-dedent": "^2.0.0"
       },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "@types/react-dom": {
-          "optional": true
-        }
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
       }
     },
-    "node_modules/@storybook/components/node_modules/@radix-ui/react-select": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz",
-      "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.13.10",
-        "@radix-ui/number": "1.0.1",
-        "@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.4",
-        "@radix-ui/react-focus-guards": "1.0.1",
-        "@radix-ui/react-focus-scope": "1.0.3",
-        "@radix-ui/react-id": "1.0.1",
-        "@radix-ui/react-popper": "1.1.2",
-        "@radix-ui/react-portal": "1.0.3",
-        "@radix-ui/react-primitive": "1.0.3",
-        "@radix-ui/react-slot": "1.0.2",
-        "@radix-ui/react-use-callback-ref": "1.0.1",
-        "@radix-ui/react-use-controllable-state": "1.0.1",
-        "@radix-ui/react-use-layout-effect": "1.0.1",
-        "@radix-ui/react-use-previous": "1.0.1",
-        "@radix-ui/react-visually-hidden": "1.0.3",
-        "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/@storybook/core-client": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.17.tgz",
-      "integrity": "sha512-LuDbADK+DPNAOOCXOlvY09hdGVueXlDetsdOJ/DgYnSa9QSWv9Uv+F8QcEgR3QckZJbPlztKJIVLgP2n/Xkijw==",
-      "dev": true,
-      "dependencies": {
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/preview-api": "7.6.17"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/storybook"
-      }
-    },
-    "node_modules/@storybook/core-common": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz",
-      "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==",
-      "dev": true,
-      "dependencies": {
-        "@storybook/core-events": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/types": "7.6.17",
-        "@types/find-cache-dir": "^3.2.1",
-        "@types/node": "^18.0.0",
-        "@types/node-fetch": "^2.6.4",
-        "@types/pretty-hrtime": "^1.0.0",
-        "chalk": "^4.1.0",
-        "esbuild": "^0.18.0",
-        "esbuild-register": "^3.5.0",
-        "file-system-cache": "2.3.0",
-        "find-cache-dir": "^3.0.0",
-        "find-up": "^5.0.0",
-        "fs-extra": "^11.1.0",
-        "glob": "^10.0.0",
-        "handlebars": "^4.7.7",
-        "lazy-universal-dotenv": "^4.0.0",
-        "node-fetch": "^2.0.0",
-        "picomatch": "^2.3.0",
-        "pkg-dir": "^5.0.0",
-        "pretty-hrtime": "^1.0.3",
-        "resolve-from": "^5.0.0",
-        "ts-dedent": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/storybook"
-      }
-    },
-    "node_modules/@storybook/core-common/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
-      "dev": true,
-      "dependencies": {
-        "undici-types": "~5.26.4"
-      }
-    },
-    "node_modules/@storybook/core-common/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@storybook/core-events": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz",
-      "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==",
-      "dev": true,
-      "dependencies": {
-        "ts-dedent": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/storybook"
-      }
-    },
-    "node_modules/@storybook/core-server": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.17.tgz",
-      "integrity": "sha512-KWGhTTaL1Q14FolcoKKZgytlPJUbH6sbJ1Ptj/84EYWFewcnEgVs0Zlnh1VStRZg+Rd1WC1V4yVd/bbDzxrvQA==",
+    "node_modules/@storybook/core-server": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.1.5.tgz",
+      "integrity": "sha512-y16W2sg5KIHG6qgbd+a0nBUYHAgiUpPDFF7cdcIpbeOIoqFn+6ECp93MVefukumiSj3sQiJFU/tSm2A8apGltw==",
       "dev": true,
       "dependencies": {
         "@aw-web-design/x-default-browser": "1.4.126",
+        "@babel/core": "^7.24.4",
+        "@babel/parser": "^7.24.4",
         "@discoveryjs/json-ext": "^0.5.3",
-        "@storybook/builder-manager": "7.6.17",
-        "@storybook/channels": "7.6.17",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/csf": "^0.1.2",
-        "@storybook/csf-tools": "7.6.17",
-        "@storybook/docs-mdx": "^0.1.0",
+        "@storybook/builder-manager": "8.1.5",
+        "@storybook/channels": "8.1.5",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/csf": "^0.1.7",
+        "@storybook/csf-tools": "8.1.5",
+        "@storybook/docs-mdx": "3.1.0-next.0",
         "@storybook/global": "^5.0.0",
-        "@storybook/manager": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/preview-api": "7.6.17",
-        "@storybook/telemetry": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/manager": "8.1.5",
+        "@storybook/manager-api": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
+        "@storybook/telemetry": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/detect-port": "^1.3.0",
+        "@types/diff": "^5.0.9",
         "@types/node": "^18.0.0",
         "@types/pretty-hrtime": "^1.0.0",
         "@types/semver": "^7.3.4",
@@ -6212,9 +7016,10 @@
         "cli-table3": "^0.6.1",
         "compression": "^1.7.4",
         "detect-port": "^1.3.0",
+        "diff": "^5.2.0",
         "express": "^4.17.3",
         "fs-extra": "^11.1.0",
-        "globby": "^11.0.2",
+        "globby": "^14.0.1",
         "ip": "^2.0.1",
         "lodash": "^4.17.21",
         "open": "^8.4.0",
@@ -6236,9 +7041,9 @@
       }
     },
     "node_modules/@storybook/core-server/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
@@ -6260,15 +7065,59 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
+    "node_modules/@storybook/core-server/node_modules/globby": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz",
+      "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==",
+      "dev": true,
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.2",
+        "ignore": "^5.2.4",
+        "path-type": "^5.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/core-server/node_modules/path-type": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+      "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@storybook/core-server/node_modules/slash": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@storybook/core-webpack": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.17.tgz",
-      "integrity": "sha512-PyGrFhRM8sTONGwwLWLqBQ1HO+LBnVZ+5TOQO7ejQfdV2FWyNOzjBXm2e5jL/C6XlqiEhmL5pyHEyDBaQJQ3KA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.1.5.tgz",
+      "integrity": "sha512-yXixldqg6gGT0OGWuWd52YZycgTrqiPlVHsi91SPtQJSaj3YRS2cM/Giq+gPTE0Zb9+Izq8QEnkyr8B4MfvGbQ==",
       "dev": true,
       "dependencies": {
-        "@storybook/core-common": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/node": "^18.0.0",
         "ts-dedent": "^2.0.0"
       },
@@ -6278,37 +7127,37 @@
       }
     },
     "node_modules/@storybook/core-webpack/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
     "node_modules/@storybook/csf": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz",
-      "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==",
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.8.tgz",
+      "integrity": "sha512-Ntab9o7LjBCbFIao5l42itFiaSh/Qu+l16l/r/9qmV9LnYZkO+JQ7tzhdlwpgJfhs+B5xeejpdAtftDRyXNajw==",
       "dev": true,
       "dependencies": {
         "type-fest": "^2.19.0"
       }
     },
     "node_modules/@storybook/csf-tools": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz",
-      "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.1.5.tgz",
+      "integrity": "sha512-jOfUo0arlaG4LlsdWaRfZCS0I1FhUnkf06ThzRBrrp8mFAPtOpf9iW16J3fYMS5vAdE/v+Z1RxuTRich4/JGdQ==",
       "dev": true,
       "dependencies": {
-        "@babel/generator": "^7.23.0",
-        "@babel/parser": "^7.23.0",
-        "@babel/traverse": "^7.23.2",
-        "@babel/types": "^7.23.0",
-        "@storybook/csf": "^0.1.2",
-        "@storybook/types": "7.6.17",
+        "@babel/generator": "^7.24.4",
+        "@babel/parser": "^7.24.4",
+        "@babel/traverse": "^7.24.1",
+        "@babel/types": "^7.24.0",
+        "@storybook/csf": "^0.1.7",
+        "@storybook/types": "8.1.5",
         "fs-extra": "^11.1.0",
-        "recast": "^0.23.1",
+        "recast": "^0.23.5",
         "ts-dedent": "^2.0.0"
       },
       "funding": {
@@ -6317,20 +7166,21 @@
       }
     },
     "node_modules/@storybook/docs-mdx": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz",
-      "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==",
+      "version": "3.1.0-next.0",
+      "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.1.0-next.0.tgz",
+      "integrity": "sha512-t4syFIeSyufieNovZbLruPt2DmRKpbwL4fERCZ1MifWDRIORCKLc4NCEHy+IqvIqd71/SJV2k4B51nF7vlJfmQ==",
       "dev": true
     },
     "node_modules/@storybook/docs-tools": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.17.tgz",
-      "integrity": "sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.1.5.tgz",
+      "integrity": "sha512-zlHv8fi1Bw8RbjkGGBJoO/RbM41bwxU1kV76TPQUyqQmzqPRsHi3zt+8bdddQLNrC6rhTF+Cj3yEdPfTZrB0aA==",
       "dev": true,
       "dependencies": {
-        "@storybook/core-common": "7.6.17",
-        "@storybook/preview-api": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/doctrine": "^0.0.3",
         "assert": "^2.1.0",
         "doctrine": "^3.0.0",
@@ -6347,10 +7197,42 @@
       "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
       "dev": true
     },
+    "node_modules/@storybook/icons": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.9.tgz",
+      "integrity": "sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==",
+      "dev": true,
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@storybook/instrumenter": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.1.5.tgz",
+      "integrity": "sha512-pyOg0YeL06bIFw8J3y0E1xyaJEVX5dtyvFZ31xi7jcElhsO/uPTbrJzSfMFtv3kDXU3hKDpeI2pbxpkFUVSvsQ==",
+      "dev": true,
+      "dependencies": {
+        "@storybook/channels": "8.1.5",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/global": "^5.0.0",
+        "@storybook/preview-api": "8.1.5",
+        "@vitest/utils": "^1.3.1",
+        "util": "^0.12.4"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      }
+    },
     "node_modules/@storybook/manager": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.17.tgz",
-      "integrity": "sha512-A1LDDIqMpwRzq/dqkbbiza0QI04o4ZHCl2a3UMDZUV/+QLc2nsr2DAaLk4CVL4/cIc5zGqmIcaOTvprx2YKVBw==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-8.1.5.tgz",
+      "integrity": "sha512-qMYwD1cXW0hJ3pMmdMlbsqktVBlsjsqwMH5PBzAN4FoWiCQ/yHeAnDXRUgFFaLcORS72h9H/cQuJ+p//RdeURg==",
       "dev": true,
       "funding": {
         "type": "opencollective",
@@ -6358,19 +7240,20 @@
       }
     },
     "node_modules/@storybook/manager-api": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.17.tgz",
-      "integrity": "sha512-IJIV1Yc6yw1dhCY4tReHCfBnUKDqEBnMyHp3mbXpsaHxnxJZrXO45WjRAZIKlQKhl/Ge1CrnznmHRCmYgqmrWg==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.1.5.tgz",
+      "integrity": "sha512-iVP7FOKDf9L7zWCb8C2XeZjWSILS3hHeNwILvd9YSX9dg9du41kJYahsAHxDCR/jp/gv0ZM/V0vuHzi+naVPkQ==",
       "dev": true,
       "dependencies": {
-        "@storybook/channels": "7.6.17",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/csf": "^0.1.2",
+        "@storybook/channels": "8.1.5",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/csf": "^0.1.7",
         "@storybook/global": "^5.0.0",
-        "@storybook/router": "7.6.17",
-        "@storybook/theming": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/icons": "^1.2.5",
+        "@storybook/router": "8.1.5",
+        "@storybook/theming": "8.1.5",
+        "@storybook/types": "8.1.5",
         "dequal": "^2.0.2",
         "lodash": "^4.17.21",
         "memoizerific": "^1.11.3",
@@ -6384,34 +7267,37 @@
       }
     },
     "node_modules/@storybook/nextjs": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.6.17.tgz",
-      "integrity": "sha512-bD9x6HzH/fxiFnghOQfDM60tNUNxFNVVCZi6OvTRxVVz/5xdqbVnYVOuaJeUSLuUnGs7ALYfx8+2OTJQ9NrwRA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-8.1.5.tgz",
+      "integrity": "sha512-iHkRvYQGK+lFbeBx18UvGHbExbySo/6Yugcjvm28WajXOETStpD/Awq6r42hMWT2hLa9tbkTv+b6TDzAoo4eNw==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.23.2",
+        "@babel/core": "^7.24.4",
         "@babel/plugin-syntax-bigint": "^7.8.3",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-syntax-import-assertions": "^7.22.5",
-        "@babel/plugin-transform-class-properties": "^7.22.5",
-        "@babel/plugin-transform-export-namespace-from": "^7.22.11",
-        "@babel/plugin-transform-numeric-separator": "^7.22.11",
-        "@babel/plugin-transform-object-rest-spread": "^7.22.15",
-        "@babel/plugin-transform-runtime": "^7.23.2",
-        "@babel/preset-env": "^7.23.2",
-        "@babel/preset-react": "^7.22.15",
-        "@babel/preset-typescript": "^7.23.2",
-        "@babel/runtime": "^7.23.2",
-        "@storybook/addon-actions": "7.6.17",
-        "@storybook/builder-webpack5": "7.6.17",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/preset-react-webpack": "7.6.17",
-        "@storybook/preview-api": "7.6.17",
-        "@storybook/react": "7.6.17",
+        "@babel/plugin-syntax-import-assertions": "^7.24.1",
+        "@babel/plugin-transform-class-properties": "^7.24.1",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.1",
+        "@babel/plugin-transform-numeric-separator": "^7.24.1",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.1",
+        "@babel/plugin-transform-runtime": "^7.24.3",
+        "@babel/preset-env": "^7.24.4",
+        "@babel/preset-react": "^7.24.1",
+        "@babel/preset-typescript": "^7.24.1",
+        "@babel/runtime": "^7.24.4",
+        "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
+        "@storybook/builder-webpack5": "8.1.5",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/preset-react-webpack": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
+        "@storybook/react": "8.1.5",
+        "@storybook/test": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/node": "^18.0.0",
         "@types/semver": "^7.3.4",
+        "babel-loader": "^9.1.3",
         "css-loader": "^6.7.3",
         "find-up": "^5.0.0",
         "fs-extra": "^11.1.0",
@@ -6419,12 +7305,12 @@
         "loader-utils": "^3.2.1",
         "node-polyfill-webpack-plugin": "^2.0.1",
         "pnp-webpack-plugin": "^1.7.0",
-        "postcss": "^8.4.21",
-        "postcss-loader": "^7.0.2",
+        "postcss": "^8.4.38",
+        "postcss-loader": "^8.1.1",
+        "react-refresh": "^0.14.0",
         "resolve-url-loader": "^5.0.0",
         "sass-loader": "^12.4.0",
         "semver": "^7.3.5",
-        "sharp": "^0.32.6",
         "style-loader": "^3.3.1",
         "styled-jsx": "5.1.1",
         "ts-dedent": "^2.0.0",
@@ -6432,23 +7318,22 @@
         "tsconfig-paths-webpack-plugin": "^4.0.1"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=18.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
       },
+      "optionalDependencies": {
+        "sharp": "^0.33.3"
+      },
       "peerDependencies": {
-        "@next/font": "^13.0.0|| ^14.0.0",
-        "next": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "next": "^13.5.0 || ^14.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
         "webpack": "^5.0.0"
       },
       "peerDependenciesMeta": {
-        "@next/font": {
-          "optional": true
-        },
         "typescript": {
           "optional": true
         },
@@ -6458,63 +7343,18 @@
       }
     },
     "node_modules/@storybook/nextjs/node_modules/@types/node": {
-      "version": "18.19.7",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.7.tgz",
-      "integrity": "sha512-IGRJfoNX10N/PfrReRZ1br/7SQ+2vF/tK3KXNwzXz82D32z5dMQEoOlFew18nLSN+vMNcLY4GrKfzwi/yWI8/w==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
-    "node_modules/@storybook/nextjs/node_modules/sharp": {
-      "version": "0.32.6",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
-      "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "color": "^4.2.3",
-        "detect-libc": "^2.0.2",
-        "node-addon-api": "^6.1.0",
-        "prebuild-install": "^7.1.1",
-        "semver": "^7.5.4",
-        "simple-get": "^4.0.1",
-        "tar-fs": "^3.0.4",
-        "tunnel-agent": "^0.6.0"
-      },
-      "engines": {
-        "node": ">=14.15.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/libvips"
-      }
-    },
-    "node_modules/@storybook/nextjs/node_modules/tar-fs": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
-      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
-      "dev": true,
-      "dependencies": {
-        "mkdirp-classic": "^0.5.2",
-        "pump": "^3.0.0",
-        "tar-stream": "^3.1.5"
-      }
-    },
-    "node_modules/@storybook/nextjs/node_modules/tar-stream": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
-      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
-      "dev": true,
-      "dependencies": {
-        "b4a": "^1.6.4",
-        "fast-fifo": "^1.2.0",
-        "streamx": "^2.15.0"
-      }
-    },
     "node_modules/@storybook/node-logger": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz",
-      "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.1.5.tgz",
+      "integrity": "sha512-9qwPX/uGhdHaVjeVUSwJUSbKX7g9goyhGYdKVuCEyl7vHR9Kp7Zkag2sEHmVdd9ixTea3jk2GZQEbnBDNQNGnw==",
       "dev": true,
       "funding": {
         "type": "opencollective",
@@ -6522,75 +7362,66 @@
       }
     },
     "node_modules/@storybook/preset-react-webpack": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.17.tgz",
-      "integrity": "sha512-gn/LvIbll9loOkzwbFlxzOZGmJ6t1vF2/gfi+p/N/AifDYe8+LVM1QV4KRVKt6UEJwsQd79lKf7vPH92AQaKKQ==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.1.5.tgz",
+      "integrity": "sha512-OiizVxDT5b7dORO8IYtNjQnrke+vgRgRPw/JSfIzWoYakDCFgui86BZ4Zx/1eecztXtQOem4bOfc7GLep5VkpA==",
       "dev": true,
       "dependencies": {
-        "@babel/preset-flow": "^7.22.15",
-        "@babel/preset-react": "^7.22.15",
-        "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
-        "@storybook/core-webpack": "7.6.17",
-        "@storybook/docs-tools": "7.6.17",
-        "@storybook/node-logger": "7.6.17",
-        "@storybook/react": "7.6.17",
+        "@storybook/core-webpack": "8.1.5",
+        "@storybook/docs-tools": "8.1.5",
+        "@storybook/node-logger": "8.1.5",
+        "@storybook/react": "8.1.5",
         "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
         "@types/node": "^18.0.0",
         "@types/semver": "^7.3.4",
-        "babel-plugin-add-react-displayname": "^0.0.5",
+        "find-up": "^5.0.0",
         "fs-extra": "^11.1.0",
         "magic-string": "^0.30.5",
         "react-docgen": "^7.0.0",
-        "react-refresh": "^0.14.0",
+        "resolve": "^1.22.8",
         "semver": "^7.3.7",
+        "tsconfig-paths": "^4.2.0",
         "webpack": "5"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=18.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "@babel/core": "^7.22.0",
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
       },
       "peerDependenciesMeta": {
-        "@babel/core": {
-          "optional": true
-        },
         "typescript": {
           "optional": true
         }
       }
     },
     "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
     "node_modules/@storybook/preset-react-webpack/node_modules/magic-string": {
-      "version": "0.30.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
-      "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dev": true,
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
-      },
-      "engines": {
-        "node": ">=12"
       }
     },
     "node_modules/@storybook/preview": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.17.tgz",
-      "integrity": "sha512-LvkMYK/y6alGjwRVNDIKL1lFlbyZ0H0c8iAbcQkiMoaFiujMQyVswMDKlWcj42Upfr/B1igydiruomc+eUt0mw==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.1.5.tgz",
+      "integrity": "sha512-8qNzK/5fCjfWcup5w3UxJXMAUp4+iOdh+vO+vDIJWSbPXRPtuarSM/tv/12N7hz/zvCpGLGBql0BE+oyC0bmhw==",
       "dev": true,
       "funding": {
         "type": "opencollective",
@@ -6598,23 +7429,23 @@
       }
     },
     "node_modules/@storybook/preview-api": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz",
-      "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.1.5.tgz",
+      "integrity": "sha512-pv0aT5WbnSYR7KWQgy3jLfuBM0ocYG6GTcmZLREW5554oiBPHhzNFv+ZrBI47RzbrbFxq1h5dj4v8lkEcKIrbA==",
       "dev": true,
       "dependencies": {
-        "@storybook/channels": "7.6.17",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-events": "7.6.17",
-        "@storybook/csf": "^0.1.2",
+        "@storybook/channels": "8.1.5",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/csf": "^0.1.7",
         "@storybook/global": "^5.0.0",
-        "@storybook/types": "7.6.17",
+        "@storybook/types": "8.1.5",
         "@types/qs": "^6.9.5",
         "dequal": "^2.0.2",
         "lodash": "^4.17.21",
         "memoizerific": "^1.11.3",
         "qs": "^6.10.0",
-        "synchronous-promise": "^2.0.15",
+        "tiny-invariant": "^1.3.1",
         "ts-dedent": "^2.0.0",
         "util-deprecate": "^1.0.2"
       },
@@ -6624,18 +7455,17 @@
       }
     },
     "node_modules/@storybook/react": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.17.tgz",
-      "integrity": "sha512-lVqzQSU03rRJWYW+gK2gq6mSo3/qtnVICY8B8oP7gc36jVu4ksDIu45bTfukM618ODkUZy0vZe6T4engK3azjA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.1.5.tgz",
+      "integrity": "sha512-Yr0Z1FQPKFnc3jI7UbNYyi5K6zoFRZlac7xzBMT4q+bUtl0g3fmYTDFisCwK8I30qE6r01EjzNvaTU75PqXkMw==",
       "dev": true,
       "dependencies": {
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-client": "7.6.17",
-        "@storybook/docs-tools": "7.6.17",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/docs-tools": "8.1.5",
         "@storybook/global": "^5.0.0",
-        "@storybook/preview-api": "7.6.17",
-        "@storybook/react-dom-shim": "7.6.17",
-        "@storybook/types": "7.6.17",
+        "@storybook/preview-api": "8.1.5",
+        "@storybook/react-dom-shim": "8.1.5",
+        "@storybook/types": "8.1.5",
         "@types/escodegen": "^0.0.6",
         "@types/estree": "^0.0.51",
         "@types/node": "^18.0.0",
@@ -6647,21 +7477,22 @@
         "lodash": "^4.17.21",
         "prop-types": "^15.7.2",
         "react-element-to-jsx-string": "^15.0.0",
+        "semver": "^7.3.7",
         "ts-dedent": "^2.0.0",
         "type-fest": "~2.19",
         "util-deprecate": "^1.0.2"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=18.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "typescript": "*"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "typescript": ">= 4.2.x"
       },
       "peerDependenciesMeta": {
         "typescript": {
@@ -6689,17 +7520,17 @@
       }
     },
     "node_modules/@storybook/react-dom-shim": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.17.tgz",
-      "integrity": "sha512-32Sa/G+WnvaPiQ1Wvjjw5UM9rr2c4GDohwCcWVv3/LJuiFPqNS6zglAtmnsrlIBnUwRBMLMh/ekCTdqMiUmfDw==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.1.5.tgz",
+      "integrity": "sha512-eyHSngIBHeFT4vVkQTN2+c/mSKCPrb8uPpWbrc3ihGBKvL/656erWNmiUVnY3zuQvCBPz2q2Vy3v2Pr+nvfOTw==",
       "dev": true,
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
       }
     },
     "node_modules/@storybook/react/node_modules/@types/estree": {
@@ -6709,21 +7540,21 @@
       "dev": true
     },
     "node_modules/@storybook/react/node_modules/@types/node": {
-      "version": "18.19.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz",
-      "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
     "node_modules/@storybook/router": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.17.tgz",
-      "integrity": "sha512-GnyC0j6Wi5hT4qRhSyT8NPtJfGmf82uZw97LQRWeyYu5gWEshUdM7aj40XlNiScd5cZDp0owO1idduVF2k2l2A==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.1.5.tgz",
+      "integrity": "sha512-DCwvAswlbLhQu6REPV04XNRhtPvsrRqHjMHKzjlfs+qYJWY7Egkofy05qlegqjkMDve33czfnRGBm0C16IydkA==",
       "dev": true,
       "dependencies": {
-        "@storybook/client-logger": "7.6.17",
+        "@storybook/client-logger": "8.1.5",
         "memoizerific": "^1.11.3",
         "qs": "^6.10.0"
       },
@@ -6733,14 +7564,14 @@
       }
     },
     "node_modules/@storybook/telemetry": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.17.tgz",
-      "integrity": "sha512-WOcOAmmengYnGInH98Px44F47DSpLyk20BM+Z/IIQDzfttGOLlxNqBBG1XTEhNRn+AYuk4aZ2JEed2lCjVIxcA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-8.1.5.tgz",
+      "integrity": "sha512-QbB1Ox7oBaCvIF2TacFjPLi1XYeHxSPeZUuFXeE+tSMdvvWZzYLnXfj/oISmV6Q+X5VZfyJVMrZ2LfeW9CuFNg==",
       "dev": true,
       "dependencies": {
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/core-common": "7.6.17",
-        "@storybook/csf-tools": "7.6.17",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-common": "8.1.5",
+        "@storybook/csf-tools": "8.1.5",
         "chalk": "^4.1.0",
         "detect-package-manager": "^2.0.1",
         "fetch-retry": "^5.0.2",
@@ -6768,260 +7599,129 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/@storybook/theming": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.17.tgz",
-      "integrity": "sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==",
+    "node_modules/@storybook/test": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.1.5.tgz",
+      "integrity": "sha512-BuxzWWS7BIJrOTuwH5WTj3nGQ+xNCvinJBQsV+MRAdH+kltgPYbntd/NBceuHmYeUrX0t8id5VUapNaG4SHw1A==",
       "dev": true,
       "dependencies": {
-        "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
-        "@storybook/client-logger": "7.6.17",
-        "@storybook/global": "^5.0.0",
-        "memoizerific": "^1.11.3"
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/core-events": "8.1.5",
+        "@storybook/instrumenter": "8.1.5",
+        "@storybook/preview-api": "8.1.5",
+        "@testing-library/dom": "^9.3.4",
+        "@testing-library/jest-dom": "^6.4.2",
+        "@testing-library/user-event": "^14.5.2",
+        "@vitest/expect": "1.3.1",
+        "@vitest/spy": "^1.3.1",
+        "util": "^0.12.4"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/storybook"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
       }
     },
-    "node_modules/@storybook/types": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz",
-      "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==",
+    "node_modules/@storybook/test/node_modules/@testing-library/dom": {
+      "version": "9.3.4",
+      "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
+      "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
       "dev": true,
       "dependencies": {
-        "@storybook/channels": "7.6.17",
-        "@types/babel__core": "^7.0.0",
-        "@types/express": "^4.7.0",
-        "file-system-cache": "2.3.0"
+        "@babel/code-frame": "^7.10.4",
+        "@babel/runtime": "^7.12.5",
+        "@types/aria-query": "^5.0.1",
+        "aria-query": "5.1.3",
+        "chalk": "^4.1.0",
+        "dom-accessibility-api": "^0.5.9",
+        "lz-string": "^1.5.0",
+        "pretty-format": "^27.0.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/storybook"
+      "engines": {
+        "node": ">=14"
       }
     },
-    "node_modules/@swc/core": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.2.tgz",
-      "integrity": "sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==",
+    "node_modules/@storybook/test/node_modules/aria-query": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+      "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+      "dev": true,
+      "dependencies": {
+        "deep-equal": "^2.0.5"
+      }
+    },
+    "node_modules/@storybook/test/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
-      "hasInstallScript": true,
       "dependencies": {
-        "@swc/counter": "^0.1.2",
-        "@swc/types": "^0.1.5"
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
       },
       "engines": {
         "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/swc"
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/@storybook/theming": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.1.5.tgz",
+      "integrity": "sha512-E4z1t49fMbVvd/t2MSL0Ecp5zbqsU/QfWBX/eorJ+m+Xc9skkwwG5qf/FnP9x4RZ9KaX8U8+862t0eafVvf4Tw==",
+      "dev": true,
+      "dependencies": {
+        "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+        "@storybook/client-logger": "8.1.5",
+        "@storybook/global": "^5.0.0",
+        "memoizerific": "^1.11.3"
       },
-      "optionalDependencies": {
-        "@swc/core-darwin-arm64": "1.4.2",
-        "@swc/core-darwin-x64": "1.4.2",
-        "@swc/core-linux-arm-gnueabihf": "1.4.2",
-        "@swc/core-linux-arm64-gnu": "1.4.2",
-        "@swc/core-linux-arm64-musl": "1.4.2",
-        "@swc/core-linux-x64-gnu": "1.4.2",
-        "@swc/core-linux-x64-musl": "1.4.2",
-        "@swc/core-win32-arm64-msvc": "1.4.2",
-        "@swc/core-win32-ia32-msvc": "1.4.2",
-        "@swc/core-win32-x64-msvc": "1.4.2"
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
       },
       "peerDependencies": {
-        "@swc/helpers": "^0.5.0"
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
       },
       "peerDependenciesMeta": {
-        "@swc/helpers": {
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
           "optional": true
         }
       }
     },
-    "node_modules/@swc/core-darwin-arm64": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz",
-      "integrity": "sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-darwin-x64": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz",
-      "integrity": "sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm-gnueabihf": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz",
-      "integrity": "sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm64-gnu": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz",
-      "integrity": "sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm64-musl": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz",
-      "integrity": "sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-x64-gnu": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz",
-      "integrity": "sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-x64-musl": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz",
-      "integrity": "sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-arm64-msvc": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz",
-      "integrity": "sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-ia32-msvc": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz",
-      "integrity": "sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-x64-msvc": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz",
-      "integrity": "sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==",
-      "cpu": [
-        "x64"
-      ],
+    "node_modules/@storybook/types": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.1.5.tgz",
+      "integrity": "sha512-/PfAZh1xtXN2MvAZZKpiL/nPkC3bZj8BQ7P7z5a/aQarP+y7qdXuoitYQ6oOH3rkaiYywmkWzA/y4iW70KXLKg==",
       "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
+      "dependencies": {
+        "@storybook/channels": "8.1.5",
+        "@types/express": "^4.7.0",
+        "file-system-cache": "2.3.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
       }
     },
     "node_modules/@swc/counter": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
-      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
-      "dev": true
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
     },
     "node_modules/@swc/helpers": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
-      "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+      "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
       "dependencies": {
+        "@swc/counter": "^0.1.3",
         "tslib": "^2.4.0"
       }
     },
-    "node_modules/@swc/types": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz",
-      "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==",
-      "dev": true
-    },
     "node_modules/@tailwindcss/container-queries": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
@@ -7031,22 +7731,22 @@
       }
     },
     "node_modules/@testing-library/dom": {
-      "version": "9.3.4",
-      "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
-      "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz",
+      "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.10.4",
         "@babel/runtime": "^7.12.5",
         "@types/aria-query": "^5.0.1",
-        "aria-query": "5.1.3",
+        "aria-query": "5.3.0",
         "chalk": "^4.1.0",
         "dom-accessibility-api": "^0.5.9",
         "lz-string": "^1.5.0",
         "pretty-format": "^27.0.2"
       },
       "engines": {
-        "node": ">=14"
+        "node": ">=18"
       }
     },
     "node_modules/@testing-library/dom/node_modules/chalk": {
@@ -7066,9 +7766,9 @@
       }
     },
     "node_modules/@testing-library/jest-dom": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz",
-      "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==",
+      "version": "6.4.5",
+      "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz",
+      "integrity": "sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==",
       "dev": true,
       "dependencies": {
         "@adobe/css-tools": "^4.3.2",
@@ -7077,7 +7777,7 @@
         "chalk": "^3.0.0",
         "css.escape": "^1.5.1",
         "dom-accessibility-api": "^0.6.3",
-        "lodash": "^4.17.15",
+        "lodash": "^4.17.21",
         "redent": "^3.0.0"
       },
       "engines": {
@@ -7117,21 +7817,27 @@
       "dev": true
     },
     "node_modules/@testing-library/react": {
-      "version": "14.2.1",
-      "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz",
-      "integrity": "sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==",
+      "version": "15.0.7",
+      "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz",
+      "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==",
       "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.12.5",
-        "@testing-library/dom": "^9.0.0",
+        "@testing-library/dom": "^10.0.0",
         "@types/react-dom": "^18.0.0"
       },
       "engines": {
-        "node": ">=14"
+        "node": ">=18"
       },
       "peerDependencies": {
+        "@types/react": "^18.0.0",
         "react": "^18.0.0",
         "react-dom": "^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
     "node_modules/@testing-library/user-event": {
@@ -7156,6 +7862,14 @@
         "node": ">= 10"
       }
     },
+    "node_modules/@types/accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/acorn": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
@@ -7203,9 +7917,9 @@
       }
     },
     "node_modules/@types/babel__traverse": {
-      "version": "7.20.5",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
-      "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
+      "version": "7.20.6",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+      "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
       "dev": true,
       "dependencies": {
         "@babel/types": "^7.20.7"
@@ -7215,7 +7929,6 @@
       "version": "1.19.5",
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
       "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
-      "dev": true,
       "dependencies": {
         "@types/connect": "*",
         "@types/node": "*"
@@ -7231,14 +7944,29 @@
       }
     },
     "node_modules/@types/connect": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
-      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
-      "dev": true,
+      "version": "3.4.36",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz",
+      "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==",
       "dependencies": {
         "@types/node": "*"
       }
     },
+    "node_modules/@types/content-disposition": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz",
+      "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg=="
+    },
+    "node_modules/@types/cookies": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz",
+      "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==",
+      "dependencies": {
+        "@types/connect": "*",
+        "@types/express": "*",
+        "@types/keygrip": "*",
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/cross-spawn": {
       "version": "6.0.6",
       "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz",
@@ -7262,6 +7990,12 @@
       "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==",
       "dev": true
     },
+    "node_modules/@types/diff": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.2.1.tgz",
+      "integrity": "sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==",
+      "dev": true
+    },
     "node_modules/@types/doctrine": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
@@ -7275,9 +8009,9 @@
       "dev": true
     },
     "node_modules/@types/emscripten": {
-      "version": "1.39.10",
-      "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz",
-      "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==",
+      "version": "1.39.13",
+      "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz",
+      "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==",
       "dev": true
     },
     "node_modules/@types/escodegen": {
@@ -7287,10 +8021,9 @@
       "dev": true
     },
     "node_modules/@types/eslint": {
-      "version": "8.56.2",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz",
-      "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==",
-      "devOptional": true,
+      "version": "8.56.10",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
+      "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -7300,7 +8033,6 @@
       "version": "3.7.7",
       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "devOptional": true,
       "dependencies": {
         "@types/eslint": "*",
         "@types/estree": "*"
@@ -7312,9 +8044,9 @@
       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
     },
     "node_modules/@types/estree-jsx": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz",
-      "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+      "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
       "dependencies": {
         "@types/estree": "*"
       }
@@ -7323,7 +8055,6 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
       "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
-      "dev": true,
       "dependencies": {
         "@types/body-parser": "*",
         "@types/express-serve-static-core": "^4.17.33",
@@ -7332,10 +8063,9 @@
       }
     },
     "node_modules/@types/express-serve-static-core": {
-      "version": "4.17.41",
-      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz",
-      "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==",
-      "dev": true,
+      "version": "4.19.3",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz",
+      "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==",
       "dependencies": {
         "@types/node": "*",
         "@types/qs": "*",
@@ -7343,12 +8073,6 @@
         "@types/send": "*"
       }
     },
-    "node_modules/@types/find-cache-dir": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz",
-      "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==",
-      "dev": true
-    },
     "node_modules/@types/graceful-fs": {
       "version": "4.1.9",
       "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
@@ -7359,9 +8083,9 @@
       }
     },
     "node_modules/@types/hast": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz",
-      "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+      "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -7372,11 +8096,15 @@
       "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
       "dev": true
     },
+    "node_modules/@types/http-assert": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz",
+      "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g=="
+    },
     "node_modules/@types/http-errors": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
-      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
-      "dev": true
+      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="
     },
     "node_modules/@types/is-empty": {
       "version": "1.2.3",
@@ -7445,9 +8173,9 @@
       }
     },
     "node_modules/@types/jest/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/@types/jsdom": {
@@ -7464,8 +8192,7 @@
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-      "devOptional": true
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
     },
     "node_modules/@types/json5": {
       "version": "0.0.29",
@@ -7473,10 +8200,46 @@
       "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
       "dev": true
     },
+    "node_modules/@types/keygrip": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz",
+      "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="
+    },
+    "node_modules/@types/koa": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz",
+      "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==",
+      "dependencies": {
+        "@types/accepts": "*",
+        "@types/content-disposition": "*",
+        "@types/cookies": "*",
+        "@types/http-assert": "*",
+        "@types/http-errors": "*",
+        "@types/keygrip": "*",
+        "@types/koa-compose": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/koa__router": {
+      "version": "12.0.3",
+      "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz",
+      "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==",
+      "dependencies": {
+        "@types/koa": "*"
+      }
+    },
+    "node_modules/@types/koa-compose": {
+      "version": "3.2.8",
+      "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz",
+      "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==",
+      "dependencies": {
+        "@types/koa": "*"
+      }
+    },
     "node_modules/@types/lodash": {
-      "version": "4.14.202",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
-      "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
+      "version": "4.17.4",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
+      "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==",
       "dev": true
     },
     "node_modules/@types/mdast": {
@@ -7493,40 +8256,40 @@
       "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
     },
     "node_modules/@types/mdx": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz",
-      "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg=="
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+      "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="
     },
     "node_modules/@types/mime": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
-      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
-      "dev": true
-    },
-    "node_modules/@types/mime-types": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz",
-      "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==",
-      "dev": true
+      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="
     },
     "node_modules/@types/ms": {
       "version": "0.7.34",
       "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
       "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
     },
+    "node_modules/@types/mysql": {
+      "version": "2.15.22",
+      "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz",
+      "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/node": {
-      "version": "20.11.24",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
-      "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+      "version": "20.14.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.0.tgz",
+      "integrity": "sha512-5cHBxFGJx6L4s56Bubp4fglrEpmyJypsqI6RgzMfBHWUJQGWAAi8cWcgetEbZXHYXo9C2Fa4EEds/uSyS4cxmA==",
       "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
     "node_modules/@types/node-fetch": {
-      "version": "2.6.10",
-      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz",
-      "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==",
-      "dev": true,
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
+      "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
       "dependencies": {
         "@types/node": "*",
         "form-data": "^4.0.0"
@@ -7544,6 +8307,24 @@
       "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
       "dev": true
     },
+    "node_modules/@types/pg": {
+      "version": "8.6.1",
+      "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
+      "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==",
+      "dependencies": {
+        "@types/node": "*",
+        "pg-protocol": "*",
+        "pg-types": "^2.2.0"
+      }
+    },
+    "node_modules/@types/pg-pool": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz",
+      "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==",
+      "dependencies": {
+        "@types/pg": "*"
+      }
+    },
     "node_modules/@types/pretty-hrtime": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
@@ -7551,38 +8332,35 @@
       "dev": true
     },
     "node_modules/@types/prop-types": {
-      "version": "15.7.11",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
-      "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
+      "version": "15.7.12",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+      "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
       "devOptional": true
     },
     "node_modules/@types/qs": {
-      "version": "6.9.11",
-      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz",
-      "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==",
-      "dev": true
+      "version": "6.9.15",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz",
+      "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg=="
     },
     "node_modules/@types/range-parser": {
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
-      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
-      "dev": true
+      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
     },
     "node_modules/@types/react": {
-      "version": "18.2.61",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.61.tgz",
-      "integrity": "sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==",
+      "version": "18.3.3",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
+      "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
       "devOptional": true,
       "dependencies": {
         "@types/prop-types": "*",
-        "@types/scheduler": "*",
         "csstype": "^3.0.2"
       }
     },
     "node_modules/@types/react-dom": {
-      "version": "18.2.19",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz",
-      "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==",
+      "version": "18.3.0",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+      "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
       "devOptional": true,
       "dependencies": {
         "@types/react": "*"
@@ -7594,39 +8372,36 @@
       "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
       "dev": true
     },
-    "node_modules/@types/scheduler": {
-      "version": "0.16.8",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
-      "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
-      "devOptional": true
-    },
     "node_modules/@types/semver": {
-      "version": "7.5.6",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-      "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+      "version": "7.5.8",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+      "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
       "dev": true
     },
     "node_modules/@types/send": {
       "version": "0.17.4",
       "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
       "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
-      "dev": true,
       "dependencies": {
         "@types/mime": "^1",
         "@types/node": "*"
       }
     },
     "node_modules/@types/serve-static": {
-      "version": "1.15.5",
-      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
-      "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
-      "dev": true,
+      "version": "1.15.7",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+      "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
       "dependencies": {
         "@types/http-errors": "*",
-        "@types/mime": "*",
-        "@types/node": "*"
+        "@types/node": "*",
+        "@types/send": "*"
       }
     },
+    "node_modules/@types/shimmer": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz",
+      "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww=="
+    },
     "node_modules/@types/stack-utils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
@@ -7650,12 +8425,6 @@
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
       "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
     },
-    "node_modules/@types/uuid": {
-      "version": "9.0.8",
-      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
-      "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
-      "dev": true
-    },
     "node_modules/@types/yargs": {
       "version": "17.0.32",
       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
@@ -7672,25 +8441,23 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz",
-      "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz",
+      "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==",
       "dev": true,
       "dependencies": {
-        "@eslint-community/regexpp": "^4.5.1",
-        "@typescript-eslint/scope-manager": "7.1.0",
-        "@typescript-eslint/type-utils": "7.1.0",
-        "@typescript-eslint/utils": "7.1.0",
-        "@typescript-eslint/visitor-keys": "7.1.0",
-        "debug": "^4.3.4",
+        "@eslint-community/regexpp": "^4.10.0",
+        "@typescript-eslint/scope-manager": "7.11.0",
+        "@typescript-eslint/type-utils": "7.11.0",
+        "@typescript-eslint/utils": "7.11.0",
+        "@typescript-eslint/visitor-keys": "7.11.0",
         "graphemer": "^1.4.0",
-        "ignore": "^5.2.4",
+        "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
-        "semver": "^7.5.4",
-        "ts-api-utils": "^1.0.1"
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7707,19 +8474,19 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz",
-      "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz",
+      "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "7.1.0",
-        "@typescript-eslint/types": "7.1.0",
-        "@typescript-eslint/typescript-estree": "7.1.0",
-        "@typescript-eslint/visitor-keys": "7.1.0",
+        "@typescript-eslint/scope-manager": "7.11.0",
+        "@typescript-eslint/types": "7.11.0",
+        "@typescript-eslint/typescript-estree": "7.11.0",
+        "@typescript-eslint/visitor-keys": "7.11.0",
         "debug": "^4.3.4"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7735,16 +8502,16 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz",
-      "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz",
+      "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.0",
-        "@typescript-eslint/visitor-keys": "7.1.0"
+        "@typescript-eslint/types": "7.11.0",
+        "@typescript-eslint/visitor-keys": "7.11.0"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7752,18 +8519,18 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz",
-      "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz",
+      "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "7.1.0",
-        "@typescript-eslint/utils": "7.1.0",
+        "@typescript-eslint/typescript-estree": "7.11.0",
+        "@typescript-eslint/utils": "7.11.0",
         "debug": "^4.3.4",
-        "ts-api-utils": "^1.0.1"
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7779,12 +8546,12 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz",
-      "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz",
+      "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==",
       "dev": true,
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7792,22 +8559,22 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz",
-      "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz",
+      "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.0",
-        "@typescript-eslint/visitor-keys": "7.1.0",
+        "@typescript-eslint/types": "7.11.0",
+        "@typescript-eslint/visitor-keys": "7.11.0",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
-        "minimatch": "9.0.3",
-        "semver": "^7.5.4",
-        "ts-api-utils": "^1.0.1"
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7819,42 +8586,54 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/utils": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz",
-      "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==",
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
       "dev": true,
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@types/json-schema": "^7.0.12",
-        "@types/semver": "^7.5.0",
-        "@typescript-eslint/scope-manager": "7.1.0",
-        "@typescript-eslint/types": "7.1.0",
-        "@typescript-eslint/typescript-estree": "7.1.0",
-        "semver": "^7.5.4"
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": ">=16 || 14 >=14.17"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@typescript-eslint/utils": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz",
+      "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@typescript-eslint/scope-manager": "7.11.0",
+        "@typescript-eslint/types": "7.11.0",
+        "@typescript-eslint/typescript-estree": "7.11.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
         "eslint": "^8.56.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz",
-      "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz",
+      "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.0",
-        "eslint-visitor-keys": "^3.4.1"
+        "@typescript-eslint/types": "7.11.0",
+        "eslint-visitor-keys": "^3.4.3"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -7920,9 +8699,9 @@
       }
     },
     "node_modules/@vercel/analytics": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.2.2.tgz",
-      "integrity": "sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.3.1.tgz",
+      "integrity": "sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==",
       "dependencies": {
         "server-only": "^0.0.1"
       },
@@ -7940,9 +8719,9 @@
       }
     },
     "node_modules/@vercel/speed-insights": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.10.tgz",
-      "integrity": "sha512-4uzdKB0RW6Ff2FkzshzjZ+RlJfLPxgm/00i0XXgxfMPhwnnsk92YgtqsxT9OcPLdJUyVU1DqFlSWWjIQMPkh0g==",
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.11.tgz",
+      "integrity": "sha512-l9hzSNmJvb2Yqpgd/BzpiT0J0aQDdtqxOf3Xm+iW4PICxVvhY1ef7Otdx4GXI+88dVkws57qMzXiShz19gXzSQ==",
       "hasInstallScript": true,
       "peerDependencies": {
         "@sveltejs/kit": "^1 || ^2",
@@ -7973,16 +8752,148 @@
         }
       }
     },
+    "node_modules/@vitest/expect": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz",
+      "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==",
+      "dev": true,
+      "dependencies": {
+        "@vitest/spy": "1.3.1",
+        "@vitest/utils": "1.3.1",
+        "chai": "^4.3.10"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/expect/node_modules/@vitest/spy": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz",
+      "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==",
+      "dev": true,
+      "dependencies": {
+        "tinyspy": "^2.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/expect/node_modules/@vitest/utils": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz",
+      "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==",
+      "dev": true,
+      "dependencies": {
+        "diff-sequences": "^29.6.3",
+        "estree-walker": "^3.0.3",
+        "loupe": "^2.3.7",
+        "pretty-format": "^29.7.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/expect/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@vitest/expect/node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@vitest/expect/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "dev": true
+    },
+    "node_modules/@vitest/spy": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz",
+      "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==",
+      "dev": true,
+      "dependencies": {
+        "tinyspy": "^2.2.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/utils": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz",
+      "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==",
+      "dev": true,
+      "dependencies": {
+        "diff-sequences": "^29.6.3",
+        "estree-walker": "^3.0.3",
+        "loupe": "^2.3.7",
+        "pretty-format": "^29.7.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/utils/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@vitest/utils/node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@vitest/utils/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "dev": true
+    },
     "node_modules/@vue/compiler-core": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.14.tgz",
-      "integrity": "sha512-ro4Zzl/MPdWs7XwxT7omHRxAjMbDFRZEEjD+2m3NBf8YzAe3HuoSEZosXQo+m1GQ1G3LQ1LdmNh1RKTYe+ssEg==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz",
+      "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==",
       "dependencies": {
-        "@babel/parser": "^7.23.6",
-        "@vue/shared": "3.4.14",
+        "@babel/parser": "^7.24.4",
+        "@vue/shared": "3.4.27",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
-        "source-map-js": "^1.0.2"
+        "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-core/node_modules/estree-walker": {
@@ -7991,28 +8902,28 @@
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "node_modules/@vue/compiler-dom": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.14.tgz",
-      "integrity": "sha512-nOZTY+veWNa0DKAceNWxorAbWm0INHdQq7cejFaWM1WYnoNSJbSEKYtE7Ir6lR/+mo9fttZpPVI9ZFGJ1juUEQ==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz",
+      "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==",
       "dependencies": {
-        "@vue/compiler-core": "3.4.14",
-        "@vue/shared": "3.4.14"
+        "@vue/compiler-core": "3.4.27",
+        "@vue/shared": "3.4.27"
       }
     },
     "node_modules/@vue/compiler-sfc": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.14.tgz",
-      "integrity": "sha512-1vHc9Kv1jV+YBZC/RJxQJ9JCxildTI+qrhtDh6tPkR1O8S+olBUekimY0km0ZNn8nG1wjtFAe9XHij+YLR8cRQ==",
-      "dependencies": {
-        "@babel/parser": "^7.23.6",
-        "@vue/compiler-core": "3.4.14",
-        "@vue/compiler-dom": "3.4.14",
-        "@vue/compiler-ssr": "3.4.14",
-        "@vue/shared": "3.4.14",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz",
+      "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==",
+      "dependencies": {
+        "@babel/parser": "^7.24.4",
+        "@vue/compiler-core": "3.4.27",
+        "@vue/compiler-dom": "3.4.27",
+        "@vue/compiler-ssr": "3.4.27",
+        "@vue/shared": "3.4.27",
         "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.5",
-        "postcss": "^8.4.33",
-        "source-map-js": "^1.0.2"
+        "magic-string": "^0.30.10",
+        "postcss": "^8.4.38",
+        "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
@@ -8021,74 +8932,70 @@
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
-      "version": "0.30.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
-      "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
-      },
-      "engines": {
-        "node": ">=12"
       }
     },
     "node_modules/@vue/compiler-ssr": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.14.tgz",
-      "integrity": "sha512-bXT6+oAGlFjTYVOTtFJ4l4Jab1wjsC0cfSfOe2B4Z0N2vD2zOBSQ9w694RsCfhjk+bC2DY5Gubb1rHZVii107Q==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz",
+      "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==",
       "dependencies": {
-        "@vue/compiler-dom": "3.4.14",
-        "@vue/shared": "3.4.14"
+        "@vue/compiler-dom": "3.4.27",
+        "@vue/shared": "3.4.27"
       }
     },
     "node_modules/@vue/reactivity": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.14.tgz",
-      "integrity": "sha512-xRYwze5Q4tK7tT2J4uy4XLhK/AIXdU5EBUu9PLnIHcOKXO0uyXpNNMzlQKuq7B+zwtq6K2wuUL39pHA6ZQzObw==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz",
+      "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==",
       "dependencies": {
-        "@vue/shared": "3.4.14"
+        "@vue/shared": "3.4.27"
       }
     },
     "node_modules/@vue/runtime-core": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.14.tgz",
-      "integrity": "sha512-qu+NMkfujCoZL6cfqK5NOfxgXJROSlP2ZPs4CTcVR+mLrwl4TtycF5Tgo0QupkdBL+2kigc6EsJlTcuuZC1NaQ==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz",
+      "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==",
       "dependencies": {
-        "@vue/reactivity": "3.4.14",
-        "@vue/shared": "3.4.14"
+        "@vue/reactivity": "3.4.27",
+        "@vue/shared": "3.4.27"
       }
     },
     "node_modules/@vue/runtime-dom": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.14.tgz",
-      "integrity": "sha512-B85XmcR4E7XsirEHVqhmy4HPbRT9WLFWV9Uhie3OapV9m1MEN9+Er6hmUIE6d8/l2sUygpK9RstFM2bmHEUigA==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz",
+      "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==",
       "dependencies": {
-        "@vue/runtime-core": "3.4.14",
-        "@vue/shared": "3.4.14",
+        "@vue/runtime-core": "3.4.27",
+        "@vue/shared": "3.4.27",
         "csstype": "^3.1.3"
       }
     },
     "node_modules/@vue/server-renderer": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.14.tgz",
-      "integrity": "sha512-pwSKXQfYdJBTpvWHGEYI+akDE18TXAiLcGn+Q/2Fj8wQSHWztoo7PSvfMNqu6NDhp309QXXbPFEGCU5p85HqkA==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz",
+      "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==",
       "dependencies": {
-        "@vue/compiler-ssr": "3.4.14",
-        "@vue/shared": "3.4.14"
+        "@vue/compiler-ssr": "3.4.27",
+        "@vue/shared": "3.4.27"
       },
       "peerDependencies": {
-        "vue": "3.4.14"
+        "vue": "3.4.27"
       }
     },
     "node_modules/@vue/shared": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.14.tgz",
-      "integrity": "sha512-nmi3BtLpvqXAWoRZ6HQ+pFJOHBU4UnH3vD3opgmwXac7vhaHKA9nj1VeGjMggdB9eLtW83eHyPCmOU1qzdsC7Q=="
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz",
+      "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA=="
     },
     "node_modules/@webassemblyjs/ast": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
-      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
+      "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
       "dependencies": {
         "@webassemblyjs/helper-numbers": "1.11.6",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
@@ -8097,26 +9004,22 @@
     "node_modules/@webassemblyjs/floating-point-hex-parser": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
-      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
-      "devOptional": true
+      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
     },
     "node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
-      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
-      "devOptional": true
+      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
     },
     "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
-      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
-      "devOptional": true
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
+      "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw=="
     },
     "node_modules/@webassemblyjs/helper-numbers": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
       "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
-      "devOptional": true,
       "dependencies": {
         "@webassemblyjs/floating-point-hex-parser": "1.11.6",
         "@webassemblyjs/helper-api-error": "1.11.6",
@@ -8126,26 +9029,23 @@
     "node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
-      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
-      "devOptional": true
+      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
-      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
+      "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
-        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/ast": "1.12.1",
+        "@webassemblyjs/helper-buffer": "1.12.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
-        "@webassemblyjs/wasm-gen": "1.11.6"
+        "@webassemblyjs/wasm-gen": "1.12.1"
       }
     },
     "node_modules/@webassemblyjs/ieee754": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
       "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
-      "devOptional": true,
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
@@ -8154,7 +9054,6 @@
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
       "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
-      "devOptional": true,
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
@@ -8162,32 +9061,29 @@
     "node_modules/@webassemblyjs/utf8": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
-      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
-      "devOptional": true
+      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
     },
     "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
-      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
+      "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
-        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/ast": "1.12.1",
+        "@webassemblyjs/helper-buffer": "1.12.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
-        "@webassemblyjs/helper-wasm-section": "1.11.6",
-        "@webassemblyjs/wasm-gen": "1.11.6",
-        "@webassemblyjs/wasm-opt": "1.11.6",
-        "@webassemblyjs/wasm-parser": "1.11.6",
-        "@webassemblyjs/wast-printer": "1.11.6"
+        "@webassemblyjs/helper-wasm-section": "1.12.1",
+        "@webassemblyjs/wasm-gen": "1.12.1",
+        "@webassemblyjs/wasm-opt": "1.12.1",
+        "@webassemblyjs/wasm-parser": "1.12.1",
+        "@webassemblyjs/wast-printer": "1.12.1"
       }
     },
     "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
-      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
+      "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
         "@webassemblyjs/ieee754": "1.11.6",
         "@webassemblyjs/leb128": "1.11.6",
@@ -8195,24 +9091,22 @@
       }
     },
     "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
-      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
+      "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
-        "@webassemblyjs/helper-buffer": "1.11.6",
-        "@webassemblyjs/wasm-gen": "1.11.6",
-        "@webassemblyjs/wasm-parser": "1.11.6"
+        "@webassemblyjs/ast": "1.12.1",
+        "@webassemblyjs/helper-buffer": "1.12.1",
+        "@webassemblyjs/wasm-gen": "1.12.1",
+        "@webassemblyjs/wasm-parser": "1.12.1"
       }
     },
     "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
-      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
+      "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-api-error": "1.11.6",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
         "@webassemblyjs/ieee754": "1.11.6",
@@ -8221,26 +9115,23 @@
       }
     },
     "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
-      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
-      "devOptional": true,
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
+      "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/ast": "1.12.1",
         "@xtuc/long": "4.2.2"
       }
     },
     "node_modules/@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "devOptional": true
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
     },
     "node_modules/@xtuc/long": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "devOptional": true
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
     },
     "node_modules/@yarnpkg/esbuild-plugin-pnp": {
       "version": "3.0.0-rc.15",
@@ -8315,7 +9206,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
       "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
-      "dev": true,
       "dependencies": {
         "event-target-shim": "^5.0.0"
       },
@@ -8442,24 +9332,21 @@
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
+    "node_modules/agentkeepalive": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
+      "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
       "dependencies": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
+        "humanize-ms": "^1.2.1"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">= 8.0.0"
       }
     },
     "node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "devOptional": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -8489,15 +9376,15 @@
       }
     },
     "node_modules/ajv-formats/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz",
+      "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==",
       "dev": true,
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
+        "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
         "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "uri-js": "^4.4.1"
       },
       "funding": {
         "type": "github",
@@ -8514,7 +9401,6 @@
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "devOptional": true,
       "peerDependencies": {
         "ajv": "^6.9.1"
       }
@@ -8546,6 +9432,18 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/ansi-html": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+      "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+      "dev": true,
+      "engines": [
+        "node >= 0.8.0"
+      ],
+      "bin": {
+        "ansi-html": "bin/ansi-html"
+      }
+    },
     "node_modules/ansi-html-community": {
       "version": "0.0.8",
       "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
@@ -8615,9 +9513,9 @@
       "dev": true
     },
     "node_modules/aria-hidden": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
-      "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+      "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
       "dependencies": {
         "tslib": "^2.0.0"
       },
@@ -8626,22 +9524,25 @@
       }
     },
     "node_modules/aria-query": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
-      "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
       "dev": true,
       "dependencies": {
-        "deep-equal": "^2.0.5"
+        "dequal": "^2.0.3"
       }
     },
     "node_modules/array-buffer-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
-      "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "is-array-buffer": "^3.0.1"
+        "call-bind": "^1.0.5",
+        "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -8654,15 +9555,16 @@
       "dev": true
     },
     "node_modules/array-includes": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
-      "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+      "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
         "is-string": "^1.0.7"
       },
       "engines": {
@@ -8681,17 +9583,38 @@
         "node": ">=8"
       }
     },
+    "node_modules/array.prototype.findlast": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/array.prototype.findlastindex": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
-      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -8736,31 +9659,47 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/array.prototype.tosorted": {
+    "node_modules/array.prototype.toreversed": {
       "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
-      "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+      "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+      "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.2.1"
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "node_modules/array.prototype.tosorted": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/arraybuffer.prototype.slice": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
-      "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
       "dev": true,
       "dependencies": {
-        "array-buffer-byte-length": "^1.0.0",
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
-        "is-array-buffer": "^3.0.2",
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.22.3",
+        "es-errors": "^1.2.1",
+        "get-intrinsic": "^1.2.3",
+        "is-array-buffer": "^3.0.4",
         "is-shared-array-buffer": "^1.0.2"
       },
       "engines": {
@@ -8771,15 +9710,14 @@
       }
     },
     "node_modules/asn1.js": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
-      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
       "dev": true,
       "dependencies": {
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "safer-buffer": "^2.1.0"
+        "minimalistic-assert": "^1.0.0"
       }
     },
     "node_modules/asn1.js/node_modules/bn.js": {
@@ -8801,6 +9739,15 @@
         "util": "^0.12.5"
       }
     },
+    "node_modules/assertion-error": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/ast-types": {
       "version": "0.16.1",
       "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
@@ -8842,31 +9789,15 @@
       "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
       "dev": true
     },
-    "node_modules/async-limiter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
-      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
-      "dev": true
-    },
-    "node_modules/asynciterator.prototype": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
-      "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
-      "dev": true,
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      }
-    },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "dev": true
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/autoprefixer": {
-      "version": "10.4.18",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz",
-      "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==",
+      "version": "10.4.19",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
+      "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
       "funding": [
         {
           "type": "opencollective",
@@ -8883,7 +9814,7 @@
       ],
       "dependencies": {
         "browserslist": "^4.23.0",
-        "caniuse-lite": "^1.0.30001591",
+        "caniuse-lite": "^1.0.30001599",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
         "picocolors": "^1.0.0",
@@ -8900,10 +9831,13 @@
       }
     },
     "node_modules/available-typed-arrays": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
-      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
       "dev": true,
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
       "engines": {
         "node": ">= 0.4"
       },
@@ -8929,12 +9863,6 @@
         "dequal": "^2.0.3"
       }
     },
-    "node_modules/b4a": {
-      "version": "1.6.4",
-      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
-      "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==",
-      "dev": true
-    },
     "node_modules/babel-core": {
       "version": "7.0.0-bridge.0",
       "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
@@ -8998,38 +9926,10 @@
         "webpack": ">=5"
       }
     },
-    "node_modules/babel-loader/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/babel-loader/node_modules/ajv-keywords": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
-      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3"
-      },
-      "peerDependencies": {
-        "ajv": "^8.8.2"
-      }
-    },
-    "node_modules/babel-loader/node_modules/find-cache-dir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
-      "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+    "node_modules/babel-loader/node_modules/find-cache-dir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+      "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
       "dev": true,
       "dependencies": {
         "common-path-prefix": "^3.0.0",
@@ -9058,12 +9958,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/babel-loader/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
-    },
     "node_modules/babel-loader/node_modules/locate-path": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
@@ -9133,25 +10027,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/babel-loader/node_modules/schema-utils": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
-      "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.9",
-        "ajv": "^8.9.0",
-        "ajv-formats": "^2.1.1",
-        "ajv-keywords": "^5.1.0"
-      },
-      "engines": {
-        "node": ">= 12.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
     "node_modules/babel-loader/node_modules/yocto-queue": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
@@ -9164,12 +10039,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/babel-plugin-add-react-displayname": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz",
-      "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==",
-      "dev": true
-    },
     "node_modules/babel-plugin-istanbul": {
       "version": "6.1.1",
       "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
@@ -9227,13 +10096,13 @@
       }
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.7",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz",
-      "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==",
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
       "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.4.4",
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
         "semver": "^6.3.1"
       },
       "peerDependencies": {
@@ -9250,25 +10119,25 @@
       }
     },
     "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.8.7",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz",
-      "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==",
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
+      "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.4.4",
-        "core-js-compat": "^3.33.1"
+        "@babel/helper-define-polyfill-provider": "^0.6.1",
+        "core-js-compat": "^3.36.1"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz",
-      "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+      "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.4.4"
+        "@babel/helper-define-polyfill-provider": "^0.6.2"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -9378,11 +10247,14 @@
       }
     },
     "node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "engines": {
         "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/bl": {
@@ -9441,13 +10313,13 @@
       "dev": true
     },
     "node_modules/body-parser": {
-      "version": "1.20.1",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
-      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+      "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
       "dev": true,
       "dependencies": {
         "bytes": "3.1.2",
-        "content-type": "~1.0.4",
+        "content-type": "~1.0.5",
         "debug": "2.6.9",
         "depd": "2.0.0",
         "destroy": "1.2.0",
@@ -9455,7 +10327,7 @@
         "iconv-lite": "0.4.24",
         "on-finished": "2.4.1",
         "qs": "6.11.0",
-        "raw-body": "2.5.1",
+        "raw-body": "2.5.2",
         "type-is": "~1.6.18",
         "unpipe": "1.0.0"
       },
@@ -9521,11 +10393,11 @@
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -9591,39 +10463,68 @@
       }
     },
     "node_modules/browserify-sign": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz",
-      "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz",
+      "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==",
       "dev": true,
       "dependencies": {
         "bn.js": "^5.2.1",
         "browserify-rsa": "^4.1.0",
         "create-hash": "^1.2.0",
         "create-hmac": "^1.1.7",
-        "elliptic": "^6.5.4",
+        "elliptic": "^6.5.5",
+        "hash-base": "~3.0",
         "inherits": "^2.0.4",
-        "parse-asn1": "^5.1.6",
-        "readable-stream": "^3.6.2",
+        "parse-asn1": "^5.1.7",
+        "readable-stream": "^2.3.8",
         "safe-buffer": "^5.2.1"
       },
       "engines": {
-        "node": ">= 4"
+        "node": ">= 0.12"
       }
     },
+    "node_modules/browserify-sign/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true
+    },
     "node_modules/browserify-sign/node_modules/readable-stream": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
       "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "node_modules/browserify-sign/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
       }
     },
+    "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
     "node_modules/browserify-zlib": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
@@ -9697,20 +10598,10 @@
         "ieee754": "^1.2.1"
       }
     },
-    "node_modules/buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "devOptional": true
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
     },
     "node_modules/buffer-xor": {
       "version": "1.0.3",
@@ -9745,14 +10636,19 @@
       }
     },
     "node_modules/call-bind": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
-      "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
       "dev": true,
       "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.1",
-        "set-function-length": "^1.1.1"
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -9795,9 +10691,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001591",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz",
-      "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==",
+      "version": "1.0.30001627",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001627.tgz",
+      "integrity": "sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw==",
       "funding": [
         {
           "type": "opencollective",
@@ -9831,6 +10727,24 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/chai": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
+      "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
+      "dev": true,
+      "dependencies": {
+        "assertion-error": "^1.1.0",
+        "check-error": "^1.0.3",
+        "deep-eql": "^4.1.3",
+        "get-func-name": "^2.0.2",
+        "loupe": "^2.3.6",
+        "pathval": "^1.1.1",
+        "type-detect": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/chalk": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
@@ -9890,16 +10804,22 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/check-error": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+      "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+      "dev": true,
+      "dependencies": {
+        "get-func-name": "^2.0.2"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://paulmillr.com/funding/"
-        }
-      ],
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -9912,6 +10832,9 @@
       "engines": {
         "node": ">= 8.10.0"
       },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
       "optionalDependencies": {
         "fsevents": "~2.3.2"
       }
@@ -9937,10 +10860,9 @@
       }
     },
     "node_modules/chrome-trace-event": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
-      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
-      "devOptional": true,
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
       "engines": {
         "node": ">=6.0"
       }
@@ -9980,10 +10902,9 @@
       }
     },
     "node_modules/cjs-module-lexer": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
-      "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
-      "dev": true
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
+      "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q=="
     },
     "node_modules/classnames": {
       "version": "2.5.1",
@@ -10011,15 +10932,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/cli-cursor": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
@@ -10047,9 +10959,9 @@
       }
     },
     "node_modules/cli-table3": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
-      "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+      "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
       "dev": true,
       "dependencies": {
         "string-width": "^4.2.0"
@@ -10122,9 +11034,9 @@
       "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
     },
     "node_modules/cli-truncate/node_modules/string-width": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz",
-      "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dependencies": {
         "emoji-regex": "^10.3.0",
         "get-east-asian-width": "^1.0.0",
@@ -10281,6 +11193,7 @@
       "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
       "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
       "dev": true,
+      "optional": true,
       "dependencies": {
         "color-convert": "^2.0.1",
         "color-string": "^1.9.0"
@@ -10310,6 +11223,7 @@
       "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
       "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
       "dev": true,
+      "optional": true,
       "dependencies": {
         "color-name": "^1.0.0",
         "simple-swizzle": "^0.2.2"
@@ -10330,7 +11244,6 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "dependencies": {
         "delayed-stream": "~1.0.0"
       },
@@ -10434,54 +11347,32 @@
       "dev": true
     },
     "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+      "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
       "dev": true,
       "engines": [
-        "node >= 0.8"
+        "node >= 6.0"
       ],
       "dependencies": {
         "buffer-from": "^1.0.0",
         "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
+        "readable-stream": "^3.0.2",
         "typedarray": "^0.0.6"
       }
     },
-    "node_modules/concat-stream/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
-    },
     "node_modules/concat-stream/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "dev": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/concat-stream/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/concat-stream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
       "dependencies": {
-        "safe-buffer": "~5.1.0"
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
       }
     },
     "node_modules/consola": {
@@ -10529,13 +11420,12 @@
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-      "dev": true
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
     },
     "node_modules/cookie": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
-      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
       "dev": true,
       "engines": {
         "node": ">= 0.6"
@@ -10548,12 +11438,12 @@
       "dev": true
     },
     "node_modules/core-js-compat": {
-      "version": "3.35.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz",
-      "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==",
+      "version": "3.37.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+      "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
       "dev": true,
       "dependencies": {
-        "browserslist": "^4.22.2"
+        "browserslist": "^4.23.0"
       },
       "funding": {
         "type": "opencollective",
@@ -10561,9 +11451,9 @@
       }
     },
     "node_modules/core-js-pure": {
-      "version": "3.36.0",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz",
-      "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==",
+      "version": "3.37.1",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz",
+      "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==",
       "dev": true,
       "hasInstallScript": true,
       "funding": {
@@ -10726,34 +11616,52 @@
       }
     },
     "node_modules/crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+      "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
       "dev": true,
+      "dependencies": {
+        "type-fest": "^1.0.1"
+      },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/crypto-random-string/node_modules/type-fest": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+      "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/css-functions-list": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
-      "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
+      "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
       "dev": true,
       "engines": {
         "node": ">=12 || >=16"
       }
     },
     "node_modules/css-loader": {
-      "version": "6.10.0",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz",
-      "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==",
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+      "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
       "dev": true,
       "dependencies": {
         "icss-utils": "^5.1.0",
         "postcss": "^8.4.33",
-        "postcss-modules-extract-imports": "^3.0.0",
-        "postcss-modules-local-by-default": "^4.0.4",
-        "postcss-modules-scope": "^3.1.1",
+        "postcss-modules-extract-imports": "^3.1.0",
+        "postcss-modules-local-by-default": "^4.0.5",
+        "postcss-modules-scope": "^3.2.0",
         "postcss-modules-values": "^4.0.0",
         "postcss-value-parser": "^4.2.0",
         "semver": "^7.5.4"
@@ -10885,59 +11793,95 @@
         "node": ">=12"
       }
     },
-    "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
       },
       "engines": {
-        "node": ">=6.0"
+        "node": ">= 0.4"
       },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/decimal.js": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
-      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
-      "dev": true
-    },
-    "node_modules/decode-named-character-reference": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
-      "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
       "dependencies": {
-        "character-entities": "^2.0.0"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
       },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wooorm"
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
       "dev": true,
       "dependencies": {
-        "mimic-response": "^3.1.0"
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">= 0.4"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decimal.js": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+      "dev": true
+    },
+    "node_modules/decode-named-character-reference": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+      "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+      "dependencies": {
+        "character-entities": "^2.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
     "node_modules/dedent": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
-      "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+      "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
       "peerDependencies": {
         "babel-plugin-macros": "^3.1.0"
       },
@@ -10947,6 +11891,18 @@
         }
       }
     },
+    "node_modules/deep-eql": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+      "dev": true,
+      "dependencies": {
+        "type-detect": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/deep-equal": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
@@ -10979,15 +11935,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
     "node_modules/deep-is": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -11032,17 +11979,20 @@
       }
     },
     "node_modules/define-data-property": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
-      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.2.1",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
       },
       "engines": {
         "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/define-lazy-prop": {
@@ -11077,33 +12027,10 @@
       "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
       "dev": true
     },
-    "node_modules/del": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
-      "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
-      "dev": true,
-      "dependencies": {
-        "globby": "^11.0.1",
-        "graceful-fs": "^4.2.4",
-        "is-glob": "^4.0.1",
-        "is-path-cwd": "^2.2.0",
-        "is-path-inside": "^3.0.2",
-        "p-map": "^4.0.0",
-        "rimraf": "^3.0.2",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "dev": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -11155,10 +12082,11 @@
       }
     },
     "node_modules/detect-libc": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
-      "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
       "dev": true,
+      "optional": true,
       "engines": {
         "node": ">=8"
       }
@@ -11190,9 +12118,9 @@
       }
     },
     "node_modules/detect-port": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
-      "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
+      "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
       "dev": true,
       "dependencies": {
         "address": "^1.0.1",
@@ -11201,6 +12129,9 @@
       "bin": {
         "detect": "bin/detect-port.js",
         "detect-port": "bin/detect-port.js"
+      },
+      "engines": {
+        "node": ">= 4.0.0"
       }
     },
     "node_modules/devlop": {
@@ -11221,9 +12152,9 @@
       "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
     },
     "node_modules/diff": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
-      "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+      "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
       "dev": true,
       "engines": {
         "node": ">=0.3.1"
@@ -11399,15 +12330,14 @@
       }
     },
     "node_modules/dotenv": {
-      "version": "16.3.1",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
-      "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
-      "dev": true,
+      "version": "16.4.5",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+      "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
       "engines": {
         "node": ">=12"
       },
       "funding": {
-        "url": "https://github.com/motdotla/dotenv?sponsor=1"
+        "url": "https://dotenvx.com"
       }
     },
     "node_modules/dotenv-expand": {
@@ -11479,9 +12409,9 @@
       "dev": true
     },
     "node_modules/ejs": {
-      "version": "3.1.9",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
-      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+      "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
       "dev": true,
       "dependencies": {
         "jake": "^10.8.5"
@@ -11494,14 +12424,14 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.690",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz",
-      "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA=="
+      "version": "1.4.788",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz",
+      "integrity": "sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA=="
     },
     "node_modules/elliptic": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz",
+      "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==",
       "dev": true,
       "dependencies": {
         "bn.js": "^4.11.9",
@@ -11581,10 +12511,9 @@
       "dev": true
     },
     "node_modules/enhanced-resolve": {
-      "version": "5.15.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
-      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
-      "devOptional": true,
+      "version": "5.16.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
+      "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -11614,9 +12543,9 @@
       }
     },
     "node_modules/envinfo": {
-      "version": "7.11.1",
-      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz",
-      "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
+      "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
       "dev": true,
       "bin": {
         "envinfo": "dist/cli.js"
@@ -11644,50 +12573,57 @@
       }
     },
     "node_modules/es-abstract": {
-      "version": "1.22.3",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
-      "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
-      "dev": true,
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.0",
-        "arraybuffer.prototype.slice": "^1.0.2",
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.5",
-        "es-set-tostringtag": "^2.0.1",
+      "version": "1.23.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "dev": true,
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "arraybuffer.prototype.slice": "^1.0.3",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
         "es-to-primitive": "^1.2.1",
         "function.prototype.name": "^1.1.6",
-        "get-intrinsic": "^1.2.2",
-        "get-symbol-description": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "get-symbol-description": "^1.0.2",
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "hasown": "^2.0.0",
-        "internal-slot": "^1.0.5",
-        "is-array-buffer": "^3.0.2",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.0.7",
+        "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
-        "is-negative-zero": "^2.0.2",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
         "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.2",
+        "is-shared-array-buffer": "^1.0.3",
         "is-string": "^1.0.7",
-        "is-typed-array": "^1.1.12",
+        "is-typed-array": "^1.1.13",
         "is-weakref": "^1.0.2",
         "object-inspect": "^1.13.1",
         "object-keys": "^1.1.1",
-        "object.assign": "^4.1.4",
-        "regexp.prototype.flags": "^1.5.1",
-        "safe-array-concat": "^1.0.1",
-        "safe-regex-test": "^1.0.0",
-        "string.prototype.trim": "^1.2.8",
-        "string.prototype.trimend": "^1.0.7",
-        "string.prototype.trimstart": "^1.0.7",
-        "typed-array-buffer": "^1.0.0",
-        "typed-array-byte-length": "^1.0.0",
-        "typed-array-byte-offset": "^1.0.0",
-        "typed-array-length": "^1.0.4",
+        "object.assign": "^4.1.5",
+        "regexp.prototype.flags": "^1.5.2",
+        "safe-array-concat": "^1.1.2",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.6",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.13"
+        "which-typed-array": "^1.1.15"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11696,6 +12632,27 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/es-get-iterator": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -11717,42 +12674,56 @@
       }
     },
     "node_modules/es-iterator-helpers": {
-      "version": "1.0.15",
-      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
-      "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+      "version": "1.0.19",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+      "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
       "dev": true,
       "dependencies": {
-        "asynciterator.prototype": "^1.0.0",
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.1",
-        "es-set-tostringtag": "^2.0.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-set-tostringtag": "^2.0.3",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.3",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
+        "internal-slot": "^1.0.7",
         "iterator.prototype": "^1.1.2",
-        "safe-array-concat": "^1.0.1"
+        "safe-array-concat": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/es-module-lexer": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
-      "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
-      "devOptional": true
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz",
+      "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg=="
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
     "node_modules/es-set-tostringtag": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
-      "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.2.2",
-        "has-tostringtag": "^1.0.0",
-        "hasown": "^2.0.0"
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11785,9 +12756,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
-      "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+      "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
@@ -11797,28 +12768,29 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/android-arm": "0.18.20",
-        "@esbuild/android-arm64": "0.18.20",
-        "@esbuild/android-x64": "0.18.20",
-        "@esbuild/darwin-arm64": "0.18.20",
-        "@esbuild/darwin-x64": "0.18.20",
-        "@esbuild/freebsd-arm64": "0.18.20",
-        "@esbuild/freebsd-x64": "0.18.20",
-        "@esbuild/linux-arm": "0.18.20",
-        "@esbuild/linux-arm64": "0.18.20",
-        "@esbuild/linux-ia32": "0.18.20",
-        "@esbuild/linux-loong64": "0.18.20",
-        "@esbuild/linux-mips64el": "0.18.20",
-        "@esbuild/linux-ppc64": "0.18.20",
-        "@esbuild/linux-riscv64": "0.18.20",
-        "@esbuild/linux-s390x": "0.18.20",
-        "@esbuild/linux-x64": "0.18.20",
-        "@esbuild/netbsd-x64": "0.18.20",
-        "@esbuild/openbsd-x64": "0.18.20",
-        "@esbuild/sunos-x64": "0.18.20",
-        "@esbuild/win32-arm64": "0.18.20",
-        "@esbuild/win32-ia32": "0.18.20",
-        "@esbuild/win32-x64": "0.18.20"
+        "@esbuild/aix-ppc64": "0.20.2",
+        "@esbuild/android-arm": "0.20.2",
+        "@esbuild/android-arm64": "0.20.2",
+        "@esbuild/android-x64": "0.20.2",
+        "@esbuild/darwin-arm64": "0.20.2",
+        "@esbuild/darwin-x64": "0.20.2",
+        "@esbuild/freebsd-arm64": "0.20.2",
+        "@esbuild/freebsd-x64": "0.20.2",
+        "@esbuild/linux-arm": "0.20.2",
+        "@esbuild/linux-arm64": "0.20.2",
+        "@esbuild/linux-ia32": "0.20.2",
+        "@esbuild/linux-loong64": "0.20.2",
+        "@esbuild/linux-mips64el": "0.20.2",
+        "@esbuild/linux-ppc64": "0.20.2",
+        "@esbuild/linux-riscv64": "0.20.2",
+        "@esbuild/linux-s390x": "0.20.2",
+        "@esbuild/linux-x64": "0.20.2",
+        "@esbuild/netbsd-x64": "0.20.2",
+        "@esbuild/openbsd-x64": "0.20.2",
+        "@esbuild/sunos-x64": "0.20.2",
+        "@esbuild/win32-arm64": "0.20.2",
+        "@esbuild/win32-ia32": "0.20.2",
+        "@esbuild/win32-x64": "0.20.2"
       }
     },
     "node_modules/esbuild-plugin-alias": {
@@ -11840,9 +12812,9 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
       "engines": {
         "node": ">=6"
       }
@@ -11952,14 +12924,14 @@
       }
     },
     "node_modules/eslint-config-next": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.1.tgz",
-      "integrity": "sha512-OLyw2oHzwE0M0EODGYMbjksDQKSshQWBzYY+Nkoxoe3+Q5G0lpb9EkekyDk7Foz9BMfotbYShJrgYoBEAVqU4Q==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.3.tgz",
+      "integrity": "sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==",
       "dev": true,
       "dependencies": {
-        "@next/eslint-plugin-next": "14.1.1",
+        "@next/eslint-plugin-next": "14.2.3",
         "@rushstack/eslint-patch": "^1.3.3",
-        "@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
+        "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0",
         "eslint-import-resolver-node": "^0.3.6",
         "eslint-import-resolver-typescript": "^3.5.2",
         "eslint-plugin-import": "^2.28.1",
@@ -12182,9 +13154,9 @@
       }
     },
     "node_modules/eslint-module-utils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
-      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
+      "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
       "dev": true,
       "dependencies": {
         "debug": "^3.2.7"
@@ -12500,15 +13472,6 @@
         "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
       }
     },
-    "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
-      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
-      "dev": true,
-      "dependencies": {
-        "dequal": "^2.0.3"
-      }
-    },
     "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -12573,33 +13536,35 @@
       }
     },
     "node_modules/eslint-plugin-no-relative-import-paths": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-no-relative-import-paths/-/eslint-plugin-no-relative-import-paths-1.5.3.tgz",
-      "integrity": "sha512-z7c7Km1U0zdLyPziWeRKSsN2mPaGaBHDjfXn98B8XjRIhFi2bPqduRYcxWih1kI5al5tQtiChXVmspLkB0wNsQ==",
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-no-relative-import-paths/-/eslint-plugin-no-relative-import-paths-1.5.4.tgz",
+      "integrity": "sha512-2smViH7R3682NR6dwgYr8Vm7emqNP1gEjBku6DbvUy3Ef/2Fz+mhwsFjZGSixzWzazMCj4MAgIWTsHELCCDJKA==",
       "dev": true
     },
     "node_modules/eslint-plugin-react": {
-      "version": "7.33.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
-      "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+      "version": "7.34.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz",
+      "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==",
       "dev": true,
       "dependencies": {
-        "array-includes": "^3.1.6",
-        "array.prototype.flatmap": "^1.3.1",
-        "array.prototype.tosorted": "^1.1.1",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlast": "^1.2.5",
+        "array.prototype.flatmap": "^1.3.2",
+        "array.prototype.toreversed": "^1.1.2",
+        "array.prototype.tosorted": "^1.1.3",
         "doctrine": "^2.1.0",
-        "es-iterator-helpers": "^1.0.12",
+        "es-iterator-helpers": "^1.0.19",
         "estraverse": "^5.3.0",
         "jsx-ast-utils": "^2.4.1 || ^3.0.0",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.6",
-        "object.fromentries": "^2.0.6",
-        "object.hasown": "^1.1.2",
-        "object.values": "^1.1.6",
+        "object.entries": "^1.1.8",
+        "object.fromentries": "^2.0.8",
+        "object.hasown": "^1.1.4",
+        "object.values": "^1.2.0",
         "prop-types": "^15.8.1",
-        "resolve": "^2.0.0-next.4",
+        "resolve": "^2.0.0-next.5",
         "semver": "^6.3.1",
-        "string.prototype.matchall": "^4.0.8"
+        "string.prototype.matchall": "^4.0.11"
       },
       "engines": {
         "node": ">=4"
@@ -12609,9 +13574,9 @@
       }
     },
     "node_modules/eslint-plugin-react-hooks": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
-      "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+      "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
       "dev": true,
       "engines": {
         "node": ">=10"
@@ -12979,7 +13944,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "devOptional": true,
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -12991,7 +13955,6 @@
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "devOptional": true,
       "engines": {
         "node": ">=4.0"
       }
@@ -13100,7 +14063,6 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
       "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
-      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -13114,7 +14076,6 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "devOptional": true,
       "engines": {
         "node": ">=0.8.x"
       }
@@ -13152,12 +14113,6 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/execa/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
     "node_modules/exit": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -13167,15 +14122,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/expand-template": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
-      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/expect": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
@@ -13193,17 +14139,17 @@
       }
     },
     "node_modules/express": {
-      "version": "4.18.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
-      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+      "version": "4.19.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
+      "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
       "dev": true,
       "dependencies": {
         "accepts": "~1.3.8",
         "array-flatten": "1.1.1",
-        "body-parser": "1.20.1",
+        "body-parser": "1.20.2",
         "content-disposition": "0.5.4",
         "content-type": "~1.0.4",
-        "cookie": "0.5.0",
+        "cookie": "0.6.0",
         "cookie-signature": "1.0.6",
         "debug": "2.6.9",
         "depd": "2.0.0",
@@ -13280,47 +14226,10 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/extract-zip": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
-      "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
-      "dev": true,
-      "dependencies": {
-        "concat-stream": "^1.6.2",
-        "debug": "^2.6.9",
-        "mkdirp": "^0.5.4",
-        "yauzl": "^2.10.0"
-      },
-      "bin": {
-        "extract-zip": "cli.js"
-      }
-    },
-    "node_modules/extract-zip/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/extract-zip/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "devOptional": true
-    },
-    "node_modules/fast-fifo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
-      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
-      "dev": true
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
     },
     "node_modules/fast-glob": {
       "version": "3.3.2",
@@ -13357,8 +14266,7 @@
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "devOptional": true
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
@@ -13376,9 +14284,9 @@
       }
     },
     "node_modules/fastq": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
-      "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
       "dependencies": {
         "reusify": "^1.0.4"
       }
@@ -13405,15 +14313,6 @@
         "bser": "2.1.1"
       }
     },
-    "node_modules/fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-      "dev": true,
-      "dependencies": {
-        "pend": "~1.2.0"
-      }
-    },
     "node_modules/feed": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
@@ -13489,9 +14388,9 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -13626,7 +14525,6 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
       "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
       "dependencies": {
         "locate-path": "^6.0.0",
         "path-exists": "^4.0.0"
@@ -13653,15 +14551,15 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.2.9",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
-      "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
       "dev": true
     },
     "node_modules/flow-parser": {
-      "version": "0.229.2",
-      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.229.2.tgz",
-      "integrity": "sha512-T72XV2Izvl7yV6dhHhLaJ630Y6vOZJl6dnOS6dN0bPW9ExuREu7xGAf3omtcxX76POTuux9TJPu9ZpS48a/rdw==",
+      "version": "0.237.1",
+      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.237.1.tgz",
+      "integrity": "sha512-PUeG8GQLmrv49vEcFcag7mriJvVs7Yyegnv1DGskvcokhP8UyqWsLV0KoTQ1iAW3ePVUIGUc3MFfBaXwz9MmIg==",
       "dev": true,
       "engines": {
         "node": ">=0.4.0"
@@ -13691,6 +14589,17 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/fork-ts-checker-webpack-plugin": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
@@ -13771,11 +14680,28 @@
         "node": "*"
       }
     },
+    "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
     "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "dev": true,
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -13785,6 +14711,11 @@
         "node": ">= 6"
       }
     },
+    "node_modules/form-data-encoder": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
+      "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
+    },
     "node_modules/format": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
@@ -13794,6 +14725,26 @@
         "node": ">=0.4.x"
       }
     },
+    "node_modules/formdata-node": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
+      "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+      "dependencies": {
+        "node-domexception": "1.0.0",
+        "web-streams-polyfill": "4.0.0-beta.3"
+      },
+      "engines": {
+        "node": ">= 12.20"
+      }
+    },
+    "node_modules/formdata-node/node_modules/web-streams-polyfill": {
+      "version": "4.0.0-beta.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+      "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -13875,9 +14826,9 @@
       "dev": true
     },
     "node_modules/fs-monkey": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz",
-      "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+      "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
       "dev": true
     },
     "node_modules/fs.realpath": {
@@ -13937,7 +14888,6 @@
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -13962,17 +14912,30 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/get-intrinsic": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
-      "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+    "node_modules/get-func-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+      "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
       "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.2",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
         "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3",
         "hasown": "^2.0.0"
       },
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -14003,18 +14966,6 @@
         "node": ">=8.0.0"
       }
     },
-    "node_modules/get-port": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
-      "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/get-stream": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -14028,13 +14979,14 @@
       }
     },
     "node_modules/get-symbol-description": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
+        "call-bind": "^1.0.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4"
       },
       "engines": {
         "node": ">= 0.4"
@@ -14044,9 +14996,9 @@
       }
     },
     "node_modules/get-tsconfig": {
-      "version": "4.7.2",
-      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-      "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+      "version": "4.7.5",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
+      "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
       "dev": true,
       "dependencies": {
         "resolve-pkg-maps": "^1.0.0"
@@ -14056,51 +15008,45 @@
       }
     },
     "node_modules/giget": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz",
-      "integrity": "sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
+      "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
       "dev": true,
       "dependencies": {
-        "citty": "^0.1.5",
+        "citty": "^0.1.6",
         "consola": "^3.2.3",
-        "defu": "^6.1.3",
-        "node-fetch-native": "^1.6.1",
-        "nypm": "^0.3.3",
+        "defu": "^6.1.4",
+        "node-fetch-native": "^1.6.3",
+        "nypm": "^0.3.8",
         "ohash": "^1.1.3",
-        "pathe": "^1.1.1",
+        "pathe": "^1.1.2",
         "tar": "^6.2.0"
       },
       "bin": {
         "giget": "dist/cli.mjs"
       }
     },
-    "node_modules/github-from-package": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
-      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
-      "dev": true
-    },
     "node_modules/github-slugger": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
       "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="
     },
     "node_modules/glob": {
-      "version": "10.3.10",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
-      "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+      "version": "10.4.1",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz",
+      "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==",
       "dependencies": {
         "foreground-child": "^3.1.0",
-        "jackspeak": "^2.3.5",
-        "minimatch": "^9.0.1",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
-        "path-scurry": "^1.10.1"
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "path-scurry": "^1.11.1"
       },
       "bin": {
         "glob": "dist/esm/bin.mjs"
       },
       "engines": {
-        "node": ">=16 || 14 >=14.17"
+        "node": ">=16 || 14 >=14.18"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -14120,8 +15066,21 @@
     "node_modules/glob-to-regexp": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "devOptional": true
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+    },
+    "node_modules/glob/node_modules/minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
     },
     "node_modules/global-modules": {
       "version": "2.0.0",
@@ -14165,18 +15124,18 @@
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/globalthis": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
-      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
       "dev": true,
       "dependencies": {
-        "define-properties": "^1.1.3"
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -14348,21 +15307,21 @@
       }
     },
     "node_modules/has-property-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
-      "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.2.2"
+        "es-define-property": "^1.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/has-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
-      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
       "dev": true,
       "engines": {
         "node": ">= 0.4"
@@ -14384,12 +15343,12 @@
       }
     },
     "node_modules/has-tostringtag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
       "dev": true,
       "dependencies": {
-        "has-symbols": "^1.0.2"
+        "has-symbols": "^1.0.3"
       },
       "engines": {
         "node": ">= 0.4"
@@ -14399,33 +15358,18 @@
       }
     },
     "node_modules/hash-base": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
-      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==",
       "dev": true,
       "dependencies": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
       },
       "engines": {
         "node": ">=4"
       }
     },
-    "node_modules/hash-base/node_modules/readable-stream": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-      "dev": true,
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/hash.js": {
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
@@ -14437,9 +15381,9 @@
       }
     },
     "node_modules/hasown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
-      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -14525,16 +15469,16 @@
       }
     },
     "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz",
-      "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ=="
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz",
+      "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g=="
     },
     "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz",
-      "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz",
+      "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==",
       "dependencies": {
-        "inline-style-parser": "0.2.2"
+        "inline-style-parser": "0.2.3"
       }
     },
     "node_modules/hast-util-to-string": {
@@ -14608,9 +15552,9 @@
       }
     },
     "node_modules/html-entities": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
-      "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+      "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
       "dev": true,
       "funding": [
         {
@@ -14779,15 +15723,23 @@
         "node": ">=10.17.0"
       }
     },
+    "node_modules/humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "dependencies": {
+        "ms": "^2.0.0"
+      }
+    },
     "node_modules/husky": {
-      "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
-      "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+      "version": "9.0.11",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz",
+      "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==",
       "bin": {
-        "husky": "lib/bin.js"
+        "husky": "bin.mjs"
       },
       "engines": {
-        "node": ">=14"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/typicode"
@@ -14838,9 +15790,9 @@
       ]
     },
     "node_modules/ignore": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
-      "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
       "dev": true,
       "engines": {
         "node": ">= 4"
@@ -14861,11 +15813,6 @@
         "node": ">=16.x"
       }
     },
-    "node_modules/immediate": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
-      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
-    },
     "node_modules/import-fresh": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -14891,6 +15838,36 @@
         "node": ">=4"
       }
     },
+    "node_modules/import-in-the-middle": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.4.tgz",
+      "integrity": "sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==",
+      "dependencies": {
+        "acorn": "^8.8.2",
+        "acorn-import-attributes": "^1.9.5",
+        "cjs-module-lexer": "^1.2.2",
+        "module-details-from-path": "^1.0.3"
+      }
+    },
+    "node_modules/import-in-the-middle/node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/import-in-the-middle/node_modules/acorn-import-attributes": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
     "node_modules/import-local": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
@@ -14975,9 +15952,9 @@
       }
     },
     "node_modules/import-meta-resolve": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz",
-      "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+      "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
       "dev": true,
       "funding": {
         "type": "github",
@@ -15006,6 +15983,7 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -15028,12 +16006,12 @@
       "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
     },
     "node_modules/internal-slot": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
-      "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.2.2",
+        "es-errors": "^1.3.0",
         "hasown": "^2.0.0",
         "side-channel": "^1.0.4"
       },
@@ -15042,31 +16020,31 @@
       }
     },
     "node_modules/intl-messageformat": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz",
-      "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==",
+      "version": "10.5.14",
+      "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz",
+      "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==",
       "dependencies": {
-        "@formatjs/ecma402-abstract": "1.11.4",
-        "@formatjs/fast-memoize": "1.2.1",
-        "@formatjs/icu-messageformat-parser": "2.1.0",
-        "tslib": "^2.1.0"
+        "@formatjs/ecma402-abstract": "2.0.0",
+        "@formatjs/fast-memoize": "2.2.0",
+        "@formatjs/icu-messageformat-parser": "2.7.8",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/intl-messageformat/node_modules/@formatjs/ecma402-abstract": {
-      "version": "1.11.4",
-      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
-      "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz",
+      "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==",
       "dependencies": {
-        "@formatjs/intl-localematcher": "0.2.25",
-        "tslib": "^2.1.0"
+        "@formatjs/intl-localematcher": "0.5.4",
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/intl-messageformat/node_modules/@formatjs/intl-localematcher": {
-      "version": "0.2.25",
-      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
-      "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz",
+      "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==",
       "dependencies": {
-        "tslib": "^2.1.0"
+        "tslib": "^2.4.0"
       }
     },
     "node_modules/invariant": {
@@ -15133,14 +16111,16 @@
       }
     },
     "node_modules/is-array-buffer": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
-      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.0",
-        "is-typed-array": "^1.1.10"
+        "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -15252,6 +16232,21 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/is-date-object": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
@@ -15407,10 +16402,13 @@
       }
     },
     "node_modules/is-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
-      "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
       "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -15432,9 +16430,9 @@
       }
     },
     "node_modules/is-negative-zero": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
       "dev": true,
       "engines": {
         "node": ">= 0.4"
@@ -15466,15 +16464,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-path-cwd": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/is-path-inside": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
@@ -15535,21 +16524,27 @@
       }
     },
     "node_modules/is-set": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
-      "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
       "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/is-shared-array-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
-      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2"
+        "call-bind": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -15598,12 +16593,12 @@
       }
     },
     "node_modules/is-typed-array": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
-      "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
       "dev": true,
       "dependencies": {
-        "which-typed-array": "^1.1.11"
+        "which-typed-array": "^1.1.14"
       },
       "engines": {
         "node": ">= 0.4"
@@ -15625,10 +16620,13 @@
       }
     },
     "node_modules/is-weakmap": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
-      "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
       "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -15646,13 +16644,16 @@
       }
     },
     "node_modules/is-weakset": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
-      "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+      "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -15700,14 +16701,14 @@
       }
     },
     "node_modules/istanbul-lib-instrument": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz",
-      "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz",
+      "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
+        "@babel/core": "^7.23.9",
+        "@babel/parser": "^7.23.9",
+        "@istanbuljs/schema": "^0.1.3",
         "istanbul-lib-coverage": "^3.2.0",
         "semver": "^7.5.4"
       },
@@ -15768,9 +16769,9 @@
       }
     },
     "node_modules/istanbul-reports": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
-      "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+      "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
       "dev": true,
       "dependencies": {
         "html-escaper": "^2.0.0",
@@ -15794,9 +16795,9 @@
       }
     },
     "node_modules/jackspeak": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
-      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz",
+      "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==",
       "dependencies": {
         "@isaacs/cliui": "^8.0.2"
       },
@@ -15811,9 +16812,9 @@
       }
     },
     "node_modules/jake": {
-      "version": "10.8.7",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
-      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+      "version": "10.9.1",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+      "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
       "dev": true,
       "dependencies": {
         "async": "^3.2.3",
@@ -15980,9 +16981,9 @@
       }
     },
     "node_modules/jest-circus/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-cli": {
@@ -16109,6 +17110,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -16164,9 +17166,9 @@
       }
     },
     "node_modules/jest-config/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-diff": {
@@ -16227,9 +17229,9 @@
       }
     },
     "node_modules/jest-diff/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-docblock": {
@@ -16303,9 +17305,9 @@
       }
     },
     "node_modules/jest-each/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-environment-jsdom": {
@@ -16335,20 +17337,6 @@
         }
       }
     },
-    "node_modules/jest-environment-jsdom/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
     "node_modules/jest-environment-node": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
@@ -16366,20 +17354,6 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-environment-node/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
     "node_modules/jest-get-type": {
       "version": "29.6.3",
       "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -16429,18 +17403,6 @@
         "node": ">=10.12.0"
       }
     },
-    "node_modules/jest-junit/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/jest-junit/node_modules/uuid": {
       "version": "8.3.2",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -16490,9 +17452,9 @@
       }
     },
     "node_modules/jest-leak-detector/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-matcher-utils": {
@@ -16553,9 +17515,9 @@
       }
     },
     "node_modules/jest-matcher-utils/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-message-util": {
@@ -16621,69 +17583,29 @@
       }
     },
     "node_modules/jest-message-util/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-mock": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
-      "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.5.1",
-        "@types/node": "*"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-mock/node_modules/@jest/types": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
-      "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
       "dev": true,
       "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "@types/yargs": "^16.0.0",
-        "chalk": "^4.0.0"
+        "jest-util": "^29.7.0"
       },
       "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-mock/node_modules/@types/yargs": {
-      "version": "16.0.9",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
-      "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
-      "dev": true,
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/jest-mock/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-pnp-resolver": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
-      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+    "node_modules/jest-pnp-resolver": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
       "dev": true,
       "engines": {
         "node": ">=6"
@@ -16866,6 +17788,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -16882,20 +17805,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/jest-runtime/node_modules/jest-mock": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
-      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-util": "^29.7.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
     "node_modules/jest-runtime/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -16982,9 +17891,9 @@
       }
     },
     "node_modules/jest-snapshot/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-util": {
@@ -17092,9 +18001,9 @@
       }
     },
     "node_modules/jest-validate/node_modules/react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
     "node_modules/jest-watcher": {
@@ -17242,12 +18151,6 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/jscodeshift/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
     "node_modules/jscodeshift/node_modules/write-file-atomic": {
       "version": "2.4.3",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
@@ -17320,7 +18223,6 @@
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
       "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true,
       "bin": {
         "jsesc": "bin/jsesc"
       },
@@ -17337,14 +18239,12 @@
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "devOptional": true
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "devOptional": true
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -17356,7 +18256,6 @@
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true,
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -17427,15 +18326,15 @@
       }
     },
     "node_modules/known-css-properties": {
-      "version": "0.29.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
-      "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
+      "version": "0.31.0",
+      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz",
+      "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==",
       "dev": true
     },
     "node_modules/language-subtag-registry": {
-      "version": "0.3.22",
-      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
-      "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+      "version": "0.3.23",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+      "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
       "dev": true
     },
     "node_modules/language-tags": {
@@ -17486,20 +18385,15 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/lie": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
-      "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
-      "dependencies": {
-        "immediate": "~3.0.5"
-      }
-    },
     "node_modules/lilconfig": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
-      "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
       "engines": {
         "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
       }
     },
     "node_modules/lines-and-columns": {
@@ -17508,20 +18402,20 @@
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
     "node_modules/lint-staged": {
-      "version": "15.2.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz",
-      "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==",
-      "dependencies": {
-        "chalk": "5.3.0",
-        "commander": "11.1.0",
-        "debug": "4.3.4",
-        "execa": "8.0.1",
-        "lilconfig": "3.0.0",
-        "listr2": "8.0.0",
-        "micromatch": "4.0.5",
-        "pidtree": "0.6.0",
-        "string-argv": "0.3.2",
-        "yaml": "2.3.4"
+      "version": "15.2.5",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz",
+      "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==",
+      "dependencies": {
+        "chalk": "~5.3.0",
+        "commander": "~12.1.0",
+        "debug": "~4.3.4",
+        "execa": "~8.0.1",
+        "lilconfig": "~3.1.1",
+        "listr2": "~8.2.1",
+        "micromatch": "~4.0.7",
+        "pidtree": "~0.6.0",
+        "string-argv": "~0.3.2",
+        "yaml": "~2.4.2"
       },
       "bin": {
         "lint-staged": "bin/lint-staged.js"
@@ -17545,11 +18439,11 @@
       }
     },
     "node_modules/lint-staged/node_modules/commander": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
-      "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
       "engines": {
-        "node": ">=16"
+        "node": ">=18"
       }
     },
     "node_modules/lint-staged/node_modules/execa": {
@@ -17616,9 +18510,9 @@
       }
     },
     "node_modules/lint-staged/node_modules/npm-run-path": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz",
-      "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
       "dependencies": {
         "path-key": "^4.0.0"
       },
@@ -17654,6 +18548,17 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/lint-staged/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/lint-staged/node_modules/strip-final-newline": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
@@ -17666,23 +18571,26 @@
       }
     },
     "node_modules/lint-staged/node_modules/yaml": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-      "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
+      "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+      "bin": {
+        "yaml": "bin.mjs"
+      },
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/listr2": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz",
-      "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==",
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz",
+      "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==",
       "dependencies": {
         "cli-truncate": "^4.0.0",
         "colorette": "^2.0.20",
         "eventemitter3": "^5.0.1",
         "log-update": "^6.0.0",
-        "rfdc": "^1.3.0",
+        "rfdc": "^1.3.1",
         "wrap-ansi": "^9.0.0"
       },
       "engines": {
@@ -17717,9 +18625,9 @@
       "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
     },
     "node_modules/listr2/node_modules/string-width": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz",
-      "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dependencies": {
         "emoji-regex": "^10.3.0",
         "get-east-asian-width": "^1.0.0",
@@ -17763,9 +18671,9 @@
       }
     },
     "node_modules/load-plugin": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.1.tgz",
-      "integrity": "sha512-YZyxJaWfN4F1xfPCyKFNIOL26vlFukmJY7wegxsriav4y2/0ZiICota6uFvyy52GjUj+tsPSjGLX+2m7kiU0+g==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz",
+      "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==",
       "dev": true,
       "dependencies": {
         "@npmcli/config": "^8.0.0",
@@ -17780,33 +18688,23 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
-      "devOptional": true,
       "engines": {
         "node": ">=6.11.5"
       }
     },
     "node_modules/loader-utils": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
-      "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.2.tgz",
+      "integrity": "sha512-vjJi4vQDasD8t0kMpxe+9URAcgbSuASqoj/Wuk3MawTk97LYa2KfdHreAkd1G/pmPLMvzZEw7/OsydADNemerQ==",
       "dev": true,
       "engines": {
         "node": ">= 12.13.0"
       }
     },
-    "node_modules/localforage": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
-      "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
-      "dependencies": {
-        "lie": "3.1.1"
-      }
-    },
     "node_modules/locate-path": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
       "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
       "dependencies": {
         "p-locate": "^5.0.0"
       },
@@ -17825,18 +18723,13 @@
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+      "dev": true
     },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "node_modules/lodash.throttle": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
-      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
     },
     "node_modules/lodash.truncate": {
       "version": "4.4.2",
@@ -17895,12 +18788,9 @@
       }
     },
     "node_modules/log-update/node_modules/ansi-escapes": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz",
-      "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==",
-      "dependencies": {
-        "type-fest": "^3.0.0"
-      },
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+      "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
       "engines": {
         "node": ">=14.16"
       },
@@ -17965,9 +18855,9 @@
       }
     },
     "node_modules/log-update/node_modules/string-width": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz",
-      "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dependencies": {
         "emoji-regex": "^10.3.0",
         "get-east-asian-width": "^1.0.0",
@@ -17994,17 +18884,6 @@
         "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "node_modules/log-update/node_modules/type-fest": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
-      "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/log-update/node_modules/wrap-ansi": {
       "version": "9.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
@@ -18041,6 +18920,15 @@
         "loose-envify": "cli.js"
       }
     },
+    "node_modules/loupe": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+      "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+      "dev": true,
+      "dependencies": {
+        "get-func-name": "^2.0.1"
+      }
+    },
     "node_modules/lower-case": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
@@ -18054,7 +18942,6 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dev": true,
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -18147,9 +19034,9 @@
       }
     },
     "node_modules/markdown-to-jsx": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz",
-      "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==",
+      "version": "7.3.2",
+      "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz",
+      "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==",
       "dev": true,
       "engines": {
         "node": ">= 10"
@@ -18180,113 +19067,162 @@
       }
     },
     "node_modules/mdast-comment-marker": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-2.1.2.tgz",
-      "integrity": "sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-3.0.0.tgz",
+      "integrity": "sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-mdx-expression": "^1.1.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-mdx-expression": "^2.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/@types/hast": {
-      "version": "2.3.9",
-      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz",
-      "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==",
+    "node_modules/mdast-comment-marker/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/mdast-comment-marker/node_modules/mdast-util-from-markdown": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
-      "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==",
+    "node_modules/mdast-util-directive": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz",
+      "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "@types/unist": "^2.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "mdast-util-to-string": "^3.1.0",
-        "micromark": "^3.0.0",
-        "micromark-util-decode-numeric-character-reference": "^1.0.0",
-        "micromark-util-decode-string": "^1.0.0",
-        "micromark-util-normalize-identifier": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "uvu": "^0.5.0"
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0",
+        "parse-entities": "^4.0.0",
+        "stringify-entities": "^4.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/mdast-util-mdx-expression": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz",
-      "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==",
+    "node_modules/mdast-util-directive/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/estree-jsx": "^1.0.0",
-        "@types/hast": "^2.0.0",
-        "@types/mdast": "^3.0.0",
-        "mdast-util-from-markdown": "^1.0.0",
-        "mdast-util-to-markdown": "^1.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/character-entities-legacy": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+      "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/character-reference-invalid": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+      "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/is-alphabetical": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+      "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/is-alphanumerical": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+      "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+      "dev": true,
+      "dependencies": {
+        "is-alphabetical": "^2.0.0",
+        "is-decimal": "^2.0.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/mdast-util-phrasing": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
-      "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==",
+    "node_modules/mdast-util-directive/node_modules/is-decimal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+      "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/is-hexadecimal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+      "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "micromark": "^4.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-decode-string": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0",
+        "unist-util-stringify-position": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/mdast-util-to-markdown": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz",
-      "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==",
+    "node_modules/mdast-util-directive/node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "@types/unist": "^2.0.0",
-        "longest-streak": "^3.0.0",
-        "mdast-util-phrasing": "^3.0.0",
-        "mdast-util-to-string": "^3.0.0",
-        "micromark-util-decode-string": "^1.0.0",
-        "unist-util-visit": "^4.0.0",
-        "zwitch": "^2.0.0"
+        "@types/mdast": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz",
-      "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==",
+    "node_modules/mdast-util-directive/node_modules/micromark": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
       "dev": true,
       "funding": [
         {
@@ -18302,266 +19238,208 @@
         "@types/debug": "^4.0.0",
         "debug": "^4.0.0",
         "decode-named-character-reference": "^1.0.0",
-        "micromark-core-commonmark": "^1.0.1",
-        "micromark-factory-space": "^1.0.0",
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-chunked": "^1.0.0",
-        "micromark-util-combine-extensions": "^1.0.0",
-        "micromark-util-decode-numeric-character-reference": "^1.0.0",
-        "micromark-util-encode": "^1.0.0",
-        "micromark-util-normalize-identifier": "^1.0.0",
-        "micromark-util-resolve-all": "^1.0.0",
-        "micromark-util-sanitize-uri": "^1.0.0",
-        "micromark-util-subtokenize": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.1",
-        "uvu": "^0.5.0"
-      }
-    },
-    "node_modules/mdast-comment-marker/node_modules/micromark-core-commonmark": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz",
-      "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==",
+        "devlop": "^1.0.0",
+        "micromark-core-commonmark": "^2.0.0",
+        "micromark-factory-space": "^2.0.0",
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-combine-extensions": "^2.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-encode": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-resolve-all": "^2.0.0",
+        "micromark-util-sanitize-uri": "^2.0.0",
+        "micromark-util-subtokenize": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/parse-entities": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
+      "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
+        "@types/unist": "^2.0.0",
+        "character-entities": "^2.0.0",
+        "character-entities-legacy": "^3.0.0",
+        "character-reference-invalid": "^2.0.0",
         "decode-named-character-reference": "^1.0.0",
-        "micromark-factory-destination": "^1.0.0",
-        "micromark-factory-label": "^1.0.0",
-        "micromark-factory-space": "^1.0.0",
-        "micromark-factory-title": "^1.0.0",
-        "micromark-factory-whitespace": "^1.0.0",
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-chunked": "^1.0.0",
-        "micromark-util-classify-character": "^1.0.0",
-        "micromark-util-html-tag-name": "^1.0.0",
-        "micromark-util-normalize-identifier": "^1.0.0",
-        "micromark-util-resolve-all": "^1.0.0",
-        "micromark-util-subtokenize": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.1",
-        "uvu": "^0.5.0"
-      }
-    },
-    "node_modules/mdast-comment-marker/node_modules/micromark-factory-destination": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz",
-      "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+        "is-alphanumerical": "^2.0.0",
+        "is-decimal": "^2.0.0",
+        "is-hexadecimal": "^2.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/@types/unist": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+      "dev": true
+    },
+    "node_modules/mdast-util-find-and-replace": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz",
+      "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==",
       "dependencies": {
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+        "@types/mdast": "^4.0.0",
+        "escape-string-regexp": "^5.0.0",
+        "unist-util-is": "^6.0.0",
+        "unist-util-visit-parents": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-factory-label": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz",
-      "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+    "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0",
-        "uvu": "^0.5.0"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-factory-space": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
-      "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
+    "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/mdast-util-from-markdown": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+        "@types/mdast": "^3.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "micromark": "~2.11.0",
+        "parse-entities": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-factory-title": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz",
-      "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==",
+    "node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+      "dev": true
+    },
+    "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "micromark-factory-space": "^1.0.0",
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-factory-whitespace": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz",
-      "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==",
+    "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-factory-space": "^1.0.0",
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+        "@types/unist": "^2.0.2"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-character": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
-      "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
+    "node_modules/mdast-util-frontmatter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
+      "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "escape-string-regexp": "^5.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0",
+        "micromark-extension-frontmatter": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-chunked": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz",
-      "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==",
+    "node_modules/mdast-util-frontmatter/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-util-symbol": "^1.0.0"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-classify-character": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz",
-      "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==",
+    "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-combine-extensions": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz",
-      "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==",
+    "node_modules/mdast-util-frontmatter/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-util-chunked": "^1.0.0",
-        "micromark-util-types": "^1.0.0"
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "micromark": "^4.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-decode-string": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0",
+        "unist-util-stringify-position": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-decode-numeric-character-reference": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
-      "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
+    "node_modules/mdast-util-frontmatter/node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
       "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
       "dependencies": {
-        "micromark-util-symbol": "^1.0.0"
+        "@types/mdast": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-decode-string": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
-      "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
+    "node_modules/mdast-util-frontmatter/node_modules/micromark": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
       "dev": true,
       "funding": [
         {
@@ -18574,146 +19452,130 @@
         }
       ],
       "dependencies": {
-        "decode-named-character-reference": "^1.0.0",
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-decode-numeric-character-reference": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0"
+        "@types/debug": "^4.0.0",
+        "debug": "^4.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "micromark-core-commonmark": "^2.0.0",
+        "micromark-factory-space": "^2.0.0",
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-combine-extensions": "^2.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-encode": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-resolve-all": "^2.0.0",
+        "micromark-util-sanitize-uri": "^2.0.0",
+        "micromark-util-subtokenize": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz",
-      "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ]
+    "node_modules/mdast-util-gfm": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz",
+      "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==",
+      "dependencies": {
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-gfm-autolink-literal": "^2.0.0",
+        "mdast-util-gfm-footnote": "^2.0.0",
+        "mdast-util-gfm-strikethrough": "^2.0.0",
+        "mdast-util-gfm-table": "^2.0.0",
+        "mdast-util-gfm-task-list-item": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-html-tag-name": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz",
-      "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ]
+    "node_modules/mdast-util-gfm-autolink-literal": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz",
+      "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "ccount": "^2.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-find-and-replace": "^3.0.0",
+        "micromark-util-character": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-normalize-identifier": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
-      "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+    "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
-        "micromark-util-symbol": "^1.0.0"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-resolve-all": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz",
-      "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+    "node_modules/mdast-util-gfm-footnote": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz",
+      "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==",
       "dependencies": {
-        "micromark-util-types": "^1.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.1.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-sanitize-uri": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz",
-      "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+    "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
-        "micromark-util-character": "^1.0.0",
-        "micromark-util-encode": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-subtokenize": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz",
-      "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
+    "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
-        "micromark-util-chunked": "^1.0.0",
-        "micromark-util-symbol": "^1.0.0",
-        "micromark-util-types": "^1.0.0",
-        "uvu": "^0.5.0"
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "micromark": "^4.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-decode-string": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0",
+        "unist-util-stringify-position": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-symbol": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
-      "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ]
+    "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+      "dependencies": {
+        "@types/mdast": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
     },
-    "node_modules/mdast-comment-marker/node_modules/micromark-util-types": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
-      "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-footnote/node_modules/micromark": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
       "funding": [
         {
           "type": "GitHub Sponsors",
@@ -18723,187 +19585,146 @@
           "type": "OpenCollective",
           "url": "https://opencollective.com/unified"
         }
-      ]
+      ],
+      "dependencies": {
+        "@types/debug": "^4.0.0",
+        "debug": "^4.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "micromark-core-commonmark": "^2.0.0",
+        "micromark-factory-space": "^2.0.0",
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-combine-extensions": "^2.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-encode": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-resolve-all": "^2.0.0",
+        "micromark-util-sanitize-uri": "^2.0.0",
+        "micromark-util-subtokenize": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
     },
-    "node_modules/mdast-comment-marker/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-strikethrough": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+      "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "micromark": "^4.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-decode-string": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0",
+        "unist-util-stringify-position": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-comment-marker/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-find-and-replace": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz",
-      "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==",
+    "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
       "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "escape-string-regexp": "^5.0.0",
-        "unist-util-is": "^6.0.0",
-        "unist-util-visit-parents": "^6.0.0"
+        "@types/mdast": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
-      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/mdast-util-from-markdown": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
-      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-to-string": "^2.0.0",
-        "micromark": "~2.11.0",
-        "parse-entities": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/debug": "^4.0.0",
+        "debug": "^4.0.0",
+        "decode-named-character-reference": "^1.0.0",
+        "devlop": "^1.0.0",
+        "micromark-core-commonmark": "^2.0.0",
+        "micromark-factory-space": "^2.0.0",
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-combine-extensions": "^2.0.0",
+        "micromark-util-decode-numeric-character-reference": "^2.0.0",
+        "micromark-util-encode": "^2.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "micromark-util-resolve-all": "^2.0.0",
+        "micromark-util-sanitize-uri": "^2.0.0",
+        "micromark-util-subtokenize": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
       }
     },
-    "node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": {
+    "node_modules/mdast-util-gfm-table": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
-      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
-      "dev": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
-      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.2"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-frontmatter": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
-      "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
-      "dev": true,
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+      "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "devlop": "^1.0.0",
-        "escape-string-regexp": "^5.0.0",
+        "markdown-table": "^3.0.0",
         "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0",
-        "micromark-extension-frontmatter": "^2.0.0"
+        "mdast-util-to-markdown": "^2.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-frontmatter/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
-    "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
-      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/mdast-util-frontmatter/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
-      "dev": true,
+    "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -18923,11 +19744,10 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-frontmatter/node_modules/mdast-util-to-string": {
+    "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
       "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
-      "dev": true,
       "dependencies": {
         "@types/mdast": "^4.0.0"
       },
@@ -18936,11 +19756,10 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-frontmatter/node_modules/micromark": {
+    "node_modules/mdast-util-gfm-table/node_modules/micromark": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
       "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
-      "dev": true,
       "funding": [
         {
           "type": "GitHub Sponsors",
@@ -18971,76 +19790,33 @@
         "micromark-util-types": "^2.0.0"
       }
     },
-    "node_modules/mdast-util-gfm": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz",
-      "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==",
-      "dependencies": {
-        "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-gfm-autolink-literal": "^2.0.0",
-        "mdast-util-gfm-footnote": "^2.0.0",
-        "mdast-util-gfm-strikethrough": "^2.0.0",
-        "mdast-util-gfm-table": "^2.0.0",
-        "mdast-util-gfm-task-list-item": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-autolink-literal": {
+    "node_modules/mdast-util-gfm-task-list-item": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz",
-      "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+      "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
-        "ccount": "^2.0.0",
         "devlop": "^1.0.0",
-        "mdast-util-find-and-replace": "^3.0.0",
-        "micromark-util-character": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/mdast-util-gfm-footnote": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz",
-      "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "devlop": "^1.1.0",
         "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0"
+        "mdast-util-to-markdown": "^2.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+    "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
-    "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+    "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19060,7 +19836,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": {
+    "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
       "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
@@ -19072,7 +19848,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-footnote/node_modules/micromark": {
+    "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
       "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
@@ -19106,32 +19882,18 @@
         "micromark-util-types": "^2.0.0"
       }
     },
-    "node_modules/mdast-util-gfm-strikethrough": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
-      "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+    "node_modules/mdast-util-gfm/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
-    "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+    "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19151,7 +19913,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": {
+    "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
       "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
@@ -19163,7 +19925,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": {
+    "node_modules/mdast-util-gfm/node_modules/micromark": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
       "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
@@ -19197,279 +19959,26 @@
         "micromark-util-types": "^2.0.0"
       }
     },
-    "node_modules/mdast-util-gfm-table": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
-      "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+    "node_modules/mdast-util-heading-style": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-3.0.0.tgz",
+      "integrity": "sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==",
+      "dev": true,
       "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "devlop": "^1.0.0",
-        "markdown-table": "^3.0.0",
-        "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0"
+        "@types/mdast": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "@types/unist": "^3.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "mdast-util-to-string": "^4.0.0",
-        "micromark": "^4.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-decode-string": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0",
-        "unist-util-stringify-position": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
-      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-table/node_modules/micromark": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
-      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "@types/debug": "^4.0.0",
-        "debug": "^4.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "micromark-core-commonmark": "^2.0.0",
-        "micromark-factory-space": "^2.0.0",
-        "micromark-util-character": "^2.0.0",
-        "micromark-util-chunked": "^2.0.0",
-        "micromark-util-combine-extensions": "^2.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-encode": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-resolve-all": "^2.0.0",
-        "micromark-util-sanitize-uri": "^2.0.0",
-        "micromark-util-subtokenize": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0"
-      }
-    },
-    "node_modules/mdast-util-gfm-task-list-item": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
-      "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "devlop": "^1.0.0",
-        "mdast-util-from-markdown": "^2.0.0",
-        "mdast-util-to-markdown": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "@types/unist": "^3.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "mdast-util-to-string": "^4.0.0",
-        "micromark": "^4.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-decode-string": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0",
-        "unist-util-stringify-position": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
-      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
-      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "@types/debug": "^4.0.0",
-        "debug": "^4.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "micromark-core-commonmark": "^2.0.0",
-        "micromark-factory-space": "^2.0.0",
-        "micromark-util-character": "^2.0.0",
-        "micromark-util-chunked": "^2.0.0",
-        "micromark-util-combine-extensions": "^2.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-encode": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-resolve-all": "^2.0.0",
-        "micromark-util-sanitize-uri": "^2.0.0",
-        "micromark-util-subtokenize": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0"
-      }
-    },
-    "node_modules/mdast-util-gfm/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "@types/unist": "^3.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "mdast-util-to-string": "^4.0.0",
-        "micromark": "^4.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-decode-string": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0",
-        "unist-util-stringify-position": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
-      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/mdast-util-gfm/node_modules/micromark": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
-      "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "@types/debug": "^4.0.0",
-        "debug": "^4.0.0",
-        "decode-named-character-reference": "^1.0.0",
-        "devlop": "^1.0.0",
-        "micromark-core-commonmark": "^2.0.0",
-        "micromark-factory-space": "^2.0.0",
-        "micromark-util-character": "^2.0.0",
-        "micromark-util-chunked": "^2.0.0",
-        "micromark-util-combine-extensions": "^2.0.0",
-        "micromark-util-decode-numeric-character-reference": "^2.0.0",
-        "micromark-util-encode": "^2.0.0",
-        "micromark-util-normalize-identifier": "^2.0.0",
-        "micromark-util-resolve-all": "^2.0.0",
-        "micromark-util-sanitize-uri": "^2.0.0",
-        "micromark-util-subtokenize": "^2.0.0",
-        "micromark-util-symbol": "^2.0.0",
-        "micromark-util-types": "^2.0.0"
-      }
-    },
-    "node_modules/mdast-util-heading-style": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-2.0.1.tgz",
-      "integrity": "sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==",
+    "node_modules/mdast-util-heading-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
     "node_modules/mdast-util-mdx": {
@@ -19506,17 +20015,17 @@
       }
     },
     "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
     "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19583,9 +20092,9 @@
       }
     },
     "node_modules/mdast-util-mdx-jsx": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz",
-      "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz",
+      "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==",
       "dependencies": {
         "@types/estree-jsx": "^1.0.0",
         "@types/hast": "^3.0.0",
@@ -19607,9 +20116,9 @@
       }
     },
     "node_modules/mdast-util-mdx-jsx/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -19673,9 +20182,9 @@
       }
     },
     "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19766,17 +20275,17 @@
       "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
     },
     "node_modules/mdast-util-mdx/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
     "node_modules/mdast-util-mdx/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19860,17 +20369,17 @@
       }
     },
     "node_modules/mdast-util-mdxjs-esm/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
     "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -19937,9 +20446,9 @@
       }
     },
     "node_modules/mdast-util-phrasing": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz",
-      "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+      "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "unist-util-is": "^6.0.0"
@@ -19950,9 +20459,9 @@
       }
     },
     "node_modules/mdast-util-phrasing/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -19978,9 +20487,9 @@
       }
     },
     "node_modules/mdast-util-to-hast/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -20005,9 +20514,9 @@
       }
     },
     "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -20073,9 +20582,9 @@
       }
     },
     "node_modules/meow": {
-      "version": "13.1.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-13.1.0.tgz",
-      "integrity": "sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA==",
+      "version": "13.2.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+      "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
       "dev": true,
       "engines": {
         "node": ">=18"
@@ -20133,9 +20642,9 @@
       }
     },
     "node_modules/micromark-core-commonmark": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz",
-      "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz",
+      "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==",
       "funding": [
         {
           "type": "GitHub Sponsors",
@@ -20531,9 +21040,9 @@
       }
     },
     "node_modules/micromark-util-character": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
-      "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz",
+      "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==",
       "funding": [
         {
           "type": "GitHub Sponsors",
@@ -20757,9 +21266,9 @@
       }
     },
     "node_modules/micromark-util-subtokenize": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
-      "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz",
+      "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==",
       "funding": [
         {
           "type": "GitHub Sponsors",
@@ -20808,11 +21317,11 @@
       ]
     },
     "node_modules/micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
       "dependencies": {
-        "braces": "^3.0.2",
+        "braces": "^3.0.3",
         "picomatch": "^2.3.1"
       },
       "engines": {
@@ -20854,7 +21363,6 @@
       "version": "1.52.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "devOptional": true,
       "engines": {
         "node": ">= 0.6"
       }
@@ -20863,7 +21371,6 @@
       "version": "2.1.35",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "devOptional": true,
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -20879,18 +21386,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/min-indent": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -20916,6 +21411,7 @@
       "version": "9.0.3",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
       "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+      "dev": true,
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -20930,14 +21426,15 @@
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/minipass": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
-      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
       "engines": {
         "node": ">=16 || 14 >=14.17"
       }
@@ -20974,14 +21471,15 @@
       "dev": true
     },
     "node_modules/mkdirp": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-      "dependencies": {
-        "minimist": "^1.2.6"
-      },
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true,
       "bin": {
         "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/mkdirp-classic": {
@@ -20990,6 +21488,11 @@
       "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
       "dev": true
     },
+    "node_modules/module-details-from-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
+      "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="
+    },
     "node_modules/mri": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -21031,12 +21534,6 @@
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
     },
-    "node_modules/napi-build-utils": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
-      "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
-      "dev": true
-    },
     "node_modules/natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -21054,16 +21551,15 @@
     "node_modules/neo-async": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "devOptional": true
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
     },
     "node_modules/next": {
-      "version": "14.1.1",
-      "resolved": "https://registry.npmjs.org/next/-/next-14.1.1.tgz",
-      "integrity": "sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww==",
+      "version": "14.2.3",
+      "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz",
+      "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==",
       "dependencies": {
-        "@next/env": "14.1.1",
-        "@swc/helpers": "0.5.2",
+        "@next/env": "14.2.3",
+        "@swc/helpers": "0.5.5",
         "busboy": "1.6.0",
         "caniuse-lite": "^1.0.30001579",
         "graceful-fs": "^4.2.11",
@@ -21077,18 +21573,19 @@
         "node": ">=18.17.0"
       },
       "optionalDependencies": {
-        "@next/swc-darwin-arm64": "14.1.1",
-        "@next/swc-darwin-x64": "14.1.1",
-        "@next/swc-linux-arm64-gnu": "14.1.1",
-        "@next/swc-linux-arm64-musl": "14.1.1",
-        "@next/swc-linux-x64-gnu": "14.1.1",
-        "@next/swc-linux-x64-musl": "14.1.1",
-        "@next/swc-win32-arm64-msvc": "14.1.1",
-        "@next/swc-win32-ia32-msvc": "14.1.1",
-        "@next/swc-win32-x64-msvc": "14.1.1"
+        "@next/swc-darwin-arm64": "14.2.3",
+        "@next/swc-darwin-x64": "14.2.3",
+        "@next/swc-linux-arm64-gnu": "14.2.3",
+        "@next/swc-linux-arm64-musl": "14.2.3",
+        "@next/swc-linux-x64-gnu": "14.2.3",
+        "@next/swc-linux-x64-musl": "14.2.3",
+        "@next/swc-win32-arm64-msvc": "14.2.3",
+        "@next/swc-win32-ia32-msvc": "14.2.3",
+        "@next/swc-win32-x64-msvc": "14.2.3"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.1.0",
+        "@playwright/test": "^1.41.2",
         "react": "^18.2.0",
         "react-dom": "^18.2.0",
         "sass": "^1.3.0"
@@ -21097,15 +21594,18 @@
         "@opentelemetry/api": {
           "optional": true
         },
+        "@playwright/test": {
+          "optional": true
+        },
         "sass": {
           "optional": true
         }
       }
     },
     "node_modules/next-intl": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-3.4.3.tgz",
-      "integrity": "sha512-Rgc2+groUlLffk/19m8jkOXv2khKbnO8WlYqYVeIeW4i6XS7HV65OoQogtbiolptdWaztLvigJqo7r+HVAQ95A==",
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-3.14.1.tgz",
+      "integrity": "sha512-Jb5KdYaJCH3z4O/Ab05YOi7lzaqtFcnOa8KdUCHvHKxPYNM7H6I/5hC3dvKPDb9S5gW6wMp3bNQoMzcWw227jw==",
       "funding": [
         {
           "type": "individual",
@@ -21115,7 +21615,7 @@
       "dependencies": {
         "@formatjs/intl-localematcher": "^0.2.32",
         "negotiator": "^0.6.3",
-        "use-intl": "^3.4.3"
+        "use-intl": "^3.14.1"
       },
       "peerDependencies": {
         "next": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
@@ -21123,13 +21623,12 @@
       }
     },
     "node_modules/next-themes": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz",
-      "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==",
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz",
+      "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==",
       "peerDependencies": {
-        "next": "*",
-        "react": "*",
-        "react-dom": "*"
+        "react": "^16.8 || ^17 || ^18",
+        "react-dom": "^16.8 || ^17 || ^18"
       }
     },
     "node_modules/next/node_modules/postcss": {
@@ -21169,30 +21668,12 @@
         "tslib": "^2.0.3"
       }
     },
-    "node_modules/node-abi": {
-      "version": "3.54.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz",
-      "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/node-abort-controller": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
       "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
       "dev": true
     },
-    "node_modules/node-addon-api": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
-      "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
-      "dev": true
-    },
     "node_modules/node-dir": {
       "version": "0.1.17",
       "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
@@ -21227,6 +21708,24 @@
         "node": "*"
       }
     },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
     "node_modules/node-fetch": {
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -21247,9 +21746,9 @@
       }
     },
     "node_modules/node-fetch-native": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz",
-      "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==",
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+      "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
       "dev": true
     },
     "node_modules/node-fetch/node_modules/tr46": {
@@ -21310,5295 +21809,253 @@
         "vm-browserify": "^1.1.2"
       },
       "engines": {
-        "node": ">=12"
-      },
-      "peerDependencies": {
-        "webpack": ">=5"
-      }
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
-    },
-    "node_modules/nopt": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
-      "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "^2.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "node_modules/normalize-package-data/node_modules/semver": {
-      "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/npm-normalize-package-bin": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
-      "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
-      "dev": true,
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-      "dev": true,
-      "dependencies": {
-        "boolbase": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/nth-check?sponsor=1"
-      }
-    },
-    "node_modules/nwsapi": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
-      "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
-      "dev": true
-    },
-    "node_modules/nypm": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz",
-      "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==",
-      "dev": true,
-      "dependencies": {
-        "citty": "^0.1.5",
-        "execa": "^8.0.1",
-        "pathe": "^1.1.2",
-        "ufo": "^1.3.2"
-      },
-      "bin": {
-        "nypm": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": "^14.16.0 || >=16.10.0"
-      }
-    },
-    "node_modules/nypm/node_modules/execa": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
-      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^8.0.1",
-        "human-signals": "^5.0.0",
-        "is-stream": "^3.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^5.1.0",
-        "onetime": "^6.0.0",
-        "signal-exit": "^4.1.0",
-        "strip-final-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=16.17"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/nypm/node_modules/get-stream": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
-      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
-      "dev": true,
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/human-signals": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
-      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=16.17.0"
-      }
-    },
-    "node_modules/nypm/node_modules/is-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
-      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
-      "dev": true,
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/mimic-fn": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
-      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/npm-run-path": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
-      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^4.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/onetime": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
-      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
-      "dev": true,
-      "dependencies": {
-        "mimic-fn": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/path-key": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
-      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/strip-final-newline": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
-      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-hash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
-      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
-      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
-      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "define-properties": "^1.2.1",
-        "has-symbols": "^1.0.3",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.entries": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
-      "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.fromentries": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
-      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.groupby": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
-      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1"
-      }
-    },
-    "node_modules/object.hasown": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
-      "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
-      "dev": true,
-      "dependencies": {
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.values": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
-      "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/objectorarray": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
-      "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
-      "dev": true
-    },
-    "node_modules/ohash": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
-      "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==",
-      "dev": true
-    },
-    "node_modules/on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
-      "dev": true,
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/open": {
-      "version": "8.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
-      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
-      "dev": true,
-      "dependencies": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
-      "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
-      "dev": true,
-      "dependencies": {
-        "@aashutoshrathi/word-wrap": "^1.2.3",
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
-      "dev": true,
-      "dependencies": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ora/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/ora/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ora/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ora/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
-    "node_modules/os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
-      "dev": true
-    },
-    "node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "dependencies": {
-        "aggregate-error": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
-      "dev": true
-    },
-    "node_modules/param-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
-      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
-      "dev": true,
-      "dependencies": {
-        "dot-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-asn1": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
-      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
-      "dev": true,
-      "dependencies": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/parse-entities": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-      "dev": true,
-      "dependencies": {
-        "character-entities": "^1.0.0",
-        "character-entities-legacy": "^1.0.0",
-        "character-reference-invalid": "^1.0.0",
-        "is-alphanumerical": "^1.0.0",
-        "is-decimal": "^1.0.0",
-        "is-hexadecimal": "^1.0.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wooorm"
-      }
-    },
-    "node_modules/parse-entities/node_modules/character-entities": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
-      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
-      "dev": true,
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wooorm"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "dev": true,
-      "dependencies": {
-        "entities": "^4.4.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/pascal-case": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
-      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
-      "dev": true,
-      "dependencies": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
-      "dev": true
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "node_modules/path-scurry": {
-      "version": "1.10.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
-      "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
-      "dependencies": {
-        "lru-cache": "^9.1.1 || ^10.0.0",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
-      "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
-      "engines": {
-        "node": "14 || >=16.14"
-      }
-    },
-    "node_modules/path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
-      "dev": true
-    },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "dev": true
-    },
-    "node_modules/pbkdf2": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
-      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
-      "dev": true,
-      "dependencies": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/peek-stream": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
-      "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
-      "dev": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "duplexify": "^3.5.0",
-        "through2": "^2.0.3"
-      }
-    },
-    "node_modules/pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
-      "dev": true
-    },
-    "node_modules/periscopic": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
-      "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^3.0.0",
-        "is-reference": "^3.0.0"
-      }
-    },
-    "node_modules/periscopic/node_modules/is-reference": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
-      "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
-      "dependencies": {
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pidtree": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
-      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
-      "bin": {
-        "pidtree": "bin/pidtree.js"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pirates": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
-      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/pkg-dir": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
-      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/pluralize": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
-      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pnp-webpack-plugin": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz",
-      "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==",
-      "dev": true,
-      "dependencies": {
-        "ts-pnp": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/polished": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz",
-      "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.17.8"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.4.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
-      "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "nanoid": "^3.3.7",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-bem-linter": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-bem-linter/-/postcss-bem-linter-4.0.1.tgz",
-      "integrity": "sha512-jTG3uMo6n2YyxLBPLsRN+5R9djNJZ3mirAugvnYbZaZOwPmLb/MaQ2uql0fSdVYegjZBmX8tW5B0mfZigiXZ9Q==",
-      "dev": true,
-      "dependencies": {
-        "minimatch": "^3.1.2",
-        "postcss-resolve-nested-selector": "^0.1.1"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.21"
-      }
-    },
-    "node_modules/postcss-bem-linter/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/postcss-bem-linter/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/postcss-calc": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
-      "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
-      "dependencies": {
-        "postcss-selector-parser": "^6.0.11",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^14 || ^16 || >=18.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.2"
-      }
-    },
-    "node_modules/postcss-import": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.0.0.tgz",
-      "integrity": "sha512-e77lhVvrD1I2y7dYmBv0k9ULTdArgEYZt97T4w6sFIU5uxIHvDFQlKgUUyY7v7Barj0Yf/zm5A4OquZN7jKm5Q==",
-      "dependencies": {
-        "postcss-value-parser": "^4.0.0",
-        "read-cache": "^1.0.0",
-        "resolve": "^1.1.7"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.0.0"
-      }
-    },
-    "node_modules/postcss-js": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
-      "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
-      "dependencies": {
-        "camelcase-css": "^2.0.1"
-      },
-      "engines": {
-        "node": "^12 || ^14 || >= 16"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.21"
-      }
-    },
-    "node_modules/postcss-load-config": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
-      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "lilconfig": "^3.0.0",
-        "yaml": "^2.3.4"
-      },
-      "engines": {
-        "node": ">= 14"
-      },
-      "peerDependencies": {
-        "postcss": ">=8.0.9",
-        "ts-node": ">=9.0.0"
-      },
-      "peerDependenciesMeta": {
-        "postcss": {
-          "optional": true
-        },
-        "ts-node": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/postcss-load-config/node_modules/yaml": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-      "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/postcss-loader": {
-      "version": "7.3.4",
-      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz",
-      "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==",
-      "dev": true,
-      "dependencies": {
-        "cosmiconfig": "^8.3.5",
-        "jiti": "^1.20.0",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": ">= 14.15.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "postcss": "^7.0.0 || ^8.0.1",
-        "webpack": "^5.0.0"
-      }
-    },
-    "node_modules/postcss-loader/node_modules/cosmiconfig": {
-      "version": "8.3.6",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
-      "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
-      "dev": true,
-      "dependencies": {
-        "import-fresh": "^3.3.0",
-        "js-yaml": "^4.1.0",
-        "parse-json": "^5.2.0",
-        "path-type": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/d-fischer"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.9.5"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/postcss-mixins": {
-      "version": "9.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.4.tgz",
-      "integrity": "sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==",
-      "dependencies": {
-        "fast-glob": "^3.2.11",
-        "postcss-js": "^4.0.0",
-        "postcss-simple-vars": "^7.0.0",
-        "sugarss": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=14.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.14"
-      }
-    },
-    "node_modules/postcss-modules-extract-imports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
-      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-      "dev": true,
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-local-by-default": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz",
-      "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==",
-      "dev": true,
-      "dependencies": {
-        "icss-utils": "^5.0.0",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.1.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-scope": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz",
-      "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==",
-      "dev": true,
-      "dependencies": {
-        "postcss-selector-parser": "^6.0.4"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-values": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
-      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
-      "dev": true,
-      "dependencies": {
-        "icss-utils": "^5.0.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-nested": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
-      "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
-      "dependencies": {
-        "postcss-selector-parser": "^6.0.11"
-      },
-      "engines": {
-        "node": ">=12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.14"
-      }
-    },
-    "node_modules/postcss-resolve-nested-selector": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
-      "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
-      "dev": true
-    },
-    "node_modules/postcss-safe-parser": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
-      "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "engines": {
-        "node": ">=18.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-selector-parser": {
-      "version": "6.0.15",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
-      "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-simple-vars": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz",
-      "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==",
-      "engines": {
-        "node": ">=14.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.1"
-      }
-    },
-    "node_modules/postcss-sorting": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
-      "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
-      "dev": true,
-      "peerDependencies": {
-        "postcss": "^8.4.20"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
-    },
-    "node_modules/prebuild-install": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
-      "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
-      "dev": true,
-      "dependencies": {
-        "detect-libc": "^2.0.0",
-        "expand-template": "^2.0.3",
-        "github-from-package": "0.0.0",
-        "minimist": "^1.2.3",
-        "mkdirp-classic": "^0.5.3",
-        "napi-build-utils": "^1.0.1",
-        "node-abi": "^3.3.0",
-        "pump": "^3.0.0",
-        "rc": "^1.2.7",
-        "simple-get": "^4.0.0",
-        "tar-fs": "^2.0.0",
-        "tunnel-agent": "^0.6.0"
-      },
-      "bin": {
-        "prebuild-install": "bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/prettier": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
-      "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
-      "dev": true,
-      "bin": {
-        "prettier": "bin/prettier.cjs"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/prettier/prettier?sponsor=1"
-      }
-    },
-    "node_modules/prettier-plugin-tailwindcss": {
-      "version": "0.5.11",
-      "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz",
-      "integrity": "sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==",
-      "dev": true,
-      "engines": {
-        "node": ">=14.21.3"
-      },
-      "peerDependencies": {
-        "@ianvs/prettier-plugin-sort-imports": "*",
-        "@prettier/plugin-pug": "*",
-        "@shopify/prettier-plugin-liquid": "*",
-        "@trivago/prettier-plugin-sort-imports": "*",
-        "prettier": "^3.0",
-        "prettier-plugin-astro": "*",
-        "prettier-plugin-css-order": "*",
-        "prettier-plugin-import-sort": "*",
-        "prettier-plugin-jsdoc": "*",
-        "prettier-plugin-marko": "*",
-        "prettier-plugin-organize-attributes": "*",
-        "prettier-plugin-organize-imports": "*",
-        "prettier-plugin-style-order": "*",
-        "prettier-plugin-svelte": "*"
-      },
-      "peerDependenciesMeta": {
-        "@ianvs/prettier-plugin-sort-imports": {
-          "optional": true
-        },
-        "@prettier/plugin-pug": {
-          "optional": true
-        },
-        "@shopify/prettier-plugin-liquid": {
-          "optional": true
-        },
-        "@trivago/prettier-plugin-sort-imports": {
-          "optional": true
-        },
-        "prettier-plugin-astro": {
-          "optional": true
-        },
-        "prettier-plugin-css-order": {
-          "optional": true
-        },
-        "prettier-plugin-import-sort": {
-          "optional": true
-        },
-        "prettier-plugin-jsdoc": {
-          "optional": true
-        },
-        "prettier-plugin-marko": {
-          "optional": true
-        },
-        "prettier-plugin-organize-attributes": {
-          "optional": true
-        },
-        "prettier-plugin-organize-imports": {
-          "optional": true
-        },
-        "prettier-plugin-style-order": {
-          "optional": true
-        },
-        "prettier-plugin-svelte": {
-          "optional": true
-        },
-        "prettier-plugin-twig-melody": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/pretty-error": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
-      "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.20",
-        "renderkid": "^3.0.0"
-      }
-    },
-    "node_modules/pretty-format": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
-      "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^17.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/pretty-format/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
-    },
-    "node_modules/pretty-hrtime": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
-      "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/proc-log": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
-      "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
-      "dev": true,
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-      "dev": true,
-      "dependencies": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/prop-types": {
-      "version": "15.8.1",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
-      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
-      "dev": true,
-      "dependencies": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
-      }
-    },
-    "node_modules/property-information": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz",
-      "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wooorm"
-      }
-    },
-    "node_modules/proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-      "dev": true,
-      "dependencies": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-    },
-    "node_modules/psl": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
-    },
-    "node_modules/public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "dev": true,
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/public-encrypt/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
-      "dev": true
-    },
-    "node_modules/pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "dependencies": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "node_modules/pumpify/node_modules/pump": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-      "dev": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "devOptional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/puppeteer-core": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz",
-      "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==",
-      "dev": true,
-      "dependencies": {
-        "@types/mime-types": "^2.1.0",
-        "debug": "^4.1.0",
-        "extract-zip": "^1.6.6",
-        "https-proxy-agent": "^4.0.0",
-        "mime": "^2.0.3",
-        "mime-types": "^2.1.25",
-        "progress": "^2.0.1",
-        "proxy-from-env": "^1.0.0",
-        "rimraf": "^2.6.1",
-        "ws": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=8.16.0"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/agent-base": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
-      "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/https-proxy-agent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
-      "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
-      "dev": true,
-      "dependencies": {
-        "agent-base": "5",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/mime": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
-      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
-      "dev": true,
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/ws": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
-      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
-      "dev": true,
-      "dependencies": {
-        "async-limiter": "~1.0.0"
-      }
-    },
-    "node_modules/pure-rand": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz",
-      "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/dubzzz"
-        },
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/fast-check"
-        }
-      ]
-    },
-    "node_modules/qs": {
-      "version": "6.11.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
-      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
-      "dev": true,
-      "dependencies": {
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
-    },
-    "node_modules/queue": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
-      "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
-      "dev": true,
-      "dependencies": {
-        "inherits": "~2.0.3"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/queue-tick": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
-      "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
-      "dev": true
-    },
-    "node_modules/ramda": {
-      "version": "0.29.0",
-      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz",
-      "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==",
-      "dev": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/ramda"
-      }
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "devOptional": true,
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dev": true,
-      "dependencies": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
-      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
-      "dev": true,
-      "dependencies": {
-        "bytes": "3.1.2",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
-      "dependencies": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "bin": {
-        "rc": "cli.js"
-      }
-    },
-    "node_modules/rc/node_modules/strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
-      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-colorful": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
-      "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
-      "dev": true,
-      "peerDependencies": {
-        "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
-      }
-    },
-    "node_modules/react-docgen": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz",
-      "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.18.9",
-        "@babel/traverse": "^7.18.9",
-        "@babel/types": "^7.18.9",
-        "@types/babel__core": "^7.18.0",
-        "@types/babel__traverse": "^7.18.0",
-        "@types/doctrine": "^0.0.9",
-        "@types/resolve": "^1.20.2",
-        "doctrine": "^3.0.0",
-        "resolve": "^1.22.1",
-        "strip-indent": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=16.14.0"
-      }
-    },
-    "node_modules/react-docgen-typescript": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
-      "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
-      "dev": true,
-      "peerDependencies": {
-        "typescript": ">= 4.3.x"
-      }
-    },
-    "node_modules/react-docgen/node_modules/@types/doctrine": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
-      "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
-      "dev": true
-    },
-    "node_modules/react-dom": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
-      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "scheduler": "^0.23.0"
-      },
-      "peerDependencies": {
-        "react": "^18.2.0"
-      }
-    },
-    "node_modules/react-element-to-jsx-string": {
-      "version": "15.0.0",
-      "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
-      "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
-      "dev": true,
-      "dependencies": {
-        "@base2/pretty-print-object": "1.0.1",
-        "is-plain-object": "5.0.0",
-        "react-is": "18.1.0"
-      },
-      "peerDependencies": {
-        "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0",
-        "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0"
-      }
-    },
-    "node_modules/react-element-to-jsx-string/node_modules/react-is": {
-      "version": "18.1.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
-      "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
-      "dev": true
-    },
-    "node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
-    },
-    "node_modules/react-refresh": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
-      "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-remove-scroll": {
-      "version": "2.5.5",
-      "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
-      "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
-      "dependencies": {
-        "react-remove-scroll-bar": "^2.3.3",
-        "react-style-singleton": "^2.2.1",
-        "tslib": "^2.1.0",
-        "use-callback-ref": "^1.3.0",
-        "use-sidecar": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/react-remove-scroll-bar": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
-      "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
-      "dependencies": {
-        "react-style-singleton": "^2.2.1",
-        "tslib": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/react-style-singleton": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
-      "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
-      "dependencies": {
-        "get-nonce": "^1.0.0",
-        "invariant": "^2.2.4",
-        "tslib": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/read-cache": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
-      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
-      "dependencies": {
-        "pify": "^2.3.0"
-      }
-    },
-    "node_modules/read-package-json-fast": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
-      "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
-      "dev": true,
-      "dependencies": {
-        "json-parse-even-better-errors": "^3.0.0",
-        "npm-normalize-package-bin": "^3.0.0"
-      },
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
-      "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
-      "dev": true,
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/read-pkg": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-      "dev": true,
-      "dependencies": {
-        "@types/normalize-package-data": "^2.4.0",
-        "normalize-package-data": "^2.5.0",
-        "parse-json": "^5.0.0",
-        "type-fest": "^0.6.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/read-pkg-up": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.1.0",
-        "read-pkg": "^5.2.0",
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/read-pkg/node_modules/type-fest": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
-      "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
-      "dev": true,
-      "dependencies": {
-        "abort-controller": "^3.0.0",
-        "buffer": "^6.0.3",
-        "events": "^3.3.0",
-        "process": "^0.11.10",
-        "string_decoder": "^1.3.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/reading-time": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz",
-      "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="
-    },
-    "node_modules/recast": {
-      "version": "0.23.5",
-      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.5.tgz",
-      "integrity": "sha512-M67zIddJiwXdfPQRYKJ0qZO1SLdH1I0hYeb0wzxA+pNOvAZiQHulWzuk+fYsEWRQ8VfZrgjyucqsCOtCyM01/A==",
-      "dev": true,
-      "dependencies": {
-        "ast-types": "^0.16.1",
-        "esprima": "~4.0.0",
-        "source-map": "~0.6.1",
-        "tiny-invariant": "^1.3.3",
-        "tslib": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/recast/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/redent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
-      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-      "dev": true,
-      "dependencies": {
-        "indent-string": "^4.0.0",
-        "strip-indent": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/redent/node_modules/strip-indent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
-      "dev": true,
-      "dependencies": {
-        "min-indent": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/reflect.getprototypeof": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
-      "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
-        "globalthis": "^1.0.3",
-        "which-builtin-type": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
-    },
-    "node_modules/regenerate-unicode-properties": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
-      "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
-      "dev": true,
-      "dependencies": {
-        "regenerate": "^1.4.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regenerator-runtime": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
-    },
-    "node_modules/regenerator-transform": {
-      "version": "0.15.2",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
-      "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "node_modules/regex-parser": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
-      "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
-      "dev": true
-    },
-    "node_modules/regexp.prototype.flags": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
-      "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "set-function-name": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/regexpu-core": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
-      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/regjsgen": "^0.8.0",
-        "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^10.1.0",
-        "regjsparser": "^0.9.1",
-        "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regjsparser": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
-      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
-      "dev": true,
-      "dependencies": {
-        "jsesc": "~0.5.0"
-      },
-      "bin": {
-        "regjsparser": "bin/parser"
-      }
-    },
-    "node_modules/regjsparser/node_modules/jsesc": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      }
-    },
-    "node_modules/rehype-autolink-headings": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz",
-      "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==",
-      "dependencies": {
-        "@types/hast": "^3.0.0",
-        "@ungap/structured-clone": "^1.0.0",
-        "hast-util-heading-rank": "^3.0.0",
-        "hast-util-is-element": "^3.0.0",
-        "unified": "^11.0.0",
-        "unist-util-visit": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/rehype-slug": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
-      "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
-      "dependencies": {
-        "@types/hast": "^3.0.0",
-        "github-slugger": "^2.0.0",
-        "hast-util-heading-rank": "^3.0.0",
-        "hast-util-to-string": "^3.0.0",
-        "unist-util-visit": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/remark-frontmatter": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz",
-      "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "mdast-util-frontmatter": "^2.0.0",
-        "micromark-extension-frontmatter": "^2.0.0",
-        "unified": "^11.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-frontmatter/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/remark-gfm": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz",
-      "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==",
-      "dependencies": {
-        "@types/mdast": "^4.0.0",
-        "mdast-util-gfm": "^3.0.0",
-        "micromark-extension-gfm": "^3.0.0",
-        "remark-parse": "^11.0.0",
-        "remark-stringify": "^11.0.0",
-        "unified": "^11.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-gfm/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
-      "dependencies": {
-        "@types/unist": "*"
-      }
-    },
-    "node_modules/remark-lint": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-9.1.2.tgz",
-      "integrity": "sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "remark-message-control": "^7.0.0",
-        "unified": "^10.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-3.1.2.tgz",
-      "integrity": "sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-blockquote-indentation/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-4.1.2.tgz",
-      "integrity": "sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-character-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-checkbox-content-indent/-/remark-lint-checkbox-content-indent-4.1.2.tgz",
-      "integrity": "sha512-8uaHAm4bSqB7XpnecLRObe00Lj9eoHiecV+44CfJeWyoo50cTPR/hIMfsMtDxsNt4LZP+6oCV9z+vACJqDv8Hg==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0",
-        "vfile-location": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-checkbox-content-indent/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-3.1.2.tgz",
-      "integrity": "sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-code-block-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-definition-spacing/-/remark-lint-definition-spacing-3.1.2.tgz",
-      "integrity": "sha512-l058jAKfZfCOmlbIzoTll+CrZm9Bh42ZVCHcODPSZC8Yx4terCKgIoks+RWJDEdUbEw0YQoYvPc59ZVmp3BIew==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-definition-spacing/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-3.1.2.tgz",
-      "integrity": "sha512-yh4m3dlPmRsqM/BFhpqHYfrmBvFQ+D5dZZKDDYP2rf3YEoXlEVt8T8lWQueTTSxcq6yXAqL/XQL/iqqUHlLcHw==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-flag/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-3.1.2.tgz",
-      "integrity": "sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-fenced-code-marker/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-file-extension": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-file-extension/-/remark-lint-file-extension-2.1.2.tgz",
-      "integrity": "sha512-Nq54F5R7F1gyj/IMW6SvkAbVNrH+p38WK3//KCoZLDUYFrH0oXgXXFGHi9CT/O0VEopW+bWJfTn8YAJRs0qI5Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-file-extension/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-file-extension/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-file-extension/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-file-extension/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-file-extension/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-file-extension/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-final-definition/-/remark-lint-final-definition-3.1.2.tgz",
-      "integrity": "sha512-3O3JT6xqlrgq+UjhMPxshgMtwXn99w0BEO9JwbDls49N0XCu0n22Pq1n6X3tEVzskPLo3YYyVYfW2Z2C2rneKQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-final-definition/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-definition/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-newline": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-2.1.2.tgz",
-      "integrity": "sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-newline/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-final-newline/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-final-newline/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-newline/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-newline/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-final-newline/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-first-heading-level/-/remark-lint-first-heading-level-3.1.2.tgz",
-      "integrity": "sha512-uSgDMAKOolDcxfJwQU+iJK2Vbz2ZIzBAjQiN0f+9O/7XwrAH5IuVQH60w7chuxVrauVHmd1rbjmvzXVq8R30VQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-first-heading-level/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-3.1.2.tgz",
-      "integrity": "sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-hard-break-spaces/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-3.1.2.tgz",
-      "integrity": "sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-heading-style": "^2.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-heading-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-heading-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-4.1.2.tgz",
-      "integrity": "sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-bullet-indent/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-3.1.2.tgz",
-      "integrity": "sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-list-item-indent/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/remark-lint-maximum-line-length/-/remark-lint-maximum-line-length-3.1.3.tgz",
-      "integrity": "sha512-TA7IE+0c8agRm1k7JZr7ZZFiL44JMBAj1KlMxSTACBuebdPJe7IPaLIQga10bnz75jfWMzSiRURMFHo4lt3kdw==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-maximum-line-length/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-5.1.2.tgz",
-      "integrity": "sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0",
-        "vfile-location": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-consecutive-blank-lines": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-4.1.3.tgz",
-      "integrity": "sha512-yU3jH6UMHvaxX3DPBen+7CoPiCcqJ4BeteyOKeKX+tKWCWKILpiz+TVToRbeLnWO4IvFNnSRFMSXmcWSDdbY4w==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "@types/unist": "^2.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "webpack": ">=5"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/node-releases": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+    },
+    "node_modules/nopt": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+      "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "abbrev": "^2.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "bin": {
+        "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/normalize-package-data/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "bin": {
+        "semver": "bin/semver"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/npm-normalize-package-bin": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+      "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "path-key": "^3.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-3.1.2.tgz",
-      "integrity": "sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==",
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "unist-util-visit": "^4.0.0"
+        "boolbase": "^1.0.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/nwsapi": {
+      "version": "2.2.10",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz",
+      "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==",
       "dev": true
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/nypm": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz",
+      "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
+      "dependencies": {
+        "citty": "^0.1.6",
+        "consola": "^3.2.3",
+        "execa": "^8.0.1",
+        "pathe": "^1.1.2",
+        "ufo": "^1.4.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "bin": {
+        "nypm": "dist/cli.mjs"
+      },
+      "engines": {
+        "node": "^14.16.0 || >=16.10.0"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/nypm/node_modules/execa": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^8.0.1",
+        "human-signals": "^5.0.0",
+        "is-stream": "^3.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^5.1.0",
+        "onetime": "^6.0.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=16.17"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/nypm/node_modules/get-stream": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
+      "engines": {
+        "node": ">=16"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/nypm/node_modules/human-signals": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=16.17.0"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/nypm/node_modules/is-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/nypm/node_modules/mimic-fn": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+      "engines": {
+        "node": ">=12"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/nypm/node_modules/npm-run-path": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "path-key": "^4.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/nypm/node_modules/onetime": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "mimic-fn": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=12"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-duplicate-definitions/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/nypm/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+      "engines": {
+        "node": ">=12"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-2.1.2.tgz",
-      "integrity": "sha512-kM4vwBkne7f9euDKsuyxTtrsiafjH+KOwu8ZmuSVWh5U+u0EMcPyN5fxfaQIW+5FkrJA1jwnRu7ciXJBJt74Og==",
+    "node_modules/nypm/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
       "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0"
+      "engines": {
+        "node": ">=14"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/nypm/node_modules/strip-final-newline": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
       "dev": true,
       "engines": {
         "node": ">=12"
@@ -26607,189 +22064,219 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-hash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/object-is": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-articles/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/object.entries": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+      "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-2.1.2.tgz",
-      "integrity": "sha512-gw06jaaFwBR3s+3E2kJlv+E7rAzS7Nj+MFU7TViwbsYnR7PA96htLVDCjClyNUE7JHUNcv93HdLm8ykg8kRyNA==",
+    "node_modules/object.fromentries": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/object.groupby": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/object.hasown": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+      "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/object.values": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/objectorarray": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
+      "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
+      "dev": true
+    },
+    "node_modules/ohash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
+      "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==",
+      "dev": true
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "ee-first": "1.1.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8"
       }
     },
-    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
       "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "wrappy": "1"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-2.1.2.tgz",
-      "integrity": "sha512-VrbHg25Oo9k/bNbS7ye1X7F6ER4uZSubO+t5DHJ4WZ6iVbNtBar/JwzVelY1YxUAutv42OvHfuveh4vKlcNgVA==",
-      "dev": true,
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0"
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
       "dev": true,
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
       "engines": {
         "node": ">=12"
       },
@@ -26797,2850 +22284,3047 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
+    "node_modules/openai": {
+      "version": "4.47.3",
+      "resolved": "https://registry.npmjs.org/openai/-/openai-4.47.3.tgz",
+      "integrity": "sha512-470d4ibH5kizXflCzgur22GpM4nOjrg7WQ9jTOa3dNKEn248oBy4+pjOyfcFR4V4YUn/YlDNjp6h83PbviCCKQ==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/node": "^18.11.18",
+        "@types/node-fetch": "^2.6.4",
+        "abort-controller": "^3.0.0",
+        "agentkeepalive": "^4.2.1",
+        "form-data-encoder": "1.7.2",
+        "formdata-node": "^4.3.2",
+        "node-fetch": "^2.6.7",
+        "web-streams-polyfill": "^3.2.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "bin": {
+        "openai": "bin/cli"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
+    "node_modules/openai/node_modules/@types/node": {
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "undici-types": "~5.26.4"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
+    "node_modules/opentelemetry-instrumentation-fetch-node": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.0.tgz",
+      "integrity": "sha512-aiSt/4ubOTyb1N5C2ZbGrBvaJOXIZhZvpRPYuUVxQJe27wJZqf/o65iPrqgLcgfeOLaQ8cS2Q+762jrYvniTrA==",
+      "optional": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@opentelemetry/api": "^1.6.0",
+        "@opentelemetry/instrumentation": "^0.43.0",
+        "@opentelemetry/semantic-conventions": "^1.17.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">18.0.0"
       }
     },
-    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.43.0.tgz",
+      "integrity": "sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==",
+      "optional": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/shimmer": "^1.0.2",
+        "import-in-the-middle": "1.4.2",
+        "require-in-the-middle": "^7.1.1",
+        "semver": "^7.5.2",
+        "shimmer": "^1.2.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-4.1.2.tgz",
-      "integrity": "sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-heading-style": "^2.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+    "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "optional": true,
+      "bin": {
+        "acorn": "bin/acorn"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+    "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/acorn-import-assertions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+      "optional": true,
+      "peerDependencies": {
+        "acorn": "^8"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
+    "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz",
+      "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==",
+      "optional": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "acorn": "^8.8.2",
+        "acorn-import-assertions": "^1.9.0",
+        "cjs-module-lexer": "^1.2.2",
+        "module-details-from-path": "^1.0.3"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/ora/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/ora/node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "restore-cursor": "^3.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/ora/node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+    "node_modules/os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+      "dev": true
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-heading-content-indent/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-heading-indent": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-heading-indent/-/remark-lint-no-heading-indent-4.1.2.tgz",
-      "integrity": "sha512-XFoSebfsYV6EFYRCYkCzSw6xxgltN5l3aPH+UfCk/0geMnl3DrCQjbQt9qhxQzBSBa4gA91CGs2DRI5Xxbwzig==",
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "pluralize": "^8.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
       "dev": true
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/param-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "callsites": "^3.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/parse-asn1": {
+      "version": "5.1.7",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz",
+      "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "asn1.js": "^4.10.1",
+        "browserify-aes": "^1.2.0",
+        "evp_bytestokey": "^1.0.3",
+        "hash-base": "~3.0",
+        "pbkdf2": "^3.1.2",
+        "safe-buffer": "^5.2.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.10"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/parse-entities": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "character-entities": "^1.0.0",
+        "character-entities-legacy": "^1.0.0",
+        "character-reference-invalid": "^1.0.0",
+        "is-alphanumerical": "^1.0.0",
+        "is-decimal": "^1.0.0",
+        "is-hexadecimal": "^1.0.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/parse-entities/node_modules/character-entities": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/parse5": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "entities": "^4.4.0"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8"
       }
     },
-    "node_modules/remark-lint-no-heading-indent/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
       }
     },
-    "node_modules/remark-lint-no-inline-padding": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-4.1.2.tgz",
-      "integrity": "sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==",
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-to-string": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/pathe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
       "dev": true
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/pathval": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
       "dev": true,
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": "*"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.12"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/peek-stream": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+      "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "buffer-from": "^1.0.0",
+        "duplexify": "^3.5.0",
+        "through2": "^2.0.3"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
+    "node_modules/periscopic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
+      "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^3.0.0",
+        "is-reference": "^3.0.0"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
+    "node_modules/periscopic/node_modules/is-reference": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
+      "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/estree": "*"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz",
+      "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg=="
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+    "node_modules/picocolors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "engines": {
+        "node": ">=8.6"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/remark-lint-no-inline-padding/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+    "node_modules/pidtree": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+      "bin": {
+        "pidtree": "bin/pidtree.js"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "node_modules/remark-lint-no-literal-urls": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-3.1.2.tgz",
-      "integrity": "sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==",
+    "node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-to-string": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "find-up": "^5.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-literal-urls/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/pluralize": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
       "dev": true,
       "engines": {
-        "node": ">=12"
+        "node": ">=4"
+      }
+    },
+    "node_modules/pnp-webpack-plugin": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz",
+      "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==",
+      "dev": true,
+      "dependencies": {
+        "ts-pnp": "^1.1.6"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/polished": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
+      "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@babel/runtime": "^7.17.8"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
       "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.38",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+      "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.2.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^10 || ^12 || >=14"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/postcss-bem-linter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-bem-linter/-/postcss-bem-linter-4.0.1.tgz",
+      "integrity": "sha512-jTG3uMo6n2YyxLBPLsRN+5R9djNJZ3mirAugvnYbZaZOwPmLb/MaQ2uql0fSdVYegjZBmX8tW5B0mfZigiXZ9Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "minimatch": "^3.1.2",
+        "postcss-resolve-nested-selector": "^0.1.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "postcss": "^8.4.21"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/postcss-bem-linter/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/postcss-bem-linter/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "brace-expansion": "^1.1.7"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "*"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
+    "node_modules/postcss-calc": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz",
+      "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "postcss-selector-parser": "^6.0.16",
+        "postcss-value-parser": "^4.2.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^18.12 || ^20.9 || >=22.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.38"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
+    "node_modules/postcss-import": {
+      "version": "16.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz",
+      "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
       }
     },
-    "node_modules/remark-lint-no-literal-urls/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/postcss-js": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+      "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "camelcase-css": "^2.0.1"
+      },
+      "engines": {
+        "node": "^12 || ^14 || >= 16"
       },
       "funding": {
         "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.21"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-3.1.2.tgz",
-      "integrity": "sha512-9rJSsrwdzwKmtuloBjJobLzjGL7Lgtk3+vMNUyuH9z/nBfkUCN3qxn3Nt9AxL+wwSAsHV6e74W+W2S1ohBLt6A==",
-      "dev": true,
+    "node_modules/postcss-load-config": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "unist-util-visit": "^4.0.0"
+        "lilconfig": "^3.0.0",
+        "yaml": "^2.3.4"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
       "engines": {
-        "node": ">=12"
+        "node": ">= 14"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "postcss": ">=8.0.9",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "postcss": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+    "node_modules/postcss-load-config/node_modules/yaml": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
+      "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+      "bin": {
+        "yaml": "bin.mjs"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 14"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/postcss-loader": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz",
+      "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "cosmiconfig": "^9.0.0",
+        "jiti": "^1.20.0",
+        "semver": "^7.5.4"
+      },
+      "engines": {
+        "node": ">= 18.12.0"
       },
       "funding": {
         "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "@rspack/core": "0.x || 1.x",
+        "postcss": "^7.0.0 || ^8.0.1",
+        "webpack": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@rspack/core": {
+          "optional": true
+        },
+        "webpack": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/postcss-loader/node_modules/cosmiconfig": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+      "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "env-paths": "^2.2.1",
+        "import-fresh": "^3.3.0",
+        "js-yaml": "^4.1.0",
+        "parse-json": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=14"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/d-fischer"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.9.5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
+    "node_modules/postcss-mixins": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-10.0.1.tgz",
+      "integrity": "sha512-5+cI9r8L5ChegVsLM9pXa53Ft03Mt9xAq+kvzqfrUHGPCArVGOfUvmQK2CLP3XWWP2dqxDLQI+lIcXG+GTqOBQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "fast-glob": "^3.3.2",
+        "postcss-js": "^4.0.1",
+        "postcss-simple-vars": "^7.0.1",
+        "sugarss": "^4.0.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^18.0 || >= 20.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.14"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/postcss-modules-extract-imports": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+      "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "postcss": "^8.1.0"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/postcss-modules-local-by-default": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz",
+      "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/postcss-modules-scope": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz",
+      "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "postcss-selector-parser": "^6.0.4"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
       }
     },
-    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "icss-utils": "^5.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-3.1.2.tgz",
-      "integrity": "sha512-np2MDEhXHviXhbQFjnC1QYv5/fxCV1cIHfGMoJpqiW7Zcu/UGCOo5TE3XswZH4ukHZJ65c3X2A6qfLDW+ur3CQ==",
-      "dev": true,
+    "node_modules/postcss-nested": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+      "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
+        "postcss-selector-parser": "^6.0.11"
+      },
+      "engines": {
+        "node": ">=12.0"
       },
       "funding": {
         "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.14"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/postcss-resolve-nested-selector": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+      "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
       "dev": true
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/postcss-safe-parser": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
+      "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
       "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "postcss": "^8.4.31"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
+    "node_modules/postcss-selector-parser": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
+      "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
+    "node_modules/postcss-simple-vars": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz",
+      "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==",
+      "engines": {
+        "node": ">=14.0"
       },
       "funding": {
         "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.1"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/postcss-sorting": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
+      "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "postcss": "^8.4.20"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-shell-dollars/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "xtend": "^4.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-3.1.2.tgz",
-      "integrity": "sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==",
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
       "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/prettier": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz",
+      "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==",
       "dev": true,
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
       "engines": {
-        "node": ">=12"
+        "node": ">=14"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://github.com/prettier/prettier?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/prettier-fallback": {
+      "name": "prettier",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz",
+      "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/prettier/prettier?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/prettier-plugin-tailwindcss": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.1.tgz",
+      "integrity": "sha512-AnbeYZu0WGj+QgKciUgdMnRxrqcxltleZPgdwfA5104BHM3siBLONN/HLW1yS2HvzSNkzpQ/JAj+LN0jcJO+0w==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
+      "engines": {
+        "node": ">=14.21.3"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "@ianvs/prettier-plugin-sort-imports": "*",
+        "@prettier/plugin-pug": "*",
+        "@shopify/prettier-plugin-liquid": "*",
+        "@trivago/prettier-plugin-sort-imports": "*",
+        "@zackad/prettier-plugin-twig-melody": "*",
+        "prettier": "^3.0",
+        "prettier-plugin-astro": "*",
+        "prettier-plugin-css-order": "*",
+        "prettier-plugin-import-sort": "*",
+        "prettier-plugin-jsdoc": "*",
+        "prettier-plugin-marko": "*",
+        "prettier-plugin-organize-attributes": "*",
+        "prettier-plugin-organize-imports": "*",
+        "prettier-plugin-sort-imports": "*",
+        "prettier-plugin-style-order": "*",
+        "prettier-plugin-svelte": "*"
+      },
+      "peerDependenciesMeta": {
+        "@ianvs/prettier-plugin-sort-imports": {
+          "optional": true
+        },
+        "@prettier/plugin-pug": {
+          "optional": true
+        },
+        "@shopify/prettier-plugin-liquid": {
+          "optional": true
+        },
+        "@trivago/prettier-plugin-sort-imports": {
+          "optional": true
+        },
+        "@zackad/prettier-plugin-twig-melody": {
+          "optional": true
+        },
+        "prettier-plugin-astro": {
+          "optional": true
+        },
+        "prettier-plugin-css-order": {
+          "optional": true
+        },
+        "prettier-plugin-import-sort": {
+          "optional": true
+        },
+        "prettier-plugin-jsdoc": {
+          "optional": true
+        },
+        "prettier-plugin-marko": {
+          "optional": true
+        },
+        "prettier-plugin-organize-attributes": {
+          "optional": true
+        },
+        "prettier-plugin-organize-imports": {
+          "optional": true
+        },
+        "prettier-plugin-sort-imports": {
+          "optional": true
+        },
+        "prettier-plugin-style-order": {
+          "optional": true
+        },
+        "prettier-plugin-svelte": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/pretty-error": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+      "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "lodash": "^4.17.20",
+        "renderkid": "^3.0.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/pretty-format": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+      "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "ansi-regex": "^5.0.1",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^17.0.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/pretty-format/node_modules/react-is": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+      "dev": true
+    },
+    "node_modules/pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/proc-log": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+      "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-3.1.2.tgz",
-      "integrity": "sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==",
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
       "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.6.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
       "dev": true
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
+    "node_modules/progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
       },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "dev": true,
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/property-information": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+      "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.10"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+      "dev": true
+    },
+    "node_modules/public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/public-encrypt/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/pumpify/node_modules/pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
-    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pure-rand": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+      "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/dubzzz"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fast-check"
+        }
+      ]
+    },
+    "node_modules/qs": {
+      "version": "6.12.1",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz",
+      "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-table-indentation": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-4.1.2.tgz",
-      "integrity": "sha512-5lkO+Yrtni/CDMZi7mlwbB2zzRQLH94DesboXg51aO2UfZlSn5dZNhmN5wkyCU2AiApUhlFNbxfKMHOWFPLdog==",
+    "node_modules/querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
       "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0",
-        "vfile-location": "^4.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.4.x"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
       "dev": true
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/queue": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+      "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "inherits": "~2.0.3"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/quotation": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/quotation/-/quotation-2.0.3.tgz",
+      "integrity": "sha512-yEc24TEgCFLXx7D4JHJJkK4JFVtatO8fziwUxY4nB/Jbea9o9CVS3gt22mA0W7rPYAGW2fWzYDSOtD94PwOyqA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/ramda": {
+      "version": "0.29.0",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz",
+      "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
       "funding": {
         "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://opencollective.com/ramda"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.8"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
-      "dev": true,
+    "node_modules/react": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "loose-envify": "^1.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/react-colorful": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
+      "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/react-docgen": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz",
+      "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@babel/core": "^7.18.9",
+        "@babel/traverse": "^7.18.9",
+        "@babel/types": "^7.18.9",
+        "@types/babel__core": "^7.18.0",
+        "@types/babel__traverse": "^7.18.0",
+        "@types/doctrine": "^0.0.9",
+        "@types/resolve": "^1.20.2",
+        "doctrine": "^3.0.0",
+        "resolve": "^1.22.1",
+        "strip-indent": "^4.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=16.14.0"
       }
     },
-    "node_modules/remark-lint-no-table-indentation/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/react-docgen-typescript": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
+      "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
       "dev": true,
+      "peerDependencies": {
+        "typescript": ">= 4.3.x"
+      }
+    },
+    "node_modules/react-docgen/node_modules/@types/doctrine": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
+      "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
+      "dev": true
+    },
+    "node_modules/react-dom": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "react": "^18.3.1"
       }
     },
-    "node_modules/remark-lint-no-tabs": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-tabs/-/remark-lint-no-tabs-3.1.2.tgz",
-      "integrity": "sha512-PQQmRpGHRW9tMnAXtlQbMke8byIJu9hlotCH6pJZPO4FodpXvD4JW5EMM3BmO0JQDZsQWrx3qfqxCEMxrj8Qbg==",
+    "node_modules/react-element-to-jsx-string": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
+      "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "vfile-location": "^4.0.0"
+        "@base2/pretty-print-object": "1.0.1",
+        "is-plain-object": "5.0.0",
+        "react-is": "18.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "peerDependencies": {
+        "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0",
+        "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0"
       }
     },
-    "node_modules/remark-lint-no-tabs/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+    "node_modules/react-element-to-jsx-string/node_modules/react-is": {
+      "version": "18.1.0",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
+      "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
       "dev": true
     },
-    "node_modules/remark-lint-no-tabs/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "node_modules/react-refresh": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+      "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
       "dev": true,
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-tabs/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
+    "node_modules/react-remove-scroll": {
+      "version": "2.5.5",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
+      "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "react-remove-scroll-bar": "^2.3.3",
+        "react-style-singleton": "^2.2.1",
+        "tslib": "^2.1.0",
+        "use-callback-ref": "^1.3.0",
+        "use-sidecar": "^1.1.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-tabs/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
+    "node_modules/react-remove-scroll-bar": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+      "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "react-style-singleton": "^2.2.1",
+        "tslib": "^2.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-tabs/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
+    "node_modules/react-style-singleton": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+      "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "get-nonce": "^1.0.0",
+        "invariant": "^2.2.4",
+        "tslib": "^2.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/remark-lint-no-tabs/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "pify": "^2.3.0"
       }
     },
-    "node_modules/remark-lint-no-trailing-spaces": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-trailing-spaces/-/remark-lint-no-trailing-spaces-2.0.1.tgz",
-      "integrity": "sha512-cj8t+nvtO6eAY2lJC7o5du8VeOCK13XiDUHL4U6k5aw6ZLr3EYWbQ/rNc6cr60eHkh5Ldm09KiZjV3CWpxqJ0g==",
+    "node_modules/read-package-json-fast": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+      "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
       "dev": true,
       "dependencies": {
-        "unified-lint-rule": "^1.0.2"
+        "json-parse-even-better-errors": "^3.0.0",
+        "npm-normalize-package-bin": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/remark-lint-no-trailing-spaces/node_modules/unified-lint-rule": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.6.tgz",
-      "integrity": "sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==",
+    "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+      "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
       "dev": true,
-      "dependencies": {
-        "wrapped": "^1.0.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/remark-lint-no-undefined-references": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-4.2.1.tgz",
-      "integrity": "sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==",
+    "node_modules/read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "micromark-util-normalize-identifier": "^1.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0",
-        "vfile-location": "^4.0.0"
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-undefined-references/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
       "dev": true,
+      "dependencies": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
       "engines": {
-        "node": ">=12"
+        "node": ">=8"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/micromark-util-normalize-identifier": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
-      "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ],
-      "dependencies": {
-        "micromark-util-symbol": "^1.0.0"
-      }
-    },
-    "node_modules/remark-lint-no-undefined-references/node_modules/micromark-util-symbol": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
-      "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "GitHub Sponsors",
-          "url": "https://github.com/sponsors/unifiedjs"
-        },
-        {
-          "type": "OpenCollective",
-          "url": "https://opencollective.com/unified"
-        }
-      ]
-    },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/read-pkg-up/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/read-pkg-up/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "p-locate": "^4.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/read-pkg-up/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/read-pkg-up/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "p-limit": "^2.2.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/read-pkg-up/node_modules/type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/read-pkg/node_modules/type-fest": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/readable-stream": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
+      "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "abort-controller": "^3.0.0",
+        "buffer": "^6.0.3",
+        "events": "^3.3.0",
+        "process": "^0.11.10",
+        "string_decoder": "^1.3.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "node_modules/remark-lint-no-undefined-references/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "picomatch": "^2.2.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8.10.0"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-3.1.2.tgz",
-      "integrity": "sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==",
+    "node_modules/reading-time": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz",
+      "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="
+    },
+    "node_modules/recast": {
+      "version": "0.23.9",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
+      "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-visit": "^4.0.0"
+        "ast-types": "^0.16.1",
+        "esprima": "~4.0.0",
+        "source-map": "~0.6.1",
+        "tiny-invariant": "^1.3.3",
+        "tslib": "^2.0.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 4"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/recast/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "dev": true,
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/redent/node_modules/strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "min-indent": "^1.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/reflect.getprototypeof": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+      "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.1",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "globalthis": "^1.0.3",
+        "which-builtin-type": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
+      "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "regenerate": "^1.4.2"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
+    "node_modules/regenerator-transform": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+      "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@babel/runtime": "^7.8.4"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/regex-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
+      "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
+      "dev": true
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+      "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "call-bind": "^1.0.6",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "set-function-name": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/remark-lint-no-unused-definitions/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/regexpu-core": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@babel/regjsgen": "^0.8.0",
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-3.1.2.tgz",
-      "integrity": "sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==",
+    "node_modules/regjsparser": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "jsesc": "~0.5.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "bin": {
+        "regjsparser": "bin/parser"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "bin": {
+        "jsesc": "bin/jsesc"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
+    "node_modules/rehype-autolink-headings": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz",
+      "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==",
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/hast": "^3.0.0",
+        "@ungap/structured-clone": "^1.0.0",
+        "hast-util-heading-rank": "^3.0.0",
+        "hast-util-is-element": "^3.0.0",
+        "unified": "^11.0.0",
+        "unist-util-visit": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
+    "node_modules/rehype-slug": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
+      "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/hast": "^3.0.0",
+        "github-slugger": "^2.0.0",
+        "hast-util-heading-rank": "^3.0.0",
+        "hast-util-to-string": "^3.0.0",
+        "unist-util-visit": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 0.10"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-frontmatter": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz",
+      "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-frontmatter": "^2.0.0",
+        "micromark-extension-frontmatter": "^2.0.0",
+        "unified": "^11.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-frontmatter/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-gfm": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz",
+      "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-gfm": "^3.0.0",
+        "micromark-extension-gfm": "^3.0.0",
+        "remark-parse": "^11.0.0",
+        "remark-stringify": "^11.0.0",
+        "unified": "^11.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-gfm/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-10.0.0.tgz",
+      "integrity": "sha512-E8yHHDOJ8b+qI0G49BRu24pe8t0fNNBWv8ENQJpCGNrVeTeyBIGEbaUe1yuF7OG8faA6PVpcN/pqWjzW9fcBWQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "remark-message-control": "^8.0.0",
+        "unified": "^11.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-blockquote-indentation": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-4.0.0.tgz",
+      "integrity": "sha512-hdUvn+KsJbBKpY9jLY01PmfpJ/WGhLu9GJMXQGU8ADXJc+F5DWSgKAr6GQ1IUKqvGYdEML/KZ61WomWFUuecVA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-ordered-list-marker-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-blockquote-indentation/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-checkbox-character-style": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-5.0.0.tgz",
+      "integrity": "sha512-K0G/Nok59fb2q5KUxcemBVt+ymnhTkDVLJAatZ4PAh9At8y0DGctHdU27jWsuvO0Fs7Zy62Usk7IJE2VO89p1w==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-prohibited-strings": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/remark-lint-prohibited-strings/-/remark-lint-prohibited-strings-3.1.0.tgz",
-      "integrity": "sha512-zwfDDdYl7ye0gEHcwhdkv1ZGXj1ibw4gnLLZkkvySnDdTz2tshY3fOJLY5NikbVseaIRVGOr5qa+8J9WNQT/fA==",
+    "node_modules/remark-lint-checkbox-character-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "escape-string-regexp": "^5.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.1",
-        "unist-util-visit": "^4.0.0",
-        "vfile-location": "^4.0.1"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-prohibited-strings/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-prohibited-strings/node_modules/escape-string-regexp": {
+    "node_modules/remark-lint-checkbox-content-indent": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
-      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+      "resolved": "https://registry.npmjs.org/remark-lint-checkbox-content-indent/-/remark-lint-checkbox-content-indent-5.0.0.tgz",
+      "integrity": "sha512-7L25a7TEfdogFSh4HDOnB+GTTTEiXJDMlceUPft9bzIjElI8Hm2+a2D8jUQn4ahj+j/3LmdZW4GjAeyfdPuqTA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-position": {
+    "node_modules/remark-lint-checkbox-content-indent/node_modules/@types/mdast": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-code-block-style": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-4.0.0.tgz",
+      "integrity": "sha512-LKBKMVruEO0tzDnnnqi1TfUcnwY6Mo7cVtZM4E4pKt3KMhtvgU2wD68/MxDOEJd0pmnLrEgIadv74bY0gWhZpg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-code-block-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-rule-style": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-3.1.2.tgz",
-      "integrity": "sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==",
+    "node_modules/remark-lint-definition-spacing": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-definition-spacing/-/remark-lint-definition-spacing-4.0.0.tgz",
+      "integrity": "sha512-t6nP8unz6z/DLBTWeOmDFHPFbX3E2PbNgt2fTazRbVnMC6z3o25hBzg5hI6DL0MPt2ZTRX++rJsGRjb+vgh/tQ==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "@types/mdast": "^4.0.0",
+        "longest-streak": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-rule-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-definition-spacing/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-fenced-code-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-4.0.0.tgz",
+      "integrity": "sha512-Zs0wJd4nRvBo/9NWQVfWg5Ykapbo0Zzw/SyZc3f0h73S1gTZZcfeU+bA5oDivlBdcUgLBsyHRE0QaoaVvN3/Wg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "quotation": "^2.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/remark-lint-fenced-code-flag/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unist-util-position": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+    "node_modules/remark-lint-fenced-code-marker": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-4.0.0.tgz",
+      "integrity": "sha512-WFN88Rx78m4/HSbW3Kx2XAYbVfzYns4bJd9qpwDD90DA3nc59zciYd01xi6Bk3n9vSs5gIlmG7xkwxVHHJ8KCA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-fenced-code-marker/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-file-extension": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-file-extension/-/remark-lint-file-extension-3.0.0.tgz",
+      "integrity": "sha512-wrOKiGvcl/ftB7FkeX2/l13ALvhKXV77HGR8AXo86cVY2pD+K0WdOC52DV3ldgpUXpWzE9kcgF8bbkxwzKpFFg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@types/mdast": "^4.0.0",
+        "quotation": "^2.0.0",
+        "unified-lint-rule": "^3.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-file-extension/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-final-definition": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/remark-lint-final-definition/-/remark-lint-final-definition-4.0.1.tgz",
+      "integrity": "sha512-51T9oSdA7wuhjSdgGo0snO1BY39Igt9cJQi7XpgtgFsbfQk8zSSAUAc/rLabY6+YCTpcPs6qmwvLXZ4mPX6Qlg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-mdx": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-rule-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-final-definition/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-strong-marker": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-3.1.2.tgz",
-      "integrity": "sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==",
+    "node_modules/remark-lint-final-newline": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-3.0.0.tgz",
+      "integrity": "sha512-NaPyn6FiOn3IV/6gIcwWfJmgraPT2IaVLjhakfPglZkKVfn/FrOfETyY8Bp+HLoSRI9967OH0yRDnK7/pPIWeQ==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "vfile-location": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-strong-marker/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-final-newline/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-first-heading-level": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-first-heading-level/-/remark-lint-first-heading-level-4.0.0.tgz",
+      "integrity": "sha512-CAMSDt03MwzGD1bgOZ+UaE0lN1xZXtJZGRXwMg7OmGazLVDtTsRkMEK0YY2LUyozdHBUFoq6FQt5pKyYdt/Tmw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-mdx": "^3.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/remark-lint-first-heading-level/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-hard-break-spaces": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-4.0.0.tgz",
+      "integrity": "sha512-zCTq7/xfM0ZL3bMopXse9DH2nk38wE1LrxmYwnTrqASBLnEAJWE2U2//tRGVMEBfSAnNvmIo96twz6zkLWjbGA==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unist-util-position": {
+    "node_modules/remark-lint-hard-break-spaces/node_modules/@types/mdast": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-heading-style": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-4.0.0.tgz",
+      "integrity": "sha512-dQ6Jul5K0+aNUvrq4W7H0+osSoC9hsmwHZqBFq000+eMP/hWJqI8tuudw1rap8HHYuOsKLRbB5q+Fr7G+3Vw+Q==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-heading-style": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-heading-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-list-item-bullet-indent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-5.0.0.tgz",
+      "integrity": "sha512-qq22QaxsDjfsL7aWGIPmP3P0N99CJBQQW1+iSrhYAMCDzqVlw6I3wPNAeR6s8mcoeHT8YlT6eQH3V8xJ0SlW6w==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-list-item-bullet-indent/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-strong-marker/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-list-item-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-4.0.0.tgz",
+      "integrity": "sha512-Yd6/g8CH9e4vlPAPNgl7F575uKhP+pTo/qwGkE61GOcgEVNJ/529hjumUhyQ4sOAX0YAPAjxvq6fJvb4AhVOOA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-4.1.3.tgz",
-      "integrity": "sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==",
+    "node_modules/remark-lint-list-item-indent/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "@types/unist": "^2.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-maximum-line-length": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/remark-lint-maximum-line-length/-/remark-lint-maximum-line-length-4.0.1.tgz",
+      "integrity": "sha512-hQlh8UrRfhkO4FU7z7t1Bu5ethj1y2iBncO5AOWF38RAmlHaZdB2lQxNA8IvUZITGJYpT1aThdFTEf+58lv08Q==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-mdx": "^3.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-table-cell-padding/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-maximum-line-length/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-no-blockquote-without-marker": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-6.0.0.tgz",
+      "integrity": "sha512-fBhoTpkWcl5tG4FdwPdJIyb8XLrdr6MdLk1+K2BQ6Rom3rRsIYvuox4ohxOunNrXuth8xyw8kC6wDmODR44oFw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-directive": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-location": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/remark-lint-no-blockquote-without-marker/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-consecutive-blank-lines": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-5.0.0.tgz",
+      "integrity": "sha512-HsDZbFlelBVO3mEJDXd9v4z0HLB8pqxWnsV+I4ILYFp5lKYf6NxJaLBWFtP1gAg1+95WxityGLkGtYqmicDjpg==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-directive": "^3.0.0",
+        "mdast-util-mdx": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unist-util-position": {
+    "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/@types/mdast": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-no-duplicate-definitions": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-4.0.0.tgz",
+      "integrity": "sha512-21fcOACkCyhNsHkedKlpvqIywYx+5zGR507bW8e59gzdGhTbnBwQ9du4ACmN9jxPTfIBhUVMz0bWezkGrHE7Bg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-no-duplicate-definitions/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-no-file-name-articles": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-3.0.0.tgz",
+      "integrity": "sha512-il4IseupahbV2TVfFjfDVL/EQw7jBWVlMVsv4K2cgl5uPIjiCjFGQypqKnWl6pZDN0oNOs/DE8gBdyuDjldJaA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-no-file-name-articles/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-file-name-consecutive-dashes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-3.0.0.tgz",
+      "integrity": "sha512-3vSI1LOQlu8NSCpWLsKELa8dS9HU+YVZE0U43/DNkdEcnZmlJLpTHQjBTMZUHQipRgoOO+TOSyXFyN/H+2lbuQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-cell-padding/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-file-name-outer-dashes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-3.0.0.tgz",
+      "integrity": "sha512-3kgamCp39mdlCtqF/+JLwwS4VpSj5wvVwRythUfrpW7993I9kF67dBsaU545aEzWSK+UJZqjb40i0m2VfnBRfQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-table-pipes/-/remark-lint-table-pipes-4.1.2.tgz",
-      "integrity": "sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==",
+    "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-heading-content-indent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-5.0.0.tgz",
+      "integrity": "sha512-psYSlD2BjcVkgpeXOLwPcYFBrbtJWp8E8JX1J4vSfoHPeY6aIxgYxXkf57cjGTApfRL8xawBmMDiF1FgQvpZYg==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-lint-table-pipes/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-no-heading-content-indent/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-no-heading-indent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-heading-indent/-/remark-lint-no-heading-indent-5.0.0.tgz",
+      "integrity": "sha512-JWGIWhaEzH00HywI0DHex92tJ5Mw7l11shQ6/MGhRjYsHMRWcwWcVeOuktVMe/BiQbg0hRoE4+g0z2VgUD6Cqw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/remark-lint-no-heading-indent/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-literal-urls": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-4.0.0.tgz",
+      "integrity": "sha512-rl/3Ai4Ax9IH/fRpOJZuXk1HgYX6oFTauhmBOilpqbq/YT2kN3FuXaneXdRfKv1bgMdHaLKxHWxGj/mDyA2n8w==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "micromark-util-character": "^2.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unist-util-position": {
+    "node_modules/remark-lint-no-literal-urls/node_modules/@types/mdast": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-literal-urls/node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-no-multiple-toplevel-headings": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-4.0.0.tgz",
+      "integrity": "sha512-JW11iYxza7asDdhQuKfr8SH1u4NBOCQ4U7Ru0HrKCPcT4y/AB1C1il5uMQzbcervgYPBq69xzyQ24+AJeL0t3A==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-mdx": "^3.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-shell-dollars": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-4.0.0.tgz",
+      "integrity": "sha512-ye2h8FzjsgqqQV0HHN2g9N4FqI3eD9Gpgu7tU5ADIJyQ3mUJdwBoFn7IlGnpmumR1fb/l6u/AhRavIZxXYqG+Q==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "collapse-white-space": "^2.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-no-shell-dollars/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-shortcut-reference-image": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-4.0.0.tgz",
+      "integrity": "sha512-YEiCpW5F/8/LZyxlOuVK2L/n0NJ1AB0AJK7oP39OVyEk3Xl7w+JQi6nZ3KiH6REh+PWGqKn6M0KEPL9cT/iAOw==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-no-shortcut-reference-image/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-shortcut-reference-link": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-4.0.0.tgz",
+      "integrity": "sha512-6jka2Zz3I6G2MvDcKrwADYhTOxHMFMK854u1cfBEIH5/XnCCXROtoqiiDtbZw+NJqbmwsBKvGL4t2gnmEJUmgg==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-table-pipes/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-no-shortcut-reference-link/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-table-indentation": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-5.0.0.tgz",
+      "integrity": "sha512-MaLmnzgirpnRiRjWwrsyOX0RmP2eG4YAv169MtsxTVa6O3CpUDwTuTzivudE9L0kVvTlyF9DXEmdyjm85LDyVA==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-location": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-3.1.2.tgz",
-      "integrity": "sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==",
+    "node_modules/remark-lint-no-table-indentation/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "unified": "^10.0.0",
-        "unified-lint-rule": "^2.0.0",
-        "unist-util-generated": "^2.0.0",
-        "unist-util-position": "^4.0.0",
-        "unist-util-visit": "^4.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-no-tabs": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-tabs/-/remark-lint-no-tabs-4.0.0.tgz",
+      "integrity": "sha512-rQR7LDdcw047ajB3D+v9uzdB8aZfZtEdlUJvQXKkcVDteWiuXGC3PcIrmM/8n3J/wlFMuwoAaW2IcdlJf8HzXQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "vfile-location": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
+    "node_modules/remark-lint-no-tabs/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "*"
+      }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-no-trailing-spaces": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-trailing-spaces/-/remark-lint-no-trailing-spaces-2.0.1.tgz",
+      "integrity": "sha512-cj8t+nvtO6eAY2lJC7o5du8VeOCK13XiDUHL4U6k5aw6ZLr3EYWbQ/rNc6cr60eHkh5Ldm09KiZjV3CWpxqJ0g==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "unified-lint-rule": "^1.0.2"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-no-trailing-spaces/node_modules/unified-lint-rule": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.6.tgz",
+      "integrity": "sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "wrapped": "^1.0.1"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+    "node_modules/remark-lint-no-undefined-references": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-5.0.0.tgz",
+      "integrity": "sha512-O0q8bHpRHK1T85oqO+uep4BkvQnZZp3y+wahDeeLLq9dCJfF56sq6Tt5OOTt1BAOZlpobS3OPQHUiJWYP6hX1w==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "collapse-white-space": "^2.0.0",
+        "devlop": "^1.0.0",
+        "micromark-util-normalize-identifier": "^2.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-location": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-position": {
+    "node_modules/remark-lint-no-undefined-references/node_modules/@types/mdast": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
-      "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-no-unused-definitions": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-4.0.0.tgz",
+      "integrity": "sha512-YCZ6k575NCTx7mnN+9ls0G6YgMsZHi0LYQqfLW8MNVHBtbpTBvfmk8I39bmsvuKWeBD98weZoXSDqIiIGg+Q/g==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-visit": "^5.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-visit": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
-      "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+    "node_modules/remark-lint-no-unused-definitions/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^5.1.1"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-visit-parents": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
-      "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+    "node_modules/remark-lint-ordered-list-marker-style": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-4.0.0.tgz",
+      "integrity": "sha512-xZ7Xppy5fzACH4b9h1b4lTzVtNY2AlUkNTfl1Oe6cIKN8tk3juFxN0wL2RpktPtSZ7iRIabzFmg6l8WPhlASJA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "micromark-util-character": "^2.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "@types/unist": "*"
       }
     },
-    "node_modules/remark-lint-unordered-list-marker-style/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-lint-prohibited-strings": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-prohibited-strings/-/remark-lint-prohibited-strings-4.0.0.tgz",
+      "integrity": "sha512-dfLF4da5v3klRAdkHBLpNIC7WpvNdN7Eylgf+p19HPJn53CaxqlGjFvAQDAJU83xXEPWAmdonlx04GIS5ryLow==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "escape-string-regexp": "^5.0.0",
+        "unified-lint-rule": "^2.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile-location": "^5.0.1"
       }
     },
-    "node_modules/remark-lint/node_modules/@types/unist": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/@types/unist": {
       "version": "2.0.10",
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
       "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
       "dev": true
     },
-    "node_modules/remark-lint/node_modules/is-plain-obj": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/remark-lint-prohibited-strings/node_modules/is-plain-obj": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
       "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
@@ -29652,7 +25336,7 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/remark-lint/node_modules/unified": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/unified": {
       "version": "10.1.2",
       "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
       "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
@@ -29671,7 +25355,23 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint/node_modules/unist-util-stringify-position": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/unified-lint-rule": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-2.1.2.tgz",
+      "integrity": "sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "^2.0.0",
+        "trough": "^2.0.0",
+        "unified": "^10.0.0",
+        "vfile": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-stringify-position": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
       "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
@@ -29684,7 +25384,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint/node_modules/vfile": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/vfile": {
       "version": "5.3.7",
       "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
       "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
@@ -29700,7 +25400,7 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-lint/node_modules/vfile-message": {
+    "node_modules/remark-lint-prohibited-strings/node_modules/vfile-message": {
       "version": "3.1.4",
       "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
       "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
@@ -29714,116 +25414,190 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-mdx": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz",
-      "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==",
+    "node_modules/remark-lint-rule-style": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-4.0.0.tgz",
+      "integrity": "sha512-Kt7IHMB5IbLgRFKaFUmB895sV3PTD0MBgN9CvXKxr1wHFF43S6tabjFIBSoQqyJRlhH0S3rK6Lvopofa009gLg==",
+      "dev": true,
       "dependencies": {
-        "mdast-util-mdx": "^3.0.0",
-        "micromark-extension-mdxjs": "^3.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-7.1.1.tgz",
-      "integrity": "sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==",
+    "node_modules/remark-lint-rule-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "mdast-comment-marker": "^2.0.0",
-        "unified": "^10.0.0",
-        "unified-message-control": "^4.0.0",
-        "vfile": "^5.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-strong-marker": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-4.0.0.tgz",
+      "integrity": "sha512-YcvuzakYhQWdCH+1E30sUY+wyvq+PNa77NZAMAYO/cS/pZczFB+q4Ccttw4Q+No/chX8oMfe0GYtm8dDWLei/g==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
+    "node_modules/remark-lint-strong-marker/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "*"
+      }
     },
-    "node_modules/remark-message-control/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+    "node_modules/remark-lint-table-cell-padding": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-5.0.0.tgz",
+      "integrity": "sha512-LNyiHDQZBIOqcQGG1tYsZHW7g0v8OyRmRgDrD5WEsMaAYfM6EiECUokN/Q4py9h4oM/2KUSrdZbtfuZmy87/kA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "pluralize": "^8.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+    "node_modules/remark-lint-table-cell-padding/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-table-pipes": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-table-pipes/-/remark-lint-table-pipes-5.0.0.tgz",
+      "integrity": "sha512-e7jzAScDrt5+eMomh099TZJBN2K9ldDxBu9iYhNu5C0YsdAvnckJkgilsuClxFpmx4LCVYaX0EGbt/hQ3LB3xg==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "@types/unist": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+    "node_modules/remark-lint-table-pipes/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint-unordered-list-marker-style": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-4.0.0.tgz",
+      "integrity": "sha512-XlP4Wr4KJNovyWVv0H5axfUlF23iE9Kt2SxaVq4+ieum5YcMmKE6KsL+aqt3kiJb60SH1u6a0bxKFvdM/9riOA==",
+      "dev": true,
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "unified-lint-rule": "^3.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-lint/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/remark-mdx": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz",
+      "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==",
+      "dependencies": {
+        "mdast-util-mdx": "^3.0.0",
+        "micromark-extension-mdxjs": "^3.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/remark-message-control/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/remark-message-control": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-8.0.0.tgz",
+      "integrity": "sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/mdast": "^4.0.0",
+        "mdast-comment-marker": "^3.0.0",
+        "unified-message-control": "^5.0.0",
+        "vfile": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
+    "node_modules/remark-message-control/node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "dev": true,
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
     "node_modules/remark-parse": {
       "version": "11.0.0",
       "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
@@ -29840,17 +25614,17 @@
       }
     },
     "node_modules/remark-parse/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
     },
     "node_modules/remark-parse/node_modules/mdast-util-from-markdown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-      "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+      "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
       "dependencies": {
         "@types/mdast": "^4.0.0",
         "@types/unist": "^3.0.0",
@@ -29917,45 +25691,44 @@
       }
     },
     "node_modules/remark-preset-lint-node": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/remark-preset-lint-node/-/remark-preset-lint-node-5.0.0.tgz",
-      "integrity": "sha512-E8q3jgNVuhm738oQV7dLNEukO1JVIgYuNoNdn4hliVYdrjJY3zJdsntJbUzZqMmBopcMAy3HwOwwHWz7C0Qsvw==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/remark-preset-lint-node/-/remark-preset-lint-node-5.0.2.tgz",
+      "integrity": "sha512-yuPSpd9hDqX8ZqCMem+EX2CJvuu7zzjoZRL65NGkJeg4wrxiv7ztrRZ8WgQ0lKV0JVG6h541QHG1gtzd6E3Eig==",
       "dev": true,
       "dependencies": {
         "js-yaml": "^4.1.0",
         "remark-gfm": "^4.0.0",
-        "remark-lint-blockquote-indentation": "^3.1.2",
-        "remark-lint-checkbox-character-style": "^4.1.2",
-        "remark-lint-checkbox-content-indent": "^4.1.2",
-        "remark-lint-code-block-style": "^3.1.2",
-        "remark-lint-definition-spacing": "^3.1.2",
-        "remark-lint-fenced-code-flag": "^3.1.2",
-        "remark-lint-fenced-code-marker": "^3.1.2",
-        "remark-lint-file-extension": "^2.1.2",
-        "remark-lint-final-definition": "^3.1.2",
-        "remark-lint-first-heading-level": "^3.1.2",
-        "remark-lint-heading-style": "^3.1.2",
-        "remark-lint-list-item-indent": "^3.1.2",
-        "remark-lint-maximum-line-length": "^3.1.3",
-        "remark-lint-no-consecutive-blank-lines": "^4.1.3",
-        "remark-lint-no-file-name-articles": "^2.1.2",
-        "remark-lint-no-file-name-consecutive-dashes": "^2.1.2",
-        "remark-lint-no-file-name-outer-dashes": "^2.1.2",
-        "remark-lint-no-heading-indent": "^4.1.2",
-        "remark-lint-no-multiple-toplevel-headings": "^3.1.2",
-        "remark-lint-no-shell-dollars": "^3.1.2",
-        "remark-lint-no-table-indentation": "^4.1.2",
-        "remark-lint-no-tabs": "^3.1.2",
+        "remark-lint-blockquote-indentation": "^4.0.0",
+        "remark-lint-checkbox-character-style": "^5.0.0",
+        "remark-lint-checkbox-content-indent": "^5.0.0",
+        "remark-lint-code-block-style": "^4.0.0",
+        "remark-lint-definition-spacing": "^4.0.0",
+        "remark-lint-fenced-code-flag": "^4.0.0",
+        "remark-lint-fenced-code-marker": "^4.0.0",
+        "remark-lint-file-extension": "^3.0.0",
+        "remark-lint-final-definition": "^4.0.1",
+        "remark-lint-first-heading-level": "^4.0.0",
+        "remark-lint-heading-style": "^4.0.0",
+        "remark-lint-maximum-line-length": "^4.0.1",
+        "remark-lint-no-consecutive-blank-lines": "^5.0.0",
+        "remark-lint-no-file-name-articles": "^3.0.0",
+        "remark-lint-no-file-name-consecutive-dashes": "^3.0.0",
+        "remark-lint-no-file-name-outer-dashes": "^3.0.0",
+        "remark-lint-no-heading-indent": "^5.0.0",
+        "remark-lint-no-multiple-toplevel-headings": "^4.0.0",
+        "remark-lint-no-shell-dollars": "^4.0.0",
+        "remark-lint-no-table-indentation": "^5.0.0",
+        "remark-lint-no-tabs": "^4.0.0",
         "remark-lint-no-trailing-spaces": "^2.0.1",
-        "remark-lint-prohibited-strings": "^3.1.0",
-        "remark-lint-rule-style": "^3.1.2",
-        "remark-lint-strong-marker": "^3.1.2",
-        "remark-lint-table-cell-padding": "^4.1.3",
-        "remark-lint-table-pipes": "^4.1.2",
-        "remark-lint-unordered-list-marker-style": "^3.1.2",
-        "remark-preset-lint-recommended": "^6.1.3",
+        "remark-lint-prohibited-strings": "^4.0.0",
+        "remark-lint-rule-style": "^4.0.0",
+        "remark-lint-strong-marker": "^4.0.0",
+        "remark-lint-table-cell-padding": "^5.0.0",
+        "remark-lint-table-pipes": "^5.0.0",
+        "remark-lint-unordered-list-marker-style": "^4.0.0",
+        "remark-preset-lint-recommended": "^7.0.0",
         "semver": "^7.5.4",
-        "unified-lint-rule": "^2.1.2",
+        "unified-lint-rule": "^3.0.0",
         "unist-util-visit": "^5.0.0"
       },
       "engines": {
@@ -29963,108 +25736,26 @@
       }
     },
     "node_modules/remark-preset-lint-recommended": {
-      "version": "6.1.3",
-      "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-6.1.3.tgz",
-      "integrity": "sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==",
-      "dev": true,
-      "dependencies": {
-        "@types/mdast": "^3.0.0",
-        "remark-lint": "^9.0.0",
-        "remark-lint-final-newline": "^2.0.0",
-        "remark-lint-hard-break-spaces": "^3.0.0",
-        "remark-lint-list-item-bullet-indent": "^4.0.0",
-        "remark-lint-list-item-indent": "^3.0.0",
-        "remark-lint-no-blockquote-without-marker": "^5.0.0",
-        "remark-lint-no-duplicate-definitions": "^3.0.0",
-        "remark-lint-no-heading-content-indent": "^4.0.0",
-        "remark-lint-no-inline-padding": "^4.0.0",
-        "remark-lint-no-literal-urls": "^3.0.0",
-        "remark-lint-no-shortcut-reference-image": "^3.0.0",
-        "remark-lint-no-shortcut-reference-link": "^3.0.0",
-        "remark-lint-no-undefined-references": "^4.0.0",
-        "remark-lint-no-unused-definitions": "^3.0.0",
-        "remark-lint-ordered-list-marker-style": "^3.0.0",
-        "unified": "^10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/remark-preset-lint-recommended/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-7.0.0.tgz",
+      "integrity": "sha512-A9aPDL78OO12xG2a83DVd+M2QzdBMjn545fbXj40BFJdpt9t//MADkPAwRfpMCBkKi+iECPUTFCb3Jm8SsFG2w==",
+      "dev": true,
+      "dependencies": {
+        "remark-lint": "^10.0.0",
+        "remark-lint-final-newline": "^3.0.0",
+        "remark-lint-hard-break-spaces": "^4.0.0",
+        "remark-lint-list-item-bullet-indent": "^5.0.0",
+        "remark-lint-list-item-indent": "^4.0.0",
+        "remark-lint-no-blockquote-without-marker": "^6.0.0",
+        "remark-lint-no-duplicate-definitions": "^4.0.0",
+        "remark-lint-no-heading-content-indent": "^5.0.0",
+        "remark-lint-no-literal-urls": "^4.0.0",
+        "remark-lint-no-shortcut-reference-image": "^4.0.0",
+        "remark-lint-no-shortcut-reference-link": "^4.0.0",
+        "remark-lint-no-undefined-references": "^5.0.0",
+        "remark-lint-no-unused-definitions": "^4.0.0",
+        "remark-lint-ordered-list-marker-style": "^4.0.0",
+        "unified": "^11.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -30152,9 +25843,9 @@
       }
     },
     "node_modules/remark-rehype/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -30174,9 +25865,9 @@
       }
     },
     "node_modules/remark-stringify/node_modules/@types/mdast": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
-      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
       "dependencies": {
         "@types/unist": "*"
       }
@@ -30212,6 +25903,19 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/require-in-the-middle": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz",
+      "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==",
+      "dependencies": {
+        "debug": "^4.1.1",
+        "module-details-from-path": "^1.0.3",
+        "resolve": "^1.22.1"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
     "node_modules/requireindex": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
@@ -30342,11 +26046,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/restore-cursor/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
-    },
     "node_modules/reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -30357,14 +26056,15 @@
       }
     },
     "node_modules/rfdc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
+      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg=="
     },
     "node_modules/rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
       "dependencies": {
         "glob": "^7.1.3"
@@ -30390,6 +26090,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -30429,14 +26130,15 @@
       }
     },
     "node_modules/rollup": {
-      "version": "2.78.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz",
-      "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==",
+      "version": "3.29.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+      "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
       "bin": {
         "rollup": "dist/bin/rollup"
       },
       "engines": {
-        "node": ">=10.0.0"
+        "node": ">=14.18.0",
+        "npm": ">=8.0.0"
       },
       "optionalDependencies": {
         "fsevents": "~2.3.2"
@@ -30477,13 +26179,13 @@
       }
     },
     "node_modules/safe-array-concat": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
-      "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.5",
-        "get-intrinsic": "^1.2.2",
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
         "has-symbols": "^1.0.3",
         "isarray": "^2.0.5"
       },
@@ -30498,7 +26200,6 @@
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "devOptional": true,
       "funding": [
         {
           "type": "github",
@@ -30515,13 +26216,13 @@
       ]
     },
     "node_modules/safe-regex-test": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz",
-      "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.5",
-        "get-intrinsic": "^1.2.2",
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
         "is-regex": "^1.1.4"
       },
       "engines": {
@@ -30576,9 +26277,9 @@
       }
     },
     "node_modules/sax": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
-      "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
     },
     "node_modules/saxes": {
       "version": "6.0.0",
@@ -30593,31 +26294,66 @@
       }
     },
     "node_modules/scheduler": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
-      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+      "version": "0.23.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
       "dependencies": {
         "loose-envify": "^1.1.0"
       }
     },
     "node_modules/schema-utils": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
-      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
-      "devOptional": true,
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+      "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+      "dev": true,
       "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
+        "@types/json-schema": "^7.0.9",
+        "ajv": "^8.9.0",
+        "ajv-formats": "^2.1.1",
+        "ajv-keywords": "^5.1.0"
       },
       "engines": {
-        "node": ">= 10.13.0"
+        "node": ">= 12.13.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/webpack"
       }
     },
+    "node_modules/schema-utils/node_modules/ajv": {
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz",
+      "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2",
+        "uri-js": "^4.4.1"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/schema-utils/node_modules/ajv-keywords": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3"
+      },
+      "peerDependencies": {
+        "ajv": "^8.8.2"
+      }
+    },
+    "node_modules/schema-utils/node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true
+    },
     "node_modules/section-matter": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
@@ -30631,12 +26367,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.5.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -30644,22 +26377,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/semver/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
     "node_modules/send": {
       "version": "0.18.0",
       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
@@ -30709,7 +26426,6 @@
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
       "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
-      "devOptional": true,
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -30735,30 +26451,32 @@
       "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="
     },
     "node_modules/set-function-length": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
-      "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
       "dev": true,
       "dependencies": {
-        "define-data-property": "^1.1.1",
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.2",
+        "get-intrinsic": "^1.2.4",
         "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.1"
+        "has-property-descriptors": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/set-function-name": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
-      "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
       "dev": true,
       "dependencies": {
-        "define-data-property": "^1.0.1",
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
         "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.0"
+        "has-property-descriptors": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -30801,6 +26519,47 @@
         "node": ">=8"
       }
     },
+    "node_modules/sharp": {
+      "version": "0.33.4",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz",
+      "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "color": "^4.2.3",
+        "detect-libc": "^2.0.3",
+        "semver": "^7.6.0"
+      },
+      "engines": {
+        "libvips": ">=8.15.2",
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-darwin-arm64": "0.33.4",
+        "@img/sharp-darwin-x64": "0.33.4",
+        "@img/sharp-libvips-darwin-arm64": "1.0.2",
+        "@img/sharp-libvips-darwin-x64": "1.0.2",
+        "@img/sharp-libvips-linux-arm": "1.0.2",
+        "@img/sharp-libvips-linux-arm64": "1.0.2",
+        "@img/sharp-libvips-linux-s390x": "1.0.2",
+        "@img/sharp-libvips-linux-x64": "1.0.2",
+        "@img/sharp-libvips-linuxmusl-arm64": "1.0.2",
+        "@img/sharp-libvips-linuxmusl-x64": "1.0.2",
+        "@img/sharp-linux-arm": "0.33.4",
+        "@img/sharp-linux-arm64": "0.33.4",
+        "@img/sharp-linux-s390x": "0.33.4",
+        "@img/sharp-linux-x64": "0.33.4",
+        "@img/sharp-linuxmusl-arm64": "0.33.4",
+        "@img/sharp-linuxmusl-x64": "0.33.4",
+        "@img/sharp-wasm32": "0.33.4",
+        "@img/sharp-win32-ia32": "0.33.4",
+        "@img/sharp-win32-x64": "0.33.4"
+      }
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -30821,88 +26580,47 @@
       }
     },
     "node_modules/shiki": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.1.2.tgz",
-      "integrity": "sha512-qNzFwTv5uhEDNUIwp7wHjsrffVeLbmOgWnM5mZZhoiz7G2qAUvqVfUzuWfieD45/YAKipzCtdV9SndacKtABow==",
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.6.2.tgz",
+      "integrity": "sha512-X3hSm5GzzBd/BmPmGfkueOUADLyBoZo1ojYQXhd+NU2VJn458yt4duaS0rVzC+WtqftSV7mTVvDw+OB9AHi3Eg==",
       "dependencies": {
-        "@shikijs/core": "1.1.2"
+        "@shikijs/core": "1.6.2"
       }
     },
+    "node_modules/shimmer": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
+      "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
+    },
     "node_modules/side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
       "engines": {
-        "node": ">=14"
+        "node": ">= 0.4"
       },
       "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/simple-concat": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
-      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/simple-get": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "decompress-response": "^6.0.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
-      }
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
     },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
       "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
       "dev": true,
+      "optional": true,
       "dependencies": {
         "is-arrayish": "^0.3.1"
       }
@@ -30911,7 +26629,8 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
       "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
-      "dev": true
+      "dev": true,
+      "optional": true
     },
     "node_modules/sisteransi": {
       "version": "1.0.5",
@@ -30969,9 +26688,9 @@
       }
     },
     "node_modules/source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -31031,9 +26750,9 @@
       }
     },
     "node_modules/spdx-license-ids": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz",
-      "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==",
+      "version": "3.0.18",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+      "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
       "dev": true
     },
     "node_modules/sprintf-js": {
@@ -31115,12 +26834,12 @@
       "dev": true
     },
     "node_modules/storybook": {
-      "version": "7.6.17",
-      "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.17.tgz",
-      "integrity": "sha512-8+EIo91bwmeFWPg1eysrxXlhIYv3OsXrznTr4+4Eq0NikqAoq6oBhtlN5K2RGS2lBVF537eN+9jTCNbR+WrzDA==",
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.1.5.tgz",
+      "integrity": "sha512-v4o8AfTvxWpdGa9Pa9x8EAmqbN5yJc+2fW8b6ZaCsDOTh2t5Y3EUHbIzdtvX+1Gb6ALsOs5e2Q9GlCAzjz+WNQ==",
       "dev": true,
       "dependencies": {
-        "@storybook/cli": "7.6.17"
+        "@storybook/cli": "8.1.5"
       },
       "bin": {
         "sb": "index.js",
@@ -31195,16 +26914,6 @@
         "node": ">=10.0.0"
       }
     },
-    "node_modules/streamx": {
-      "version": "2.15.6",
-      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz",
-      "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==",
-      "dev": true,
-      "dependencies": {
-        "fast-fifo": "^1.1.0",
-        "queue-tick": "^1.0.1"
-      }
-    },
     "node_modules/string_decoder": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -31304,34 +27013,41 @@
       }
     },
     "node_modules/string.prototype.matchall": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
-      "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+      "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
-        "regexp.prototype.flags": "^1.5.0",
-        "set-function-name": "^2.0.0",
-        "side-channel": "^1.0.4"
+        "internal-slot": "^1.0.7",
+        "regexp.prototype.flags": "^1.5.2",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/string.prototype.trim": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
-      "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -31341,37 +27057,40 @@
       }
     },
     "node_modules/string.prototype.trimend": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
-      "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/string.prototype.trimstart": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
-      "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/stringify-entities": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz",
-      "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+      "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
       "dependencies": {
         "character-entities-html4": "^2.0.0",
         "character-entities-legacy": "^3.0.0"
@@ -31513,48 +27232,59 @@
       }
     },
     "node_modules/stylelint": {
-      "version": "16.2.1",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.1.tgz",
-      "integrity": "sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==",
+      "version": "16.6.1",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.6.1.tgz",
+      "integrity": "sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==",
       "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/stylelint"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/stylelint"
+        }
+      ],
       "dependencies": {
-        "@csstools/css-parser-algorithms": "^2.5.0",
-        "@csstools/css-tokenizer": "^2.2.3",
-        "@csstools/media-query-list-parser": "^2.1.7",
-        "@csstools/selector-specificity": "^3.0.1",
+        "@csstools/css-parser-algorithms": "^2.6.3",
+        "@csstools/css-tokenizer": "^2.3.1",
+        "@csstools/media-query-list-parser": "^2.1.11",
+        "@csstools/selector-specificity": "^3.1.1",
+        "@dual-bundle/import-meta-resolve": "^4.1.0",
         "balanced-match": "^2.0.0",
         "colord": "^2.9.3",
         "cosmiconfig": "^9.0.0",
-        "css-functions-list": "^3.2.1",
+        "css-functions-list": "^3.2.2",
         "css-tree": "^2.3.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "fastest-levenshtein": "^1.0.16",
-        "file-entry-cache": "^8.0.0",
+        "file-entry-cache": "^9.0.0",
         "global-modules": "^2.0.0",
         "globby": "^11.1.0",
         "globjoin": "^0.1.4",
         "html-tags": "^3.3.1",
-        "ignore": "^5.3.0",
+        "ignore": "^5.3.1",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
-        "known-css-properties": "^0.29.0",
+        "known-css-properties": "^0.31.0",
         "mathml-tag-names": "^2.1.3",
-        "meow": "^13.1.0",
-        "micromatch": "^4.0.5",
+        "meow": "^13.2.0",
+        "micromatch": "^4.0.7",
         "normalize-path": "^3.0.0",
-        "picocolors": "^1.0.0",
-        "postcss": "^8.4.33",
+        "picocolors": "^1.0.1",
+        "postcss": "^8.4.38",
         "postcss-resolve-nested-selector": "^0.1.1",
         "postcss-safe-parser": "^7.0.0",
-        "postcss-selector-parser": "^6.0.15",
+        "postcss-selector-parser": "^6.1.0",
         "postcss-value-parser": "^4.2.0",
         "resolve-from": "^5.0.0",
         "string-width": "^4.2.3",
         "strip-ansi": "^7.1.0",
         "supports-hyperlinks": "^3.0.0",
         "svg-tags": "^1.0.0",
-        "table": "^6.8.1",
+        "table": "^6.8.2",
         "write-file-atomic": "^5.0.1"
       },
       "bin": {
@@ -31562,10 +27292,6 @@
       },
       "engines": {
         "node": ">=18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/stylelint"
       }
     },
     "node_modules/stylelint-config-recommended": {
@@ -31665,29 +27391,28 @@
       "dev": true
     },
     "node_modules/stylelint/node_modules/file-entry-cache": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
-      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
+      "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
       "dev": true,
       "dependencies": {
-        "flat-cache": "^4.0.0"
+        "flat-cache": "^5.0.0"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=18"
       }
     },
     "node_modules/stylelint/node_modules/flat-cache": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.0.tgz",
-      "integrity": "sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+      "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
       "dev": true,
       "dependencies": {
-        "flatted": "^3.2.9",
-        "keyv": "^4.5.4",
-        "rimraf": "^5.0.5"
+        "flatted": "^3.3.1",
+        "keyv": "^4.5.4"
       },
       "engines": {
-        "node": ">=16"
+        "node": ">=18"
       }
     },
     "node_modules/stylelint/node_modules/is-fullwidth-code-point": {
@@ -31699,17 +27424,11 @@
         "node": ">=8"
       }
     },
-    "node_modules/stylelint/node_modules/rimraf": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
-      "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
+    "node_modules/stylelint/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
       "dev": true,
-      "dependencies": {
-        "glob": "^10.3.7"
-      },
-      "bin": {
-        "rimraf": "dist/esm/bin.mjs"
-      },
       "engines": {
         "node": ">=14"
       },
@@ -31868,31 +27587,12 @@
       "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
       "dev": true
     },
-    "node_modules/swc-loader": {
-      "version": "0.2.6",
-      "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz",
-      "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==",
-      "dev": true,
-      "dependencies": {
-        "@swc/counter": "^0.1.3"
-      },
-      "peerDependencies": {
-        "@swc/core": "^1.2.147",
-        "webpack": ">=2"
-      }
-    },
     "node_modules/symbol-tree": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
       "dev": true
     },
-    "node_modules/synchronous-promise": {
-      "version": "2.0.17",
-      "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz",
-      "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==",
-      "dev": true
-    },
     "node_modules/synckit": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz",
@@ -31910,9 +27610,9 @@
       }
     },
     "node_modules/table": {
-      "version": "6.8.1",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
-      "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+      "version": "6.8.2",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+      "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
       "dev": true,
       "dependencies": {
         "ajv": "^8.0.1",
@@ -31926,15 +27626,15 @@
       }
     },
     "node_modules/table/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz",
+      "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==",
       "dev": true,
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
+        "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
         "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "uri-js": "^4.4.1"
       },
       "funding": {
         "type": "github",
@@ -31994,9 +27694,9 @@
       }
     },
     "node_modules/tailwindcss": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
-      "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
+      "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
       "dependencies": {
         "@alloc/quick-lru": "^5.2.0",
         "arg": "^5.0.2",
@@ -32006,7 +27706,7 @@
         "fast-glob": "^3.3.0",
         "glob-parent": "^6.0.2",
         "is-glob": "^4.0.3",
-        "jiti": "^1.19.1",
+        "jiti": "^1.21.0",
         "lilconfig": "^2.1.0",
         "micromatch": "^4.0.5",
         "normalize-path": "^3.0.0",
@@ -32057,15 +27757,14 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "devOptional": true,
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/tar": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
-      "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
       "dev": true,
       "dependencies": {
         "chownr": "^2.0.0",
@@ -32136,18 +27835,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/tar/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/tar/node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -32176,12 +27863,12 @@
       }
     },
     "node_modules/temp-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
-      "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz",
+      "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=14.16"
       }
     },
     "node_modules/temp/node_modules/brace-expansion": {
@@ -32198,6 +27885,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -32230,6 +27918,7 @@
       "version": "2.6.3",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
       "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
       "dependencies": {
         "glob": "^7.1.3"
@@ -32239,41 +27928,39 @@
       }
     },
     "node_modules/tempy": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
-      "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz",
+      "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==",
       "dev": true,
       "dependencies": {
-        "del": "^6.0.0",
-        "is-stream": "^2.0.0",
-        "temp-dir": "^2.0.0",
-        "type-fest": "^0.16.0",
-        "unique-string": "^2.0.0"
+        "is-stream": "^3.0.0",
+        "temp-dir": "^3.0.0",
+        "type-fest": "^2.12.2",
+        "unique-string": "^3.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=14.16"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/tempy/node_modules/type-fest": {
-      "version": "0.16.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
-      "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+    "node_modules/tempy/node_modules/is-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/terser": {
-      "version": "5.26.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
-      "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
-      "devOptional": true,
+      "version": "5.31.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz",
+      "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==",
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
         "acorn": "^8.8.2",
@@ -32291,7 +27978,6 @@
       "version": "5.3.10",
       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
       "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
-      "devOptional": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.20",
         "jest-worker": "^27.4.5",
@@ -32325,7 +28011,6 @@
       "version": "27.5.1",
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-      "devOptional": true,
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -32335,11 +28020,27 @@
         "node": ">= 10.13.0"
       }
     },
+    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
     "node_modules/terser-webpack-plugin/node_modules/supports-color": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "devOptional": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -32354,7 +28055,6 @@
       "version": "8.11.3",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
       "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
-      "devOptional": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -32365,14 +28065,12 @@
     "node_modules/terser/node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "devOptional": true
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
     },
     "node_modules/terser/node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "devOptional": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -32381,7 +28079,6 @@
       "version": "0.5.21",
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "devOptional": true,
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
@@ -32415,6 +28112,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -32532,6 +28230,15 @@
       "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
       "dev": true
     },
+    "node_modules/tinyspy": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
+      "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
+      "dev": true,
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
     "node_modules/tmpl": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -32542,7 +28249,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -32559,9 +28265,9 @@
       }
     },
     "node_modules/tocbot": {
-      "version": "4.25.0",
-      "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz",
-      "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==",
+      "version": "4.28.2",
+      "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.28.2.tgz",
+      "integrity": "sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==",
       "dev": true
     },
     "node_modules/toidentifier": {
@@ -32574,9 +28280,9 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
-      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+      "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
       "dev": true,
       "dependencies": {
         "psl": "^1.1.33",
@@ -32619,21 +28325,21 @@
       }
     },
     "node_modules/trough": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
-      "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+      "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/wooorm"
       }
     },
     "node_modules/ts-api-utils": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
-      "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+      "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
       "dev": true,
       "engines": {
-        "node": ">=16.13.0"
+        "node": ">=16"
       },
       "peerDependencies": {
         "typescript": ">=4.2.0"
@@ -32752,101 +28458,96 @@
       "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
       "dev": true
     },
-    "node_modules/tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "^5.0.1"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/turbo": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.12.4.tgz",
-      "integrity": "sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.0.1.tgz",
+      "integrity": "sha512-sJhxfBaN14pYj//xxAG6zAyStkE2j4HI9JVXVMob35SGob6dz/HuSqV/4QlVqw0uKAkwc1lXIsnykbe8RLmOOw==",
+      "dev": true,
       "bin": {
         "turbo": "bin/turbo"
       },
       "optionalDependencies": {
-        "turbo-darwin-64": "1.12.4",
-        "turbo-darwin-arm64": "1.12.4",
-        "turbo-linux-64": "1.12.4",
-        "turbo-linux-arm64": "1.12.4",
-        "turbo-windows-64": "1.12.4",
-        "turbo-windows-arm64": "1.12.4"
+        "turbo-darwin-64": "2.0.1",
+        "turbo-darwin-arm64": "2.0.1",
+        "turbo-linux-64": "2.0.1",
+        "turbo-linux-arm64": "2.0.1",
+        "turbo-windows-64": "2.0.1",
+        "turbo-windows-arm64": "2.0.1"
       }
     },
     "node_modules/turbo-darwin-64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.12.4.tgz",
-      "integrity": "sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.0.1.tgz",
+      "integrity": "sha512-GO391pUmI6c6l/EpUIaXNzwbVDWRvYahm5oLB176dAWRYKYO+Osqs/XBdOM0G3l7ZFdR6nUtRJc8qinJp7qDUQ==",
       "cpu": [
         "x64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/turbo-darwin-arm64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.4.tgz",
-      "integrity": "sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.0.1.tgz",
+      "integrity": "sha512-rmjJoxeq7nmH/F2aWKapahrDE2zE2Uc15rvs4Rz6qHOzSqC8R5uyLpQyTKIPIZ95O/z9nKfLfVPyiRENuk5vpw==",
       "cpu": [
         "arm64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/turbo-linux-64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.12.4.tgz",
-      "integrity": "sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.0.1.tgz",
+      "integrity": "sha512-vwTOc4v4jm6tM+9WlsiDlN+zwHP8A2wlsAYiNqz2u0DZL55aCWaVdivh2VpVLN36Mr9HgREGH0Fw+jx6ObcNRg==",
       "cpu": [
         "x64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/turbo-linux-arm64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.12.4.tgz",
-      "integrity": "sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.0.1.tgz",
+      "integrity": "sha512-DkVt76fjwY940DfmqznWhpYIlKYduvKAoTtylkERrDlcWUpDYWwqNbcf9PRRIbnjnv9lIxvuom1KZmMY+cw/Ig==",
       "cpu": [
         "arm64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/turbo-windows-64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.12.4.tgz",
-      "integrity": "sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.0.1.tgz",
+      "integrity": "sha512-XskV34kYuXVIHbRbgH8jr35Y8uA6kJOQ0LJStU4jFk7piiyk0a4n2GNDymMtvIwAxYdbuTe+pKuPCThFdirHBQ==",
       "cpu": [
         "x64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/turbo-windows-arm64": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.12.4.tgz",
-      "integrity": "sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.0.1.tgz",
+      "integrity": "sha512-R2/RmKr2uQxkOCtXK5LNxdD3Iv7lUm56iy2FrDwTDgPI7X7K6WRjrxdirmFIu/fABYE5n6EampU3ejbG5mmGtg==",
       "cpu": [
         "arm64"
       ],
+      "dev": true,
       "optional": true,
       "os": [
         "win32"
@@ -32899,29 +28600,30 @@
       }
     },
     "node_modules/typed-array-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
-      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1",
-        "is-typed-array": "^1.1.10"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/typed-array-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
-      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
@@ -32931,16 +28633,17 @@
       }
     },
     "node_modules/typed-array-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
       "dev": true,
       "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
@@ -32950,14 +28653,20 @@
       }
     },
     "node_modules/typed-array-length": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
-      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "is-typed-array": "^1.1.9"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -32970,9 +28679,9 @@
       "dev": true
     },
     "node_modules/typescript": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
-      "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+      "version": "5.4.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+      "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -32982,9 +28691,9 @@
       }
     },
     "node_modules/ufo": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
-      "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==",
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
+      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
       "dev": true
     },
     "node_modules/uglify-js": {
@@ -33016,9 +28725,9 @@
       }
     },
     "node_modules/undici": {
-      "version": "5.28.3",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
-      "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
+      "version": "5.28.4",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
+      "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
       "dependencies": {
         "@fastify/busboy": "^2.0.0"
       },
@@ -33071,6 +28780,18 @@
         "node": ">=4"
       }
     },
+    "node_modules/unicorn-magic": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+      "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/unified": {
       "version": "11.0.4",
       "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz",
@@ -33090,9 +28811,9 @@
       }
     },
     "node_modules/unified-engine": {
-      "version": "11.2.0",
-      "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.0.tgz",
-      "integrity": "sha512-H9wEDpBSM0cpEUuuYAOIiPzLCVN0pjASZZ6FFNzgzYS/HHzl9tArk/ereOMGtcF8m8vgjzw+HrU3YN7oenT7Ww==",
+      "version": "11.2.1",
+      "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.1.tgz",
+      "integrity": "sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==",
       "dev": true,
       "dependencies": {
         "@types/concat-stream": "^2.0.0",
@@ -33100,9 +28821,9 @@
         "@types/is-empty": "^1.0.0",
         "@types/node": "^20.0.0",
         "@types/unist": "^3.0.0",
-        "@ungap/structured-clone": "^1.0.0",
         "concat-stream": "^2.0.0",
         "debug": "^4.0.0",
+        "extend": "^3.0.0",
         "glob": "^10.0.0",
         "ignore": "^5.0.0",
         "is-empty": "^1.0.0",
@@ -33122,21 +28843,6 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/unified-engine/node_modules/concat-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
-      "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
-      "dev": true,
-      "engines": [
-        "node >= 6.0"
-      ],
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^3.0.2",
-        "typedarray": "^0.0.6"
-      }
-    },
     "node_modules/unified-engine/node_modules/is-plain-obj": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -33150,9 +28856,9 @@
       }
     },
     "node_modules/unified-engine/node_modules/json-parse-even-better-errors": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
-      "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+      "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
       "dev": true,
       "engines": {
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -33186,240 +28892,60 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/unified-engine/node_modules/readable-stream": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-      "dev": true,
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/unified-engine/node_modules/type-fest": {
       "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
-      "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
-      "dev": true,
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/unified-engine/node_modules/yaml": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-      "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/unified-lint-rule": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-2.1.2.tgz",
-      "integrity": "sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "trough": "^2.0.0",
-        "unified": "^10.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-lint-rule/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/unified-lint-rule/node_modules/is-plain-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
-      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/unified-lint-rule/node_modules/unified": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
-      "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "bail": "^2.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^4.0.0",
-        "trough": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-lint-rule/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-lint-rule/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-lint-rule/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-message-control": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-4.0.0.tgz",
-      "integrity": "sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit": "^3.0.0",
-        "vfile": "^5.0.0",
-        "vfile-location": "^4.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-message-control/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/unified-message-control/node_modules/unist-util-is": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
-      "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-message-control/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/unified-message-control/node_modules/unist-util-visit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz",
-      "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
+      "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0",
-        "unist-util-visit-parents": "^4.0.0"
+      "engines": {
+        "node": ">=14.16"
       },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/unified-message-control/node_modules/unist-util-visit-parents": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz",
-      "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==",
+    "node_modules/unified-engine/node_modules/yaml": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
+      "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
       "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^5.0.0"
+      "bin": {
+        "yaml": "bin.mjs"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+      "engines": {
+        "node": ">= 14"
       }
     },
-    "node_modules/unified-message-control/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+    "node_modules/unified-lint-rule": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz",
+      "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
+        "@types/unist": "^3.0.0",
+        "trough": "^2.0.0",
+        "unified": "^11.0.0",
+        "vfile": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/unified-message-control/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+    "node_modules/unified-message-control": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-5.0.0.tgz",
+      "integrity": "sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/unist": "^3.0.0",
+        "devlop": "^1.0.0",
+        "space-separated-tokens": "^2.0.0",
+        "unist-util-is": "^6.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile": "^6.0.0",
+        "vfile-location": "^5.0.0",
+        "vfile-message": "^4.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -33438,25 +28964,18 @@
       }
     },
     "node_modules/unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+      "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
       "dev": true,
       "dependencies": {
-        "crypto-random-string": "^2.0.0"
+        "crypto-random-string": "^4.0.0"
       },
       "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/unist-util-generated": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz",
-      "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==",
-      "dev": true,
+        "node": ">=12"
+      },
       "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/unist-util-inspect": {
@@ -33578,6 +29097,28 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/unplugin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz",
+      "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==",
+      "dependencies": {
+        "acorn": "^8.8.1",
+        "chokidar": "^3.5.3",
+        "webpack-sources": "^3.2.3",
+        "webpack-virtual-modules": "^0.5.0"
+      }
+    },
+    "node_modules/unplugin/node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/untildify": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
@@ -33588,9 +29129,9 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+      "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -33606,8 +29147,8 @@
         }
       ],
       "dependencies": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -33620,7 +29161,6 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "devOptional": true,
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -33652,9 +29192,9 @@
       "dev": true
     },
     "node_modules/use-callback-ref": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz",
-      "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
+      "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
       "dependencies": {
         "tslib": "^2.0.0"
       },
@@ -33672,30 +29212,17 @@
       }
     },
     "node_modules/use-intl": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-3.4.3.tgz",
-      "integrity": "sha512-Cx+Q8QQtJMwzOfBZMuTUPQSVeBbVdjdAXvK5EfvhufsMyiDT7RT4dLgU/ewPVncyB9ctkRva715h2uCGzYBQ4A==",
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-3.14.1.tgz",
+      "integrity": "sha512-LVjHUSnQxryiWY+zCFkwoe+a8LK4RIM/4+lV54FSLehOH3gO1JcnXQ85TbfKUTfvEDY7B0DkH7WOM+CWppZanA==",
       "dependencies": {
         "@formatjs/ecma402-abstract": "^1.11.4",
-        "intl-messageformat": "^9.3.18"
+        "intl-messageformat": "^10.5.11"
       },
       "peerDependencies": {
         "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
       }
     },
-    "node_modules/use-resize-observer": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz",
-      "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==",
-      "dev": true,
-      "dependencies": {
-        "@juggle/resize-observer": "^3.3.1"
-      },
-      "peerDependencies": {
-        "react": "16.8.0 - 18",
-        "react-dom": "16.8.0 - 18"
-      }
-    },
     "node_modules/use-sidecar": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
@@ -33760,7 +29287,6 @@
       "version": "9.0.1",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
       "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
-      "dev": true,
       "funding": [
         "https://github.com/sponsors/broofa",
         "https://github.com/sponsors/ctavan"
@@ -33844,62 +29370,13 @@
       }
     },
     "node_modules/vfile-location": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz",
-      "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "vfile": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/vfile-location/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
-      "dev": true
-    },
-    "node_modules/vfile-location/node_modules/unist-util-stringify-position": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
-      "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/vfile-location/node_modules/vfile": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
-      "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
-      "dev": true,
-      "dependencies": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0",
-        "vfile-message": "^3.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified"
-      }
-    },
-    "node_modules/vfile-location/node_modules/vfile-message": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
-      "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz",
+      "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==",
       "dev": true,
       "dependencies": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^3.0.0"
+        "@types/unist": "^3.0.0",
+        "vfile": "^6.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -33920,9 +29397,12 @@
       }
     },
     "node_modules/vfile-matter/node_modules/yaml": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-      "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
+      "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+      "bin": {
+        "yaml": "bin.mjs"
+      },
       "engines": {
         "node": ">= 14"
       }
@@ -33941,9 +29421,9 @@
       }
     },
     "node_modules/vfile-reporter": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.0.tgz",
-      "integrity": "sha512-NfHyHdkCcy0BsXiLA3nId29TY7W7hgpc8nd8Soe3imATx5N4/+mkLYdMR+Y6Zvu6BXMMi0FZsD4FLCm1dN85Pg==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz",
+      "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==",
       "dev": true,
       "dependencies": {
         "@types/supports-color": "^8.0.0",
@@ -34057,15 +29537,15 @@
       "dev": true
     },
     "node_modules/vue": {
-      "version": "3.4.14",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.14.tgz",
-      "integrity": "sha512-Rop5Al/ZcBbBz+KjPZaZDgHDX0kUP4duEzDbm+1o91uxYUNmJrZSBuegsNIJvUGy+epLevNRNhLjm08VKTgGyw==",
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz",
+      "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==",
       "dependencies": {
-        "@vue/compiler-dom": "3.4.14",
-        "@vue/compiler-sfc": "3.4.14",
-        "@vue/runtime-dom": "3.4.14",
-        "@vue/server-renderer": "3.4.14",
-        "@vue/shared": "3.4.14"
+        "@vue/compiler-dom": "3.4.27",
+        "@vue/compiler-sfc": "3.4.27",
+        "@vue/runtime-dom": "3.4.27",
+        "@vue/server-renderer": "3.4.27",
+        "@vue/shared": "3.4.27"
       },
       "peerDependencies": {
         "typescript": "*"
@@ -34104,10 +29584,9 @@
       }
     },
     "node_modules/watchpack": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
-      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
-      "devOptional": true,
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz",
+      "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==",
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
         "graceful-fs": "^4.1.2"
@@ -34125,6 +29604,14 @@
         "defaults": "^1.0.3"
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -34135,34 +29622,33 @@
       }
     },
     "node_modules/webpack": {
-      "version": "5.89.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
-      "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
-      "devOptional": true,
+      "version": "5.91.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz",
+      "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==",
       "dependencies": {
         "@types/eslint-scope": "^3.7.3",
-        "@types/estree": "^1.0.0",
-        "@webassemblyjs/ast": "^1.11.5",
-        "@webassemblyjs/wasm-edit": "^1.11.5",
-        "@webassemblyjs/wasm-parser": "^1.11.5",
+        "@types/estree": "^1.0.5",
+        "@webassemblyjs/ast": "^1.12.1",
+        "@webassemblyjs/wasm-edit": "^1.12.1",
+        "@webassemblyjs/wasm-parser": "^1.12.1",
         "acorn": "^8.7.1",
         "acorn-import-assertions": "^1.9.0",
-        "browserslist": "^4.14.5",
+        "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.15.0",
+        "enhanced-resolve": "^5.16.0",
         "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
         "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.9",
+        "graceful-fs": "^4.2.11",
         "json-parse-even-better-errors": "^2.3.1",
         "loader-runner": "^4.2.0",
         "mime-types": "^2.1.27",
         "neo-async": "^2.6.2",
         "schema-utils": "^3.2.0",
         "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.3.7",
-        "watchpack": "^2.4.0",
+        "terser-webpack-plugin": "^5.3.10",
+        "watchpack": "^2.4.1",
         "webpack-sources": "^3.2.3"
       },
       "bin": {
@@ -34182,9 +29668,9 @@
       }
     },
     "node_modules/webpack-dev-middleware": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz",
-      "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==",
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz",
+      "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==",
       "dev": true,
       "dependencies": {
         "colorette": "^2.0.10",
@@ -34209,59 +29695,6 @@
         }
       }
     },
-    "node_modules/webpack-dev-middleware/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
-      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3"
-      },
-      "peerDependencies": {
-        "ajv": "^8.8.2"
-      }
-    },
-    "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
-    },
-    "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
-      "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.9",
-        "ajv": "^8.9.0",
-        "ajv-formats": "^2.1.1",
-        "ajv-keywords": "^5.1.0"
-      },
-      "engines": {
-        "node": ">= 12.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
     "node_modules/webpack-hot-middleware": {
       "version": "2.26.1",
       "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz",
@@ -34284,14 +29717,12 @@
     "node_modules/webpack-virtual-modules": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
-      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
-      "dev": true
+      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw=="
     },
     "node_modules/webpack/node_modules/acorn": {
       "version": "8.11.3",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
       "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
-      "devOptional": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -34303,7 +29734,6 @@
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
       "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
-      "devOptional": true,
       "peerDependencies": {
         "acorn": "^8"
       }
@@ -34312,7 +29742,6 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "devOptional": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
@@ -34325,11 +29754,27 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "devOptional": true,
       "engines": {
         "node": ">=4.0"
       }
     },
+    "node_modules/webpack/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
     "node_modules/whatwg-encoding": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
@@ -34433,31 +29878,34 @@
       }
     },
     "node_modules/which-collection": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
-      "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
       "dev": true,
       "dependencies": {
-        "is-map": "^2.0.1",
-        "is-set": "^2.0.1",
-        "is-weakmap": "^2.0.1",
-        "is-weakset": "^2.0.1"
+        "is-map": "^2.0.3",
+        "is-set": "^2.0.3",
+        "is-weakmap": "^2.0.2",
+        "is-weakset": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/which-typed-array": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
-      "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
       "dev": true,
       "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.4",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0"
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -34466,6 +29914,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/wordwrap": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -34601,16 +30058,10 @@
         "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "node_modules/write-file-atomic/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
     "node_modules/ws": {
-      "version": "8.16.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
-      "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+      "version": "8.17.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz",
+      "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
       "dev": true,
       "engines": {
         "node": ">=10.0.0"
@@ -34664,7 +30115,6 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
       "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true,
       "engines": {
         "node": ">=0.4"
       }
@@ -34681,8 +30131,7 @@
     "node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     },
     "node_modules/yaml": {
       "version": "1.10.2",
@@ -34749,21 +30198,10 @@
         "node": ">=8"
       }
     },
-    "node_modules/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-      "dev": true,
-      "dependencies": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    },
     "node_modules/yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true,
       "engines": {
         "node": ">=10"
       },
diff --git a/package.json b/package.json
index 049b0fe2c637b..f29f78f53ebd4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,7 @@
 {
   "type": "module",
   "private": true,
+  "name": "@nodejs/website",
   "description": "Nodejs.org Website",
   "homepage": "https://nodejs.org",
   "repository": {
@@ -14,17 +15,19 @@
   "engines": {
     "node": "v20"
   },
+  "packageManager": "npm@10.7.0",
   "scripts": {
     "scripts:release-post": "cross-env NODE_NO_WARNINGS=1 node scripts/release-post/index.mjs",
-    "serve": "cross-env NODE_NO_WARNINGS=1 next dev --turbo",
+    "dev": "cross-env NODE_NO_WARNINGS=1 next dev",
+    "serve": "npm run dev",
     "build": "cross-env NODE_NO_WARNINGS=1 next build",
     "start": "cross-env NODE_NO_WARNINGS=1 next start",
     "deploy": "cross-env NEXT_PUBLIC_STATIC_EXPORT=true npm run build",
     "lint:js": "eslint \"**/*.{js,mjs,ts,tsx}\" --cache --cache-strategy=content --cache-location=.eslintjscache",
     "lint:md": "eslint \"**/*.md?(x)\" --cache --cache-strategy=content --cache-location=.eslintmdcache",
     "lint:css": "stylelint \"**/*.css\" --allow-empty-input --cache --cache-strategy=content --cache-location=.stylelintcache",
-    "lint": "npm run lint:js && npm run lint:md && npm run lint:css",
-    "lint:fix": "npm run lint:js -- --fix && npm run lint:md -- --fix && npm run lint:css -- --fix",
+    "lint": "turbo run lint:md lint:js lint:css",
+    "lint:fix": "turbo run lint:md lint:js lint:css --no-cache -- --fix",
     "prettier": "prettier \"**/*.{js,mjs,ts,tsx,md,mdx,json,yml,css}\" --check --cache --cache-strategy=content --cache-location=.prettiercache",
     "prettier:fix": "npm run prettier -- --write",
     "format": "npm run lint:fix && npm run prettier:fix",
@@ -33,80 +36,81 @@
     "storybook:build": "cross-env NODE_NO_WARNINGS=1 storybook build --quiet --webpack-stats-json",
     "test:unit": "cross-env NODE_NO_WARNINGS=1 jest",
     "test:unit:watch": "npm run test:unit -- --watch",
-    "test": "npm run test:unit",
-    "prepare": "husky install"
+    "test": "turbo test:unit",
+    "prepare": "husky"
   },
   "dependencies": {
     "@heroicons/react": "~2.1.1",
     "@mdx-js/mdx": "^3.0.1",
     "@nodevu/core": "~0.1.0",
-    "@orama/highlight": "^0.1.3",
-    "@oramacloud/client": "^1.0.9",
+    "@orama/highlight": "^0.1.5",
+    "@oramacloud/client": "^1.0.13",
     "@radix-ui/react-accessible-icon": "^1.0.3",
     "@radix-ui/react-avatar": "^1.0.4",
     "@radix-ui/react-dialog": "^1.0.5",
     "@radix-ui/react-dropdown-menu": "^2.0.6",
     "@radix-ui/react-label": "^2.0.2",
+    "@radix-ui/react-scroll-area": "^1.0.5",
     "@radix-ui/react-select": "^2.0.0",
+    "@radix-ui/react-slot": "^1.0.2",
     "@radix-ui/react-tabs": "^1.0.4",
     "@radix-ui/react-toast": "^1.1.5",
     "@savvywombat/tailwindcss-grid-areas": "~4.0.0",
-    "@sentry/nextjs": "~7.93.0",
+    "@sentry/nextjs": "~8.7.0",
     "@tailwindcss/container-queries": "~0.1.1",
-    "@types/node": "20.11.24",
+    "@types/node": "20.14.0",
     "@vcarl/remark-headings": "~0.1.0",
-    "@vercel/analytics": "~1.2.2",
+    "@vercel/analytics": "~1.3.1",
     "@vercel/speed-insights": "~1.0.10",
     "autoprefixer": "~10.4.18",
     "classnames": "~2.5.1",
     "cross-env": "7.0.3",
-    "dedent": "1.5.1",
+    "dedent": "1.5.3",
     "feed": "~4.2.2",
     "github-slugger": "~2.0.0",
-    "glob": "~10.3.10",
+    "glob": "~10.4.1",
     "gray-matter": "~4.0.3",
-    "husky": "8.0.3",
-    "lint-staged": "15.2.0",
-    "next": "~14.1.1",
-    "next-intl": "~3.4.0",
-    "next-themes": "~0.2.1",
-    "postcss": "~8.4.35",
-    "postcss-calc": "~9.0.1",
-    "postcss-import": "~16.0.0",
-    "postcss-mixins": "~9.0.4",
+    "husky": "9.0.11",
+    "lint-staged": "15.2.5",
+    "next": "~14.2.3",
+    "next-intl": "~3.14.1",
+    "next-themes": "~0.3.0",
+    "postcss": "~8.4.38",
+    "postcss-calc": "~10.0.0",
+    "postcss-import": "~16.1.0",
+    "postcss-mixins": "~10.0.1",
     "postcss-simple-vars": "~7.0.1",
-    "react": "^18.2.0",
-    "react-dom": "^18.2.0",
+    "react": "^18.3.1",
+    "react-dom": "^18.3.1",
     "rehype-autolink-headings": "~7.1.0",
     "rehype-slug": "~6.0.0",
     "remark-gfm": "~4.0.0",
     "remark-reading-time": "~2.0.1",
-    "semver": "~7.5.4",
-    "shiki": "~1.1.2",
-    "tailwindcss": "^3.4.0",
-    "turbo": "1.12.4",
-    "typescript": "~5.3.2",
+    "semver": "~7.6.0",
+    "shiki": "~1.6.2",
+    "tailwindcss": "^3.4.3",
+    "typescript": "~5.4.2",
     "unist-util-visit": "~5.0.0",
     "vfile": "~6.0.1",
     "vfile-matter": "~5.0.0"
   },
   "devDependencies": {
-    "@storybook/addon-controls": "~7.6.17",
-    "@storybook/addon-interactions": "~7.6.17",
-    "@storybook/addon-themes": "~7.6.17",
-    "@storybook/addon-viewport": "~7.6.17",
-    "@storybook/nextjs": "~7.6.17",
-    "@testing-library/jest-dom": "~6.4.2",
-    "@testing-library/react": "~14.2.1",
+    "@storybook/addon-controls": "~8.1.5",
+    "@storybook/addon-interactions": "~8.1.5",
+    "@storybook/addon-themes": "~8.1.5",
+    "@storybook/addon-viewport": "~8.1.5",
+    "@storybook/nextjs": "~8.1.5",
+    "@testing-library/jest-dom": "~6.4.5",
+    "@testing-library/react": "~15.0.7",
     "@testing-library/user-event": "~14.5.2",
     "@types/jest": "29.5.12",
-    "@types/react": "^18.2.61",
-    "@types/react-dom": "^18.2.19",
-    "@types/semver": "~7.5.5",
-    "@typescript-eslint/eslint-plugin": "7.1.0",
-    "@typescript-eslint/parser": "7.1.0",
+    "@types/react": "^18.3.1",
+    "@types/react-dom": "^18.3.0",
+    "@types/semver": "~7.5.8",
+    "@typescript-eslint/eslint-plugin": "7.11.0",
+    "@typescript-eslint/parser": "7.11.0",
     "eslint": "8.57.0",
-    "eslint-config-next": "~14.1.1",
+    "eslint-config-next": "~14.2.3",
     "eslint-config-prettier": "9.1.0",
     "eslint-plugin-mdx": "3.1.5",
     "eslint-plugin-no-relative-import-paths": "^1.5.3",
@@ -115,15 +119,16 @@
     "jest": "29.7.0",
     "jest-environment-jsdom": "29.7.0",
     "jest-junit": "16.0.0",
-    "prettier": "3.2.5",
-    "prettier-plugin-tailwindcss": "0.5.11",
+    "prettier": "3.3.0",
+    "prettier-plugin-tailwindcss": "0.6.1",
     "remark-frontmatter": "5.0.0",
-    "remark-preset-lint-node": "5.0.0",
-    "storybook": "~7.6.17",
-    "stylelint": "16.2.1",
+    "remark-preset-lint-node": "5.0.2",
+    "storybook": "~8.1.5",
+    "stylelint": "16.6.1",
     "stylelint-config-standard": "36.0.0",
     "stylelint-order": "6.0.4",
     "stylelint-selector-bem-pattern": "4.0.0",
+    "turbo": "2.0.1",
     "user-agent-data-types": "0.4.2"
   }
 }
diff --git a/pages/ar/about/get-involved/collab-summit.md b/pages/ar/about/get-involved/collab-summit.md
deleted file mode 100644
index d8b152d0a2723..0000000000000
--- a/pages/ar/about/get-involved/collab-summit.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: Collab Summit
-layout: about
----
-
-# Collaborator Summit
-
-Node.js's Collaborator Summit is an un-conference for bringing current and
-potential contributors together to discuss Node.js with lively collaboration,
-education, and knowledge sharing. Committees and working groups come together
-twice per year to make important decisions while also being able to work on some
-exciting efforts they want to push forward in-person.
-
-## Who attends?
-
-Anyone is welcome to attend Collab Summit. During the
-summit, leaders will help onboard new contributors to groups they'd love to help
-prior to integrating them into the working sessions.
-
-This is your opportunity to learn what is happening within the community to jump
-in and contribute with the skills you have and would like to hone.
-
-Working groups will put together a schedule so that people can
-familiarize themselves before folks get onsite, having the general collaborator
-discussions, and then dive into breakout sessions.
-
-We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit)
-for upcoming and past Collab Summits and have a look at the
-[issues filed](https://github.com/nodejs/summit/issues) that share what
-individual working groups and committees are looking to discuss in-person.
diff --git a/pages/ar/about/get-involved/contribute.md b/pages/ar/about/get-involved/contribute.md
deleted file mode 100644
index 6392c5fe32cb5..0000000000000
--- a/pages/ar/about/get-involved/contribute.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-title: Contributing
-layout: about
----
-
-# Contributing
-
-Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that.
-
-## Asking for General Help
-
-Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues).
-
-## Reporting an Issue
-
-If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself.
-
-When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information:
-
-- Version of Node.js
-- Platform you're running on (macOS, SmartOS, Linux, Windows)
-- Architecture you're running on (32bit or 64bit and x86 or ARM)
-
-The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction.
-
-- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node)
-- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues)
-
-## Code contributions
-
-If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well.
-
-If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution.
-
-## Becoming a collaborator
-
-By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of:
-
-- code commits and pull requests
-- documentation commits and pull requests
-- comments on issues and pull requests
-- contributions to the Node.js website
-- assistance provided to end users and novice contributors
-- participation in working groups
-- other participation in the wider Node.js community
-
-If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly.
diff --git a/pages/ar/about/get-involved/events.mdx b/pages/ar/about/get-involved/events.mdx
deleted file mode 100644
index 2fb8672daed2d..0000000000000
--- a/pages/ar/about/get-involved/events.mdx
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: Upcoming Events
-layout: about
----
-
-## Upcoming Events
-
-Node.js events are open and available to the public. Anyone is welcome to join and participate.
-
-### Upcoming Node.js® Meetings
-
-The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project.
-
-The following meetings are upcoming in the next 7 days.
-
-
diff --git a/pages/ar/about/get-involved/index.md b/pages/ar/about/get-involved/index.md
deleted file mode 100644
index 858bfc61901b2..0000000000000
--- a/pages/ar/about/get-involved/index.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: Get involved
-layout: about
----
-
-# Get Involved
-
-## Community Discussion
-
-- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features.
-- For real-time chat about Node.js development use one of the platforms below
-  - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/)
-  - For Slack, there are two options:
-    - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project).
-    - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community.
-- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs).
-- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings.
-
-## Learning
-
-- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website.
-- [Official API reference documentation](https://nodejs.org/api/).
-- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games.
-- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day.
-- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part.
-- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord.
diff --git a/pages/ar/about/governance.md b/pages/ar/about/governance.md
deleted file mode 100644
index af512bbe769d3..0000000000000
--- a/pages/ar/about/governance.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-title: Project Governance
-layout: about
----
-
-# Project Governance
-
-## Consensus Seeking Process
-
-The Node.js project follows a [Consensus Seeking][] decision making model.
-
-## Collaborators
-
-The [nodejs/node][] core GitHub repository is maintained by the Collaborators
-who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis.
-
-Individuals making significant and valuable contributions are made Collaborators
-and given commit-access to the project. These individuals are identified by the
-TSC and their nomination is discussed with the existing Collaborators.
-
-For the current list of Collaborators, see the project's [README.md][].
-
-A guide for Collaborators is maintained at [collaborator-guide.md][].
-
-## Technical Steering Committee
-
-The project is governed by the [Technical Steering Committee (TSC)][]
-which is responsible for high-level guidance of the project.
-
-[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making
-[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members
-[tsc]: https://github.com/nodejs/TSC
-[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md
-[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md
-[nodejs/node]: https://github.com/nodejs/node
diff --git a/pages/ar/about/index.mdx b/pages/ar/about/index.mdx
deleted file mode 100644
index 13459154c71d4..0000000000000
--- a/pages/ar/about/index.mdx
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: About Node.js®
-layout: about
----
-
-
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/ar/about/previous-releases.mdx b/pages/ar/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/ar/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/ar/about/security-reporting.mdx b/pages/ar/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/ar/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/ar/download/current.mdx b/pages/ar/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ar/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ar/download/index.mdx b/pages/ar/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ar/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ar/download/package-manager/all.md b/pages/ar/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/ar/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/ar/download/package-manager/current.mdx b/pages/ar/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/ar/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ar/download/package-manager/index.mdx b/pages/ar/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/ar/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ar/download/prebuilt-binaries/current.mdx b/pages/ar/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ar/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ar/download/prebuilt-binaries/index.mdx b/pages/ar/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ar/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ar/download/source-code/current.mdx b/pages/ar/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ar/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ar/download/source-code/index.mdx b/pages/ar/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ar/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ar/index.mdx b/pages/ar/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/ar/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/de/about/get-involved/collab-summit.md b/pages/de/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/de/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/de/about/get-involved/contribute.md b/pages/de/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/de/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/de/about/get-involved/events.mdx b/pages/de/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/de/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/de/about/get-involved/index.md b/pages/de/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/de/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/de/about/governance.md b/pages/de/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/de/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/de/about/index.mdx b/pages/de/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/de/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/de/about/previous-releases.mdx b/pages/de/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/de/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/de/about/security-reporting.mdx b/pages/de/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/de/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/de/download/current.mdx b/pages/de/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/de/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/de/download/index.mdx b/pages/de/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/de/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/de/download/package-manager/all.md b/pages/de/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/de/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/de/download/package-manager/current.mdx b/pages/de/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/de/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/de/download/package-manager/index.mdx b/pages/de/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/de/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/de/download/prebuilt-binaries/current.mdx b/pages/de/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/de/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/de/download/prebuilt-binaries/index.mdx b/pages/de/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/de/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/de/download/source-code/current.mdx b/pages/de/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/de/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/de/download/source-code/index.mdx b/pages/de/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/de/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/de/index.mdx b/pages/de/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/de/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/de/search.mdx b/pages/de/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/de/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/en/about/branding.mdx b/pages/en/about/branding.mdx new file mode 100644 index 0000000000000..156cb1c0da48d --- /dev/null +++ b/pages/en/about/branding.mdx @@ -0,0 +1,110 @@ +--- +title: Branding of Node.js +layout: about +--- + +# Branding of Node.js + +Please review the [trademark policy](https://trademark-policy.openjsf.org/) for information about permissible use of Node.js® logos and marks. + +## Node.js® Mascot + +Node.js mascot + +## Node.js® Logo + +### Node.js® Horizontal Logo + + + + + + +
+ Node.js Dark Horizontal Logo + + Node.js Light Horizontal Logo +
+ +### Node.js® Stacked Logo + + + + + + + + + + +
+ Node.js Dark Stacked Logo + + Node.js Light Stacked Logo +
+ Node.js Black Stacked Logo + + Node.js White Stacked Logo +
+ +### JS Icons + + + + + + +
+ JS Icons Green + + White JS Icons +
diff --git a/pages/en/about/get-involved/collab-summit.md b/pages/en/about/get-involved/collab-summit.md index d8b152d0a2723..245937c16c695 100644 --- a/pages/en/about/get-involved/collab-summit.md +++ b/pages/en/about/get-involved/collab-summit.md @@ -1,30 +1,33 @@ --- -title: Collab Summit +title: Collaboration Summit layout: about --- -# Collaborator Summit +# Collaboration Summit -Node.js's Collaborator Summit is an un-conference for bringing current and +Node.js's Collaboration Summit is an un-conference for bringing current and potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. +education, and knowledge sharing. Teams, working groups and contributors +from the community come together twice per year to have discussions that +help decision-making while also working on some exciting efforts they +want to push forward in-person. ## Who attends? -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. +The Collaboration Summit is primarily attended by existing contributors and +community members, but it also welcomes those who are not yet a contributor +and want to get onboard. If you are new to contributing to Node.js, the +Collaboration Summit can be a good opportunity to help you learn what is +happening within the community and contribute with the skills you have +and would like to hone. -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. +Prior to the summit, contributors and community members send session proposals to +create a schedule. Attendees can familiarize themselves with the session before +getting onsite, having the general collaborator discussions, and then diving +into sessions. There will also be plenty of opportunities for hallway tracks +and brainstorms. -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the +For information about upcoming and past Collaboration Summits, check out the +[Summit repo](https://github.com/openjs-foundation/summit). Have a look at the [issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. +contributors and community members are proposing to discuss in-person. diff --git a/pages/en/about/governance.md b/pages/en/about/governance.md index af512bbe769d3..72321ba48bd40 100644 --- a/pages/en/about/governance.md +++ b/pages/en/about/governance.md @@ -12,11 +12,11 @@ The Node.js project follows a [Consensus Seeking][] decision making model. ## Collaborators The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. +who are nominated by other existing Collaborators on an ongoing basis. Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. +and given commit-access to the project. These individuals are identified by other +Collaborators and their nomination is discussed with the existing Collaborators. For the current list of Collaborators, see the project's [README.md][]. @@ -25,7 +25,9 @@ A guide for Collaborators is maintained at [collaborator-guide.md][]. ## Technical Steering Committee The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. +which is responsible for high-level guidance of the project. TSC is a +subset of active Collaborators who are nominated by other existing TSC +members. [consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members diff --git a/pages/en/about/index.mdx b/pages/en/about/index.mdx index 0c0760bfa4337..f35bfc6a68919 100644 --- a/pages/en/about/index.mdx +++ b/pages/en/about/index.mdx @@ -3,16 +3,6 @@ title: About Node.js® layout: about --- -
- Node.js mascot -
- ---- - # About Node.js® As an asynchronous event-driven JavaScript runtime, Node.js is designed to build @@ -20,13 +10,30 @@ scalable network applications. In the following "hello world" example, many connections can be handled concurrently. Upon each connection, the callback is fired, but if there is no work to be done, Node.js will sleep. -```js -const http = require('node:http'); +```cjs +const { createServer } = require('node:http'); + +const hostname = '127.0.0.1'; +const port = 3000; + +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +```mjs +import { createServer } from 'node:http'; const hostname = '127.0.0.1'; const port = 3000; -const server = http.createServer((req, res) => { +const server = createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); @@ -75,4 +82,4 @@ over your cores. [`child_process.fork()`]: https://nodejs.org/api/child_process.html [`cluster`]: https://nodejs.org/api/cluster.html [event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ +[twisted]: https://twisted.org/ diff --git a/pages/en/about/previous-releases.mdx b/pages/en/about/previous-releases.mdx index 3b292e56350c5..3e0014c64dc3d 100644 --- a/pages/en/about/previous-releases.mdx +++ b/pages/en/about/previous-releases.mdx @@ -1,21 +1,21 @@ --- -title: Previous Releases +title: Node.js Releases layout: about --- -# Previous Releases +# Node.js Releases Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. _LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. -### Release Schedule +## Release Schedule ![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). -### Looking for latest release of a version branch? +## Looking for latest release of a version branch? diff --git a/pages/en/blog/announcements/diving-into-the-nodejs-website-redesign.md b/pages/en/blog/announcements/diving-into-the-nodejs-website-redesign.md new file mode 100644 index 0000000000000..a3c1b87d8c1ab --- /dev/null +++ b/pages/en/blog/announcements/diving-into-the-nodejs-website-redesign.md @@ -0,0 +1,119 @@ +--- +date: '2024-03-24T12:30:09.000Z' +category: announcements +title: Diving into the Node.js Website Redesign +layout: blog-post +author: Brian Muenzenmeyer +--- + +By now you've noticed nodejs.org's fresh new look! + +We've taken great care in approaching this design with a nod to the past and look to the future. The site has many converging use cases, thousands of pages, and is a daily resource to many. The whole story had some dead ends and detours. But in the end it was a collective effort; coming to life with the contributions of over three dozen contributors and fantastic teamwork with select partners. The site improves the information architecture, brings content to users' fingertips like never before, and puts in place a stable development platform for years to come. We've also iterated on a revamped developer experience, clearer CI/CD feedback, and an approachable tech stack. + +Read on for a deeper dive into the journey and insights into what's to come. + +![A screenshot of the nodejs.org website from 2024.](/static/images/blog/announcements/2024-nodejs-screenshot.png) + +## Scale and Constraints + +The nodejs.org site has been around for over 14 years. A design resembling the utilitarian download and docs homepage first appeared in late 2011. This was Node.js _0.6_ days, for context. + +![A screenshot of the nodejs.org website from late 2011.](/static/images/blog/announcements/2011-nodejs-screenshot.png) + +Ever since, the site has slowly grown in scale, as the project has needed it to. It contains 1600+ pages. At its peak it had almost 20 localized languages. The domain serves _3 billion_ requests a month, with _2 petabytes_ of data transferred. It would be an understatement to say that the site is a critical resource for the Node.js community. It was absolutely paramount to ensure changes didn't cause unnecessary disruption, both to users and contributors. + +## A False Start: nodejs.dev + +The project's first attempt at a redesign began in 2019. The work started on a new domain and a new repo, [nodejs.dev](https://github.com/nodejs/nodejs.dev). In retrospect, this might have unintentionally doomed the project from the start. The team faced challenges of siloed development. Put simply, this codebase was not where the community or contributors were. Established contributor workflows were not present. Already busy people volunteering their time don't want to learn a second set of tools. It was too heavy a burden. The project was not able to sustain the kind of leadership it needed to maintain momentum. Additionally, a singular cutover for the new tech stack would have been complicated and pose a risk to the established presence of the site. + +Out of nodejs.dev, however, came a lot of lessons and renewed content. A series of [comprehensive learning resources](https://nodejs.org/en/learn/getting-started/introduction-to-nodejs) was created that we carried forward into our current design. A vision from all this was forming: incremental evolution, in-place development, and as little disruption as possible. + +## Reassembling the Airplane in Flight + +In 2022, Claudio Wunder joined the project. He bridged the gap between both development efforts. He steered the web team toward a new direction: pivot back to the existing repository. Consider how the site could be rebuilt _while_ still functioning as a production-grade resource. + +The codebase was starting to show its age across a number of dimensions. The design was stale. The Metalsmith and Handlebars templates had fallen out of favor for most web developers approaching the project. The internals of the site were hard to extend and poorly documented. Trying to blend code and content was a challenge. + +The team carefully considered the tech stack. The first stage of the in-flight redesign dwelt on [nextra](https://nextra.site/), an excellent Next.js static site generator. This was a great way to get started, but as the site grew, we needed a custom setup. We found ourselves "breaking out" of nextra's conventions more and more, relying on the underlying Next.js patterns and power tools that nextra abstracts away. + +[Next.js](https://nextjs.org/) was a natural progression, notable for its flexibility and power. For instance, the site is still statically built for end-user speed and foundational hosting independence but leverages Next.js's incremental static regeneration to pick up dynamic content like releases. React offered an authoring experience not only more aligned with the current skillsets of contributors, but also with a larger ecosystem of tools at our disposal. + +We had a close partnership with [Vercel](https://vercel.com/) along this journey. They provided direct support when the scale of the site strained webpack's memory management during static export. This was a symbiotic relationship of sorts. Our needs pushed their platform to improve, and their platform enabled us to build a better site. We beta-tested new releases before public availability, a real-world stress test for the framework. + +In April 2023, we performed a miniature cutover. This is a bit of an ironic statement. The [pull request](https://github.com/nodejs/nodejs.org/pull/4991) was 1600 files and pushed the GitHub UI to the limits of its rendering capabilities. The site's infrastructure would change, but the look and feel, content, and authoring experience would remain unchanged. This was a critical milestone—proof we could rebuild the airplane in flight. + +## Redesign + +The [OpenJS Foundation](https://openjsf.org/) was kind enough to help fund our redesign with designer [Hayden Bleasel](https://haydenbleasel.com/). Hayden brought a modern design to the site and helped us think through the multi-faceted use cases we encountered. The result was a [Figma](https://www.figma.com/) document that we could use to guide our development. Included were UX flows, dark/light modes, page layouts, mobile viewport considerations, and a component breakdown. + +![A screenshot of the nodejs.org website redesign in Figma.](/static/images/blog/announcements/2024-nodejs-figma.png) + +Realizing the design as code was next, and an effort distributed across the world. A lot of emphasis was placed on sequential build-up of foundational design elements and structured component hierarchies. We built variants of components from day one and considered internationalization at the outset. This reduced rework and made any task accessible to a newcomer. We started building components in isolation via [Storybook](https://storybook.js.org/) and [Chromatic](https://www.chromatic.com/)'s hosted instance. Storybook was a great place to prototype, iterate on, and test components. We choose to use [Tailwind CSS](https://tailwindcss.com/), but with an emphasis on design tokens and applied CSS. This common language helped newcomers orient to our approach and translate the Figma. + +[Orama](https://docs.oramasearch.com/) search puts all the site's content at a user's fingertips. They index our static content and provide lightning-fast results of API content, learning material, blog posts, and more. The team there directly contributed this integration and continues to help us deliver a superb experience. It's already hard to imagine _not_ having this feature. + +The reach that Node.js enjoys in our communities is important to us. As such, the old site was internationalized to almost 20 languages. An unfortunate combination of events led us to reset all translations, however. This was a hard decision, but the right one given the circumstances. We're working with [Crowdin](https://crowdin.com/) to re-establish our efforts. This will include a careful parsing of the new MDX-based content. We're looking forward to the continual internalization in the coming months. + +As we built and started previewing the site both on the new infrastructure and redesigned, having deeper insight into end-user behavior was invaluable. We've leveraged [Sentry](https://sentry.io/welcome/) to provide error reporting, monitoring, and diagnostic tools. This has been a great help in identifying issues and providing a better experience for our users. Sentry was also useful prior to the redesign work to identify issues in the old site via replayed user sessions. + +Throughout all of these integrations and development steps, we've focused on end-user accessibility and performance. Vercel and [Cloudflare](https://cloudflare.com) support ensures the site is fast and reliable. We've also invested in our CI/CD pipeline with GitHub Actions, providing contributors with real-time feedback. This includes visual regression testing with Chromatic, Lighthouse results, and a suite of linters and tests to ensure the site quality remains high. + +![A screenshot of the nodejs.org lighthouse scores. Run on a Windows Chrome browser in desktop mode. Performance: 100, Accessibility: 91, Best Practices: 100, SEO: 100](/static/images/blog/announcements/2024-nodejs-redesign-lighthouse.jpg) + +### Grace Hopper and Hacktoberfest + +Throughout the site redesign, we've worked actively to make for an inclusive and welcoming experience. The redesign effort aligned well with both [Grace Hopper Celebration's Open Source Day](https://ghc.anitab.org/awards-programs/open-source-day/) in September of 2023, and then [Hacktoberfest](https://hacktoberfest.com/) the following month. Both events expose new contributors to projects across the ecosystem. We prepared for these events by staging "good first issues" as discrete development tasks. In the case of Grace Hopper, we also provided in-the-field mentorship so attendees could end the day with a landed PR. We're proud to say that we had a number of first-time contributors to the project as a result. + +During Grace Hopper alone, 40 PRs opened from 28 authors. Hacktoberfest saw 26 more PRs. + +![A screenshot of the nodejs.org activity during Grace Hopper.](/static/images/blog/announcements/2024-grace-hopper-activity.png) + +### Documentation, documentation, documentation + +An open source project is only as good as its documentation. Allowing new contributors to asynchronously establish context is essential. To that end, we don't limit DX (developer experience) to tooling. The redesign served as an excellent opportunity to identify and improve gaps in our docs. Along the way, we iterated on or introduced: + +- [COLLABORATOR_GUIDE](https://github.com/nodejs/nodejs.org/blob/main/COLLABORATOR_GUIDE.md) +- [CONTENT_VS_CODE](https://github.com/nodejs/nodejs.org/blob/main/CONTENT_VS_CODE.md) +- [CONTRIBUTING](https://github.com/nodejs/nodejs.org/blob/main/CONTRIBUTING.md) +- [DEPENDENCY_PINNING](https://github.com/nodejs/nodejs.org/blob/main/DEPENDENCY_PINNING.md) +- [GOVERNANCE](https://github.com/nodejs/nodejs.org/blob/main/GOVERNANCE.md) +- [README](https://github.com/nodejs/nodejs.org/blob/main/README.md) +- [TRANSLATION](https://github.com/nodejs/nodejs.org/blob/main/TRANSLATION.md) + +New code has a strong focus on inline code and configuration comments, separation of concerns, and clearly defined constants. The use of TypeScript throughout helps contributors understand the shape of data and the expected behavior of functions. + +## Future Plans + +The redesign sets the stage for a new era of the Node.js website. We have a solid foundation in place that will last for years to come. If the past is any indicator, we'll be iterating within this space for a long time. + +But the work isn't done yet. We'll: + +- extend the site redesign to the API docs. They are in a separate codebase but plan to port the styles developed here to the API. This is careful work again that cannot disrupt daily use or contribution. +- explore a monorepo for the website and API docs. This should improve coupling where it matters and reduce the overhead of managing two separate codebases. +- reset internationalization efforts. The prior translations could not be carried over. Our heavy markdown / MDX approach poses a unique challenge we are partnering with Crowdin to solve. +- continue to improve the CI/CD processes. We've made great strides in providing self-service feedback to contributors, but there's more to do. + +## Thanks + +Many people and organizations have contributed in both big and small ways to realize the redesign. We'd like to thank: + +- first and foremost, all [contributors and collaborators](https://github.com/nodejs/nodejs.org/graphs/contributors) that make this project possible. +- [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions. +- [Cloudflare](https://cloudflare.com) for providing the infrastructure that serves Node.js's Website, Node.js's CDN, and more. +- [Crowdin](https://crowdin.com/) for providing a platform that allows us to localize the Node.js Website and collaborate with translators. +- [Hayden Bleasel](https://haydenbleasel.com/) for his design work on the Node.js redesign. +- [Orama](https://docs.oramasearch.com/) for providing a search platform that indexes our content and provides lightning-fast results. +- [Sentry](https://sentry.io/welcome/) for providing an open source license for their error reporting, monitoring, and diagnostic tools. +- [Vercel](https://www.vercel.com/) for providing the infrastructure that serves and powers the Node.js Website +- and lastly, the [OpenJS Foundation](https://openjsf.org/) for their support and guidance. + +The community is strong, and we're excited about what we can accomplish together. + +> Here is your weekly reminder that the Node.js project is driven by volunteers. Therefore every feature that lands is because someone spent time (or money) to make it happen. This is called Open Governance. +> [Matteo Collina, via social media](https://x.com/matteocollina/status/1770496526424351205?s=46&t=22eoAstJVk5l46KQXYEk5Q) + +Want to get involved? [Check out the project on GitHub](https://github.com/nodejs/nodejs.org). + +--- + +Thanks to Amal Hussein and Claudio Wunder for helping gather info for this post. diff --git a/pages/en/blog/community/update-v8-5.4.md b/pages/en/blog/announcements/update-v8-5.4.md similarity index 100% rename from pages/en/blog/community/update-v8-5.4.md rename to pages/en/blog/announcements/update-v8-5.4.md diff --git a/pages/en/blog/announcements/v22-release-announce.md b/pages/en/blog/announcements/v22-release-announce.md new file mode 100644 index 0000000000000..c3001b748f586 --- /dev/null +++ b/pages/en/blog/announcements/v22-release-announce.md @@ -0,0 +1,109 @@ +--- +date: '2024-04-24T17:45:00.000Z' +category: announcements +title: 'Node.js 22 is now available!' +layout: blog-post +author: The Node.js Project +--- + +We're excited to announce the release of Node.js 22! +Highlights include require()ing ES modules, a WebSocket client, updates of the V8 JavaScript engine, and more! + +Node.js 22 will enter long-term support (LTS) in October, but until then, it will be the "Current" release for the next six months. +We encourage you to explore the new features and benefits offered by this latest release and evaluate their potential impact on your applications. + +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 22 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 22.0.0, visit: [https://nodejs.org/download/current/](/download/current/). You can find the release post at [https://nodejs.org/blog/release/v22.0.0](/blog/release/v22.0.0), +which contains the full list of commits included in this release. + +### Notable Changes + +#### V8 Update to 12.4 + +The V8 release 12.4 includes new features like WebAssembly Garbage Collection, [Array.fromAsync](https://tc39.es/proposal-array-from-async/), [Set methods](https://tc39.es/proposal-set-methods/) and [iterator helpers](https://tc39.es/proposal-iterator-helpers/). + +Contributed by Michaël Zasso in [#52465](https://github.com/nodejs/node/pull/52465) + +#### Maglev + +V8's Maglev Compiler is now enabled by default on supported architectures (). +Maglev improves performance for short-lived CLI programs. + +Contributed by Keyhan Vakil in [#51360](https://github.com/nodejs/node/pull/51360) + +#### Support require()ing synchronous ESM graphs + +This release adds `require()` support for synchronous ESM graphs under +the flag `--experimental-require-module`. + +If `--experimental-require-module` is enabled, and the ECMAScript +module being loaded by `require()` meets the following requirements: + +- Explicitly marked as an ES module with a "type": "module" field in the closest package.json or a .mjs extension. +- Fully synchronous (contains no top-level await). + +`require()` will load the requested module as an ES Module, and return +the module name space object. In this case it is similar to dynamic +`import()` but is run synchronously and returns the name space object +directly. +We intend to eventually enable `require(esm)` by default in the future, without +the flag. + +Contributed by Joyee Cheung in [#51977](https://github.com/nodejs/node/pull/51977) + +#### Running package.json scripts + +Node.js 22 includes a new experimental feature for the execution of scripts from the `package.json` with the cli flag `node --run `. +It also supports `node --run test` which executes the test command inside `package.json` scripts. + +Contributed by Yagiz Nizipli [#52190](https://github.com/nodejs/node/pull/52190) + +#### Stream default High Water Mark + +Increased the default High Water Mark for streams from 16KiB to 64KiB. +This provides a performance boost across the board at the cost of slightly higher memory usage. +Users in memory sensitive environments are encouraged to explicitly set `setDefaultHighWaterMark`. + +Contributed by Robert Nagy in [#52037](https://github.com/nodejs/node/pull/52037) + +#### Watch Mode (node --watch) + +From this release Watch Mode is considered stable. +When in watch mode, changes in the watched files cause the Node.js process to restart. + +Contributed by Moshe Atlow [#52074](https://github.com/nodejs/node/pull/52074) + +#### WebSocket + +The browser-compatible implementation of WebSocket, previously behind the flag `--experimental-websocket`, will be enabled by default. +This provides a WebSocket client to Node.js without external dependencies. + +Contributed by the Undici team and Aras Abbasi in [#51594](https://github.com/nodejs/node/pull/51594) + +#### glob and globSync + +This release adds to the `node:fs`module the functions `glob` and `globSync` for pattern matching. +Developers can now utilize these functions for matching file paths based on specified patterns. + +Contributed by Moshe Atlow [#51912](https://github.com/nodejs/node/pull/51912) + +#### Improve performance of AbortSignal creation + +This release enhances the efficiency of creating `AbortSignal` instances, leading to significantly improved performance in `fetch` and the test runner. + +Contributed by Raz Luvaton in [#52505](https://github.com/nodejs/node/pull/52505) + +## Call to action + +Try out the new Node.js 22 release! We’re always happy to hear your feedback. Testing your applications and modules with Node.js 22 helps to ensure the future compatibility of your project with the latest Node.js changes and features. + +Also of note is that Node.js 18 will go End-of-Life in April 2025, so we advise you to start planning to upgrade to Node.js 20 (LTS) or Node.js 22 (soon to be LTS). + +Looking to the future, the [Next-10](https://github.com/nodejs/next-10) team is running a survey to gather info from the ecosystem. Help shape the future of Node.js by participating. Submit your feedback [here](https://linuxfoundation.surveymonkey.com/r/nodenext10survey24). + +[CHANGELOG]: https://github.com/nodejs/node/releases/tag/v22.0.0 diff --git a/pages/en/blog/community/v5-to-v7.md b/pages/en/blog/announcements/v5-to-v7.md similarity index 100% rename from pages/en/blog/community/v5-to-v7.md rename to pages/en/blog/announcements/v5-to-v7.md diff --git a/pages/en/blog/community/domain-postmortem.md b/pages/en/blog/community/domain-postmortem.md new file mode 100644 index 0000000000000..e339d57e22bf3 --- /dev/null +++ b/pages/en/blog/community/domain-postmortem.md @@ -0,0 +1,466 @@ +--- +date: '2016-04-11T00:00:00.000Z' +category: community +title: Domain Module Postmortem +layout: blog-post +author: Evan Lucas +--- + +# Domain Module Postmortem + +## Usability Issues + +### Implicit Behavior + +It's possible for a developer to create a new domain and then simply run +`domain.enter()`. Which then acts as a catch-all for any exception in the +future that couldn't be observed by the thrower. Allowing a module author to +intercept the exceptions of unrelated code in a different module. Preventing +the originator of the code from knowing about its own exceptions. + +Here's an example of how one indirectly linked modules can affect another: + +```js +// module a.js +const b = require('./b'); +const c = require('./c'); + +// module b.js +const d = require('domain').create(); +d.on('error', () => { + /* silence everything */ +}); +d.enter(); + +// module c.js +const dep = require('some-dep'); +dep.method(); // Uh-oh! This method doesn't actually exist. +``` + +Since module `b` enters the domain but never exits any uncaught exception will +be swallowed. Leaving module `c` in the dark as to why it didn't run the entire +script. Leaving a potentially partially populated `module.exports`. Doing this +is not the same as listening for `'uncaughtException'`. As the latter is +explicitly meant to globally catch errors. The other issue is that domains are +processed prior to any `'uncaughtException'` handlers, and prevent them from +running. + +Another issue is that domains route errors automatically if no `'error'` +handler was set on the event emitter. There is no opt-in mechanism for this, +and automatically propagates across the entire asynchronous chain. This may +seem useful at first, but once asynchronous calls are two or more modules deep +and one of them doesn't include an error handler the creator of the domain will +suddenly be catching unexpected exceptions, and the thrower's exception will go +unnoticed by the author. + +The following is a simple example of how a missing `'error'` handler allows +the active domain to hijack the error: + +```js +const domain = require('domain'); +const net = require('net'); +const d = domain.create(); +d.on('error', err => console.error(err.message)); + +d.run(() => + net + .createServer(c => { + c.end(); + c.write('bye'); + }) + .listen(8000) +); +``` + +Even manually removing the connection via `d.remove(c)` does not prevent the +connection's error from being automatically intercepted. + +Failures that plagues both error routing and exception handling are the +inconsistencies in how errors are bubbled. The following is an example of how +nested domains will and won't bubble the exception based on when they happen: + +```js +const domain = require('domain'); +const net = require('net'); +const d = domain.create(); +d.on('error', () => console.error('d intercepted an error')); + +d.run(() => { + const server = net + .createServer(c => { + const e = domain.create(); // No 'error' handler being set. + e.run(() => { + // This will not be caught by d's error handler. + setImmediate(() => { + throw new Error('thrown from setImmediate'); + }); + // Though this one will bubble to d's error handler. + throw new Error('immediately thrown'); + }); + }) + .listen(8080); +}); +``` + +It may be expected that nested domains always remain nested, and will always +propagate the exception up the domain stack. Or that exceptions will never +automatically bubble. Unfortunately both these situations occur, leading to +potentially confusing behavior that may even be prone to difficult to debug +timing conflicts. + +### API Gaps + +While APIs based on using `EventEmitter` can use `bind()` and errback style +callbacks can use `intercept()`, alternative APIs that implicitly bind to the +active domain must be executed inside of `run()`. Meaning if module authors +wanted to support domains using a mechanism alternative to those mentioned they +must manually implement domain support themselves. Instead of being able to +leverage the implicit mechanisms already in place. + +### Error Propagation + +Propagating errors across nested domains is not straight forward, if even +possible. Existing documentation shows a simple example of how to `close()` an +`http` server if there is an error in the request handler. What it does not +explain is how to close the server if the request handler creates another +domain instance for another async request. Using the following as a simple +example of the failing of error propagation: + +```js +const d1 = domain.create(); +d1.foo = true; // custom member to make more visible in console +d1.on('error', er => { + /* handle error */ +}); + +d1.run(() => + setTimeout(() => { + const d2 = domain.create(); + d2.bar = 43; + d2.on('error', er => console.error(er.message, domain._stack)); + d2.run(() => { + setTimeout(() => { + setTimeout(() => { + throw new Error('outer'); + }); + throw new Error('inner'); + }); + }); + }) +); +``` + +Even in the case that the domain instances are being used for local storage so +access to resources are made available there is still no way to allow the error +to continue propagating from `d2` back to `d1`. Quick inspection may tell us +that simply throwing from `d2`'s domain `'error'` handler would allow `d1` to +then catch the exception and execute its own error handler. Though that is not +the case. Upon inspection of `domain._stack` you'll see that the stack only +contains `d2`. + +This may be considered a failing of the API, but even if it did operate in this +way there is still the issue of transmitting the fact that a branch in the +asynchronous execution has failed, and that all further operations in that +branch must cease. In the example of the http request handler, if we fire off +several asynchronous requests and each one then `write()`'s data back to the +client many more errors will arise from attempting to `write()` to a closed +handle. More on this in _Resource Cleanup on Exception_. + +### Resource Cleanup on Exception + +The following script contains a more complex example of properly cleaning up +in a small resource dependency tree in the case that an exception occurs in a +given connection or any of its dependencies. Breaking down the script into its +basic operations: + +```js +'use strict'; + +const domain = require('domain'); +const EE = require('events'); +const fs = require('fs'); +const net = require('net'); +const util = require('util'); +const print = process._rawDebug; + +const pipeList = []; +const FILENAME = '/tmp/tmp.tmp'; +const PIPENAME = '/tmp/node-domain-example-'; +const FILESIZE = 1024; +var uid = 0; + +// Setting up temporary resources +const buf = Buffer(FILESIZE); +for (var i = 0; i < buf.length; i++) buf[i] = ((Math.random() * 1e3) % 78) + 48; // Basic ASCII +fs.writeFileSync(FILENAME, buf); + +function ConnectionResource(c) { + EE.call(this); + this._connection = c; + this._alive = true; + this._domain = domain.create(); + this._id = Math.random().toString(32).substr(2).substr(0, 8) + ++uid; + + this._domain.add(c); + this._domain.on('error', () => { + this._alive = false; + }); +} +util.inherits(ConnectionResource, EE); + +ConnectionResource.prototype.end = function end(chunk) { + this._alive = false; + this._connection.end(chunk); + this.emit('end'); +}; + +ConnectionResource.prototype.isAlive = function isAlive() { + return this._alive; +}; + +ConnectionResource.prototype.id = function id() { + return this._id; +}; + +ConnectionResource.prototype.write = function write(chunk) { + this.emit('data', chunk); + return this._connection.write(chunk); +}; + +// Example begin +net + .createServer(c => { + const cr = new ConnectionResource(c); + + const d1 = domain.create(); + fs.open( + FILENAME, + 'r', + d1.intercept(fd => { + streamInParts(fd, cr, 0); + }) + ); + + pipeData(cr); + + c.on('close', () => cr.end()); + }) + .listen(8080); + +function streamInParts(fd, cr, pos) { + const d2 = domain.create(); + var alive = true; + d2.on('error', er => { + print('d2 error:', er.message); + cr.end(); + }); + fs.read( + fd, + new Buffer(10), + 0, + 10, + pos, + d2.intercept((bRead, buf) => { + if (!cr.isAlive()) { + return fs.close(fd); + } + if (cr._connection.bytesWritten < FILESIZE) { + // Documentation says callback is optional, but doesn't mention that if + // the write fails an exception will be thrown. + const goodtogo = cr.write(buf); + if (goodtogo) { + setTimeout(() => streamInParts(fd, cr, pos + bRead), 1000); + } else { + cr._connection.once('drain', () => + streamInParts(fd, cr, pos + bRead) + ); + } + return; + } + cr.end(buf); + fs.close(fd); + }) + ); +} + +function pipeData(cr) { + const pname = PIPENAME + cr.id(); + const ps = net.createServer(); + const d3 = domain.create(); + const connectionList = []; + d3.on('error', er => { + print('d3 error:', er.message); + cr.end(); + }); + d3.add(ps); + ps.on('connection', conn => { + connectionList.push(conn); + conn.on('data', () => {}); // don't care about incoming data. + conn.on('close', () => { + connectionList.splice(connectionList.indexOf(conn), 1); + }); + }); + cr.on('data', chunk => { + for (var i = 0; i < connectionList.length; i++) { + connectionList[i].write(chunk); + } + }); + cr.on('end', () => { + for (var i = 0; i < connectionList.length; i++) { + connectionList[i].end(); + } + ps.close(); + }); + pipeList.push(pname); + ps.listen(pname); +} + +process.on('SIGINT', () => process.exit()); +process.on('exit', () => { + try { + for (var i = 0; i < pipeList.length; i++) { + fs.unlinkSync(pipeList[i]); + } + fs.unlinkSync(FILENAME); + } catch (e) {} +}); +``` + +- When a new connection happens, concurrently: + - Open a file on the file system + - Open Pipe to unique socket +- Read a chunk of the file asynchronously +- Write chunk to both the TCP connection and any listening sockets +- If any of these resources error, notify all other attached resources that + they need to clean up and shutdown + +As we can see from this example a lot more must be done to properly clean up +resources when something fails than what can be done strictly through the +domain API. All that domains offer is an exception aggregation mechanism. Even +the potentially useful ability to propagate data with the domain is easily +countered, in this example, by passing the needed resources as a function +argument. + +One problem domains perpetuated was the supposed simplicity of being able to +continue execution, contrary to what the documentation stated, of the +application despite an unexpected exception. This example demonstrates the +fallacy behind that idea. + +Attempting proper resource cleanup on unexpected exception becomes more complex +as the application itself grows in complexity. This example only has 3 basic +resources in play, and all of them with a clear dependency path. If an +application uses something like shared resources or resource reuse the ability +to cleanup, and properly test that cleanup has been done, grows greatly. + +In the end, in terms of handling errors, domains aren't much more than a +glorified `'uncaughtException'` handler. Except with more implicit and +unobservable behavior by third-parties. + +### Resource Propagation + +Another use case for domains was to use it to propagate data along asynchronous +data paths. One problematic point is the ambiguity of when to expect the +correct domain when there are multiple in the stack (which must be assumed if +the async stack works with other modules). Also the conflict between being +able to depend on a domain for error handling while also having it available to +retrieve the necessary data. + +The following is a involved example demonstrating the failing using domains to +propagate data along asynchronous stacks: + +```js +const domain = require('domain'); +const net = require('net'); + +const server = net + .createServer(c => { + // Use a domain to propagate data across events within the + // connection so that we don't have to pass arguments + // everywhere. + const d = domain.create(); + d.data = { connection: c }; + d.add(c); + // Mock class that does some useless async data transformation + // for demonstration purposes. + const ds = new DataStream(dataTransformed); + c.on('data', chunk => ds.data(chunk)); + }) + .listen(8080, () => console.log(`listening on 8080`)); + +function dataTransformed(chunk) { + // FAIL! Because the DataStream instance also created a + // domain we have now lost the active domain we had + // hoped to use. + domain.active.data.connection.write(chunk); +} + +function DataStream(cb) { + this.cb = cb; + // DataStream wants to use domains for data propagation too! + // Unfortunately this will conflict with any domain that + // already exists. + this.domain = domain.create(); + this.domain.data = { inst: this }; +} + +DataStream.prototype.data = function data(chunk) { + // This code is self contained, but pretend it's a complex + // operation that crosses at least one other module. So + // passing along "this", etc., is not easy. + this.domain.run(function () { + // Simulate an async operation that does the data transform. + setImmediate(() => { + for (var i = 0; i < chunk.length; i++) + chunk[i] = ((chunk[i] + Math.random() * 100) % 96) + 33; + // Grab the instance from the active domain and use that + // to call the user's callback. + const self = domain.active.data.inst; + self.cb.call(self, chunk); + }); + }); +}; +``` + +The above shows that it is difficult to have more than one asynchronous API +attempt to use domains to propagate data. This example could possibly be fixed +by assigning `parent: domain.active` in the `DataStream` constructor. Then +restoring it via `domain.active = domain.active.data.parent` just before the +user's callback is called. Also the instantiation of `DataStream` in the +`'connection'` callback must be run inside `d.run()`, instead of simply using +`d.add(c)`, otherwise there will be no active domain. + +In short, for this to have a prayer of a chance usage would need to strictly +adhere to a set of guidelines that would be difficult to enforce or test. + +## Performance Issues + +A significant deterrent from using domains is the overhead. Using node's +built-in http benchmark, `http_simple.js`, without domains it can handle over +22,000 requests/second. Whereas if it's run with `NODE_USE_DOMAINS=1` that +number drops down to under 17,000 requests/second. In this case there is only +a single global domain. If we edit the benchmark so the http request callback +creates a new domain instance performance drops further to 15,000 +requests/second. + +While this probably wouldn't affect a server only serving a few hundred or even +a thousand requests per second, the amount of overhead is directly proportional +to the number of asynchronous requests made. So if a single connection needs to +connect to several other services all of those will contribute to the overall +latency of delivering the final product to the client. + +Using `AsyncWrap` and tracking the number of times +`init`/`pre`/`post`/`destroy` are called in the mentioned benchmark we find +that the sum of all events called is over 170,000 times per second. This means +even adding 1 microsecond overhead per call for any type of setup or tear down +will result in a 17% performance loss. Granted, this is for the optimized +scenario of the benchmark, but I believe this demonstrates the necessity for a +mechanism such as domain to be as cheap to run as possible. + +## Looking Ahead + +The domain module has been soft deprecated since Dec 2014, but has not yet been +removed because node offers no alternative functionality at the moment. As of +this writing there is ongoing work building out the `AsyncWrap` API and a +proposal for Zones being prepared for the TC39. At such time there is suitable +functionality to replace domains it will undergo the full deprecation cycle and +eventually be removed from core. diff --git a/pages/en/blog/events/.gitkeep b/pages/en/blog/events/.gitkeep deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/pages/en/blog/events/collab-summit-2024-london.md b/pages/en/blog/events/collab-summit-2024-london.md new file mode 100644 index 0000000000000..5083c4de783d6 --- /dev/null +++ b/pages/en/blog/events/collab-summit-2024-london.md @@ -0,0 +1,92 @@ +--- +date: '2024-04-15T00:00:00.000Z' +category: events +title: 'Trip report: Node.js collaboration summit (2024 London)' +layout: blog-post +author: Joyee Cheung +--- + +About twice per year, Node.js contributors and community members get together in an unconference called [the Node.js collaboration summit](https://nodejs.org/en/about/get-involved/collab-summit). At the summit, we share knowledge about the project and the ecosystem, brainstorm solutions to technical and non-technical issues, make progress in decision-making discussions, and push forward new initiatives. + +The [first collaboration summit of 2024](https://github.com/openjs-foundation/summit/issues/387) was held on 3-4 April, hosted by Bloomberg at their London office. In this edition, 20 attendees joined in person, including 15 Node.js core collaborators (10 of whom were from the Technical Steering Committee) and 5 more members/contributors from the community. We were also joined by around a dozen remote participants who contributed significantly to the discussions. In addition, we had our first crossover session with WinterCG. + +Here is a recap of what happened at the summit. + +## HTTP, web server frameworks and clients + +The summit started with a morning of discussions about HTTP - both the server and the client. + +Jean Burellier ([@sheplu](https://github.com/sheplu)) presented the recent development in the [Web server framework working group](https://github.com/nodejs/web-server-frameworks). We discussed ideas for the [next generation of the HTTP stack](https://github.com/nodejs/http-next). In particular we brainstormed about higher-level APIs that can abstract over three different HTTP stacks (1.1, 2 and QUIC), and lower-level APIs that empower frameworks to maximize performance and do request injection without having to monkey-patch. The next-gen HTTP parser [milo](https://github.com/ShogunPanda/milo) may also be part of the picture. Iteration of the API design will continue in the [Web server framework working group](https://github.com/nodejs/web-server-frameworks) after the session. + +Matteo Collina ([@mcollina](https://github.com/mcollina)) and Robert Nagy ([@ronag](https://github.com/ronag)) facilitated a [session about the HTTP client](https://github.com/openjs-foundation/summit/issues/393) and a [session about Undici](https://github.com/openjs-foundation/summit/issues/391). The sessions mainly focused on APIs to improve customization. We brainstormed what a [composable dispatcher API](https://github.com/nodejs/undici/issues/2722) should look like and how it should be implemented in [Undici](https://github.com/nodejs/undici) and exposed to Node.js users. We also discussed whether/how we should provide [built-in environment variable handling for proxies](https://github.com/nodejs/undici/issues/1650). An idea was proposed to release an official package that provides extra abilities for the power users while decoupling semantic versioning from the Node.js releases. We will bring the ideas back to GitHub and continue the exploration. + +## New features for the built-in CLI + +Ruy Adorno ([@ruyadorno](https://github.com/ruyadorno)) presented the recent development in the [tooling group](https://github.com/nodejs/tooling). We discussed adding a new command line utility that lets users quickly start a static file server for Web development. Folks at the session generally found the idea favorable. We discussed the goals and non-goals of this new utility at the session and will follow up on GitHub. + +Before the summit, a [recent pull request](https://github.com/nodejs/node/pull/52190) to add a subcommand `node run` (similar to a built-in, slimmed-down version of `npm run`) started a debate on GitHub. The author of the pull request, Yagiz Nizipli ([@anonrig](https://github.com/anonrig)), joined remotely and we used the session to settle the debate in the pull request. Most people at the session favored the idea, though we also agreed that we should have a more thought-out subcommand strategy. We agreed that this new feature could land as `node --run` in the first iteration. While the option is still experimental, we'll figure out whether or how we should introduce more subcommands in the future and how we can minimize breakage to existing workflows. At the meantime we could also explore adding more performant primitives that help package managers speed up their script runners. + +## Version management of package managers and the Node.js binary + +Wes Todd ([@wesleytodd](https://github.com/wesleytodd)) facilitated a [session](https://github.com/openjs-foundation/summit/issues/400) about the [Node.js version manager/package manager effort](https://github.com/nodejs/package-maintenance/issues/591). We started with a recap of how corepack went into the Node.js distribution as a way to provide more package manager options to our users, then dived into several topics: + +- How should we enable reproducible builds with pinned versions of Node.js and package managers? How can we provide a more consistent user experience across the platform? +- How can we enable faster distribution cycles of newer versions of package managers? +- Should Node.js have a recommended version manager? Should we provide a one-line script to install Node.js? How should those be maintained? +- `devEngine` in `package.json` and recent [package metadata effort](https://github.com/openjs-foundation/package-metadata-interoperability-collab-space). +- What should our short-term strategy be for corepack? + +We agreed that the next steps should be: + +- Come up with a short-term strategy for corepack in the package maintenance working group in the coming weeks. +- For a long-term strategy, continue iterating on the goals in the package maintenance working group and come back with a proposal about the project goals in this field. Then send a pull request to add the goals document into the nodejs/node core repository, and get the broader contributor base to review the proposal, before diving into the implementation details. + +## Better asynchronous scheduling and memory management + +The second day of the summit started with deep dives into some tricky technical issues in Node.js core. + +Robert Nagy ([@ronag](https://github.com/ronag)) facilitated a [session](https://github.com/openjs-foundation/summit/issues/392) to brainstorm solutions to [an error-prone use case](https://github.com/nodejs/node/issues/51156) in asynchronous scheduling. This comes from the intricate timing difference and interoperability among promises, `EventEmitter`, and existing scheduling APIs such as `process.nextTick`, `queueMicroTask()`, and `setImmediate()`. We looked into several potential solutions: some may break the timing, and some may lead to other surprises, though some ideas involving [a new scheduling API](https://github.com/nodejs/node/pull/51471) or a [new `EventEmitter` option](https://github.com/openjs-foundation/summit/issues/392#issuecomment-2037511747) looked more promising. For now, we will document the caveats more clearly and follow up by looking into the ideas mentioned in the session, finding recommendable usage patterns, and promoting them to library authors and end users to avoid the issue. + +Joyee Cheung ([@joyeecheung](https://github.com/joyeecheung)) gave [a presentation](https://github.com/joyeecheung/talks/blob/master/node_collab_summit_202404/improving-native-memory-management-diagnostics-in-nodejs.pdf) to share knowledge about a corner in the code base that fewer contributors are familiar with these days - the native memory management and how to fix the memory issues in Node.js core. We dived into a case study of a few recently fixed memory bugs in the vm APIs, and talked about recent work in [migrating the native memory management](https://docs.google.com/document/d/1ny2Qz_EsUnXGKJRGxoA-FXIE2xpLgaMAN6jD7eAkqFQ/edit) to use the [V8 Oilpan library](https://v8.dev/blog/oilpan-library) in order to prevent similar bugs and improve garbage collection performance. + +## Release and CITGM + +Ruy Adorno ([@ruyadorno](https://github.com/ruyadorno)) facilitated a [session](https://github.com/openjs-foundation/summit/issues/389) to bring the regular meeting of the [release working group](https://github.com/nodejs/Release) to a larger audience at the summit. We looked into the upcoming release schedule, talked about the obstacles in recent releases, and discussed the recent challenges with backports and flaky CI. We need more volunteers to help improve automation, so we also brainstormed ideas to improve documentation and our process, so that more contributors can jump in and share the work without having to become a releaser themselves (which requires more trust building for security reasons). + +We also discussed the status of the [CITGM](https://github.com/nodejs/citgm) - a platform we've been using to run the test suite of npm packages against unreleased versions of Node.js to detect breakage. It has been struggling with a lot of flakes and, as a result, has not been reliable enough for releasers to extract useful information. We brainstormed ideas to make it more reliable, e.g., developing automation to help the module authors notice the breakage early in their own CI. The session ended with a call for volunteers to help implement the ideas brainstormed and maintain the reliability of CITGM. + +## Content curation, user survey and funding + +Jean Burellier ([@sheplu](https://github.com/sheplu)) facilitated [a session](https://github.com/openjs-foundation/summit/issues/401) to talk about the recent developments in the [Next-10 initiative](https://github.com/nodejs/next-10), and Micheal Dawson ([@mhdawson](https://github.com/mhdawson)) joined remotely to give us more context. Attendees learned about the recently proposed [Node.js Ambassador program](https://github.com/nodejs/next-10/issues/259) which aims to promote educational content created by creators from the community, and the [Speakers Beaureau](https://openjsf.org/events) initiative from the OpenJS foundation that funds speakers to promote recent developments in the project. We brainstormed ideas to promote quality and up-to-date content and phase out content that still teaches out-of-date practices, including: + +- Creating a venue for content creators to get their content reviewed or proof-read by project contributors and for project contributors to reach out to content creators to promote recent developments in the project. +- Getting more Node.js collaborators involved in the development of the certification program. +- Putting more reputable educational resources on our website. + +We also discussed topics that should be included in the [upcoming 2024 user survey](https://github.com/nodejs/next-10/pull/261), including the adoption of new and existing features. These may be helpful for decision-making regarding some of the unresolved issues, e.g., the future of corepack. We'll review the survey pull request after the summit. + +Given that currently, direct sponsorship of engineering work in the project is far too limited for the existing workload, we also discussed ideas to improve the situation. For example, adding more crowdsourcing channels to get bugs fixed or features implemented and providing better stories for companies to sponsor engineering work on specific tasks. Discussions will continue in the [Next-10 repository](https://github.com/nodejs/next-10/issues/259). + +## ECMASCript Modules and interoperability + +Daniel Ehrenberg ([@littledan](https://github.com/littledan)) and Guy Bedford ([@guybedford](https://github.com/guybedford), remote) facilitated [a session about ECMAScript modules](https://github.com/openjs-foundation/summit/issues/397). Attendees were briefed about the recent module-related proposals in TC39. We looked into use cases that still miss support in the language, such as module mocking. We also discussed pending tasks in Node.js core's ESM integration, including adding [universal, in-thread and synchronous loader hooks](https://github.com/nodejs/node/issues/52219), and getting help to fix [bugs in the existing off-thread loader hooks](https://github.com/nodejs/node/pull/50752). + +Nicolò Ribaudo ([@nicolo-ribaudo](https://github.com/nicolo-ribaudo)) joined remotely and presented the [Stage 2 deferred module evaluation proposal](https://github.com/tc39/proposal-defer-import-eval), which is built upon being able to evaluate ESM synchronously and therefore can share specification and JavaScript engine changes with the recently added [synchronous-only `require(esm)` in Node.js](https://github.com/nodejs/node/pull/51977). + +We will continue our discussions in the TC39 module harmony working group. + +## Participation in standards: TC39, WinterCG and security + +Daniel Ehrenberg ([@littledan](https://github.com/littledan)) briefed the audience about several recent proposals in TC39 that may be interesting for Node.js and could use more feedback from Node.js, including [`AsyncContext`](https://github.com/tc39/proposal-async-context) and [`ShadowRealm`](https://github.com/tc39/proposal-shadowrealm), etc. Oliver Medhurst ([@CanadaHonk](https://github.com/CanadaHonk)) gave an introduction about ongoing work and proposals in the WinterCG. We also learned about the recent ECMA TC55 for server-side API standardization. + +Since the summit overlaps with the monthly call of [WinterCG](https://wintercg.org/), part of this session was scheduled to be a cross-over session with WinterCG. We were joined by Luca Casonato ([@lucacasonato](https://github.com/lucacasonato), remote) who explained how WinterCG works. Andreu Botella ([@andreubotella](https://github.com/andreubotella)) also joined remotely and shared how the [minimum common API](https://github.com/wintercg/proposal-common-minimum-api) tried to leave room in the specification when Node.js API behavior deviates from the browsers. We agreed that both Node.js contributors and others from WinterCG should make an effort to improve communication and ensure that the specifications are compatible and interoperable with Node.js. We also discussed how to get funding to help Node.js implement proposals coming out of WinterCG. + +Node.js has a distributed consensus-seeking model, which makes effective communication between Node.js contributors and other standards bodies challenging. As a possible solution to this problem, James M Snell ([@jasnell](https://github.com/jasnell)) proposed at the [mini-summit at NodeConf EU last year](https://github.com/nodejs/TSC/issues/1422) to [set up a standards-positions repository](https://github.com/nodejs/admin/issues/841) which captures consensus within the project about proposals in standards. We revisited this idea at this summit, and discussed communication setups that may help folks from WinterCG get input more effectively from those who work on the relevant parts in Node.js. The discussions will continue in the [standards-positions repository](https://github.com/nodejs/standards-positions). + +Finally, we discussed standards for supply chain security, such as [CycloneDX](https://github.com/CycloneDX) and [SLSA](https://github.com/slsa-framework/slsa). Feelings about SLSA were mixed; several people expressed that it is incompatible with Node.js's current contribution model, and implementing it requires a significant change in the contribution process that needs resources we do not have. The project is still in a learning process, and we want to explore different options in security standards. The exploration will continue in the [security working group](https://github.com/nodejs/security-wg). + +## Wrapping up + +We had many productive discussions at the summit. Both the contributors and community members learned a lot from each other. We will follow up on the discussions in respective working groups/teams on GitHub. + +We are also looking into the organization of the next summit in the second half of 2024. Follow [this issue](https://github.com/nodejs/admin/issues/814) if you are interested! diff --git a/pages/en/blog/release/v18.20.0.md b/pages/en/blog/release/v18.20.0.md new file mode 100644 index 0000000000000..e7c881a7d7e25 --- /dev/null +++ b/pages/en/blog/release/v18.20.0.md @@ -0,0 +1,254 @@ +--- +date: '2024-03-26T17:49:14.613Z' +category: release +title: Node v18.20.0 (LTS) +layout: blog-post +author: Richard Lau +--- + +## 2024-03-26, Version 18.20.0 'Hydrogen' (LTS), @richardlau + +### Notable Changes + +#### Added support for import attributes + +Support has been added for import attributes, to replace the old import +assertions syntax. This will aid migration by making the new syntax available +across all currently supported Node.js release lines. + +This adds the `with` keyword which should be used in place of the previous +`assert` keyword, which will be removed in a future semver-major Node.js +release. + +For example, + +```console +import "foo" assert { ... } +``` + +should be replaced with + +```console +import "foo" with { ... } +``` + +For more details, see + +- [#50134](https://github.com/nodejs/node/issues/50134) +- [#51622](https://github.com/nodejs/node/issues/51622) + +Contributed by Nicolò Ribaudo in [#51136](https://github.com/nodejs/node/pull/51136) +and Antoine du Hamel in [#50140](https://github.com/nodejs/node/pull/50140). + +#### Doc deprecation for `dirent.path` + +Please use newly added `dirent.parentPath` instead. + +Contributed by Antoine du Hamel in [#50976](https://github.com/nodejs/node/pull/50976) +and [#51020](https://github.com/nodejs/node/pull/51020). + +#### Experimental node-api feature flags + +Introduces an experimental feature to segregate finalizers that affect GC state. +A new type called `node_api_nogc_env` has been introduced as the const version +of `napi_env` and `node_api_nogc_finalize` as a variant of `napi_finalize` that +accepts a `node_api_nogc_env` as its first argument. + +This feature can be turned off by defining +`NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT`. + +Contributed by Gabriel Schulhof in [#50060](https://github.com/nodejs/node/pull/50060). + +#### Root certificates updated to NSS 3.98 + +Certificates added: + +- Telekom Security TLS ECC Root 2020 +- Telekom Security TLS RSA Root 2023 + +Certificates removed: + +- Security Communication Root CA + +#### Updated dependencies + +- ada updated to 2.7.6. +- base64 updated to 0.5.2. +- c-ares updated to 1.27.0. +- corepack updated to 0.25.2. +- ICU updated to 74.2. Includes CLDR 44.1 and Unicode 15.1. +- npm updated to 10.5.0. Fixes a regression in signals not being passed onto child processes. +- simdutf8 updated to 4.0.8. +- Timezone updated to 2024a. +- zlib updated to 1.3.0.1-motley-40e35a7. + +#### vm: fix V8 compilation cache support for vm.Script + +Previously repeated compilation of the same source code using `vm.Script` +stopped hitting the V8 compilation cache after v16.x when support for +`importModuleDynamically` was added to `vm.Script`, resulting in a performance +regression that blocked users (in particular Jest users) from upgrading from +v16.x. + +The recent fixes allow the compilation cache to be hit again +for `vm.Script` when `--experimental-vm-modules` is not used even in the +presence of the `importModuleDynamically` option, so that users affected by the +performance regression can now upgrade. Ongoing work is also being done to +enable compilation cache support for `vm.CompileFunction`. + +Contributed by Joyee Cheung in [#49950](https://github.com/nodejs/node/pull/49950) +and [#50137](https://github.com/nodejs/node/pull/50137). + +### Commits + +- \[[`c70383b8d4`](https://github.com/nodejs/node/commit/c70383b8d4)] - **build**: support Python 3.12 (Shi Pujin) [#50209](https://github.com/nodejs/node/pull/50209) +- \[[`4b960c3a4a`](https://github.com/nodejs/node/commit/4b960c3a4a)] - **build**: fix incorrect g++ warning message (Richard Lau) [#51695](https://github.com/nodejs/node/pull/51695) +- \[[`8fdea67694`](https://github.com/nodejs/node/commit/8fdea67694)] - **crypto**: update root certificates to NSS 3.98 (Node.js GitHub Bot) [#51794](https://github.com/nodejs/node/pull/51794) +- \[[`812b126dd9`](https://github.com/nodejs/node/commit/812b126dd9)] - **deps**: V8: cherry-pick d90d4533b053 (Michaël Zasso) [#50077](https://github.com/nodejs/node/pull/50077) +- \[[`9ab8c3db87`](https://github.com/nodejs/node/commit/9ab8c3db87)] - **deps**: update c-ares to 1.27.0 (Node.js GitHub Bot) [#51846](https://github.com/nodejs/node/pull/51846) +- \[[`c688680387`](https://github.com/nodejs/node/commit/c688680387)] - **deps**: update c-ares to 1.26.0 (Node.js GitHub Bot) [#51582](https://github.com/nodejs/node/pull/51582) +- \[[`9498ac8a47`](https://github.com/nodejs/node/commit/9498ac8a47)] - **deps**: compile c-ares with C11 support (Michaël Zasso) [#51410](https://github.com/nodejs/node/pull/51410) +- \[[`8fb743642f`](https://github.com/nodejs/node/commit/8fb743642f)] - **deps**: update c-ares to 1.25.0 (Node.js GitHub Bot) [#51385](https://github.com/nodejs/node/pull/51385) +- \[[`7bea2d7c12`](https://github.com/nodejs/node/commit/7bea2d7c12)] - **deps**: update zlib to 1.3.0.1-motley-40e35a7 (Node.js GitHub Bot) [#51274](https://github.com/nodejs/node/pull/51274) +- \[[`57a38c8f75`](https://github.com/nodejs/node/commit/57a38c8f75)] - **deps**: update zlib to 1.3.0.1-motley-dd5fc13 (Node.js GitHub Bot) [#51105](https://github.com/nodejs/node/pull/51105) +- \[[`b0ca084a6b`](https://github.com/nodejs/node/commit/b0ca084a6b)] - **deps**: update zlib to 1.3-22124f5 (Node.js GitHub Bot) [#50910](https://github.com/nodejs/node/pull/50910) +- \[[`4b43823f37`](https://github.com/nodejs/node/commit/4b43823f37)] - **deps**: update zlib to 1.2.13.1-motley-5daffc7 (Node.js GitHub Bot) [#50803](https://github.com/nodejs/node/pull/50803) +- \[[`f0da591812`](https://github.com/nodejs/node/commit/f0da591812)] - **deps**: update zlib to 1.2.13.1-motley-dfc48fc (Node.js GitHub Bot) [#50456](https://github.com/nodejs/node/pull/50456) +- \[[`16d28a883a`](https://github.com/nodejs/node/commit/16d28a883a)] - **deps**: update base64 to 0.5.2 (Node.js GitHub Bot) [#51455](https://github.com/nodejs/node/pull/51455) +- \[[`13a9e81cb6`](https://github.com/nodejs/node/commit/13a9e81cb6)] - **deps**: update base64 to 0.5.1 (Node.js GitHub Bot) [#50629](https://github.com/nodejs/node/pull/50629) +- \[[`b4502d3ac5`](https://github.com/nodejs/node/commit/b4502d3ac5)] - **deps**: update simdutf to 4.0.8 (Node.js GitHub Bot) [#51000](https://github.com/nodejs/node/pull/51000) +- \[[`183cf8a74a`](https://github.com/nodejs/node/commit/183cf8a74a)] - **deps**: update simdutf to 4.0.4 (Node.js GitHub Bot) [#50772](https://github.com/nodejs/node/pull/50772) +- \[[`11ba8593ea`](https://github.com/nodejs/node/commit/11ba8593ea)] - **deps**: update ada to 2.7.6 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`73a946d55c`](https://github.com/nodejs/node/commit/73a946d55c)] - **deps**: update ada to 2.7.5 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`cc434c1a39`](https://github.com/nodejs/node/commit/cc434c1a39)] - **deps**: update ada to 2.7.4 (Node.js GitHub Bot) [#50815](https://github.com/nodejs/node/pull/50815) +- \[[`3a3808a6ae`](https://github.com/nodejs/node/commit/3a3808a6ae)] - **deps**: upgrade npm to 10.5.0 (npm team) [#51913](https://github.com/nodejs/node/pull/51913) +- \[[`c8876d765c`](https://github.com/nodejs/node/commit/c8876d765c)] - **deps**: upgrade npm to 10.3.0 (npm team) [#51431](https://github.com/nodejs/node/pull/51431) +- \[[`5aec3af460`](https://github.com/nodejs/node/commit/5aec3af460)] - **deps**: update corepack to 0.25.2 (Node.js GitHub Bot) [#51810](https://github.com/nodejs/node/pull/51810) +- \[[`a593985326`](https://github.com/nodejs/node/commit/a593985326)] - **deps**: update corepack to 0.24.1 (Node.js GitHub Bot) [#51459](https://github.com/nodejs/node/pull/51459) +- \[[`d1a9237bf5`](https://github.com/nodejs/node/commit/d1a9237bf5)] - **deps**: update corepack to 0.24.0 (Node.js GitHub Bot) [#51318](https://github.com/nodejs/node/pull/51318) +- \[[`adac0c7a63`](https://github.com/nodejs/node/commit/adac0c7a63)] - **deps**: update corepack to 0.23.0 (Node.js GitHub Bot) [#50563](https://github.com/nodejs/node/pull/50563) +- \[[`4a6f83e32a`](https://github.com/nodejs/node/commit/4a6f83e32a)] - **deps**: escape Python strings correctly (Michaël Zasso) [#50695](https://github.com/nodejs/node/pull/50695) +- \[[`c13969e52a`](https://github.com/nodejs/node/commit/c13969e52a)] - **deps**: V8: cherry-pick ea996ad04a68 (Nicolò Ribaudo) [#51136](https://github.com/nodejs/node/pull/51136) +- \[[`6fbf0ba5c3`](https://github.com/nodejs/node/commit/6fbf0ba5c3)] - **deps**: V8: cherry-pick a0fd3209dda8 (Nicolò Ribaudo) [#51136](https://github.com/nodejs/node/pull/51136) +- \[[`68fd7516e1`](https://github.com/nodejs/node/commit/68fd7516e1)] - **deps**: update timezone to 2024a (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`f9b229ebe1`](https://github.com/nodejs/node/commit/f9b229ebe1)] - **deps**: update icu to 74.2 (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`90c73d2eb4`](https://github.com/nodejs/node/commit/90c73d2eb4)] - **deps**: update timezone to 2023d (Node.js GitHub Bot) [#51461](https://github.com/nodejs/node/pull/51461) +- \[[`2a2bf57028`](https://github.com/nodejs/node/commit/2a2bf57028)] - **deps**: update icu to 74.1 (Node.js GitHub Bot) [#50515](https://github.com/nodejs/node/pull/50515) +- \[[`425e011e52`](https://github.com/nodejs/node/commit/425e011e52)] - **deps**: add v8::Object::SetInternalFieldForNodeCore() (Joyee Cheung) [#49874](https://github.com/nodejs/node/pull/49874) +- \[[`58c70344a2`](https://github.com/nodejs/node/commit/58c70344a2)] - **deps**: V8: cherry-pick 705e374124ae (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`b0e88899e1`](https://github.com/nodejs/node/commit/b0e88899e1)] - **deps**: V8: cherry-pick 1fada6b36f8d (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`d87a810b81`](https://github.com/nodejs/node/commit/d87a810b81)] - **deps**: V8: cherry-pick 3dd9576ce336 (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`6d50966876`](https://github.com/nodejs/node/commit/6d50966876)] - **deps**: V8: cherry-pick 94e8282325a1 (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`fafbacdfec`](https://github.com/nodejs/node/commit/fafbacdfec)] - **deps**: V8: cherry-pick 9a98f96b6d68 (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`d4a530ed8d`](https://github.com/nodejs/node/commit/d4a530ed8d)] - **deps**: V8: cherry-pick 7f5daed62d47 (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`1ce901b164`](https://github.com/nodejs/node/commit/1ce901b164)] - **deps**: V8: cherry-pick c400af48b5ef (Joyee Cheung) [#51004](https://github.com/nodejs/node/pull/51004) +- \[[`f232064f35`](https://github.com/nodejs/node/commit/f232064f35)] - **doc**: fix historical experimental fetch flag (Kenrick) [#51506](https://github.com/nodejs/node/pull/51506) +- \[[`194ff6a40f`](https://github.com/nodejs/node/commit/194ff6a40f)] - **(SEMVER-MINOR)** **doc**: add deprecation notice to `dirent.path` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +- \[[`0f09267dc6`](https://github.com/nodejs/node/commit/0f09267dc6)] - **(SEMVER-MINOR)** **doc**: deprecate `dirent.path` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +- \[[`8bfb8f5b2f`](https://github.com/nodejs/node/commit/8bfb8f5b2f)] - **doc,crypto**: further clarify RSA_PKCS1_PADDING support (Tobias Nießen) [#51799](https://github.com/nodejs/node/pull/51799) +- \[[`c7baf7b274`](https://github.com/nodejs/node/commit/c7baf7b274)] - **doc,crypto**: add changelog and note about disabled RSA_PKCS1_PADDING (Filip Skokan) [#51782](https://github.com/nodejs/node/pull/51782) +- \[[`a193be3dc2`](https://github.com/nodejs/node/commit/a193be3dc2)] - **esm**: use import attributes instead of import assertions (Antoine du Hamel) [#50140](https://github.com/nodejs/node/pull/50140) +- \[[`26e8f7793e`](https://github.com/nodejs/node/commit/26e8f7793e)] - **(SEMVER-MINOR)** **fs**: introduce `dirent.parentPath` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +- \[[`5b5e5192f7`](https://github.com/nodejs/node/commit/5b5e5192f7)] - **lib**: fix compileFunction throws range error for negative numbers (Jithil P Ponnan) [#49855](https://github.com/nodejs/node/pull/49855) +- \[[`7552de6806`](https://github.com/nodejs/node/commit/7552de6806)] - **module**: fix the leak in SourceTextModule and ContextifySript (Joyee Cheung) [#48510](https://github.com/nodejs/node/pull/48510) +- \[[`2e05cf1c60`](https://github.com/nodejs/node/commit/2e05cf1c60)] - **module**: fix leak of vm.SyntheticModule (Joyee Cheung) [#48510](https://github.com/nodejs/node/pull/48510) +- \[[`a86a2e14a3`](https://github.com/nodejs/node/commit/a86a2e14a3)] - **module**: use symbol in WeakMap to manage host defined options (Joyee Cheung) [#48510](https://github.com/nodejs/node/pull/48510) +- \[[`32906ddcac`](https://github.com/nodejs/node/commit/32906ddcac)] - **node-api**: segregate nogc APIs from rest via type system (Gabriel Schulhof) [#50060](https://github.com/nodejs/node/pull/50060) +- \[[`1aa71c26ff`](https://github.com/nodejs/node/commit/1aa71c26ff)] - **node-api**: factor out common code into macros (Gabriel Schulhof) [#50664](https://github.com/nodejs/node/pull/50664) +- \[[`3d0b233f52`](https://github.com/nodejs/node/commit/3d0b233f52)] - **node-api**: introduce experimental feature flags (Gabriel Schulhof) [#50991](https://github.com/nodejs/node/pull/50991) +- \[[`96514a8b9f`](https://github.com/nodejs/node/commit/96514a8b9f)] - **src**: iterate on import attributes array correctly (Michaël Zasso) [#50703](https://github.com/nodejs/node/pull/50703) +- \[[`2c2892bf88`](https://github.com/nodejs/node/commit/2c2892bf88)] - **src**: set ModuleWrap internal fields only once (Joyee Cheung) [#49391](https://github.com/nodejs/node/pull/49391) +- \[[`ff334cb774`](https://github.com/nodejs/node/commit/ff334cb774)] - **src**: cast v8::Object::GetInternalField() return value to v8::Value (Joyee Cheung) [#48943](https://github.com/nodejs/node/pull/48943) +- \[[`270b519971`](https://github.com/nodejs/node/commit/270b519971)] - **stream**: do not defer construction by one microtick (Matteo Collina) [#52005](https://github.com/nodejs/node/pull/52005) +- \[[`95d7a75084`](https://github.com/nodejs/node/commit/95d7a75084)] - **test**: fix dns test case failures after c-ares update to 1.21.0+ (Brad House) [#50743](https://github.com/nodejs/node/pull/50743) +- \[[`cd613e5167`](https://github.com/nodejs/node/commit/cd613e5167)] - **test**: handle relative https redirect (Richard Lau) [#51121](https://github.com/nodejs/node/pull/51121) +- \[[`40f10eafcf`](https://github.com/nodejs/node/commit/40f10eafcf)] - **test**: fix `internet/test-inspector-help-page` (Richard Lau) [#51693](https://github.com/nodejs/node/pull/51693) +- \[[`5e426511b1`](https://github.com/nodejs/node/commit/5e426511b1)] - **test**: deflake test-vm-contextified-script-leak (Joyee Cheung) [#49710](https://github.com/nodejs/node/pull/49710) +- \[[`0b156c6d28`](https://github.com/nodejs/node/commit/0b156c6d28)] - **test**: use checkIfCollectable in vm leak tests (Joyee Cheung) [#49671](https://github.com/nodejs/node/pull/49671) +- \[[`1586c11b3c`](https://github.com/nodejs/node/commit/1586c11b3c)] - **test**: add checkIfCollectable to test/common/gc.js (Joyee Cheung) [#49671](https://github.com/nodejs/node/pull/49671) +- \[[`902d8b3d4b`](https://github.com/nodejs/node/commit/902d8b3d4b)] - **test**: fix flaky http-chunk-extensions-limit test (Ethan Arrowood) [#51943](https://github.com/nodejs/node/pull/51943) +- \[[`1743d2bdc1`](https://github.com/nodejs/node/commit/1743d2bdc1)] - **test**: test surrogate pair filenames on windows (Mert Can Altın) [#51800](https://github.com/nodejs/node/pull/51800) +- \[[`1c1a7ec22d`](https://github.com/nodejs/node/commit/1c1a7ec22d)] - **test**: increase platform timeout zlib-brotli-16gb (Rafael Gonzaga) [#51792](https://github.com/nodejs/node/pull/51792) +- \[[`931d02fe3e`](https://github.com/nodejs/node/commit/931d02fe3e)] - **test, v8**: fix wrong import attributes test (Nicolò Ribaudo) [#52184](https://github.com/nodejs/node/pull/52184) +- \[[`d9ea6c1f8d`](https://github.com/nodejs/node/commit/d9ea6c1f8d)] - **tls**: fix order of setting cipher before setting cert and key (Kumar Rishav) [#50186](https://github.com/nodejs/node/pull/50186) +- \[[`3184befa2e`](https://github.com/nodejs/node/commit/3184befa2e)] - **tools**: fix update-icu.sh (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`06646e11be`](https://github.com/nodejs/node/commit/06646e11be)] - **(SEMVER-MINOR)** **vm**: use import attributes instead of import assertions (Antoine du Hamel) [#50141](https://github.com/nodejs/node/pull/50141) +- \[[`fe66e9d06e`](https://github.com/nodejs/node/commit/fe66e9d06e)] - **vm**: reject in importModuleDynamically without --experimental-vm-modules (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +- \[[`052e095c6b`](https://github.com/nodejs/node/commit/052e095c6b)] - **vm**: use internal versions of compileFunction and Script (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +- \[[`9f7899ed0a`](https://github.com/nodejs/node/commit/9f7899ed0a)] - **vm**: unify host-defined option generation in vm.compileFunction (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +- \[[`6291c107d0`](https://github.com/nodejs/node/commit/6291c107d0)] - **vm**: use default HDO when importModuleDynamically is not set (Joyee Cheung) [#49950](https://github.com/nodejs/node/pull/49950) + +Windows 32-bit Installer: https://nodejs.org/dist/v18.20.0/node-v18.20.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v18.20.0/node-v18.20.0-x64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v18.20.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v18.20.0/win-x64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v18.20.0/node-v18.20.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v18.20.0/node-v18.20.0.tar.gz \ +Other release files: https://nodejs.org/dist/v18.20.0/ \ +Documentation: https://nodejs.org/docs/v18.20.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +e1203ef936317ca9dc3d5a8b4957014b6f00f334b741139df44e5eed6e81660e node-v18.20.0-aix-ppc64.tar.gz +10066ad4dd9e03ea5c4c45ef8775420ff37b860de09bbdf87b97e0c07b1ea036 node-v18.20.0-darwin-arm64.tar.gz +1f12fbcd5c8b9a80669e3cdf7037f864260610962fb69752130641276c82c47a node-v18.20.0-darwin-arm64.tar.xz +062ba71618e88e06321de5caa038843c350aababa2d315f3ca7b8551f8e66c1c node-v18.20.0-darwin-x64.tar.gz +c8afd1aac8759e69e35dd4aea8a19c6c3ab23d76fe5bccd0d3dc821354ef8043 node-v18.20.0-darwin-x64.tar.xz +b3c58422afab272e35c2eb8a79534cbb2571da0cc8b662972be93edbac567eaf node-v18.20.0-headers.tar.gz +3c554e939b14afddb7695a3c560eb95cc313f8ff22fc6cba29cf9d879f5e08bf node-v18.20.0-headers.tar.xz +93ff82497bf2ff7c0b2549637dd5098039439aa7805b08412cc71a98d437d9dd node-v18.20.0-linux-arm64.tar.gz +afe51da9ffb38ac1e3a20d9a06efd403ced4bf8831ab554a02a088dd8392fd79 node-v18.20.0-linux-arm64.tar.xz +2b63df8b0e6f57efd41b9e0d55a1da302283884aa06e2f54d303f6c9b3d74614 node-v18.20.0-linux-armv7l.tar.gz +076d62655154f5af14a3a7c690aaea9d2a6fe0d0d1cbfcbaa4bac51416b2c2c3 node-v18.20.0-linux-armv7l.tar.xz +9e652bbf53a3e37285b11dfb9d6a9bb8b02010c3b50e5c8229d4cc10e72681da node-v18.20.0-linux-ppc64le.tar.gz +433e5abf116a39b89b86637dde064d5d987628cd963513bdd9fe4757314821a3 node-v18.20.0-linux-ppc64le.tar.xz +172de3836c23634e965b7b48e193389e3869b2e822f7577b1f595181dd3526a6 node-v18.20.0-linux-s390x.tar.gz +a6c2a5796b9d9e9bf21da62ec89ff30b41a8108880b9eaa3c912f1ce795a7743 node-v18.20.0-linux-s390x.tar.xz +80620426d177141aa99376de2ad1cb5ed461104cc53c0a5334df91467c60cac3 node-v18.20.0-linux-x64.tar.gz +03eea148e56785babb27930b05ed6bf311aaa3bc573c0399dd63cad2fe5713c7 node-v18.20.0-linux-x64.tar.xz +e09a80c95d1c6fa705542e3cd7e9215531f2bf90d0542526e578002294c46469 node-v18.20.0.pkg +6961be205e1f88272fbcfced2d07febf2a708fc1f2aa8fac5f383448d900da92 node-v18.20.0.tar.gz +04c86779a2cc7eefdfcf379a9d85883aa1d3b1dc8909b6221b163684817856a4 node-v18.20.0.tar.xz +ba9dfcc964e81e75561167b0b091160ceb597b19708bb8241e78691900d93e7a node-v18.20.0-win-x64.7z +1c0aab05cc6836a8f5148cca345b92ebc948a4a2013f18d117b7ade6ff05aca6 node-v18.20.0-win-x64.zip +ad51c028ff4dc4f6c7db894c754aed68efda69356ffc1bc9de590ff223cbd278 node-v18.20.0-win-x86.7z +c2f7a0e7a72f129a7a0873967d146a4076e313535b28f89af86f28581d801929 node-v18.20.0-win-x86.zip +bd0c8b9395d3d557100dce101b4389e287d6d738d2631cb05f1977c9544c561b node-v18.20.0-x64.msi +43b21eae9afb028c8063e75ea813367b1882f9a89dd0e3689b4dbc782b4c3b6e node-v18.20.0-x86.msi +fc346b6005bc3e499c785b666b6eaa12f5472fdc1f8974ec06e420cc9e24084d win-x64/node.exe +64d93225aaece04e3cd45177d6dea2b22df49e127281fefa3ade43ac46a36cc6 win-x64/node.lib +0578c4eafc0fe3ffac13939040d15a1e0e139ea03a2cdae9139541a1f7c656e9 win-x64/node_pdb.7z +33e7f2df6ffa215818f8c5b312792f56d673166b36e289cb8457aa838ba217b6 win-x64/node_pdb.zip +e43c9c39ff9901946ece51078e15c54abe95a46f0eace502edc4fe562aed0e53 win-x86/node.exe +df34047e8ae646e6f43d76ecbec9709a185f29e01f49b377c4c46070cacc2859 win-x86/node.lib +cbc76028e2d28cd95ca8d1c8cac7bf5b524bebcc6ad9421a2dbfb4f4dc1e1164 win-x86/node_pdb.7z +2fc78e5e09afdbbed40fe39fc4b12bf139af67c00226da82d204b567dfb43fe2 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEyC+jrhy+3Gvka5NgxDzsRcF6uTwFAmYDChEACgkQxDzsRcF6 +uTz8jw//UcblZ55SqS9lJdJsPN7tVSH05QwBmBKvOUxd3jr83Ljgu3wKxXQj5S/c +Pnvlhm4LK8FtoAT/US+fhe+RCtYtic+M0dzhq7Boe55rDvsxeUGlA8qKcQY7+snj +hS6tQYMYvW+4HZrmdZ1HcC5bs86kAgmj29I3XCOrAKVNkf/VZ/JSH/1oBky2b6PK +QKFKUM5Z5SG/hnSedrpnoNf1udYd4BJalwic9txLLXU2Xu1JcuIU9Sukw9Vb5H+9 +MNlOvYJpk8vlimvwa71+bwCBIYnksvABpYilm55XZ8c0Hfu4slJl+adDp8O7pEj3 +TcX4j4QT0z+z6XiRIAPA0JIWYNVVPqtNKyx6uAReEwCNgjKrlwNe6JiTcg0shbnr +rTVtwuOOB+PFNl0DZ63HIaPp+368T2cbLlVLb8wb6tSeA9qgI2qAOk9MiWLHUFCu +M/6IlZUoB2MBKjtmvs+y7mCCqcUN++L3+2j9A1qTv6omvV+xroUo74JgrMim4LN4 +fTGesVB3hPwNOHTSdQTT8Kwxc6N+WKhPJk1rbEVMYemTPrZX2+zOwr9lm7XeLUPI +ZhyjbP1ihJ4rVaES4FCUdcDURXS3fyi+lkrt474SJs6Cb1tJB+WlQv0a4GYKh/o0 +A21oK7PXHqanzKvUAlDjs5cR+p5OMrXUCCVO3VaSmfmnpsFHAbI= +=UXp/ +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v18.20.1.md b/pages/en/blog/release/v18.20.1.md new file mode 100644 index 0000000000000..a0946dd686b75 --- /dev/null +++ b/pages/en/blog/release/v18.20.1.md @@ -0,0 +1,97 @@ +--- +date: '2024-04-03T14:27:39.936Z' +category: release +title: Node v18.20.1 (LTS) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-03, Version 18.20.1 'Hydrogen' (LTS), @RafaelGSS + +This is a security release. + +### Notable Changes + +- CVE-2024-27983 - Assertion failed in node::http2::Http2Session::\~Http2Session() leads to HTTP/2 server crash- (High) +- CVE-2024-27982 - HTTP Request Smuggling via Content Length Obfuscation - (Medium) +- llhttp version 9.2.1 +- undici version 5.28.4 + +### Commits + +- \[[`60d24938de`](https://github.com/nodejs/node/commit/60d24938de)] - **deps**: update undici to v5.28.4 (Matteo Collina) [nodejs-private/node-private#577](https://github.com/nodejs-private/node-private/pull/577) +- \[[`5d4d5848cf`](https://github.com/nodejs/node/commit/5d4d5848cf)] - **http**: do not allow OBS fold in headers by default (Paolo Insogna) [nodejs-private/node-private#558](https://github.com/nodejs-private/node-private/pull/558) +- \[[`0fb816dbcc`](https://github.com/nodejs/node/commit/0fb816dbcc)] - **src**: ensure to close stream when destroying session (Anna Henningsen) [nodejs-private/node-private#561](https://github.com/nodejs-private/node-private/pull/561) + +Windows 32-bit Installer: https://nodejs.org/dist/v18.20.1/node-v18.20.1-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v18.20.1/node-v18.20.1-x64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v18.20.1/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v18.20.1/win-x64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v18.20.1/node-v18.20.1.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v18.20.1/node-v18.20.1.tar.gz \ +Other release files: https://nodejs.org/dist/v18.20.1/ \ +Documentation: https://nodejs.org/docs/v18.20.1/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +a1dc083f3795ad304150759ee38d4b9c0ba541ac36629e6a0a2d8ea5f2c09e39 node-v18.20.1-aix-ppc64.tar.gz +275ffd6e96ea38e0ce0db2a37950381102fc95d1ad863b360ba0889dc7190405 node-v18.20.1-darwin-arm64.tar.gz +c55de6b8a916eab340b3ca104fbcc9fa345f37c36393c99b84dee0fa20b8924f node-v18.20.1-darwin-arm64.tar.xz +87d6c6e5df6c4615ca90b044c75dc112473df4ebd55f6f471740c4e1c9602cbe node-v18.20.1-darwin-x64.tar.gz +8d70c5ff18843b0d0a7117f77f5b5933e763c799172ce559427f7c84b9ee9b36 node-v18.20.1-darwin-x64.tar.xz +af15f373928f572f46014bc37631e7b7e882dd854049bef40c8c27eaabcf565b node-v18.20.1-headers.tar.gz +53139e1027485211374378d8e5eedb19e64aa81e93ab3a7135be4527b1a16baf node-v18.20.1-headers.tar.xz +52896372b3b151f639be7efa8662d68aaeb065cae2c15d61d14e2b73ada79597 node-v18.20.1-linux-arm64.tar.gz +613d0ea027fc5c16087d2b69f57d1e07dd1effcd3773910b6594672aee1fd4cd node-v18.20.1-linux-arm64.tar.xz +b61392490e84cc6050967bbfc59cfd9ad6e737b6db9ef9d479b0d79c900aef64 node-v18.20.1-linux-armv7l.tar.gz +29bc1aae2200f59018bd7f3bd8c61afcf3b919177ff481d6404e5ae3a84ccc9b node-v18.20.1-linux-armv7l.tar.xz +69e0c2d291c0838f01f157fc4713cc86c803396c6c25524397339946cf31a4cb node-v18.20.1-linux-ppc64le.tar.gz +65a26b6dcb70c31ac47fbfc5688e62254962797289eed58365d40e2f54fb51d3 node-v18.20.1-linux-ppc64le.tar.xz +39793752b0ef9abe39ff942bbd3e442d71990f0592b3b0805252adb1b9c78e21 node-v18.20.1-linux-s390x.tar.gz +0eec4f8ab556ac78b68d74b5c24bbc79e9daa4ba53ca7faa20ab4ee6b87fcc7b node-v18.20.1-linux-s390x.tar.xz +d226c39c5546dca97567db8f8ca7f92fca6572d44f181b1f85af83eee5d6f9e1 node-v18.20.1-linux-x64.tar.gz +1d08285abd9fad971af5c73d13e8f2a6ae9f2906ee036095dad7d5c286642a4e node-v18.20.1-linux-x64.tar.xz +8a221a68978ab630a12e6ff5bf03a0f0fae521147210d2c36ba7450d387a237e node-v18.20.1-win-x64.7z +5af456705d267507cd4be0572d787f85a42fa239e1a9dc5458d02a9ee76d223c node-v18.20.1-win-x64.zip +7937811a1ddec32428dc4d05a0d62d5c81dcb61426a56bfe34e66681e3cc230d node-v18.20.1-win-x86.7z +6dfc810fdb4511ab32c1da4faa934c6bae9c2bc305734efe58761398ac68f5f3 node-v18.20.1-win-x86.zip +6191ea9f02bd1087a90efce0f7118f0db33c66aee010463551602074f1cdcdad node-v18.20.1-x64.msi +5587c3603752b1b406935118d8a923327a71da93d082d6e566c650be4d4e629c node-v18.20.1-x86.msi +675c340469f6f71bbcc77f4c18bb480ecdab9c953059f571ef6f7794cd09d6e8 node-v18.20.1.pkg +7fb430d0b1256c22f26dd321070182ab943005bdb7b738facc6d9a82b1e04ed7 node-v18.20.1.tar.gz +c6d867a9f25e6354810effb8201f8147a15b28000e50790fda00d1ca15f49b8a node-v18.20.1.tar.xz +8d36d351b7bc1e21a3f196cc12f3c1dc3ebd54bc8b8b678f254c6589faa8799f win-x64/node.exe +64d93225aaece04e3cd45177d6dea2b22df49e127281fefa3ade43ac46a36cc6 win-x64/node.lib +99765d9956720edfe1cd7429fd04e2bdf0cf2bc8fb419d58a69dd8fd4a0de608 win-x64/node_pdb.7z +a84fffe06ab69f15b9b32bed9aac330e45e2b10129ce38d0bbd00f917511af15 win-x64/node_pdb.zip +c286ee6d2188037e33a643f112553a1c20bb7ba74428a180d7cdeec2975f8fc6 win-x86/node.exe +df34047e8ae646e6f43d76ecbec9709a185f29e01f49b377c4c46070cacc2859 win-x86/node.lib +76612ed31fcff457141de2eafcf3d4e4ca7f6e080c4068f0f9b9ac25248c23b7 win-x86/node_pdb.7z +c02dcf9dba6277c9f1edb9dbf325c076af9e1846ca2c465638021f8e4314bbcf win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYNYkAACgkQi+q0389V +XvQ9iwv+KA3oor0FgQlo9TOa9i7af1ToNqsuwUwiCNH/vaRc+Mwau9cjX9FPCrqZ +bNoDX0rZ/xCdVt7AwFh5c556iMrywk835sujk1ixI0vPQrgjj1aXjQBLlIiR7drq +GUMTjR5qB7JD1iaKpOtfaOiAYbAzkH5uc0eIMKv70xhf7AIbd7exYNvCOB93T3Mo +Dfkm3xD/CZ9eARRSRCco4jgOko4fdPdaRsRFC9QJ0/dwaM0YirDUk8kR08I+MDvm +MF9m/QKzntScGnUagfsXGSPg4HoQCw01YvMZ5LTwlfwWI1oIfYddJGfUwlizMhLi +RdVCaSyL4wyfrMEa78if8rT4wp95HoV/TpjtEngZ+S0ZxHDa80Sbo8GxXVYCWnvx +pDXDih0hLmSc2OBcys9s9oP5ni8gwpH+gXHfr+KPRZxwYYAWHD4BFWSBE62QalUD +qqN28ffuLTC+TC6rUbt6i/NlHZCkMJB6+Ju+P4pdu9cmy4s/ofKeja0tLIvEa/vj +n9up2jbC +=zFXW +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v18.20.2.md b/pages/en/blog/release/v18.20.2.md new file mode 100644 index 0000000000000..5033a350849d7 --- /dev/null +++ b/pages/en/blog/release/v18.20.2.md @@ -0,0 +1,92 @@ +--- +date: '2024-04-10T16:36:35.678Z' +category: release +title: Node v18.20.2 (LTS) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-10, Version 18.20.2 'Hydrogen' (LTS), @RafaelGSS + +This is a security release. + +### Notable Changes + +- CVE-2024-27980 - Command injection via args parameter of `child_process.spawn` without shell option enabled on Windows + +### Commits + +- \[[`6627222409`](https://github.com/nodejs/node/commit/6627222409)] - **src**: disallow direct .bat and .cmd file spawning (Ben Noordhuis) [nodejs-private/node-private#564](https://github.com/nodejs-private/node-private/pull/564) + +Windows 32-bit Installer: https://nodejs.org/dist/v18.20.2/node-v18.20.2-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v18.20.2/node-v18.20.2-x64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v18.20.2/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v18.20.2/win-x64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v18.20.2/node-v18.20.2.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v18.20.2/node-v18.20.2-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v18.20.2/node-v18.20.2.tar.gz \ +Other release files: https://nodejs.org/dist/v18.20.2/ \ +Documentation: https://nodejs.org/docs/v18.20.2/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +f335733f4ae95fdb1c1011a59d79194768ad9d29c12fd07409163439944ee5dd node-v18.20.2-aix-ppc64.tar.gz +2647d831f16b3dc7857ed4ee721d3c378194918ecda80b9471590250d328fa3c node-v18.20.2-darwin-arm64.tar.gz +726e87689ac033ef73cb8041cc5e96c904a6e59971258008f17ee74c6ff4854b node-v18.20.2-darwin-arm64.tar.xz +e26d8074da6d22ed23140e0ba964cba9c694f9b839ce48835d692a7a7e36421e node-v18.20.2-darwin-x64.tar.gz +81d58aaadca73637ded8c6944980e4a66a1dc2b0eeaa7c380252912907fd8ccd node-v18.20.2-darwin-x64.tar.xz +b31e5d82fb327373f7119fef3d1ee67b140a23c198e0f44f44b2e4ff9b3f29e5 node-v18.20.2-headers.tar.gz +6f3be52bfb4a8ecaea29ed8dbdb86694cdbae19334dc65cc2c982243b102978a node-v18.20.2-headers.tar.xz +0b21ad5a11dd6c59a62eb34d1a0c2af28fe29187fa60da2c993b7cdf2a5a2f28 node-v18.20.2-linux-arm64.tar.gz +be36d2ad5842a7a9456b7de32fcc9656a6e0a79edab5f14ac05479d2eef2aa0e node-v18.20.2-linux-arm64.tar.xz +adc55a8a594882b72967b05a4e47b4911879eeb44477f9447e05c84d420797ac node-v18.20.2-linux-armv7l.tar.gz +19f0964f36a88546f73d4eb95e40b047d08205ed078061d2e4e9078e802231e8 node-v18.20.2-linux-armv7l.tar.xz +40193c181756789bb53130d5c96cfacb2e90dff3a5ef196014d4df8d9cecd6ba node-v18.20.2-linux-ppc64le.tar.gz +7844f4d19174826b3c5162a92a0f6c7f028d324df4d59684e3e7ae40980358ed node-v18.20.2-linux-ppc64le.tar.xz +3c56d6addf76802c5f4e28dfccf4919c1affdf7d47937b4df902250e72eeca89 node-v18.20.2-linux-s390x.tar.gz +08cb2f45228d9d812b107a15656316da99a79b0b4e69c7b33635ed96b5565647 node-v18.20.2-linux-s390x.tar.xz +a222595d353a7d1e48994a7d9c25e61ab1b8a1b0ce0652029f5cf999978b2e49 node-v18.20.2-linux-x64.tar.gz +d0584a21d83d710f947b210434449f6d2a65d14975d6fe9aaf430aae79dc312b node-v18.20.2-linux-x64.tar.xz +9d2e3bcf978c511e8e635686623da2ea59efe1b9111e58ba8f23e531ffa65028 node-v18.20.2-win-x64.7z +1b7dde318fad3110db1d597184e78d327816e61eef340323765d86f7481babe6 node-v18.20.2-win-x64.zip +6327b08558db40b5426f814dc24afdc4e290ec29ca6f3dd36b8b43dd1862e2af node-v18.20.2-win-x86.7z +7fde182306cb446dbecb732b897fe740d935d848810fed2aa87f56e2e31ea32b node-v18.20.2-win-x86.zip +e2ea83c8a392bb46e1841eca510f600cfa8c5dc0750d29d42fcf67b5672ac86b node-v18.20.2-x64.msi +e7a46aba0fe62db5fe3a81a85561e2a202bc90d637fc2eb7569ad68ad50d383a node-v18.20.2-x86.msi +7cc83750a77ff2d4666c75d08e01f3027a4ab412894fe077e62e675fac739b11 node-v18.20.2.pkg +68c165b9ceb7bc69dcdc75c6099723edb5ff0509215959af0775ed426174c404 node-v18.20.2.tar.gz +8aaea7c9c7e927fb09d91498da311b6e4d18233390e23c723a53b891fad4c73f node-v18.20.2.tar.xz +797de9af018be0ad307cdd22ce4451c17c2dfb27e154b4ad475147d42872bdde win-x64/node.exe +64d93225aaece04e3cd45177d6dea2b22df49e127281fefa3ade43ac46a36cc6 win-x64/node.lib +cffbcf594d0006eaad4045d7bc4995a09a8003843f95fda44b59802a136e1e99 win-x64/node_pdb.7z +0017d7b5ea6faa281b559a002f8b52042099cad98c82e6b22b5767f6b0f15015 win-x64/node_pdb.zip +adb9e06c6f51b6eab819abd92b345d372b432a38ea130b698f81aab7c57641f1 win-x86/node.exe +df34047e8ae646e6f43d76ecbec9709a185f29e01f49b377c4c46070cacc2859 win-x86/node.lib +2316a8b568e4d30201faf627026f008d112482bb04308e1b86acea6c9a886b5c win-x86/node_pdb.7z +c35ab3d6ca6500988b326817c8921d89b1eccc5d11cef0cc9b6cd672030744a4 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYWvnAACgkQi+q0389V +XvRMkQv/f3bvkK2Q1jjsBGN+STmkeOrusk2zykA5ypDxMookxZwFFPHQxGqVJY4D +hNsoYEYEbhnPcM+cHp4ba4GKfYtjJyUACStwDRzO6lFI6nLZs0FrSSIjmc/2Q5Rp +IKuW2PQ5iAZz8M5PjI8Y4OMCDj1e4JChRgh1uLSkSLYg/G7YF/rcUDuVj4dHFdPb +61UTCqkI8kHVwTG4vMxJjCJYlHMkXmQ4VJ2ku8NHzPzBW3Vshdy0fISpImCGcSSJ +Bc995Roeh2hO5takxZ84m64YUxSGHDcBHow8i1uhpfIo8Ryow2ngDXjqsjXeiUbH +eqKz8tKd76/GQvGdWk/fKBDOEnLN5LTnu+aBQCCfSLSGjwIJErZ4+FZwaFqN+Dnq +y9+RRUYBKOgnZirOmzBqmMwJsSMq8MMKJxkSOWpb4RSQLsMNBNT9mHmB3v7GXFvt +JcSzij7LI/9cbmjdvACUJXAKY2eVkIhU36kpgJ1G12w2Kv06uts4uMNWj2ImEU9c +/i6OcSNN +=LyPd +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v18.20.3.md b/pages/en/blog/release/v18.20.3.md new file mode 100644 index 0000000000000..4c0f46da58f55 --- /dev/null +++ b/pages/en/blog/release/v18.20.3.md @@ -0,0 +1,148 @@ +--- +date: '2024-05-21T12:13:37.812Z' +category: release +title: Node v18.20.3 (LTS) +layout: blog-post +author: Richard Lau +--- + +## 2024-05-21, Version 18.20.3 'Hydrogen' (LTS), @richardlau + +### Notable Changes + +This release fixes a regression introduced in Node.js 18.19.0 where `http.server.close()` was incorrectly closing idle connections. + +A fix has also been included for compiling Node.js from source with newer versions of Clang. + +The list of keys used to sign releases has been synchronized with the current list from the `main` branch. + +#### Updated dependencies + +- acorn updated to 8.11.3. +- acorn-walk updated to 8.3.2. +- ada updated to 2.7.8. +- c-ares updated to 1.28.1. +- corepack updated to 0.28.0. +- nghttp2 updated to 1.61.0. +- ngtcp2 updated to 1.3.0. +- npm updated to 10.7.0. Includes a fix from npm\@10.5.1 to limit the number of open connections [npm/cli#7324](https://github.com/npm/cli/pull/7324). +- simdutf updated to 5.2.4. +- zlib updated to 1.3.0.1-motley-7d77fb7. + +### Commits + +- \[[`0c260e10e7`](https://github.com/nodejs/node/commit/0c260e10e7)] - **deps**: update zlib to 1.3.0.1-motley-7d77fb7 (Node.js GitHub Bot) [#52516](https://github.com/nodejs/node/pull/52516) +- \[[`1152d7f919`](https://github.com/nodejs/node/commit/1152d7f919)] - **deps**: update zlib to 1.3.0.1-motley-24c07df (Node.js GitHub Bot) [#52199](https://github.com/nodejs/node/pull/52199) +- \[[`755399db9d`](https://github.com/nodejs/node/commit/755399db9d)] - **deps**: update zlib to 1.3.0.1-motley-24342f6 (Node.js GitHub Bot) [#52123](https://github.com/nodejs/node/pull/52123) +- \[[`af3e32073b`](https://github.com/nodejs/node/commit/af3e32073b)] - **deps**: update ada to 2.7.8 (Node.js GitHub Bot) [#52517](https://github.com/nodejs/node/pull/52517) +- \[[`e4ea2db58b`](https://github.com/nodejs/node/commit/e4ea2db58b)] - **deps**: update c-ares to 1.28.1 (Node.js GitHub Bot) [#52285](https://github.com/nodejs/node/pull/52285) +- \[[`14e857bea2`](https://github.com/nodejs/node/commit/14e857bea2)] - **deps**: update corepack to 0.28.0 (Node.js GitHub Bot) [#52616](https://github.com/nodejs/node/pull/52616) +- \[[`7f5dd44ca6`](https://github.com/nodejs/node/commit/7f5dd44ca6)] - **deps**: upgrade npm to 10.7.0 (npm team) [#52767](https://github.com/nodejs/node/pull/52767) +- \[[`78f84ebb09`](https://github.com/nodejs/node/commit/78f84ebb09)] - **deps**: update ngtcp2 to 1.3.0 (Node.js GitHub Bot) [#51796](https://github.com/nodejs/node/pull/51796) +- \[[`1f489a3753`](https://github.com/nodejs/node/commit/1f489a3753)] - **deps**: update ngtcp2 to 1.2.0 (Node.js GitHub Bot) [#51584](https://github.com/nodejs/node/pull/51584) +- \[[`3034968225`](https://github.com/nodejs/node/commit/3034968225)] - **deps**: update ngtcp2 to 1.1.0 (Node.js GitHub Bot) [#51319](https://github.com/nodejs/node/pull/51319) +- \[[`1aa9da467f`](https://github.com/nodejs/node/commit/1aa9da467f)] - **deps**: add nghttp3/\*\*/.deps to .gitignore (Luigi Pinca) [#51400](https://github.com/nodejs/node/pull/51400) +- \[[`28c0c78c9a`](https://github.com/nodejs/node/commit/28c0c78c9a)] - **deps**: update ngtcp2 and nghttp3 (James M Snell) [#51291](https://github.com/nodejs/node/pull/51291) +- \[[`8fd5a35364`](https://github.com/nodejs/node/commit/8fd5a35364)] - **deps**: upgrade npm to 10.5.2 (npm team) [#52458](https://github.com/nodejs/node/pull/52458) +- \[[`2c53ff31c9`](https://github.com/nodejs/node/commit/2c53ff31c9)] - **deps**: update acorn-walk to 8.3.2 (Node.js GitHub Bot) [#51457](https://github.com/nodejs/node/pull/51457) +- \[[`12f28f33c2`](https://github.com/nodejs/node/commit/12f28f33c2)] - **deps**: update acorn to 8.11.3 (Node.js GitHub Bot) [#51317](https://github.com/nodejs/node/pull/51317) +- \[[`dddb7eb3e0`](https://github.com/nodejs/node/commit/dddb7eb3e0)] - **deps**: update acorn-walk to 8.3.1 (Node.js GitHub Bot) [#50457](https://github.com/nodejs/node/pull/50457) +- \[[`c86550e607`](https://github.com/nodejs/node/commit/c86550e607)] - **deps**: update acorn-walk to 8.3.0 (Node.js GitHub Bot) [#50457](https://github.com/nodejs/node/pull/50457) +- \[[`9500817f66`](https://github.com/nodejs/node/commit/9500817f66)] - **deps**: update acorn to 8.11.2 (Node.js GitHub Bot) [#50460](https://github.com/nodejs/node/pull/50460) +- \[[`7a8c7b6275`](https://github.com/nodejs/node/commit/7a8c7b6275)] - **deps**: update ada to 2.7.7 (Node.js GitHub Bot) [#52028](https://github.com/nodejs/node/pull/52028) +- \[[`b199889943`](https://github.com/nodejs/node/commit/b199889943)] - **deps**: update corepack to 0.26.0 (Node.js GitHub Bot) [#52027](https://github.com/nodejs/node/pull/52027) +- \[[`052b0ba0c6`](https://github.com/nodejs/node/commit/052b0ba0c6)] - **deps**: upgrade npm to 10.5.1 (npm team) [#52351](https://github.com/nodejs/node/pull/52351) +- \[[`209823d3af`](https://github.com/nodejs/node/commit/209823d3af)] - **deps**: update simdutf to 5.2.4 (Node.js GitHub Bot) [#52473](https://github.com/nodejs/node/pull/52473) +- \[[`5114cbe18a`](https://github.com/nodejs/node/commit/5114cbe18a)] - **deps**: update simdutf to 5.2.3 (Yagiz Nizipli) [#52381](https://github.com/nodejs/node/pull/52381) +- \[[`be30309ea0`](https://github.com/nodejs/node/commit/be30309ea0)] - **deps**: update simdutf to 5.0.0 (Daniel Lemire) [#52138](https://github.com/nodejs/node/pull/52138) +- \[[`b56f66e250`](https://github.com/nodejs/node/commit/b56f66e250)] - **deps**: update simdutf to 4.0.9 (Node.js GitHub Bot) [#51655](https://github.com/nodejs/node/pull/51655) +- \[[`a9f3b9d9d1`](https://github.com/nodejs/node/commit/a9f3b9d9d1)] - **deps**: update nghttp2 to 1.61.0 (Node.js GitHub Bot) [#52395](https://github.com/nodejs/node/pull/52395) +- \[[`1b6fa70620`](https://github.com/nodejs/node/commit/1b6fa70620)] - **deps**: update nghttp2 to 1.60.0 (Node.js GitHub Bot) [#51948](https://github.com/nodejs/node/pull/51948) +- \[[`3c9dbbf4d4`](https://github.com/nodejs/node/commit/3c9dbbf4d4)] - **deps**: update nghttp2 to 1.59.0 (Node.js GitHub Bot) [#51581](https://github.com/nodejs/node/pull/51581) +- \[[`e28316da54`](https://github.com/nodejs/node/commit/e28316da54)] - **deps**: update nghttp2 to 1.58.0 (Node.js GitHub Bot) [#50441](https://github.com/nodejs/node/pull/50441) +- \[[`678641f470`](https://github.com/nodejs/node/commit/678641f470)] - **deps**: V8: cherry-pick d15d49b09dc7 (Bo Anderson) [#52337](https://github.com/nodejs/node/pull/52337) +- \[[`1147fee7d9`](https://github.com/nodejs/node/commit/1147fee7d9)] - **doc**: remove ableist language from crypto (Jamie King) [#52063](https://github.com/nodejs/node/pull/52063) +- \[[`5e93eae972`](https://github.com/nodejs/node/commit/5e93eae972)] - **doc**: add release key for marco-ippolito (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`6689a98488`](https://github.com/nodejs/node/commit/6689a98488)] - **http**: remove closeIdleConnections function while calling server close (Kumar Rishav) [#52336](https://github.com/nodejs/node/pull/52336) +- \[[`71616e8a8a`](https://github.com/nodejs/node/commit/71616e8a8a)] - **node-api**: make tsfn accept napi_finalize once more (Gabriel Schulhof) [#51801](https://github.com/nodejs/node/pull/51801) +- \[[`d9d9e62474`](https://github.com/nodejs/node/commit/d9d9e62474)] - **src**: avoid draining platform tasks at FreeEnvironment (Chengzhong Wu) [#51290](https://github.com/nodejs/node/pull/51290) +- \[[`e5fc8ec9fc`](https://github.com/nodejs/node/commit/e5fc8ec9fc)] - **test**: skip v8-updates/test-linux-perf (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`351ef189ca`](https://github.com/nodejs/node/commit/351ef189ca)] - **test**: v8: Add test-linux-perf-logger test suite (Luke Albao) [#50352](https://github.com/nodejs/node/pull/50352) +- \[[`5cec2efc31`](https://github.com/nodejs/node/commit/5cec2efc31)] - **test**: reduce the number of requests and parsers (Luigi Pinca) [#50240](https://github.com/nodejs/node/pull/50240) +- \[[`5186e453d9`](https://github.com/nodejs/node/commit/5186e453d9)] - **test**: deflake test-http-regr-gh-2928 (Luigi Pinca) [#49574](https://github.com/nodejs/node/pull/49574) +- \[[`c60cd67e1c`](https://github.com/nodejs/node/commit/c60cd67e1c)] - **test**: skip test for dynamically linked OpenSSL (Richard Lau) [#52542](https://github.com/nodejs/node/pull/52542) + +Windows 32-bit Installer: https://nodejs.org/dist/v18.20.3/node-v18.20.3-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v18.20.3/node-v18.20.3-x64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v18.20.3/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v18.20.3/win-x64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v18.20.3/node-v18.20.3.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v18.20.3/node-v18.20.3-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v18.20.3/node-v18.20.3.tar.gz \ +Other release files: https://nodejs.org/dist/v18.20.3/ \ +Documentation: https://nodejs.org/docs/v18.20.3/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +6a1a5c5b1c2c0aec48b8070d50403ef5dbe9ecb9d69c687849183d190d597ac8 node-v18.20.3-aix-ppc64.tar.gz +99328b985f7336a8fcfb62fda382155d210979fcca928e2dd75b7148d9bba636 node-v18.20.3-darwin-arm64.tar.gz +e37a21a764ac97077dd06f9aff273e27e997fed7d2b4f9ed4c5bf023e3446d37 node-v18.20.3-darwin-arm64.tar.xz +317a4607390c923610303e8583972e23fb656e9d348d3740bde0f1a94cdb7e0c node-v18.20.3-darwin-x64.tar.gz +04df598874fa15c968a1123ce8fabc26d7a2270a11cec6e5859aca67341004dd node-v18.20.3-darwin-x64.tar.xz +a76c43a7829493e710d7aaaf335c1b4884a6356f8ae4497e26389255095b84af node-v18.20.3-headers.tar.gz +75a5ce13c010e31fa0ff72338678e1c8c46ae8ef7e97acb8fa1c406c55d2affa node-v18.20.3-headers.tar.xz +7aab1e72b5f214ae08895ca0cfbf68e1731d53a6ebf945b929446564f2cc80d8 node-v18.20.3-linux-arm64.tar.gz +3c497c19ddbf75bab7fecb36ddf1738622f0ba244aa1e0aebc70e46daf1a0794 node-v18.20.3-linux-arm64.tar.xz +eb51ef4a1e1a4c33bfeb658547498c676bf467f660169ac0453961e54fd60285 node-v18.20.3-linux-armv7l.tar.gz +d5c6efda2f88718556cd0d6df4cc5adadc4f24aef80c63c3dbd54b1ecf34f52c node-v18.20.3-linux-armv7l.tar.xz +7d338eb66e3cd4a89a0682ddc5135a5037fbe2ce20327d467f01ef07ec74b3bf node-v18.20.3-linux-ppc64le.tar.gz +41c3e3d36d0ba6654612c424ad8aba63b6e92f451332eaad9e92286ed8a5a434 node-v18.20.3-linux-ppc64le.tar.xz +1e5aedfcb010581ba1527ae159079d7845ef9c0598bf7f915e2c3f8d1d473c11 node-v18.20.3-linux-s390x.tar.gz +6c71cb6f491217755e9703a7c7d950476ca99d30aca20c97c5bced432732957c node-v18.20.3-linux-s390x.tar.xz +262bdd5d59608360cb872cdb3d2aa089867b46963ec7e6a000c1afc7d183db5c node-v18.20.3-linux-x64.tar.gz +ffd6147c263b81016742dc1e72dc68885a3ca9b441d9744f9b76cad362d0cc5f node-v18.20.3-linux-x64.tar.xz +924cbd6ac35512b26180ee18f4a926ef3cf9adf8cf981a39882ba1dc19e82fcf node-v18.20.3.pkg +f35c9b9923c7b2e9243e7e2d10cd9ae61fbd5b925df3debbb72d5a70dbff555d node-v18.20.3.tar.gz +4b144f9fd6ae4b1d62b732c5b3160e7b9e84be4af0ae062c7b484e89ea41ae8d node-v18.20.3.tar.xz +61fd506729f6f0754f16c94b6d497b79f8f444892248ecefd3c5b6a20ae3db07 node-v18.20.3-win-x64.7z +8e91df18904f9cc2950dca17b737e779dbd780c7b7a2192458d42af901c8f2d3 node-v18.20.3-win-x64.zip +0ebd20313ddfa478b8d5e1510283133cfd1ba55694964da8beae7a2dbc278d4b node-v18.20.3-win-x86.7z +5db6c8a093cc8fa9ed6060a35a735c6cf811d3d5ed6b1e3fb7856708dda515d4 node-v18.20.3-win-x86.zip +073a9a13c5b29c5a5b2cc4ddb0b52a53c569e9871fd377bb706a0a7b608168e4 node-v18.20.3-x64.msi +dcbc42e359ca40093ffc960267cc45e2f73dadbd6065ceb396f9eeeacd0f2d8d node-v18.20.3-x86.msi +c0f2ecac65797fe24e50252edf718fea2942cb1e1b0a835c72f7b1bb1ff1d2b1 win-x64/node.exe +64d93225aaece04e3cd45177d6dea2b22df49e127281fefa3ade43ac46a36cc6 win-x64/node.lib +ca82b6df70c106f3d481b4a122c272f8c7530d848c08508a8e82a892d2ef7da7 win-x64/node_pdb.7z +ac40c2f3398e221774283e81e982a51de87019a54c790c4dadb8d4361e671c25 win-x64/node_pdb.zip +4e8adabd5d59a52696cbccb3eb0e583056ad59419981e072374a7972bc733ac3 win-x86/node.exe +df34047e8ae646e6f43d76ecbec9709a185f29e01f49b377c4c46070cacc2859 win-x86/node.lib +cd6b2a6f63e59dcfb05a09572be4180934104b000ecff4bb5850f19ba50f2b2e win-x86/node_pdb.7z +57c5cb6076555ff8d3f65b0a8ea63935a415832a91f6d69d091fe35d75f6034d win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEyC+jrhy+3Gvka5NgxDzsRcF6uTwFAmZMja0ACgkQxDzsRcF6 +uTxcWRAAnhHAP6BDQtkHViQJgs0cirIE+SSznnAql2YOGmzxYyK25pEwcOj0od7n +GbhSX2GdVElR/MeVTa1GbDozAWAzRkurKBDyHHjdRrRbBbXLlqOUCy6EQoMmVA9c +j5TIvkVhi4UFQcyH4JnM2ZKPbnd0TvOoz4S5svmmQVd9UMe9MhZoHlEe3Uw5QdVO +5xk9UpzPWLhVS0YQFwaITj5xe/3j/zaEWDqSB/JMrg6M7D2ZjGpTGw0bmNo8DCdc +x7RSDobmIAj7CkevOUTTj4KIJk2ha/37xIT+j7aZCtAk4ORZ1xhrNTigH63Uw9et +YK6GWsSLTItGEpaf3KAtFB+nUn2nAWXEJG5kJ8ko1p5oslfCrfE7s7VFn4x5C81n +b750hJZSiZTDOAn8iA8MzcTHuHYTZyRrIeC0WErqep8ba5kbDss4rGJuFi3IOP5U +RSST62zTTPrA3o9wtsNQ7fuBE5kIMNFks34VVJ/uqn2Auz+YuLDaVmMvjnAzE/Wd +7d7RU/tt/fYP7gfVeJPBmai+4FUs/YDKykNVX6+TDmYimbgYrFj3JpypK8NoUKzW +JPXUkAvVsZvQ0xz0E/WAyLwEOmHzIZQ+StKs45q0+dHHS3K5hftjSoKdxwf+JGD9 +iRpVTN1QBnblXmrlwHN0tVwcKDv5TCKRXkgk91P56cnExY6rd8A= +=rBjG +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.12.0.md b/pages/en/blog/release/v20.12.0.md new file mode 100644 index 0000000000000..a8d5d9c46458a --- /dev/null +++ b/pages/en/blog/release/v20.12.0.md @@ -0,0 +1,719 @@ +--- +date: '2024-03-26T17:56:21.783Z' +category: release +title: Node v20.12.0 (LTS) +layout: blog-post +author: Richard Lau +--- + +## 2024-03-26, Version 20.12.0 'Iron' (LTS), @richardlau + +### Notable Changes + +#### crypto: implement crypto.hash() + +This patch introduces a helper crypto.hash() that computes +a digest from the input at one shot. This can be 1.2-2x faster +than the object-based createHash() for smaller inputs (<= 5MB) +that are readily available (not streamed) and incur less memory +overhead since no intermediate objects will be created. + +```js +const crypto = require('node:crypto'); + +// Hashing a string and return the result as a hex-encoded string. +const string = 'Node.js'; +// 10b3493287f831e81a438811a1ffba01f8cec4b7 +console.log(crypto.hash('sha1', string)); +``` + +Contributed by Joyee Cheung in [#51044](https://github.com/nodejs/node/pull/51044). + +#### Loading and parsing environment variables + +- `process.loadEnvFile(path)`: + + - Use this function to load the `.env` file. If no path is specified, it automatically loads the .env file in the current directory. Example: `process.loadEnvFile()`. + - Load a specific .env file by specifying its path. Example: `process.loadEnvFile('./development.env')`. + +- `util.parseEnv(content)`: + - Use this function to parse an existing string containing environment variable assignments. + - Example usage: `require('node:util').parseEnv('HELLO=world')`. + +Contributed by Yagiz Nizipli in [#51476](https://github.com/nodejs/node/pull/51476). + +#### New connection attempt events + +Three new events were added in the `net.createConnection` flow: + +- `connectionAttempt`: Emitted when a new connection attempt is established. In case of Happy Eyeballs, this might emitted multiple times. +- `connectionAttemptFailed`: Emitted when a connection attempt failed. In case of Happy Eyeballs, this might emitted multiple times. +- `connectionAttemptTimeout`: Emitted when a connection attempt timed out. In case of Happy Eyeballs, this will not be emitted for the last attempt. This is not emitted at all if Happy Eyeballs is not used. + +Additionally, a previous bug has been fixed where a new connection attempt could have been started after a previous one failed and after the connection was destroyed by the user. +This led to a failed assertion. + +Contributed by Paolo Insogna in [#51045](https://github.com/nodejs/node/pull/51045). + +#### Permission Model changes + +Node.js 20.12.0 comes with several fixes for the experimental permission model and two new semver-minor commits. +We're adding a new flag `--allow-addons` to enable addon usage when using the Permission Model. + +```console +$ node --experimental-permission --allow-addons +``` + +Contributed by Rafael Gonzaga in [#51183](https://github.com/nodejs/node/pull/51183) + +And relative paths are now supported through the `--allow-fs-*` flags. +Therefore, with this release one can use: + +```console +$ node --experimental-permission --allow-fs-read=./index.js +``` + +To give only read access to the entrypoint of the application. + +Contributed by Rafael Gonzaga and Carlos Espa in [#50758](https://github.com/nodejs/node/pull/50758). + +#### sea: support embedding assets + +Users can now include assets by adding a key-path dictionary +to the configuration as the `assets` field. At build time, Node.js +would read the assets from the specified paths and bundle them into +the preparation blob. In the generated executable, users can retrieve +the assets using the `sea.getAsset()` and `sea.getAssetAsBlob()` API. + +```json +{ + "main": "/path/to/bundled/script.js", + "output": "/path/to/write/the/generated/blob.blob", + "assets": { + "a.jpg": "/path/to/a.jpg", + "b.txt": "/path/to/b.txt" + } +} +``` + +The single-executable application can access the assets as follows: + +```cjs +const { getAsset } = require('node:sea'); +// Returns a copy of the data in an ArrayBuffer +const image = getAsset('a.jpg'); +// Returns a string decoded from the asset as UTF8. +const text = getAsset('b.txt', 'utf8'); +// Returns a Blob containing the asset without copying. +const blob = getAssetAsBlob('a.jpg'); +``` + +Contributed by Joyee Cheung in [#50960](https://github.com/nodejs/node/pull/50960). + +#### Support configurable snapshot through `--build-snapshot-config` flag + +We are adding a new flag `--build-snapshot-config` to configure snapshots through a custom JSON configuration file. + +```console +$ node --build-snapshot-config=/path/to/myconfig.json +``` + +When using this flag, additional script files provided on the command line will +not be executed and instead be interpreted as regular command line arguments. + +These changes were contributed by Joyee Cheung and Anna Henningsen in [#50453](https://github.com/nodejs/node/pull/50453) + +#### Text Styling + +- `util.styleText(format, text)`: This function returns a formatted text considering the `format` passed. + +A new API has been created to format text based on `util.inspect.colors`, enabling you to style text in different colors (such as red, blue, ...) and emphasis (italic, bold, ...). + +```cjs +const { styleText } = require('node:util'); +const errorMessage = styleText('red', 'Error! Error!'); +console.log(errorMessage); +``` + +Contributed by Rafael Gonzaga in [#51850](https://github.com/nodejs/node/pull/51850). + +#### vm: support using the default loader to handle dynamic import() + +This patch adds support for using `vm.constants.USE_MAIN_CONTEXT_DEFAULT_LOADER` as the +`importModuleDynamically` option in all vm APIs that take this option except `vm.SourceTextModule`. This allows users to have a shortcut to support dynamic `import()` in the compiled code without missing the compilation cache if they don't need customization of the loading process. We emit an experimental warning when the `import()` is actually handled by the default loader through this option instead of requiring `--experimental-vm-modules`. + +```js +const { Script, constants } = require('node:vm'); +const { resolve } = require('node:path'); +const { writeFileSync } = require('node:fs'); + +// Write test.js and test.txt to the directory where the current script +// being run is located. +writeFileSync( + resolve(__dirname, 'test.mjs'), + 'export const filename = "./test.json";' +); +writeFileSync(resolve(__dirname, 'test.json'), '{"hello": "world"}'); + +// Compile a script that loads test.mjs and then test.json +// as if the script is placed in the same directory. +const script = new Script( + `(async function() { + const { filename } = await import('./test.mjs'); + return import(filename, { with: { type: 'json' } }) + })();`, + { + filename: resolve(__dirname, 'test-with-default.js'), + importModuleDynamically: constants.USE_MAIN_CONTEXT_DEFAULT_LOADER, + } +); + +// { default: { hello: 'world' } } +script.runInThisContext().then(console.log); +``` + +Contributed by Joyee Cheung in [#51244](https://github.com/nodejs/node/pull/51244). + +#### Root certificates updated to NSS 3.98 + +Certificates added: + +- Telekom Security TLS ECC Root 2020 +- Telekom Security TLS RSA Root 2023 + +Certificates removed: + +- Security Communication Root CA + +#### Updated dependencies + +- acorn updated to 8.11.3. +- ada updated to 2.7.6. +- base64 updated to 0.5.2. +- brotli updated to 1.1.0. +- c-ares updated to 1.27.0. +- corepack updated to 0.25.2. +- ICU updated to 74.2. Includes CLDR 44.1 and Unicode 15.1. +- nghttp2 updated to 1.60.0. +- npm updated to 10.5.0. Fixes a regression in signals not being passed onto child processes. +- simdutf8 updated to 4.0.8. +- Timezone updated to 2024a. +- zlib updated to 1.3.0.1-motley-40e35a7. + +#### Other notable changes + +- \[[`4f49e9d000`](https://github.com/nodejs/node/commit/4f49e9d000)] - **(SEMVER-MINOR)** **build**: build opt to set local location of headers (Michael Dawson) [#51525](https://github.com/nodejs/node/pull/51525) +- \[[`ccdb01187b`](https://github.com/nodejs/node/commit/ccdb01187b)] - **doc**: add zcbenz to collaborators (Cheng Zhao) [#51812](https://github.com/nodejs/node/pull/51812) +- \[[`481af53aea`](https://github.com/nodejs/node/commit/481af53aea)] - **doc**: add lemire to collaborators (Daniel Lemire) [#51572](https://github.com/nodejs/node/pull/51572) +- \[[`5ba4d96525`](https://github.com/nodejs/node/commit/5ba4d96525)] - **(SEMVER-MINOR)** **http2**: add h2 compat support for appendHeader (Tim Perry) [#51412](https://github.com/nodejs/node/pull/51412) +- \[[`0861498e8b`](https://github.com/nodejs/node/commit/0861498e8b)] - **(SEMVER-MINOR)** **http2**: add server handshake utility (snek) [#51172](https://github.com/nodejs/node/pull/51172) +- \[[`6b08d006ee`](https://github.com/nodejs/node/commit/6b08d006ee)] - **(SEMVER-MINOR)** **http2**: receive customsettings (Marten Richter) [#51323](https://github.com/nodejs/node/pull/51323) +- \[[`7894989bf0`](https://github.com/nodejs/node/commit/7894989bf0)] - **(SEMVER-MINOR)** **lib**: move encodingsMap to internal/util (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`a58c98ea85`](https://github.com/nodejs/node/commit/a58c98ea85)] - **(SEMVER-MINOR)** **src**: print string content better in BlobDeserializer (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`c3c0a3ee5c`](https://github.com/nodejs/node/commit/c3c0a3ee5c)] - **(SEMVER-MINOR)** **src**: support multi-line values for .env file (IlyasShabi) [#51289](https://github.com/nodejs/node/pull/51289) +- \[[`2a921966c6`](https://github.com/nodejs/node/commit/2a921966c6)] - **(SEMVER-MINOR)** **src**: do not coerce dotenv paths (Tobias Nießen) [#51425](https://github.com/nodejs/node/pull/51425) +- \[[`0dee86f295`](https://github.com/nodejs/node/commit/0dee86f295)] - **(SEMVER-MINOR)** **src**: support configurable snapshot (Joyee Cheung) [#50453](https://github.com/nodejs/node/pull/50453) +- \[[`ade6614067`](https://github.com/nodejs/node/commit/ade6614067)] - **(SEMVER-MINOR)** **stream**: add support for `deflate-raw` format to webstreams compression (Damian Krzeminski) [#50097](https://github.com/nodejs/node/pull/50097) +- \[[`fe922f05e4`](https://github.com/nodejs/node/commit/fe922f05e4)] - **(SEMVER-MINOR)** **timers**: export timers.promises (Marco Ippolito) [#51246](https://github.com/nodejs/node/pull/51246) + +### Commits + +- \[[`cbda4e9fc5`](https://github.com/nodejs/node/commit/cbda4e9fc5)] - **assert,crypto**: make KeyObject and CryptoKey testable for equality (Filip Skokan) [#50897](https://github.com/nodejs/node/pull/50897) +- \[[`92fca59647`](https://github.com/nodejs/node/commit/92fca59647)] - **async_hooks,inspector**: implement inspector api without async_wrap (Gabriel Bota) [#51501](https://github.com/nodejs/node/pull/51501) +- \[[`029ca982dc`](https://github.com/nodejs/node/commit/029ca982dc)] - **benchmark**: update iterations of benchmark/async_hooks/async-local- (Lei Shi) [#51420](https://github.com/nodejs/node/pull/51420) +- \[[`350e9fee8d`](https://github.com/nodejs/node/commit/350e9fee8d)] - **benchmark**: update iterations of benchmark/domain/domain-fn-args.js (Lei Shi) [#51408](https://github.com/nodejs/node/pull/51408) +- \[[`40fda97deb`](https://github.com/nodejs/node/commit/40fda97deb)] - **benchmark**: update iterations of assert/deepequal-typedarrays.js (Lei Shi) [#51419](https://github.com/nodejs/node/pull/51419) +- \[[`1b2e3b7049`](https://github.com/nodejs/node/commit/1b2e3b7049)] - **benchmark**: update iterations of benchmark/assert/deepequal-map.js (Lei Shi) [#51416](https://github.com/nodejs/node/pull/51416) +- \[[`7639259203`](https://github.com/nodejs/node/commit/7639259203)] - **benchmark**: rename startup.js to startup-core.js (Joyee Cheung) [#51669](https://github.com/nodejs/node/pull/51669) +- \[[`4be33b5577`](https://github.com/nodejs/node/commit/4be33b5577)] - **benchmark**: remove dependency on unshipped tools (Adam Majer) [#51146](https://github.com/nodejs/node/pull/51146) +- \[[`bd03a154a9`](https://github.com/nodejs/node/commit/bd03a154a9)] - **benchmark**: update iterations in benchmark/perf_hooks (Lei Shi) [#50869](https://github.com/nodejs/node/pull/50869) +- \[[`19b943b909`](https://github.com/nodejs/node/commit/19b943b909)] - **benchmark**: update iterations in benchmark/crypto/aes-gcm-throughput.js (Lei Shi) [#50929](https://github.com/nodejs/node/pull/50929) +- \[[`278c990dea`](https://github.com/nodejs/node/commit/278c990dea)] - **benchmark**: update iteration and size in benchmark/crypto/randomBytes.js (Lei Shi) [#50868](https://github.com/nodejs/node/pull/50868) +- \[[`443d4fcff3`](https://github.com/nodejs/node/commit/443d4fcff3)] - **benchmark**: add undici websocket benchmark (Chenyu Yang) [#50586](https://github.com/nodejs/node/pull/50586) +- \[[`3ab6143380`](https://github.com/nodejs/node/commit/3ab6143380)] - **benchmark**: add create-hash benchmark (Joyee Cheung) [#51026](https://github.com/nodejs/node/pull/51026) +- \[[`6a8ff09332`](https://github.com/nodejs/node/commit/6a8ff09332)] - **benchmark**: update interations and len in benchmark/util/text-decoder.js (Lei Shi) [#50938](https://github.com/nodejs/node/pull/50938) +- \[[`22b53bc1fa`](https://github.com/nodejs/node/commit/22b53bc1fa)] - **benchmark**: update iterations of benchmark/util/type-check.js (Lei Shi) [#50937](https://github.com/nodejs/node/pull/50937) +- \[[`f56bda5109`](https://github.com/nodejs/node/commit/f56bda5109)] - **benchmark**: update iterations in benchmark/util/normalize-encoding.js (Lei Shi) [#50934](https://github.com/nodejs/node/pull/50934) +- \[[`4fc83e1ce3`](https://github.com/nodejs/node/commit/4fc83e1ce3)] - **benchmark**: update iterations in benchmark/util/inspect-array.js (Lei Shi) [#50933](https://github.com/nodejs/node/pull/50933) +- \[[`0edddcfc19`](https://github.com/nodejs/node/commit/0edddcfc19)] - **benchmark**: update iterations in benchmark/util/format.js (Lei Shi) [#50932](https://github.com/nodejs/node/pull/50932) +- \[[`f109961fd1`](https://github.com/nodejs/node/commit/f109961fd1)] - **benchmark**: update iterations in benchmark/crypto/hkdf.js (Lei Shi) [#50866](https://github.com/nodejs/node/pull/50866) +- \[[`1e923f11f2`](https://github.com/nodejs/node/commit/1e923f11f2)] - **benchmark**: update iterations in benchmark/crypto/get-ciphers.js (Lei Shi) [#50863](https://github.com/nodejs/node/pull/50863) +- \[[`f13643da06`](https://github.com/nodejs/node/commit/f13643da06)] - **benchmark**: update number of iterations for `util.inspect` (kylo5aby) [#50651](https://github.com/nodejs/node/pull/50651) +- \[[`03b19cbd2a`](https://github.com/nodejs/node/commit/03b19cbd2a)] - **bootstrap**: improve snapshot unsupported builtin warnings (Joyee Cheung) [#50944](https://github.com/nodejs/node/pull/50944) +- \[[`51ea5b60a9`](https://github.com/nodejs/node/commit/51ea5b60a9)] - **build**: fix arm64 host cross-compilation in GN (Cheng Zhao) [#51903](https://github.com/nodejs/node/pull/51903) +- \[[`9f5547afa2`](https://github.com/nodejs/node/commit/9f5547afa2)] - _**Revert**_ "**build**: workaround for node-core-utils" (Richard Lau) [#51975](https://github.com/nodejs/node/pull/51975) +- \[[`58255e73ae`](https://github.com/nodejs/node/commit/58255e73ae)] - **build**: respect the `NODE` env variable in `Makefile` (Antoine du Hamel) [#51743](https://github.com/nodejs/node/pull/51743) +- \[[`0a7419bf0b`](https://github.com/nodejs/node/commit/0a7419bf0b)] - _**Revert**_ "**build**: fix warning in cares under GN build" (Luigi Pinca) [#51865](https://github.com/nodejs/node/pull/51865) +- \[[`4118174b85`](https://github.com/nodejs/node/commit/4118174b85)] - **build**: remove `librt` libs link for Android compatibility (BuShe Pie) [#51632](https://github.com/nodejs/node/pull/51632) +- \[[`012da16b85`](https://github.com/nodejs/node/commit/012da16b85)] - **build**: do not rely on gn_helpers in GN build (Cheng Zhao) [#51439](https://github.com/nodejs/node/pull/51439) +- \[[`93fcf52990`](https://github.com/nodejs/node/commit/93fcf52990)] - **build**: fix warning in cares under GN build (Cheng Zhao) [#51687](https://github.com/nodejs/node/pull/51687) +- \[[`2176495455`](https://github.com/nodejs/node/commit/2176495455)] - **build**: fix building js2c with GN (Cheng Zhao) [#51818](https://github.com/nodejs/node/pull/51818) +- \[[`d6e702f885`](https://github.com/nodejs/node/commit/d6e702f885)] - **build**: encode non-ASCII Latin1 characters as one byte in JS2C (Joyee Cheung) [#51605](https://github.com/nodejs/node/pull/51605) +- \[[`4f49e9d000`](https://github.com/nodejs/node/commit/4f49e9d000)] - **(SEMVER-MINOR)** **build**: build opt to set local location of headers (Michael Dawson) [#51525](https://github.com/nodejs/node/pull/51525) +- \[[`8e84aad0ef`](https://github.com/nodejs/node/commit/8e84aad0ef)] - **build**: use macOS m1 machines for testing (Yagiz Nizipli) [#51620](https://github.com/nodejs/node/pull/51620) +- \[[`5fce1a17e2`](https://github.com/nodejs/node/commit/5fce1a17e2)] - **build**: check before removing %config% link (liudonghua) [#51437](https://github.com/nodejs/node/pull/51437) +- \[[`46d6dce1a8`](https://github.com/nodejs/node/commit/46d6dce1a8)] - **build**: increase parallel executions in github (Yagiz Nizipli) [#51554](https://github.com/nodejs/node/pull/51554) +- \[[`8b3ead1f3e`](https://github.com/nodejs/node/commit/8b3ead1f3e)] - **build**: remove copyright header in node.gni (Cheng Zhao) [#51535](https://github.com/nodejs/node/pull/51535) +- \[[`d8b86ad363`](https://github.com/nodejs/node/commit/d8b86ad363)] - **build**: update GN build files for ngtcp2 (Cheng Zhao) [#51313](https://github.com/nodejs/node/pull/51313) +- \[[`ba0ffddd2d`](https://github.com/nodejs/node/commit/ba0ffddd2d)] - **build**: fix for VScode "Reopen in Container" (Serg Kryvonos) [#51271](https://github.com/nodejs/node/pull/51271) +- \[[`8b97e2e0a7`](https://github.com/nodejs/node/commit/8b97e2e0a7)] - **build**: add `-flax-vector-conversions` to V8 build (Michaël Zasso) [#51257](https://github.com/nodejs/node/pull/51257) +- \[[`bd528c7dc0`](https://github.com/nodejs/node/commit/bd528c7dc0)] - **build**: fix warnings from uv for gn build (Cheng Zhao) [#51069](https://github.com/nodejs/node/pull/51069) +- \[[`ffe467b062`](https://github.com/nodejs/node/commit/ffe467b062)] - **build,tools**: make addons tests work with GN (Cheng Zhao) [#50737](https://github.com/nodejs/node/pull/50737) +- \[[`448d67109a`](https://github.com/nodejs/node/commit/448d67109a)] - **(SEMVER-MINOR)** **crypto**: implement crypto.hash() (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`48959dd2b4`](https://github.com/nodejs/node/commit/48959dd2b4)] - **crypto**: update root certificates to NSS 3.98 (Node.js GitHub Bot) [#51794](https://github.com/nodejs/node/pull/51794) +- \[[`68e8b2c492`](https://github.com/nodejs/node/commit/68e8b2c492)] - **crypto**: use EVP_MD_fetch and cache EVP_MD for hashes (Joyee Cheung) [#51034](https://github.com/nodejs/node/pull/51034) +- \[[`adb5d69621`](https://github.com/nodejs/node/commit/adb5d69621)] - **crypto**: update CryptoKey symbol properties (Filip Skokan) [#50897](https://github.com/nodejs/node/pull/50897) +- \[[`df0213fd3d`](https://github.com/nodejs/node/commit/df0213fd3d)] - **deps**: update nghttp2 to 1.60.0 (Node.js GitHub Bot) [#51948](https://github.com/nodejs/node/pull/51948) +- \[[`208dd887a5`](https://github.com/nodejs/node/commit/208dd887a5)] - **deps**: upgrade npm to 10.5.0 (npm team) [#51913](https://github.com/nodejs/node/pull/51913) +- \[[`587e70e1ee`](https://github.com/nodejs/node/commit/587e70e1ee)] - **deps**: update corepack to 0.25.2 (Node.js GitHub Bot) [#51810](https://github.com/nodejs/node/pull/51810) +- \[[`38343c4857`](https://github.com/nodejs/node/commit/38343c4857)] - **deps**: update c-ares to 1.27.0 (Node.js GitHub Bot) [#51846](https://github.com/nodejs/node/pull/51846) +- \[[`c9974f621c`](https://github.com/nodejs/node/commit/c9974f621c)] - **deps**: update c-ares to 1.26.0 (Node.js GitHub Bot) [#51582](https://github.com/nodejs/node/pull/51582) +- \[[`0aa18e1a1c`](https://github.com/nodejs/node/commit/0aa18e1a1c)] - **deps**: update googletest to 6a59382 (Node.js GitHub Bot) [#51580](https://github.com/nodejs/node/pull/51580) +- \[[`f871bc6ddc`](https://github.com/nodejs/node/commit/f871bc6ddc)] - **deps**: update nghttp2 to 1.59.0 (Node.js GitHub Bot) [#51581](https://github.com/nodejs/node/pull/51581) +- \[[`94f8ee8717`](https://github.com/nodejs/node/commit/94f8ee8717)] - **deps**: update corepack to 0.24.1 (Node.js GitHub Bot) [#51459](https://github.com/nodejs/node/pull/51459) +- \[[`c23ce06e6b`](https://github.com/nodejs/node/commit/c23ce06e6b)] - **deps**: update ada to 2.7.6 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`372ce69de1`](https://github.com/nodejs/node/commit/372ce69de1)] - **deps**: update ada to 2.7.5 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`133719b2c9`](https://github.com/nodejs/node/commit/133719b2c9)] - **deps**: update googletest to 7c07a86 (Node.js GitHub Bot) [#51458](https://github.com/nodejs/node/pull/51458) +- \[[`35675aa07f`](https://github.com/nodejs/node/commit/35675aa07f)] - **deps**: update acorn-walk to 8.3.2 (Node.js GitHub Bot) [#51457](https://github.com/nodejs/node/pull/51457) +- \[[`ca73f55a22`](https://github.com/nodejs/node/commit/ca73f55a22)] - **deps**: update base64 to 0.5.2 (Node.js GitHub Bot) [#51455](https://github.com/nodejs/node/pull/51455) +- \[[`c9dad18191`](https://github.com/nodejs/node/commit/c9dad18191)] - **deps**: compile c-ares with C11 support (Michaël Zasso) [#51410](https://github.com/nodejs/node/pull/51410) +- \[[`a727fa73ee`](https://github.com/nodejs/node/commit/a727fa73ee)] - **deps**: upgrade npm to 10.3.0 (npm team) [#51431](https://github.com/nodejs/node/pull/51431) +- \[[`834bbfd039`](https://github.com/nodejs/node/commit/834bbfd039)] - **deps**: update c-ares to 1.25.0 (Node.js GitHub Bot) [#51385](https://github.com/nodejs/node/pull/51385) +- \[[`4c8fa3e7c2`](https://github.com/nodejs/node/commit/4c8fa3e7c2)] - **deps**: update uvwasi to 0.0.20 and fixup tests (Michael Dawson) [#51355](https://github.com/nodejs/node/pull/51355) +- \[[`bd183ef2af`](https://github.com/nodejs/node/commit/bd183ef2af)] - **deps**: add nghttp3/\*\*/.deps to .gitignore (Luigi Pinca) [#51400](https://github.com/nodejs/node/pull/51400) +- \[[`1d8169995c`](https://github.com/nodejs/node/commit/1d8169995c)] - **deps**: update corepack to 0.24.0 (Node.js GitHub Bot) [#51318](https://github.com/nodejs/node/pull/51318) +- \[[`4dfbbb8789`](https://github.com/nodejs/node/commit/4dfbbb8789)] - **deps**: update acorn to 8.11.3 (Node.js GitHub Bot) [#51317](https://github.com/nodejs/node/pull/51317) +- \[[`7d60877fa3`](https://github.com/nodejs/node/commit/7d60877fa3)] - **deps**: update brotli to 1.1.0 (Node.js GitHub Bot) [#50804](https://github.com/nodejs/node/pull/50804) +- \[[`1b99a3f0af`](https://github.com/nodejs/node/commit/1b99a3f0af)] - **deps**: update zlib to 1.3.0.1-motley-40e35a7 (Node.js GitHub Bot) [#51274](https://github.com/nodejs/node/pull/51274) +- \[[`2270285839`](https://github.com/nodejs/node/commit/2270285839)] - **deps**: update simdutf to 4.0.8 (Node.js GitHub Bot) [#51000](https://github.com/nodejs/node/pull/51000) +- \[[`61d1535d84`](https://github.com/nodejs/node/commit/61d1535d84)] - **deps**: V8: cherry-pick de611e69ad51 (Keyhan Vakil) [#51200](https://github.com/nodejs/node/pull/51200) +- \[[`04323fd595`](https://github.com/nodejs/node/commit/04323fd595)] - **deps**: update googletest to 530d5c8 (Node.js GitHub Bot) [#51191](https://github.com/nodejs/node/pull/51191) +- \[[`454b4f8d7e`](https://github.com/nodejs/node/commit/454b4f8d7e)] - **deps**: update acorn-walk to 8.3.1 (Node.js GitHub Bot) [#50457](https://github.com/nodejs/node/pull/50457) +- \[[`cc693eb908`](https://github.com/nodejs/node/commit/cc693eb908)] - **deps**: update acorn-walk to 8.3.0 (Node.js GitHub Bot) [#50457](https://github.com/nodejs/node/pull/50457) +- \[[`09519c6655`](https://github.com/nodejs/node/commit/09519c6655)] - **deps**: update zlib to 1.3.0.1-motley-dd5fc13 (Node.js GitHub Bot) [#51105](https://github.com/nodejs/node/pull/51105) +- \[[`a2f39e9168`](https://github.com/nodejs/node/commit/a2f39e9168)] - **deps**: V8: cherry-pick 0fd478bcdabd (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +- \[[`1aaf156ea7`](https://github.com/nodejs/node/commit/1aaf156ea7)] - **deps**: update zlib to 1.3-22124f5 (Node.js GitHub Bot) [#50910](https://github.com/nodejs/node/pull/50910) +- \[[`3f4e254047`](https://github.com/nodejs/node/commit/3f4e254047)] - **deps**: update googletest to 76bb2af (Node.js GitHub Bot) [#50555](https://github.com/nodejs/node/pull/50555) +- \[[`702684c008`](https://github.com/nodejs/node/commit/702684c008)] - **deps**: update googletest to b10fad3 (Node.js GitHub Bot) [#50555](https://github.com/nodejs/node/pull/50555) +- \[[`4ee7f29657`](https://github.com/nodejs/node/commit/4ee7f29657)] - **deps**: update timezone to 2024a (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`452d74c8b6`](https://github.com/nodejs/node/commit/452d74c8b6)] - **deps**: update icu to 74.2 (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`e6fc5a5ee1`](https://github.com/nodejs/node/commit/e6fc5a5ee1)] - **deps**: update timezone to 2023d (Node.js GitHub Bot) [#51461](https://github.com/nodejs/node/pull/51461) +- \[[`4ee0f8306b`](https://github.com/nodejs/node/commit/4ee0f8306b)] - **deps**: update icu to 74.1 (Node.js GitHub Bot) [#50515](https://github.com/nodejs/node/pull/50515) +- \[[`cb49f31480`](https://github.com/nodejs/node/commit/cb49f31480)] - **deps**: cherry-pick libuv/libuv\@d09441c (Richard Lau) [#51976](https://github.com/nodejs/node/pull/51976) +- \[[`ea50540c5e`](https://github.com/nodejs/node/commit/ea50540c5e)] - _**Revert**_ "**deps**: V8: cherry-pick 13192d6e10fa" (kxxt) [#51495](https://github.com/nodejs/node/pull/51495) +- \[[`6fd1617ab4`](https://github.com/nodejs/node/commit/6fd1617ab4)] - **doc**: add policy for distribution (Geoffrey Booth) [#51918](https://github.com/nodejs/node/pull/51918) +- \[[`fc0b389006`](https://github.com/nodejs/node/commit/fc0b389006)] - **doc**: fix actual result of example is different in events (Deokjin Kim) [#51925](https://github.com/nodejs/node/pull/51925) +- \[[`93d6d66339`](https://github.com/nodejs/node/commit/93d6d66339)] - **doc**: clarify Corepack threat model (Antoine du Hamel) [#51917](https://github.com/nodejs/node/pull/51917) +- \[[`276d1d1d65`](https://github.com/nodejs/node/commit/276d1d1d65)] - **doc**: add stability index to crypto.hash() (Joyee Cheung) [#51978](https://github.com/nodejs/node/pull/51978) +- \[[`473af948b5`](https://github.com/nodejs/node/commit/473af948b5)] - **doc**: remove redundant backquote which breaks sentence (JounQin) [#51904](https://github.com/nodejs/node/pull/51904) +- \[[`b52b249b05`](https://github.com/nodejs/node/commit/b52b249b05)] - **doc**: update node-api/node-addon-api team link to sharing project news (Ulises Gascón) [#51877](https://github.com/nodejs/node/pull/51877) +- \[[`a74c373ea4`](https://github.com/nodejs/node/commit/a74c373ea4)] - **doc**: add website team to sharing project news (Ulises Gascón) [#49002](https://github.com/nodejs/node/pull/49002) +- \[[`b7ce547d41`](https://github.com/nodejs/node/commit/b7ce547d41)] - **doc**: update guide link for Event Loop (Shrujal Shah) [#51874](https://github.com/nodejs/node/pull/51874) +- \[[`3dfee7ee33`](https://github.com/nodejs/node/commit/3dfee7ee33)] - **doc**: change `ExperimentalWarnings` to `ExperimentalWarning` (Ameet Kaustav) [#51741](https://github.com/nodejs/node/pull/51741) +- \[[`740d0679e7`](https://github.com/nodejs/node/commit/740d0679e7)] - **doc**: add Paolo to TSC members (Michael Dawson) [#51825](https://github.com/nodejs/node/pull/51825) +- \[[`3240a2f349`](https://github.com/nodejs/node/commit/3240a2f349)] - **doc**: reserve 123 for Electron 30 (Keeley Hammond) [#51803](https://github.com/nodejs/node/pull/51803) +- \[[`597e3db0f9`](https://github.com/nodejs/node/commit/597e3db0f9)] - **doc**: add mention to GPG_TTY (Rafael Gonzaga) [#51806](https://github.com/nodejs/node/pull/51806) +- \[[`ccdb01187b`](https://github.com/nodejs/node/commit/ccdb01187b)] - **doc**: add zcbenz to collaborators (Cheng Zhao) [#51812](https://github.com/nodejs/node/pull/51812) +- \[[`3a3de00437`](https://github.com/nodejs/node/commit/3a3de00437)] - **doc**: add entry to stewards (Rafael Gonzaga) [#51760](https://github.com/nodejs/node/pull/51760) +- \[[`06b882d2fa`](https://github.com/nodejs/node/commit/06b882d2fa)] - **doc**: update technical priorities for 2023 (Jean Burellier) [#47523](https://github.com/nodejs/node/pull/47523) +- \[[`9a68b47fe1`](https://github.com/nodejs/node/commit/9a68b47fe1)] - **doc**: mark isWebAssemblyCompiledModule eol (Marco Ippolito) [#51442](https://github.com/nodejs/node/pull/51442) +- \[[`8016628710`](https://github.com/nodejs/node/commit/8016628710)] - **doc**: fix `globals.md` introduction (Antoine du Hamel) [#51742](https://github.com/nodejs/node/pull/51742) +- \[[`9ddbe4523f`](https://github.com/nodejs/node/commit/9ddbe4523f)] - **doc**: updates for better json generating (Dmitry Semigradsky) [#51592](https://github.com/nodejs/node/pull/51592) +- \[[`140cf26d47`](https://github.com/nodejs/node/commit/140cf26d47)] - **doc**: document the GN build (Cheng Zhao) [#51676](https://github.com/nodejs/node/pull/51676) +- \[[`ecfb3f18b3`](https://github.com/nodejs/node/commit/ecfb3f18b3)] - **doc**: fix uncaught exception example (Gabriel Schulhof) [#51638](https://github.com/nodejs/node/pull/51638) +- \[[`b3157a08bf`](https://github.com/nodejs/node/commit/b3157a08bf)] - **doc**: clarify execution of `after` hook on test suite completion (Ognjen Jevremović) [#51523](https://github.com/nodejs/node/pull/51523) +- \[[`1dae1873d9`](https://github.com/nodejs/node/commit/1dae1873d9)] - **doc**: fix `dns.lookup` and `dnsPromises.lookup` description (Duncan Chiu) [#51517](https://github.com/nodejs/node/pull/51517) +- \[[`50df052087`](https://github.com/nodejs/node/commit/50df052087)] - **doc**: note that path.normalize deviates from POSIX (Tobias Nießen) [#51513](https://github.com/nodejs/node/pull/51513) +- \[[`481af53aea`](https://github.com/nodejs/node/commit/481af53aea)] - **doc**: add lemire to collaborators (Daniel Lemire) [#51572](https://github.com/nodejs/node/pull/51572) +- \[[`dec0d5d19a`](https://github.com/nodejs/node/commit/dec0d5d19a)] - **doc**: fix historical experimental fetch flag (Kenrick) [#51506](https://github.com/nodejs/node/pull/51506) +- \[[`96c480b1a1`](https://github.com/nodejs/node/commit/96c480b1a1)] - **doc**: fix type of connectionAttempt parameter (Rafael Gonzaga) [#51490](https://github.com/nodejs/node/pull/51490) +- \[[`76968ab112`](https://github.com/nodejs/node/commit/76968ab112)] - **doc**: remove reference to resolved child_process v8 issue (Ian Kerins) [#51467](https://github.com/nodejs/node/pull/51467) +- \[[`bdd3a2a9fd`](https://github.com/nodejs/node/commit/bdd3a2a9fd)] - **doc**: update typos (Aranđel Šarenac) [#51475](https://github.com/nodejs/node/pull/51475) +- \[[`3532f5587c`](https://github.com/nodejs/node/commit/3532f5587c)] - **doc**: add notes on inspector breakpoints (Chengzhong Wu) [#51417](https://github.com/nodejs/node/pull/51417) +- \[[`0dffb9f049`](https://github.com/nodejs/node/commit/0dffb9f049)] - **doc**: add links in `offboarding.md` (Antoine du Hamel) [#51440](https://github.com/nodejs/node/pull/51440) +- \[[`58d2442f0f`](https://github.com/nodejs/node/commit/58d2442f0f)] - **doc**: fix spelling mistake (u9g) [#51454](https://github.com/nodejs/node/pull/51454) +- \[[`a09f440dbd`](https://github.com/nodejs/node/commit/a09f440dbd)] - **doc**: add check for security reverts (Michael Dawson) [#51376](https://github.com/nodejs/node/pull/51376) +- \[[`401837bfc4`](https://github.com/nodejs/node/commit/401837bfc4)] - **doc**: fix some policy scope typos (Tim Kuijsten) [#51234](https://github.com/nodejs/node/pull/51234) +- \[[`f301f829ba`](https://github.com/nodejs/node/commit/f301f829ba)] - **doc**: improve subtests documentation (Marco Ippolito) [#51379](https://github.com/nodejs/node/pull/51379) +- \[[`1e40f552fd`](https://github.com/nodejs/node/commit/1e40f552fd)] - **doc**: add missing word in `child_process.md` (Joseph Joy) [#50370](https://github.com/nodejs/node/pull/50370) +- \[[`42b4f0f5ab`](https://github.com/nodejs/node/commit/42b4f0f5ab)] - **doc**: fixup alignment of warning subsection (James M Snell) [#51374](https://github.com/nodejs/node/pull/51374) +- \[[`b5bc597871`](https://github.com/nodejs/node/commit/b5bc597871)] - **doc**: the GN files should use Node's license (Cheng Zhao) [#50694](https://github.com/nodejs/node/pull/50694) +- \[[`01a41041d6`](https://github.com/nodejs/node/commit/01a41041d6)] - **doc**: improve localWindowSize event descriptions (Davy Landman) [#51071](https://github.com/nodejs/node/pull/51071) +- \[[`63aa27df10`](https://github.com/nodejs/node/commit/63aa27df10)] - **doc**: mark `--jitless` as experimental (Antoine du Hamel) [#51247](https://github.com/nodejs/node/pull/51247) +- \[[`c8233912e9`](https://github.com/nodejs/node/commit/c8233912e9)] - **doc**: run license-builder (github-actions\[bot]) [#51199](https://github.com/nodejs/node/pull/51199) +- \[[`9e360df521`](https://github.com/nodejs/node/commit/9e360df521)] - **doc**: fix limitations and known issues in pm (Rafael Gonzaga) [#51184](https://github.com/nodejs/node/pull/51184) +- \[[`52d8222d32`](https://github.com/nodejs/node/commit/52d8222d32)] - **doc**: mention node:wasi in the Threat Model (Rafael Gonzaga) [#51211](https://github.com/nodejs/node/pull/51211) +- \[[`cb3270e4c8`](https://github.com/nodejs/node/commit/cb3270e4c8)] - **doc**: remove ambiguous 'considered' (Rich Trott) [#51207](https://github.com/nodejs/node/pull/51207) +- \[[`979e183e0c`](https://github.com/nodejs/node/commit/979e183e0c)] - **doc**: set exit code in custom test runner example (Matteo Collina) [#51056](https://github.com/nodejs/node/pull/51056) +- \[[`eaadebb1f4`](https://github.com/nodejs/node/commit/eaadebb1f4)] - **doc**: remove version from `maintaining-dependencies.md` (Antoine du Hamel) [#51195](https://github.com/nodejs/node/pull/51195) +- \[[`256db6e056`](https://github.com/nodejs/node/commit/256db6e056)] - **doc**: mention native addons are restricted in pm (Rafael Gonzaga) [#51185](https://github.com/nodejs/node/pull/51185) +- \[[`2a61602ab2`](https://github.com/nodejs/node/commit/2a61602ab2)] - **doc**: correct note on behavior of stats.isDirectory (Nick Reilingh) [#50946](https://github.com/nodejs/node/pull/50946) +- \[[`184b8bea5b`](https://github.com/nodejs/node/commit/184b8bea5b)] - **doc**: fix `TestsStream` parent class (Jungku Lee) [#51181](https://github.com/nodejs/node/pull/51181) +- \[[`c61597ffe4`](https://github.com/nodejs/node/commit/c61597ffe4)] - **(SEMVER-MINOR)** **doc**: add documentation for --build-snapshot-config (Anna Henningsen) [#50453](https://github.com/nodejs/node/pull/50453) +- \[[`b88170d602`](https://github.com/nodejs/node/commit/b88170d602)] - **doc**: run license-builder (github-actions\[bot]) [#51111](https://github.com/nodejs/node/pull/51111) +- \[[`f2b4626ab8`](https://github.com/nodejs/node/commit/f2b4626ab8)] - **doc**: deprecate hash constructor (Marco Ippolito) [#51077](https://github.com/nodejs/node/pull/51077) +- \[[`6c241550cd`](https://github.com/nodejs/node/commit/6c241550cd)] - **doc**: add note regarding `--experimental-detect-module` (Shubherthi Mitra) [#51089](https://github.com/nodejs/node/pull/51089) +- \[[`8ee30ea900`](https://github.com/nodejs/node/commit/8ee30ea900)] - **doc**: correct tracingChannel.traceCallback() (Gerhard Stöbich) [#51068](https://github.com/nodejs/node/pull/51068) +- \[[`1cd27b6eff`](https://github.com/nodejs/node/commit/1cd27b6eff)] - **doc**: use length argument in pbkdf2Key (Tobias Nießen) [#51066](https://github.com/nodejs/node/pull/51066) +- \[[`09ad974537`](https://github.com/nodejs/node/commit/09ad974537)] - **doc**: add deprecation notice to `dirent.path` (Antoine du Hamel) [#51059](https://github.com/nodejs/node/pull/51059) +- \[[`1113e58f87`](https://github.com/nodejs/node/commit/1113e58f87)] - **doc**: deprecate `dirent.path` (Antoine du Hamel) [#51020](https://github.com/nodejs/node/pull/51020) +- \[[`37979d750e`](https://github.com/nodejs/node/commit/37979d750e)] - **doc**: add additional details about `--input-type` (Shubham Pandey) [#50796](https://github.com/nodejs/node/pull/50796) +- \[[`3ff00e1e79`](https://github.com/nodejs/node/commit/3ff00e1e79)] - **doc**: add procedure when CVEs don't get published (Rafael Gonzaga) [#50945](https://github.com/nodejs/node/pull/50945) +- \[[`0930be6bd5`](https://github.com/nodejs/node/commit/0930be6bd5)] - **doc**: fix some errors in esm resolution algorithms (Christopher Jeffrey (JJ)) [#50898](https://github.com/nodejs/node/pull/50898) +- \[[`ddc7964b03`](https://github.com/nodejs/node/commit/ddc7964b03)] - **doc**: reserve 121 for Electron 29 (Shelley Vohr) [#50957](https://github.com/nodejs/node/pull/50957) +- \[[`625fd69b76`](https://github.com/nodejs/node/commit/625fd69b76)] - **doc**: run license-builder (github-actions\[bot]) [#50926](https://github.com/nodejs/node/pull/50926) +- \[[`f18269607a`](https://github.com/nodejs/node/commit/f18269607a)] - **doc**: document non-node_modules-only runtime deprecation (Joyee Cheung) [#50748](https://github.com/nodejs/node/pull/50748) +- \[[`5f8e7a0fdb`](https://github.com/nodejs/node/commit/5f8e7a0fdb)] - **doc**: add doc for Unix abstract socket (theanarkh) [#50904](https://github.com/nodejs/node/pull/50904) +- \[[`e0598787e0`](https://github.com/nodejs/node/commit/e0598787e0)] - **doc**: remove flicker on page load on dark theme (Dima Demakov) [#50942](https://github.com/nodejs/node/pull/50942) +- \[[`2a7047d933`](https://github.com/nodejs/node/commit/2a7047d933)] - **doc,crypto**: further clarify RSA_PKCS1_PADDING support (Tobias Nießen) [#51799](https://github.com/nodejs/node/pull/51799) +- \[[`31c4ba4dfd`](https://github.com/nodejs/node/commit/31c4ba4dfd)] - **doc,crypto**: add changelog and note about disabled RSA_PKCS1_PADDING (Filip Skokan) [#51782](https://github.com/nodejs/node/pull/51782) +- \[[`90da41548f`](https://github.com/nodejs/node/commit/90da41548f)] - **doc,module**: clarify hook chain execution sequence (Jacob Smith) [#51884](https://github.com/nodejs/node/pull/51884) +- \[[`bb7d7f3d1c`](https://github.com/nodejs/node/commit/bb7d7f3d1c)] - **errors**: fix stacktrace of SystemError (uzlopak) [#49956](https://github.com/nodejs/node/pull/49956) +- \[[`db7459b57b`](https://github.com/nodejs/node/commit/db7459b57b)] - **errors**: improve hideStackFrames (Aras Abbasi) [#49990](https://github.com/nodejs/node/pull/49990) +- \[[`a6b3569121`](https://github.com/nodejs/node/commit/a6b3569121)] - **esm**: improve error when calling `import.meta.resolve` from `data:` URL (Antoine du Hamel) [#49516](https://github.com/nodejs/node/pull/49516) +- \[[`38f4000905`](https://github.com/nodejs/node/commit/38f4000905)] - **esm**: fix hint on invalid module specifier (Antoine du Hamel) [#51223](https://github.com/nodejs/node/pull/51223) +- \[[`e39e37bbd5`](https://github.com/nodejs/node/commit/e39e37bbd5)] - **esm**: fix hook name in error message (Bruce MacNaughton) [#50466](https://github.com/nodejs/node/pull/50466) +- \[[`d9b5cd533c`](https://github.com/nodejs/node/commit/d9b5cd533c)] - **events**: no stopPropagation call in cancelBubble (mert.altin) [#50405](https://github.com/nodejs/node/pull/50405) +- \[[`287a02c4b2`](https://github.com/nodejs/node/commit/287a02c4b2)] - **fs**: load rimraf lazily in fs/promises (Joyee Cheung) [#51617](https://github.com/nodejs/node/pull/51617) +- \[[`bbd1351ef0`](https://github.com/nodejs/node/commit/bbd1351ef0)] - **fs**: remove race condition for recursive watch on Linux (Matteo Collina) [#51406](https://github.com/nodejs/node/pull/51406) +- \[[`1b7ccec5a7`](https://github.com/nodejs/node/commit/1b7ccec5a7)] - **fs**: update jsdoc for `filehandle.createWriteStream` and `appendFile` (Jungku Lee) [#51494](https://github.com/nodejs/node/pull/51494) +- \[[`25056f5024`](https://github.com/nodejs/node/commit/25056f5024)] - **fs**: fix fs.promises.realpath for long paths on Windows (翠 / green) [#51032](https://github.com/nodejs/node/pull/51032) +- \[[`a8fd01a5a2`](https://github.com/nodejs/node/commit/a8fd01a5a2)] - **fs**: make offset, position & length args in fh.read() optional (Pulkit Gupta) [#51087](https://github.com/nodejs/node/pull/51087) +- \[[`721557c6d8`](https://github.com/nodejs/node/commit/721557c6d8)] - **fs**: add missing jsdoc parameters to `readSync` (Yagiz Nizipli) [#51225](https://github.com/nodejs/node/pull/51225) +- \[[`3ce9aacfcd`](https://github.com/nodejs/node/commit/3ce9aacfcd)] - **fs**: remove `internalModuleReadJSON` binding (Yagiz Nizipli) [#51224](https://github.com/nodejs/node/pull/51224) +- \[[`65df2c6787`](https://github.com/nodejs/node/commit/65df2c6787)] - **fs**: improve mkdtemp performance for buffer prefix (Yagiz Nizipli) [#51078](https://github.com/nodejs/node/pull/51078) +- \[[`6705b48012`](https://github.com/nodejs/node/commit/6705b48012)] - **fs**: validate fd synchronously on c++ (Yagiz Nizipli) [#51027](https://github.com/nodejs/node/pull/51027) +- \[[`afd5d67f89`](https://github.com/nodejs/node/commit/afd5d67f89)] - **fs**: throw fchownSync error from c++ (Yagiz Nizipli) [#51075](https://github.com/nodejs/node/pull/51075) +- \[[`bac982bce5`](https://github.com/nodejs/node/commit/bac982bce5)] - **fs**: update params in jsdoc for createReadStream and createWriteStream (Jungku Lee) [#51063](https://github.com/nodejs/node/pull/51063) +- \[[`6764f0c9a8`](https://github.com/nodejs/node/commit/6764f0c9a8)] - **fs**: improve error performance of readvSync (IlyasShabi) [#50100](https://github.com/nodejs/node/pull/50100) +- \[[`0225fce776`](https://github.com/nodejs/node/commit/0225fce776)] - **(SEMVER-MINOR)** **fs**: introduce `dirent.parentPath` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +- \[[`4adea6c405`](https://github.com/nodejs/node/commit/4adea6c405)] - **fs,test**: add URL to string to fs.watch (Rafael Gonzaga) [#51346](https://github.com/nodejs/node/pull/51346) +- \[[`6bf148e12b`](https://github.com/nodejs/node/commit/6bf148e12b)] - **http**: fix `close` return value mismatch between doc and implementation (kylo5aby) [#51797](https://github.com/nodejs/node/pull/51797) +- \[[`66318602d0`](https://github.com/nodejs/node/commit/66318602d0)] - **http**: split set-cookie when using setHeaders (Marco Ippolito) [#51649](https://github.com/nodejs/node/pull/51649) +- \[[`f7b53d05bd`](https://github.com/nodejs/node/commit/f7b53d05bd)] - **http**: remove misleading warning (Luigi Pinca) [#51204](https://github.com/nodejs/node/pull/51204) +- \[[`9062d30600`](https://github.com/nodejs/node/commit/9062d30600)] - **http**: do not override user-provided options object (KuthorX) [#33633](https://github.com/nodejs/node/pull/33633) +- \[[`4e38dee4ee`](https://github.com/nodejs/node/commit/4e38dee4ee)] - **http**: handle multi-value content-disposition header (Arsalan Ahmad) [#50977](https://github.com/nodejs/node/pull/50977) +- \[[`b560bfbb84`](https://github.com/nodejs/node/commit/b560bfbb84)] - **http2**: close idle connections when allowHTTP1 is true (xsbchen) [#51569](https://github.com/nodejs/node/pull/51569) +- \[[`5ba4d96525`](https://github.com/nodejs/node/commit/5ba4d96525)] - **(SEMVER-MINOR)** **http2**: add h2 compat support for appendHeader (Tim Perry) [#51412](https://github.com/nodejs/node/pull/51412) +- \[[`0861498e8b`](https://github.com/nodejs/node/commit/0861498e8b)] - **(SEMVER-MINOR)** **http2**: add server handshake utility (snek) [#51172](https://github.com/nodejs/node/pull/51172) +- \[[`6b08d006ee`](https://github.com/nodejs/node/commit/6b08d006ee)] - **(SEMVER-MINOR)** **http2**: receive customsettings (Marten Richter) [#51323](https://github.com/nodejs/node/pull/51323) +- \[[`23414a6120`](https://github.com/nodejs/node/commit/23414a6120)] - **http2**: addtl http/2 settings (Marten Richter) [#49025](https://github.com/nodejs/node/pull/49025) +- \[[`3fe59ba224`](https://github.com/nodejs/node/commit/3fe59ba224)] - **inspector**: add NodeRuntime.waitingForDebugger event (mary marchini) [#51560](https://github.com/nodejs/node/pull/51560) +- \[[`44f05e0d30`](https://github.com/nodejs/node/commit/44f05e0d30)] - **lib**: make sure close net server (theanarkh) [#51929](https://github.com/nodejs/node/pull/51929) +- \[[`3be5ff9c45`](https://github.com/nodejs/node/commit/3be5ff9c45)] - **lib**: return directly if udp socket close before lookup (theanarkh) [#51914](https://github.com/nodejs/node/pull/51914) +- \[[`dcbf88f4c7`](https://github.com/nodejs/node/commit/dcbf88f4c7)] - **lib**: account for cwd access from snapshot serialization cb (Anna Henningsen) [#51901](https://github.com/nodejs/node/pull/51901) +- \[[`da8fa484f8`](https://github.com/nodejs/node/commit/da8fa484f8)] - **lib**: fix http client socket path (theanarkh) [#51900](https://github.com/nodejs/node/pull/51900) +- \[[`55011d2c71`](https://github.com/nodejs/node/commit/55011d2c71)] - **lib**: only build the ESM facade for builtins when they are needed (Joyee Cheung) [#51669](https://github.com/nodejs/node/pull/51669) +- \[[`7894989bf0`](https://github.com/nodejs/node/commit/7894989bf0)] - **(SEMVER-MINOR)** **lib**: move encodingsMap to internal/util (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`9082cc557d`](https://github.com/nodejs/node/commit/9082cc557d)] - **lib**: do not access process.noDeprecation at build time (Joyee Cheung) [#51447](https://github.com/nodejs/node/pull/51447) +- \[[`6679e6b616`](https://github.com/nodejs/node/commit/6679e6b616)] - **lib**: add assertion for user ESM execution (Joyee Cheung) [#51748](https://github.com/nodejs/node/pull/51748) +- \[[`d6e8d03afc`](https://github.com/nodejs/node/commit/d6e8d03afc)] - **lib**: create global console properties at snapshot build time (Joyee Cheung) [#51700](https://github.com/nodejs/node/pull/51700) +- \[[`bd2a3c10ae`](https://github.com/nodejs/node/commit/bd2a3c10ae)] - **lib**: define FormData and fetch etc. in the built-in snapshot (Joyee Cheung) [#51598](https://github.com/nodejs/node/pull/51598) +- \[[`da79876ef0`](https://github.com/nodejs/node/commit/da79876ef0)] - **lib**: allow checking the test result from afterEach (Tim Stableford) [#51485](https://github.com/nodejs/node/pull/51485) +- \[[`bff7e3cf7a`](https://github.com/nodejs/node/commit/bff7e3cf7a)] - **lib**: remove unnecessary refreshHrtimeBuffer() (Joyee Cheung) [#51446](https://github.com/nodejs/node/pull/51446) +- \[[`562947e012`](https://github.com/nodejs/node/commit/562947e012)] - **lib**: fix use of `--frozen-intrinsics` with `--jitless` (Antoine du Hamel) [#51248](https://github.com/nodejs/node/pull/51248) +- \[[`7b83ef749e`](https://github.com/nodejs/node/commit/7b83ef749e)] - **lib**: move function declaration outside of loop (Sanjaiyan Parthipan) [#51242](https://github.com/nodejs/node/pull/51242) +- \[[`0a85b0fd9d`](https://github.com/nodejs/node/commit/0a85b0fd9d)] - **lib**: reduce overhead of `SafePromiseAllSettledReturnVoid` calls (Antoine du Hamel) [#51243](https://github.com/nodejs/node/pull/51243) +- \[[`f4d7f0498e`](https://github.com/nodejs/node/commit/f4d7f0498e)] - **lib**: expose default prepareStackTrace (Chengzhong Wu) [#50827](https://github.com/nodejs/node/pull/50827) +- \[[`5c7a9c8d4a`](https://github.com/nodejs/node/commit/5c7a9c8d4a)] - **lib**: don't parse windows drive letters as schemes (华) [#50580](https://github.com/nodejs/node/pull/50580) +- \[[`9da6384f5a`](https://github.com/nodejs/node/commit/9da6384f5a)] - **lib**: refactor to use validateFunction in diagnostics_channel (Deokjin Kim) [#50955](https://github.com/nodejs/node/pull/50955) +- \[[`be3205ae24`](https://github.com/nodejs/node/commit/be3205ae24)] - **lib**: streamline process.binding() handling (Joyee Cheung) [#50773](https://github.com/nodejs/node/pull/50773) +- \[[`f4987eb91e`](https://github.com/nodejs/node/commit/f4987eb91e)] - **lib,permission**: handle buffer on fs.symlink (Rafael Gonzaga) [#51212](https://github.com/nodejs/node/pull/51212) +- \[[`861e040b40`](https://github.com/nodejs/node/commit/861e040b40)] - **lib,src**: extract sourceMappingURL from module (unbyte) [#51690](https://github.com/nodejs/node/pull/51690) +- \[[`8a082754e0`](https://github.com/nodejs/node/commit/8a082754e0)] - **lib,src**: replace toUSVString with `toWellFormed()` (Yagiz Nizipli) [#47342](https://github.com/nodejs/node/pull/47342) +- \[[`3badc1139c`](https://github.com/nodejs/node/commit/3badc1139c)] - **(SEMVER-MINOR)** **lib,src,permission**: port path.resolve to C++ (Rafael Gonzaga) [#50758](https://github.com/nodejs/node/pull/50758) +- \[[`4b3cc3ce18`](https://github.com/nodejs/node/commit/4b3cc3ce18)] - **loader**: speed up line length calc used by moduleProvider (Mudit) [#50969](https://github.com/nodejs/node/pull/50969) +- \[[`960d67c51f`](https://github.com/nodejs/node/commit/960d67c51f)] - **meta**: bump github/codeql-action from 3.23.2 to 3.24.6 (dependabot\[bot]) [#51942](https://github.com/nodejs/node/pull/51942) +- \[[`1783b93af2`](https://github.com/nodejs/node/commit/1783b93af2)] - **meta**: bump actions/upload-artifact from 4.3.0 to 4.3.1 (dependabot\[bot]) [#51941](https://github.com/nodejs/node/pull/51941) +- \[[`1db603db2f`](https://github.com/nodejs/node/commit/1db603db2f)] - **meta**: bump codecov/codecov-action from 4.0.1 to 4.1.0 (dependabot\[bot]) [#51940](https://github.com/nodejs/node/pull/51940) +- \[[`2ddec64d5a`](https://github.com/nodejs/node/commit/2ddec64d5a)] - **meta**: bump actions/cache from 4.0.0 to 4.0.1 (dependabot\[bot]) [#51939](https://github.com/nodejs/node/pull/51939) +- \[[`92490421be`](https://github.com/nodejs/node/commit/92490421be)] - **meta**: bump actions/download-artifact from 4.1.1 to 4.1.3 (dependabot\[bot]) [#51938](https://github.com/nodejs/node/pull/51938) +- \[[`f3fa2b72b8`](https://github.com/nodejs/node/commit/f3fa2b72b8)] - **meta**: bump actions/setup-node from 4.0.1 to 4.0.2 (dependabot\[bot]) [#51937](https://github.com/nodejs/node/pull/51937) +- \[[`a62b042e83`](https://github.com/nodejs/node/commit/a62b042e83)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51726](https://github.com/nodejs/node/pull/51726) +- \[[`491f9f9902`](https://github.com/nodejs/node/commit/491f9f9902)] - **meta**: bump codecov/codecov-action from 3.1.4 to 4.0.1 (dependabot\[bot]) [#51648](https://github.com/nodejs/node/pull/51648) +- \[[`2765077a47`](https://github.com/nodejs/node/commit/2765077a47)] - **meta**: bump actions/download-artifact from 4.1.0 to 4.1.1 (dependabot\[bot]) [#51644](https://github.com/nodejs/node/pull/51644) +- \[[`152a07b854`](https://github.com/nodejs/node/commit/152a07b854)] - **meta**: bump actions/upload-artifact from 4.0.0 to 4.3.0 (dependabot\[bot]) [#51643](https://github.com/nodejs/node/pull/51643) +- \[[`53826920fb`](https://github.com/nodejs/node/commit/53826920fb)] - **meta**: bump step-security/harden-runner from 2.6.1 to 2.7.0 (dependabot\[bot]) [#51641](https://github.com/nodejs/node/pull/51641) +- \[[`3d1dc9b030`](https://github.com/nodejs/node/commit/3d1dc9b030)] - **meta**: bump actions/cache from 3.3.2 to 4.0.0 (dependabot\[bot]) [#51640](https://github.com/nodejs/node/pull/51640) +- \[[`287bdf6bda`](https://github.com/nodejs/node/commit/287bdf6bda)] - **meta**: bump github/codeql-action from 3.22.12 to 3.23.2 (dependabot\[bot]) [#51639](https://github.com/nodejs/node/pull/51639) +- \[[`90068fb0f1`](https://github.com/nodejs/node/commit/90068fb0f1)] - **meta**: add .mailmap entry for lemire (Daniel Lemire) [#51600](https://github.com/nodejs/node/pull/51600) +- \[[`f91786bd70`](https://github.com/nodejs/node/commit/f91786bd70)] - **meta**: mark security-wg codeowner for deps folder (Marco Ippolito) [#51529](https://github.com/nodejs/node/pull/51529) +- \[[`e51221be8d`](https://github.com/nodejs/node/commit/e51221be8d)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51468](https://github.com/nodejs/node/pull/51468) +- \[[`4a8a012c6d`](https://github.com/nodejs/node/commit/4a8a012c6d)] - **meta**: move RaisinTen to emeritus and remove from strategic initiatives (Darshan Sen) [#51411](https://github.com/nodejs/node/pull/51411) +- \[[`e9276bab3f`](https://github.com/nodejs/node/commit/e9276bab3f)] - **meta**: add .temp and .lock tags to ignore (Rafael Gonzaga) [#51343](https://github.com/nodejs/node/pull/51343) +- \[[`ae6fecbc8d`](https://github.com/nodejs/node/commit/ae6fecbc8d)] - **meta**: bump actions/setup-python from 4.7.1 to 5.0.0 (dependabot\[bot]) [#51335](https://github.com/nodejs/node/pull/51335) +- \[[`f4be49a618`](https://github.com/nodejs/node/commit/f4be49a618)] - **meta**: bump actions/setup-node from 4.0.0 to 4.0.1 (dependabot\[bot]) [#51334](https://github.com/nodejs/node/pull/51334) +- \[[`e24aa7ced1`](https://github.com/nodejs/node/commit/e24aa7ced1)] - **meta**: bump github/codeql-action from 2.22.8 to 3.22.12 (dependabot\[bot]) [#51333](https://github.com/nodejs/node/pull/51333) +- \[[`287c2bcf56`](https://github.com/nodejs/node/commit/287c2bcf56)] - **meta**: bump actions/stale from 8.0.0 to 9.0.0 (dependabot\[bot]) [#51332](https://github.com/nodejs/node/pull/51332) +- \[[`1cad0dfaff`](https://github.com/nodejs/node/commit/1cad0dfaff)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51329](https://github.com/nodejs/node/pull/51329) +- \[[`eef64b782e`](https://github.com/nodejs/node/commit/eef64b782e)] - **meta**: notify tsc on changes in SECURITY.md (Rafael Gonzaga) [#51259](https://github.com/nodejs/node/pull/51259) +- \[[`95a880f728`](https://github.com/nodejs/node/commit/95a880f728)] - **meta**: update artifact actions to v4 (Michaël Zasso) [#51219](https://github.com/nodejs/node/pull/51219) +- \[[`59805f6879`](https://github.com/nodejs/node/commit/59805f6879)] - **meta**: bump step-security/harden-runner from 2.6.0 to 2.6.1 (dependabot\[bot]) [#50999](https://github.com/nodejs/node/pull/50999) +- \[[`d74e0b97c3`](https://github.com/nodejs/node/commit/d74e0b97c3)] - **meta**: bump github/codeql-action from 2.22.5 to 2.22.8 (dependabot\[bot]) [#50998](https://github.com/nodejs/node/pull/50998) +- \[[`91cd9183d1`](https://github.com/nodejs/node/commit/91cd9183d1)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#50931](https://github.com/nodejs/node/pull/50931) +- \[[`c621491aba`](https://github.com/nodejs/node/commit/c621491aba)] - **module**: fix crash when built-in module export a `default` key (Antoine du Hamel) [#51481](https://github.com/nodejs/node/pull/51481) +- \[[`43a8d3e984`](https://github.com/nodejs/node/commit/43a8d3e984)] - **module**: fix `--preserve-symlinks-main` (per4uk) [#51312](https://github.com/nodejs/node/pull/51312) +- \[[`d8da197f86`](https://github.com/nodejs/node/commit/d8da197f86)] - **module**: move the CJS exports cache to internal/modules/cjs/loader (Joyee Cheung) [#51157](https://github.com/nodejs/node/pull/51157) +- \[[`5fc10ca4d6`](https://github.com/nodejs/node/commit/5fc10ca4d6)] - **module**: load source maps in `commonjs` translator (Hiroki Osame) [#51033](https://github.com/nodejs/node/pull/51033) +- \[[`43e9f0bc65`](https://github.com/nodejs/node/commit/43e9f0bc65)] - **module**: document `parentURL` in register options (Hiroki Osame) [#51039](https://github.com/nodejs/node/pull/51039) +- \[[`870ef5a73f`](https://github.com/nodejs/node/commit/870ef5a73f)] - **net**: fix connect crash when call destroy in lookup handler (theanarkh) [#51826](https://github.com/nodejs/node/pull/51826) +- \[[`caf71e05a6`](https://github.com/nodejs/node/commit/caf71e05a6)] - **net**: fix example IPv4 in dns docs (Aras Abbasi) [#51377](https://github.com/nodejs/node/pull/51377) +- \[[`58a636be0e`](https://github.com/nodejs/node/commit/58a636be0e)] - **(SEMVER-MINOR)** **net**: add connection attempt events (Paolo Insogna) [#51045](https://github.com/nodejs/node/pull/51045) +- \[[`06a29f830a`](https://github.com/nodejs/node/commit/06a29f830a)] - **node-api**: make napi_get_buffer_info check if passed buffer is valid (Janrupf) [#51571](https://github.com/nodejs/node/pull/51571) +- \[[`0fb98438e4`](https://github.com/nodejs/node/commit/0fb98438e4)] - **node-api**: move NAPI_EXPERIMENTAL definition to gyp file (Gabriel Schulhof) [#51254](https://github.com/nodejs/node/pull/51254) +- \[[`242139fb98`](https://github.com/nodejs/node/commit/242139fb98)] - **node-api**: optimize napi_set_property for perf (Mert Can Altın) [#50282](https://github.com/nodejs/node/pull/50282) +- \[[`dc3d70c040`](https://github.com/nodejs/node/commit/dc3d70c040)] - **node-api**: type tag external values without v8::Private (Chengzhong Wu) [#51149](https://github.com/nodejs/node/pull/51149) +- \[[`0ac070ccb7`](https://github.com/nodejs/node/commit/0ac070ccb7)] - **node-api**: segregate nogc APIs from rest via type system (Gabriel Schulhof) [#50060](https://github.com/nodejs/node/pull/50060) +- \[[`de65cada70`](https://github.com/nodejs/node/commit/de65cada70)] - **node-api**: introduce experimental feature flags (Gabriel Schulhof) [#50991](https://github.com/nodejs/node/pull/50991) +- \[[`e192ba18cd`](https://github.com/nodejs/node/commit/e192ba18cd)] - **perf_hooks**: performance milestone time origin timestamp improvement (IlyasShabi) [#51713](https://github.com/nodejs/node/pull/51713) +- \[[`f94336f95a`](https://github.com/nodejs/node/commit/f94336f95a)] - **repl**: fix `NO_COLORS` env var is ignored (Moshe Atlow) [#51568](https://github.com/nodejs/node/pull/51568) +- \[[`e08649caa0`](https://github.com/nodejs/node/commit/e08649caa0)] - **repl**: fix prepareStackTrace frames array order (Chengzhong Wu) [#50827](https://github.com/nodejs/node/pull/50827) +- \[[`07614072f1`](https://github.com/nodejs/node/commit/07614072f1)] - **sea**: update stability index (Joyee Cheung) [#51774](https://github.com/nodejs/node/pull/51774) +- \[[`eea0d74454`](https://github.com/nodejs/node/commit/eea0d74454)] - **(SEMVER-MINOR)** **sea**: support sea.getRawAsset() (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`db0efa3f40`](https://github.com/nodejs/node/commit/db0efa3f40)] - **(SEMVER-MINOR)** **sea**: support embedding assets (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`9b164c6eec`](https://github.com/nodejs/node/commit/9b164c6eec)] - **src**: fix --disable-single-executable-application (Joyee Cheung) [#51808](https://github.com/nodejs/node/pull/51808) +- \[[`306c1d35e5`](https://github.com/nodejs/node/commit/306c1d35e5)] - **src**: simplify direct queries of env vars in C++ land (Joyee Cheung) [#51829](https://github.com/nodejs/node/pull/51829) +- \[[`696063a47c`](https://github.com/nodejs/node/commit/696063a47c)] - **src**: stop the profiler and the inspector before snapshot serialization (Joyee Cheung) [#51815](https://github.com/nodejs/node/pull/51815) +- \[[`be40c8286c`](https://github.com/nodejs/node/commit/be40c8286c)] - **src**: simplify embedder entry point execution (Joyee Cheung) [#51557](https://github.com/nodejs/node/pull/51557) +- \[[`90391ff256`](https://github.com/nodejs/node/commit/90391ff256)] - **src**: compile code eagerly in snapshot builder (Joyee Cheung) [#51672](https://github.com/nodejs/node/pull/51672) +- \[[`3875fa1dc5`](https://github.com/nodejs/node/commit/3875fa1dc5)] - **src**: check empty before accessing string (Cheng Zhao) [#51665](https://github.com/nodejs/node/pull/51665) +- \[[`a58c98ea85`](https://github.com/nodejs/node/commit/a58c98ea85)] - **(SEMVER-MINOR)** **src**: print string content better in BlobDeserializer (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`62707a9d27`](https://github.com/nodejs/node/commit/62707a9d27)] - **src**: fix vm bug for configurable globalThis (F. Hinkelmann) [#51602](https://github.com/nodejs/node/pull/51602) +- \[[`c3c0a3ee5c`](https://github.com/nodejs/node/commit/c3c0a3ee5c)] - **(SEMVER-MINOR)** **src**: support multi-line values for .env file (IlyasShabi) [#51289](https://github.com/nodejs/node/pull/51289) +- \[[`dc8fe9ebf4`](https://github.com/nodejs/node/commit/dc8fe9ebf4)] - **(SEMVER-MINOR)** **src**: add `process.loadEnvFile` and `util.parseEnv` (Yagiz Nizipli) [#51476](https://github.com/nodejs/node/pull/51476) +- \[[`a5afad2a4d`](https://github.com/nodejs/node/commit/a5afad2a4d)] - **src**: terminate correctly double-quote in env variable (Marco Ippolito) [#51510](https://github.com/nodejs/node/pull/51510) +- \[[`2a921966c6`](https://github.com/nodejs/node/commit/2a921966c6)] - **(SEMVER-MINOR)** **src**: do not coerce dotenv paths (Tobias Nießen) [#51425](https://github.com/nodejs/node/pull/51425) +- \[[`50ec55c268`](https://github.com/nodejs/node/commit/50ec55c268)] - **src**: refactor `GetCreationContext` calls (Jungku Lee) [#51367](https://github.com/nodejs/node/pull/51367) +- \[[`2e65389922`](https://github.com/nodejs/node/commit/2e65389922)] - **src**: do not read string out of bounds (Cheng Zhao) [#51358](https://github.com/nodejs/node/pull/51358) +- \[[`a653531089`](https://github.com/nodejs/node/commit/a653531089)] - **src**: avoid shadowed string in fs_permission (Shelley Vohr) [#51123](https://github.com/nodejs/node/pull/51123) +- \[[`c190a057ff`](https://github.com/nodejs/node/commit/c190a057ff)] - **src**: avoid draining platform tasks at FreeEnvironment (Chengzhong Wu) [#51290](https://github.com/nodejs/node/pull/51290) +- \[[`00227674f5`](https://github.com/nodejs/node/commit/00227674f5)] - **src**: add fast api for Histogram (James M Snell) [#51296](https://github.com/nodejs/node/pull/51296) +- \[[`4733c8e4df`](https://github.com/nodejs/node/commit/4733c8e4df)] - **src**: refactor `GetCreationContext` calls (Yagiz Nizipli) [#51287](https://github.com/nodejs/node/pull/51287) +- \[[`d76e16bb47`](https://github.com/nodejs/node/commit/d76e16bb47)] - **src**: enter isolate before destructing IsolateData (Ben Noordhuis) [#51138](https://github.com/nodejs/node/pull/51138) +- \[[`4ffdd37d2c`](https://github.com/nodejs/node/commit/4ffdd37d2c)] - **src**: eliminate duplicate code in histogram.cc (James M Snell) [#51263](https://github.com/nodejs/node/pull/51263) +- \[[`2ce8b974a0`](https://github.com/nodejs/node/commit/2ce8b974a0)] - **src**: fix unix abstract socket path for trace event (theanarkh) [#50858](https://github.com/nodejs/node/pull/50858) +- \[[`9b25268cb8`](https://github.com/nodejs/node/commit/9b25268cb8)] - **src**: use BignumPointer and use BN_clear_free (James M Snell) [#50454](https://github.com/nodejs/node/pull/50454) +- \[[`a80f660343`](https://github.com/nodejs/node/commit/a80f660343)] - **src**: implement FastByteLengthUtf8 with simdutf::utf8_length_from_latin1 (Daniel Lemire) [#50840](https://github.com/nodejs/node/pull/50840) +- \[[`0dee86f295`](https://github.com/nodejs/node/commit/0dee86f295)] - **(SEMVER-MINOR)** **src**: support configurable snapshot (Joyee Cheung) [#50453](https://github.com/nodejs/node/pull/50453) +- \[[`90b5ed1d1d`](https://github.com/nodejs/node/commit/90b5ed1d1d)] - **src**: implement countObjectsWithPrototype (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +- \[[`9365e129ed`](https://github.com/nodejs/node/commit/9365e129ed)] - **src**: register udp_wrap external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +- \[[`b05d496b6c`](https://github.com/nodejs/node/commit/b05d496b6c)] - **src**: register spawn_sync external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +- \[[`642fb44982`](https://github.com/nodejs/node/commit/642fb44982)] - **src**: register process_wrap external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +- \[[`c7c9e81a1a`](https://github.com/nodejs/node/commit/c7c9e81a1a)] - **src**: fix double free reported by coverity (Michael Dawson) [#51046](https://github.com/nodejs/node/pull/51046) +- \[[`358793e28e`](https://github.com/nodejs/node/commit/358793e28e)] - **src**: remove unused headers in `node_file.cc` (Jungku Lee) [#50927](https://github.com/nodejs/node/pull/50927) +- \[[`c705b73a74`](https://github.com/nodejs/node/commit/c705b73a74)] - **src**: implement --trace-promises (Joyee Cheung) [#50899](https://github.com/nodejs/node/pull/50899) +- \[[`97aa67f006`](https://github.com/nodejs/node/commit/97aa67f006)] - **src**: fix dynamically linked zlib version (Richard Lau) [#51007](https://github.com/nodejs/node/pull/51007) +- \[[`d6f46a44f2`](https://github.com/nodejs/node/commit/d6f46a44f2)] - **src**: make ModifyCodeGenerationFromStrings more robust (Joyee Cheung) [#50763](https://github.com/nodejs/node/pull/50763) +- \[[`362135a1f9`](https://github.com/nodejs/node/commit/362135a1f9)] - **src**: disable uncaught exception abortion for ESM syntax detection (Yagiz Nizipli) [#50987](https://github.com/nodejs/node/pull/50987) +- \[[`d82b0d4320`](https://github.com/nodejs/node/commit/d82b0d4320)] - **src**: fix backtrace with tail \[\[noreturn]] abort (Chengzhong Wu) [#50849](https://github.com/nodejs/node/pull/50849) +- \[[`6df3e31bff`](https://github.com/nodejs/node/commit/6df3e31bff)] - **src**: print MKSNAPSHOT debug logs to stderr (Joyee Cheung) [#50759](https://github.com/nodejs/node/pull/50759) +- \[[`fd5efac176`](https://github.com/nodejs/node/commit/fd5efac176)] - **(SEMVER-MINOR)** **src,permission**: add --allow-addon flag (Rafael Gonzaga) [#51183](https://github.com/nodejs/node/pull/51183) +- \[[`b616f6fa06`](https://github.com/nodejs/node/commit/b616f6fa06)] - **src,stream**: improve WriteString (ywave620) [#51155](https://github.com/nodejs/node/pull/51155) +- \[[`16d8cd5b22`](https://github.com/nodejs/node/commit/16d8cd5b22)] - **stream**: do not defer construction by one microtick (Matteo Collina) [#52005](https://github.com/nodejs/node/pull/52005) +- \[[`7931c3bbc8`](https://github.com/nodejs/node/commit/7931c3bbc8)] - **stream**: fix eventNames() to not return not defined events (IlyasShabi) [#51331](https://github.com/nodejs/node/pull/51331) +- \[[`d0a6f3515d`](https://github.com/nodejs/node/commit/d0a6f3515d)] - **stream**: fix cloned webstreams not being unref correctly (tsctx) [#51526](https://github.com/nodejs/node/pull/51526) +- \[[`8750070a47`](https://github.com/nodejs/node/commit/8750070a47)] - **stream**: fix fd is null when calling clearBuffer (kylo5aby) [#50994](https://github.com/nodejs/node/pull/50994) +- \[[`ade6614067`](https://github.com/nodejs/node/commit/ade6614067)] - **(SEMVER-MINOR)** **stream**: add support for `deflate-raw` format to webstreams compression (Damian Krzeminski) [#50097](https://github.com/nodejs/node/pull/50097) +- \[[`905c48fc6e`](https://github.com/nodejs/node/commit/905c48fc6e)] - **test**: add regression test for test_runner after hook (Colin Ihrig) [#51998](https://github.com/nodejs/node/pull/51998) +- \[[`60f008b65e`](https://github.com/nodejs/node/commit/60f008b65e)] - **test**: reduce flakiness of `test-runner-output` (Antoine du Hamel) [#51952](https://github.com/nodejs/node/pull/51952) +- \[[`0ad88f6a5c`](https://github.com/nodejs/node/commit/0ad88f6a5c)] - **test**: fix flaky http-chunk-extensions-limit test (Ethan Arrowood) [#51943](https://github.com/nodejs/node/pull/51943) +- \[[`3f85c7ac97`](https://github.com/nodejs/node/commit/3f85c7ac97)] - **test**: remove flaky designation (Luigi Pinca) [#51736](https://github.com/nodejs/node/pull/51736) +- \[[`f37648ee5c`](https://github.com/nodejs/node/commit/f37648ee5c)] - **test**: skip SEA tests when SEA generation fails (Joyee Cheung) [#51887](https://github.com/nodejs/node/pull/51887) +- \[[`136b6a998b`](https://github.com/nodejs/node/commit/136b6a998b)] - **test**: fix unreliable assumption in js-native-api/test_cannot_run_js (Joyee Cheung) [#51898](https://github.com/nodejs/node/pull/51898) +- \[[`d90594aefa`](https://github.com/nodejs/node/commit/d90594aefa)] - **test**: deflake test-http2-large-write-multiple-requests (Joyee Cheung) [#51863](https://github.com/nodejs/node/pull/51863) +- \[[`a0b36e33d1`](https://github.com/nodejs/node/commit/a0b36e33d1)] - **test**: fix test-debugger-profile for coverage generation (Joyee Cheung) [#51816](https://github.com/nodejs/node/pull/51816) +- \[[`dd0f164ca3`](https://github.com/nodejs/node/commit/dd0f164ca3)] - **test**: fix test-bootstrap-modules for coverage generation (Joyee Cheung) [#51816](https://github.com/nodejs/node/pull/51816) +- \[[`e4c7d62496`](https://github.com/nodejs/node/commit/e4c7d62496)] - **test**: ensure delay in recursive fs watch tests (Joyee Cheung) [#51842](https://github.com/nodejs/node/pull/51842) +- \[[`963d7d7dea`](https://github.com/nodejs/node/commit/963d7d7dea)] - **test**: fix test-child-process-fork-net (Joyee Cheung) [#51841](https://github.com/nodejs/node/pull/51841) +- \[[`dd708d337e`](https://github.com/nodejs/node/commit/dd708d337e)] - **test**: split wasi tests (Joyee Cheung) [#51836](https://github.com/nodejs/node/pull/51836) +- \[[`853b48d905`](https://github.com/nodejs/node/commit/853b48d905)] - **test**: remove test-fs-stat-bigint flaky designation (Luigi Pinca) [#51735](https://github.com/nodejs/node/pull/51735) +- \[[`fdc7d751de`](https://github.com/nodejs/node/commit/fdc7d751de)] - **test**: skip test-http-correct-hostname on loong64 (Shi Pujin) [#51663](https://github.com/nodejs/node/pull/51663) +- \[[`c33f860d2b`](https://github.com/nodejs/node/commit/c33f860d2b)] - **test**: remove test-cli-node-options flaky designation (Luigi Pinca) [#51716](https://github.com/nodejs/node/pull/51716) +- \[[`f528e965f6`](https://github.com/nodejs/node/commit/f528e965f6)] - **test**: remove test-domain-error-types flaky designation (Luigi Pinca) [#51717](https://github.com/nodejs/node/pull/51717) +- \[[`7e3ee828f1`](https://github.com/nodejs/node/commit/7e3ee828f1)] - **test**: fix `internet/test-inspector-help-page` (Richard Lau) [#51693](https://github.com/nodejs/node/pull/51693) +- \[[`170278c25d`](https://github.com/nodejs/node/commit/170278c25d)] - **test**: remove duplicate entry for flaky test (Luigi Pinca) [#51654](https://github.com/nodejs/node/pull/51654) +- \[[`d0d5bd0e54`](https://github.com/nodejs/node/commit/d0d5bd0e54)] - **test**: remove test-crypto-keygen flaky designation (Luigi Pinca) [#51567](https://github.com/nodejs/node/pull/51567) +- \[[`bca6dcca0b`](https://github.com/nodejs/node/commit/bca6dcca0b)] - **test**: remove test-fs-rmdir-recursive flaky designation (Luigi Pinca) [#51566](https://github.com/nodejs/node/pull/51566) +- \[[`af3f229d6b`](https://github.com/nodejs/node/commit/af3f229d6b)] - **test**: remove common.expectsError calls for asserts (Paulo Chaves) [#51504](https://github.com/nodejs/node/pull/51504) +- \[[`f6fcd200e6`](https://github.com/nodejs/node/commit/f6fcd200e6)] - **test**: mark test-http2-large-file as flaky (Michaël Zasso) [#51549](https://github.com/nodejs/node/pull/51549) +- \[[`1d8e65a230`](https://github.com/nodejs/node/commit/1d8e65a230)] - **test**: use checkIfCollectableByCounting in SourceTextModule leak test (Joyee Cheung) [#51512](https://github.com/nodejs/node/pull/51512) +- \[[`713afed6b0`](https://github.com/nodejs/node/commit/713afed6b0)] - **test**: remove test-file-write-stream4 flaky designation (Luigi Pinca) [#51472](https://github.com/nodejs/node/pull/51472) +- \[[`292d0174df`](https://github.com/nodejs/node/commit/292d0174df)] - **test**: add URL tests to fs-write (Rafael Gonzaga) [#51352](https://github.com/nodejs/node/pull/51352) +- \[[`954e2f2f58`](https://github.com/nodejs/node/commit/954e2f2f58)] - **test**: remove unneeded common.expectsError for asserts (Andrés Morelos) [#51353](https://github.com/nodejs/node/pull/51353) +- \[[`f2dfe0fa80`](https://github.com/nodejs/node/commit/f2dfe0fa80)] - **test**: add regression test for 51586 (Matteo Collina) [#51491](https://github.com/nodejs/node/pull/51491) +- \[[`6ee5f50789`](https://github.com/nodejs/node/commit/6ee5f50789)] - **test**: fix flaky conditions for ppc64 SEA tests (Richard Lau) [#51422](https://github.com/nodejs/node/pull/51422) +- \[[`06a6eef9a4`](https://github.com/nodejs/node/commit/06a6eef9a4)] - **test**: replace forEach() with for...of (Alexander Jones) [#50608](https://github.com/nodejs/node/pull/50608) +- \[[`a98102a6de`](https://github.com/nodejs/node/commit/a98102a6de)] - **test**: replace forEach with for...of (Ospite Privilegiato) [#50787](https://github.com/nodejs/node/pull/50787) +- \[[`e9080a94d3`](https://github.com/nodejs/node/commit/e9080a94d3)] - **test**: replace foreach with for of (lucacapocci94-dev) [#50790](https://github.com/nodejs/node/pull/50790) +- \[[`42b162b06d`](https://github.com/nodejs/node/commit/42b162b06d)] - **test**: replace forEach() with for...of (Jia) [#50610](https://github.com/nodejs/node/pull/50610) +- \[[`cab7737f7e`](https://github.com/nodejs/node/commit/cab7737f7e)] - **test**: fix inconsistency write size in `test-fs-readfile-tostring-fail` (Jungku Lee) [#51141](https://github.com/nodejs/node/pull/51141) +- \[[`15731b4b2f`](https://github.com/nodejs/node/commit/15731b4b2f)] - **test**: replace forEach test-http-server-multiheaders2 (Marco Mac) [#50794](https://github.com/nodejs/node/pull/50794) +- \[[`9cedaa62fa`](https://github.com/nodejs/node/commit/9cedaa62fa)] - **test**: replace forEach with for-of in test-webcrypto-export-import-ec (Chiara Ricciardi) [#51249](https://github.com/nodejs/node/pull/51249) +- \[[`7f301e04be`](https://github.com/nodejs/node/commit/7f301e04be)] - **test**: move to for of loop in test-http-hostname-typechecking.js (Luca Del Puppo) [#50782](https://github.com/nodejs/node/pull/50782) +- \[[`6e62e649df`](https://github.com/nodejs/node/commit/6e62e649df)] - **test**: skip test-watch-mode-inspect on arm (Michael Dawson) [#51210](https://github.com/nodejs/node/pull/51210) +- \[[`c3c2b2b041`](https://github.com/nodejs/node/commit/c3c2b2b041)] - **test**: replace forEach with for of in file test-trace-events-net.js (Ianna83) [#50789](https://github.com/nodejs/node/pull/50789) +- \[[`55c423ba4f`](https://github.com/nodejs/node/commit/55c423ba4f)] - **test**: replace forEach() with for...of in test/parallel/test-util-log.js (Edoardo Dusi) [#50783](https://github.com/nodejs/node/pull/50783) +- \[[`8ac05cf3c4`](https://github.com/nodejs/node/commit/8ac05cf3c4)] - **test**: replace forEach with for of in test-trace-events-api.js (Andrea Pavone) [#50784](https://github.com/nodejs/node/pull/50784) +- \[[`d10d39e8ba`](https://github.com/nodejs/node/commit/d10d39e8ba)] - **test**: replace forEach with for-of in test-v8-serders.js (Mattia Iannone) [#50791](https://github.com/nodejs/node/pull/50791) +- \[[`576adc5e5b`](https://github.com/nodejs/node/commit/576adc5e5b)] - **test**: add URL tests to fs-read in pm (Rafael Gonzaga) [#51213](https://github.com/nodejs/node/pull/51213) +- \[[`996cef51b7`](https://github.com/nodejs/node/commit/996cef51b7)] - **test**: use tmpdir.refresh() in test-esm-loader-resolve-type.mjs (Luigi Pinca) [#51206](https://github.com/nodejs/node/pull/51206) +- \[[`8f2d982342`](https://github.com/nodejs/node/commit/8f2d982342)] - **test**: use tmpdir.refresh() in test-esm-json.mjs (Luigi Pinca) [#51205](https://github.com/nodejs/node/pull/51205) +- \[[`efd6630143`](https://github.com/nodejs/node/commit/efd6630143)] - **test**: fix flakiness in worker\*.test-free-called (Jithil P Ponnan) [#51013](https://github.com/nodejs/node/pull/51013) +- \[[`54a29ee506`](https://github.com/nodejs/node/commit/54a29ee506)] - **test**: deflake test-diagnostics-channel-memory-leak (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +- \[[`6319ea6183`](https://github.com/nodejs/node/commit/6319ea6183)] - **test**: test syncrhnous methods of child_process in snapshot (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +- \[[`50df4aee2b`](https://github.com/nodejs/node/commit/50df4aee2b)] - **test**: handle relative https redirect (Richard Lau) [#51121](https://github.com/nodejs/node/pull/51121) +- \[[`9f88f40cae`](https://github.com/nodejs/node/commit/9f88f40cae)] - **test**: fix test runner colored output test (Moshe Atlow) [#51064](https://github.com/nodejs/node/pull/51064) +- \[[`a1feae24cb`](https://github.com/nodejs/node/commit/a1feae24cb)] - **test**: resolve path of embedtest binary correctly (Cheng Zhao) [#50276](https://github.com/nodejs/node/pull/50276) +- \[[`a4f1805c92`](https://github.com/nodejs/node/commit/a4f1805c92)] - **test**: escape cwd in regexp (Jérémy Lal) [#50980](https://github.com/nodejs/node/pull/50980) +- \[[`1c28db8116`](https://github.com/nodejs/node/commit/1c28db8116)] - **test**: replace forEach to for.. test-webcrypto-export-import-cfrg.js (Angelo Parziale) [#50785](https://github.com/nodejs/node/pull/50785) +- \[[`a4f505213e`](https://github.com/nodejs/node/commit/a4f505213e)] - **test**: log more information in SEA tests (Joyee Cheung) [#50759](https://github.com/nodejs/node/pull/50759) +- \[[`c91b817a5c`](https://github.com/nodejs/node/commit/c91b817a5c)] - **test**: consolidate utf8 text fixtures in tests (Joyee Cheung) [#50732](https://github.com/nodejs/node/pull/50732) +- \[[`26a06b093b`](https://github.com/nodejs/node/commit/26a06b093b)] - **test**: give more time to GC in test-shadow-realm-gc-\* (Joyee Cheung) [#50735](https://github.com/nodejs/node/pull/50735) +- \[[`e8f5735149`](https://github.com/nodejs/node/commit/e8f5735149)] - **test**: test surrogate pair filenames on windows (Mert Can Altın) [#51800](https://github.com/nodejs/node/pull/51800) +- \[[`1ab9ff46a5`](https://github.com/nodejs/node/commit/1ab9ff46a5)] - **test**: mark test-wasi as flaky on Windows on ARM (Joyee Cheung) [#51834](https://github.com/nodejs/node/pull/51834) +- \[[`1c47da1453`](https://github.com/nodejs/node/commit/1c47da1453)] - **test,crypto**: update WebCryptoAPI WPT (Filip Skokan) [#51533](https://github.com/nodejs/node/pull/51533) +- \[[`91c8624608`](https://github.com/nodejs/node/commit/91c8624608)] - **test_runner**: serialize 'expected' and 'actual' in isolation (Malthe Borch) [#51851](https://github.com/nodejs/node/pull/51851) +- \[[`cea90dcfe3`](https://github.com/nodejs/node/commit/cea90dcfe3)] - **test_runner**: add ref methods to mocked timers (Marco Ippolito) [#51809](https://github.com/nodejs/node/pull/51809) +- \[[`9ff0df1793`](https://github.com/nodejs/node/commit/9ff0df1793)] - **test_runner**: check if timeout was cleared by own callback (Ben Richeson) [#51673](https://github.com/nodejs/node/pull/51673) +- \[[`34ecd1e36b`](https://github.com/nodejs/node/commit/34ecd1e36b)] - **test_runner**: fixed test object is incorrectly passed to setup() (Pulkit Gupta) [#50982](https://github.com/nodejs/node/pull/50982) +- \[[`da17a2538e`](https://github.com/nodejs/node/commit/da17a2538e)] - **test_runner**: fixed to run after hook if before throws an error (Pulkit Gupta) [#51062](https://github.com/nodejs/node/pull/51062) +- \[[`b8f0ea6f60`](https://github.com/nodejs/node/commit/b8f0ea6f60)] - **test_runner**: fix infinite loop when files are undefined in test runner (Pulkit Gupta) [#51047](https://github.com/nodejs/node/pull/51047) +- \[[`fe922f05e4`](https://github.com/nodejs/node/commit/fe922f05e4)] - **(SEMVER-MINOR)** **timers**: export timers.promises (Marco Ippolito) [#51246](https://github.com/nodejs/node/pull/51246) +- \[[`f4ac7baf85`](https://github.com/nodejs/node/commit/f4ac7baf85)] - **tools**: fix installing node with shared mode (Cheng Zhao) [#51910](https://github.com/nodejs/node/pull/51910) +- \[[`f07605fa7b`](https://github.com/nodejs/node/commit/f07605fa7b)] - **tools**: update eslint to 8.57.0 (Node.js GitHub Bot) [#51867](https://github.com/nodejs/node/pull/51867) +- \[[`d16b235fca`](https://github.com/nodejs/node/commit/d16b235fca)] - **tools**: update lint-md-dependencies to rollup\@4.12.0 (Node.js GitHub Bot) [#51795](https://github.com/nodejs/node/pull/51795) +- \[[`d27e811a01`](https://github.com/nodejs/node/commit/d27e811a01)] - **tools**: fix missing \[\[fallthrough]] in js2c (Cheng Zhao) [#51845](https://github.com/nodejs/node/pull/51845) +- \[[`7eb69308da`](https://github.com/nodejs/node/commit/7eb69308da)] - **tools**: disable automated libuv updates (Rafael Gonzaga) [#51775](https://github.com/nodejs/node/pull/51775) +- \[[`1f15af425c`](https://github.com/nodejs/node/commit/1f15af425c)] - **tools**: update lint-md-dependencies to rollup\@4.10.0 (Node.js GitHub Bot) [#51720](https://github.com/nodejs/node/pull/51720) +- \[[`c7ae13e6bc`](https://github.com/nodejs/node/commit/c7ae13e6bc)] - **tools**: update github_reporter to 1.6.0 (Node.js GitHub Bot) [#51658](https://github.com/nodejs/node/pull/51658) +- \[[`0fb079bd85`](https://github.com/nodejs/node/commit/0fb079bd85)] - **tools**: run `build-windows` workflow only on source changes (Antoine du Hamel) [#51596](https://github.com/nodejs/node/pull/51596) +- \[[`c2538e31fa`](https://github.com/nodejs/node/commit/c2538e31fa)] - **tools**: update lint-md-dependencies to rollup\@4.9.6 (Node.js GitHub Bot) [#51583](https://github.com/nodejs/node/pull/51583) +- \[[`e02dbf074b`](https://github.com/nodejs/node/commit/e02dbf074b)] - **tools**: fix loong64 build (Shi Pujin) [#51401](https://github.com/nodejs/node/pull/51401) +- \[[`ce49cb6656`](https://github.com/nodejs/node/commit/ce49cb6656)] - **tools**: set normalizeTD text default to empty string (Marco Ippolito) [#51543](https://github.com/nodejs/node/pull/51543) +- \[[`e8dc5ac552`](https://github.com/nodejs/node/commit/e8dc5ac552)] - **tools**: limit parallelism with ninja in V8 builds (Richard Lau) [#51473](https://github.com/nodejs/node/pull/51473) +- \[[`97470b179b`](https://github.com/nodejs/node/commit/97470b179b)] - **tools**: do not pass invalid flag to C compiler (Michaël Zasso) [#51409](https://github.com/nodejs/node/pull/51409) +- \[[`59af1d7923`](https://github.com/nodejs/node/commit/59af1d7923)] - **tools**: update lint-md-dependencies to rollup\@4.9.5 (Node.js GitHub Bot) [#51460](https://github.com/nodejs/node/pull/51460) +- \[[`6385c7ad57`](https://github.com/nodejs/node/commit/6385c7ad57)] - **tools**: update inspector_protocol to 83b1154 (Kohei Ueno) [#51309](https://github.com/nodejs/node/pull/51309) +- \[[`5235aaf299`](https://github.com/nodejs/node/commit/5235aaf299)] - **tools**: update github_reporter to 1.5.4 (Node.js GitHub Bot) [#51395](https://github.com/nodejs/node/pull/51395) +- \[[`4ce2ecb1ce`](https://github.com/nodejs/node/commit/4ce2ecb1ce)] - **tools**: fix version parsing in brotli update script (Richard Lau) [#51373](https://github.com/nodejs/node/pull/51373) +- \[[`86102078f5`](https://github.com/nodejs/node/commit/86102078f5)] - **tools**: update lint-md-dependencies to rollup\@4.9.4 (Node.js GitHub Bot) [#51396](https://github.com/nodejs/node/pull/51396) +- \[[`e658208159`](https://github.com/nodejs/node/commit/e658208159)] - **tools**: remove openssl v1 update script (Marco Ippolito) [#51378](https://github.com/nodejs/node/pull/51378) +- \[[`4372f6a5b8`](https://github.com/nodejs/node/commit/4372f6a5b8)] - **tools**: remove deprecated python api (Alex Yang) [#49731](https://github.com/nodejs/node/pull/49731) +- \[[`2b24059e53`](https://github.com/nodejs/node/commit/2b24059e53)] - **tools**: update lint-md-dependencies to rollup\@4.9.2 (Node.js GitHub Bot) [#51320](https://github.com/nodejs/node/pull/51320) +- \[[`1da2e8d15e`](https://github.com/nodejs/node/commit/1da2e8d15e)] - **tools**: fix dep_updaters dir updates (Michaël Zasso) [#51294](https://github.com/nodejs/node/pull/51294) +- \[[`b264dda7f2`](https://github.com/nodejs/node/commit/b264dda7f2)] - **tools**: update inspector_protocol to c488ba2 (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`fdb07d5418`](https://github.com/nodejs/node/commit/fdb07d5418)] - **tools**: update inspector_protocol to 9b4a4aa (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`6863fb84a6`](https://github.com/nodejs/node/commit/6863fb84a6)] - **tools**: update inspector_protocol to 2f51e05 (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`6b85f5c6e0`](https://github.com/nodejs/node/commit/6b85f5c6e0)] - **tools**: update inspector_protocol to d7b099b (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`cf029ca24f`](https://github.com/nodejs/node/commit/cf029ca24f)] - **tools**: update inspector_protocol to 912eb68 (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`af119447f5`](https://github.com/nodejs/node/commit/af119447f5)] - **tools**: update inspector_protocol to 547c5b8 (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`5a72506823`](https://github.com/nodejs/node/commit/5a72506823)] - **tools**: update inspector_protocol to ca525fc (cola119) [#51293](https://github.com/nodejs/node/pull/51293) +- \[[`c7aa3976f9`](https://github.com/nodejs/node/commit/c7aa3976f9)] - **tools**: update lint-md-dependencies to rollup\@4.9.1 (Node.js GitHub Bot) [#51276](https://github.com/nodejs/node/pull/51276) +- \[[`8e02d08a82`](https://github.com/nodejs/node/commit/8e02d08a82)] - **tools**: check timezone current version (Marco Ippolito) [#51178](https://github.com/nodejs/node/pull/51178) +- \[[`fa1e88775d`](https://github.com/nodejs/node/commit/fa1e88775d)] - **tools**: update lint-md-dependencies to rollup\@4.9.0 (Node.js GitHub Bot) [#51193](https://github.com/nodejs/node/pull/51193) +- \[[`04c0bf9cc5`](https://github.com/nodejs/node/commit/04c0bf9cc5)] - **tools**: update eslint to 8.56.0 (Node.js GitHub Bot) [#51194](https://github.com/nodejs/node/pull/51194) +- \[[`e896cbd0d5`](https://github.com/nodejs/node/commit/e896cbd0d5)] - **tools**: update lint-md-dependencies to rollup\@4.7.0 (Node.js GitHub Bot) [#51106](https://github.com/nodejs/node/pull/51106) +- \[[`c7350c2083`](https://github.com/nodejs/node/commit/c7350c2083)] - **tools**: update doc to highlight.js\@11.9.0 unified\@11.0.4 (Node.js GitHub Bot) [#50459](https://github.com/nodejs/node/pull/50459) +- \[[`00dfabf8fb`](https://github.com/nodejs/node/commit/00dfabf8fb)] - **tools**: update eslint to 8.55.0 (Node.js GitHub Bot) [#51025](https://github.com/nodejs/node/pull/51025) +- \[[`f91d56157b`](https://github.com/nodejs/node/commit/f91d56157b)] - **tools**: update lint-md-dependencies to rollup\@4.6.1 (Node.js GitHub Bot) [#51022](https://github.com/nodejs/node/pull/51022) +- \[[`450163cf9b`](https://github.com/nodejs/node/commit/450163cf9b)] - **tools**: add triggers to update release links workflow (Moshe Atlow) [#50974](https://github.com/nodejs/node/pull/50974) +- \[[`b1442024ea`](https://github.com/nodejs/node/commit/b1442024ea)] - **tools**: update lint-md-dependencies to rollup\@4.5.2 (Node.js GitHub Bot) [#50913](https://github.com/nodejs/node/pull/50913) +- \[[`6fc6a62daf`](https://github.com/nodejs/node/commit/6fc6a62daf)] - **tools**: fix current version check (Marco Ippolito) [#50951](https://github.com/nodejs/node/pull/50951) +- \[[`bc6bdda8b1`](https://github.com/nodejs/node/commit/bc6bdda8b1)] - **tools**: fix update-icu.sh (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`a7a4cce75d`](https://github.com/nodejs/node/commit/a7a4cce75d)] - **typings**: lib/internal/vm.js (Geoffrey Booth) [#50112](https://github.com/nodejs/node/pull/50112) +- \[[`6375540507`](https://github.com/nodejs/node/commit/6375540507)] - **typings**: fix JSDoc in `internal/modules/esm/hooks` (Alex Yang) [#50887](https://github.com/nodejs/node/pull/50887) +- \[[`4bc8e98d7c`](https://github.com/nodejs/node/commit/4bc8e98d7c)] - **url**: don't update URL immediately on update to URLSearchParams (Matt Cowley) [#51520](https://github.com/nodejs/node/pull/51520) +- \[[`2acbcbd8ad`](https://github.com/nodejs/node/commit/2acbcbd8ad)] - **url**: throw error if argument length of revokeObjectURL is 0 (DylanTet) [#50433](https://github.com/nodejs/node/pull/50433) +- \[[`c50134615e`](https://github.com/nodejs/node/commit/c50134615e)] - **(SEMVER-MINOR)** **util**: add styleText API to text formatting (Rafael Gonzaga) [#51850](https://github.com/nodejs/node/pull/51850) +- \[[`f79ac336ad`](https://github.com/nodejs/node/commit/f79ac336ad)] - **util**: pass invalidSubtypeIndex instead of trimmedSubtype to error (Gaurish Sethia) [#51264](https://github.com/nodejs/node/pull/51264) +- \[[`c3b89c310f`](https://github.com/nodejs/node/commit/c3b89c310f)] - **util**: improve performance of function areSimilarFloatArrays (Liu Jia) [#51040](https://github.com/nodejs/node/pull/51040) +- \[[`5202995b48`](https://github.com/nodejs/node/commit/5202995b48)] - **vm**: implement isContext() directly in JS land with private symbol (Joyee Cheung) [#51685](https://github.com/nodejs/node/pull/51685) +- \[[`0211a3d65f`](https://github.com/nodejs/node/commit/0211a3d65f)] - **(SEMVER-MINOR)** **vm**: support using the default loader to handle dynamic import() (Joyee Cheung) [#51244](https://github.com/nodejs/node/pull/51244) +- \[[`07fc077c5d`](https://github.com/nodejs/node/commit/07fc077c5d)] - **vm**: use v8::DeserializeInternalFieldsCallback explicitly (Joyee Cheung) [#50984](https://github.com/nodejs/node/pull/50984) +- \[[`5183e3a4b1`](https://github.com/nodejs/node/commit/5183e3a4b1)] - **watch**: clarify that the fileName parameter can be null (Luigi Pinca) [#51305](https://github.com/nodejs/node/pull/51305) +- \[[`63bf8a66df`](https://github.com/nodejs/node/commit/63bf8a66df)] - **watch**: fix null `fileName` on windows systems (vnc5) [#49891](https://github.com/nodejs/node/pull/49891) +- \[[`07da4e9b58`](https://github.com/nodejs/node/commit/07da4e9b58)] - **watch**: fix infinite loop when passing --watch=true flag (Pulkit Gupta) [#51160](https://github.com/nodejs/node/pull/51160) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.12.0/node-v20.12.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.12.0/node-v20.12.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.12.0/node-v20.12.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.12.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.12.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.12.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.12.0/node-v20.12.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.12.0/node-v20.12.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.12.0/node-v20.12.0.tar.gz \ +Other release files: https://nodejs.org/dist/v20.12.0/ \ +Documentation: https://nodejs.org/docs/v20.12.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +8d2ce67d19e2eafe7581f5865382f19ce7f6e66c1d19ed451b7290dcb7b74bd9 node-v20.12.0-aix-ppc64.tar.gz +fb834931c0d6f71a8d352c37a0e56be1dc4a93544eba75e8098df02e16b9deb8 node-v20.12.0-arm64.msi +422a74b7ede14b697a8c2ca887ea161fe79898a35f163fdfb98435c5ab25027b node-v20.12.0-darwin-arm64.tar.gz +a45292e27d492ed3d4ede74cc73c6edcf6ff10b61fbf89108adf0df39a3ccbe8 node-v20.12.0-darwin-arm64.tar.xz +5c7d71a1c1cf613037432e0b6c3d913d96604d9293b3397ec70b344730c81daf node-v20.12.0-darwin-x64.tar.gz +81fb96bc67a92624c09998f9566ae5c8d64e916aa3cd8a0c75f868d43566d539 node-v20.12.0-darwin-x64.tar.xz +aa2d7c2734287fbb757d2e64050ad8454b68ea6eda3c870b5cb386daf059e354 node-v20.12.0-headers.tar.gz +c07c342b85b6ae78b00269e7d39c3f65c8680181d4a6bc0dcbd605dc77a1ace4 node-v20.12.0-headers.tar.xz +8e180526df8ad4086a4df7bfaaa14d21eb2a6cf58b1c5493c639022c165c2884 node-v20.12.0-linux-arm64.tar.gz +007ca2699cf6e84290e5bed844ed66ef9d707d23561dfaf117212b7dce216ba7 node-v20.12.0-linux-arm64.tar.xz +259626b4825d9abba3721941d97f56f10ca7c56757a2468835e40b6fe4520757 node-v20.12.0-linux-armv7l.tar.gz +668fb421a24be596c98f00a31049fbf6ada14d221b7382e0f1caa55ab421431a node-v20.12.0-linux-armv7l.tar.xz +767d6150c086fcdeb9f689b9f487194e3fb459a6ec4e5668d51a051fce67a161 node-v20.12.0-linux-ppc64le.tar.gz +78dc3b7ad993c332684802e35c1f0de2b76193d13394bc89e3bab216828587c7 node-v20.12.0-linux-ppc64le.tar.xz +d14fc89595949a6bde905158ad54f77f1be3b3341dc9876699f5fa77a5397e9e node-v20.12.0-linux-s390x.tar.gz +c271eeb99c98e13428b493b5ffc50ab949e1a282bf679fe3667097f86301961e node-v20.12.0-linux-s390x.tar.xz +b6b998947595c9550d6b89c815a68d608f5920275f1b48812f89792de3fdd893 node-v20.12.0-linux-x64.tar.gz +0a126adf5b6a5eb11a37bad76a0c626a18f20b6811322e68aae0e3cf9bf580bd node-v20.12.0-linux-x64.tar.xz +5081a9af0049b7137aa05e43b58dd81dc922ede26301b7e03e89f329f530b34c node-v20.12.0.pkg +6d81620a0d328ec3039184ad2f5a0fc340ed44a59e90947765567346671525e7 node-v20.12.0.tar.gz +76e5346cebfd581528f699f764f4d1a6e87cb818b696708f235ddcb625a0f78d node-v20.12.0.tar.xz +96690fd6580aa8df8883ae7283c5702d7774441d7ba6b761901047d51760017d node-v20.12.0-win-arm64.7z +d4115d4d533998d83aad50e68964e19c25df4d7b413b672e5a602b68c2b37830 node-v20.12.0-win-arm64.zip +2f623dac976071ef7a9cbf26081fd21b07349d234287bc863d690d4cf2adbe01 node-v20.12.0-win-x64.7z +85db3df652459e380edbbc57973c00c1e15626d354a9ae6ddfc45d27cc573584 node-v20.12.0-win-x64.zip +47e57d5409b6dba0ab72868fc6691345ded1a54c3f6b0d724410bfdcb976d383 node-v20.12.0-win-x86.7z +d52d99cabc2656680ff9abb390d4edd4cb3700a2f8542913b2d576c4ad2cec76 node-v20.12.0-win-x86.zip +937432cb688794cd1acb205bb60322dae5da1ff21b07d5f89c3c5218a1814512 node-v20.12.0-x64.msi +7736df30cbf133ab83d134e7feef71716c35cde662155c407c7bc9c709dd99a7 node-v20.12.0-x86.msi +08c6c69177c7fefd129d84ba178a8fd1aeb32416658b1ae469ffcd4d907d0218 win-arm64/node.exe +e780ac993543d4705ba5bffa79a53854fcb5e77b6845464074ca590dab194539 win-arm64/node.lib +d92d73d5cfd55ad8779a0a6003b0d1b6b660e5d863852ef91374afb9defa49dc win-arm64/node_pdb.7z +c38a950487156e304f11855eb677df5d32287857d374134b5315723691439178 win-arm64/node_pdb.zip +17bbe2cf844b2f2e00f1ef1c5fd136590c002ec1c11f9ff2933912845158d44c win-x64/node.exe +caf3833e5f15e703b91ff1720bb3b350c42f6c3dec8820d2b8fa43d7bf06553a win-x64/node.lib +985b712a8bec222e3d352895f16900fa57bd02116092ebf8a8eca1b55be14f04 win-x64/node_pdb.7z +25a372eaba2ad6c3bf4f3c98a4dbdda083609b6df553c1e658284c3f413fdbfd win-x64/node_pdb.zip +cc3b2d8efe6e004938b8a9fe07f9d2de7153b8c6dca4f1d23beec8e15987fd58 win-x86/node.exe +d4c3d7656ef310e538dcb372e99393fdce9bbce783cb03e12bf638c166d994a5 win-x86/node.lib +37f1e21a79655b577a96985df76cb008cb98db74c311998b8831246d4331e2a7 win-x86/node_pdb.7z +12d8fe239dcbdee9aff0bf28b509f5e86873e8de2147f61b2a624c7a6a0267fb win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEyC+jrhy+3Gvka5NgxDzsRcF6uTwFAmYDCkYACgkQxDzsRcF6 +uTzQYg//ZH4PjfeKrz1kxcAvZJJnxdAGwkQE2fefWPwop2bQ5ON7vknXVRC86dyV +Rx9c5p3NDV2rPj1APGvrmmfrvWQzgOdnJEvPgu0N4WEX17LB7KOa25iRw70bBeaY +jbrDcPy+rUVgCrEOKQvrusfyiITreAuTh6LPSIGV7HOU+LVsPnRq/LA3BpQLIUF3 +pKpw7EQe6mVg1fitxkhDa+m4gtkq+FAD6N6PcrOOSVwZNhWH+rnhXJWtHqFc3jMc +Vio8z4/VzcoEnIg3GvxBWp5v7nRz8i3CINb4lKvBkSSI7U7LE2ly2XLxlLTQXgP1 +xHkqmyoZTEXb6In/WR1sxQGJlW566e51s8C6H6KOfIb8/Q9xV2GUEq28YZHC6qU4 +7JlXI3MpsIcirEaxFGcpBmaGr/CNkdOVBY/38AO++LNutCCiGE5MRNTWKxQ1qEKQ +xlcfyav8cp/liPjx5+WKin8heyok21unY54U+dxv2/J3Tz1Az/Fg5Pbopghk24Ox +qQ4ck7tfOXIqlndJ5gXKxLTnVIwBE7neV7lowW4XHmEAg25RLDjrYzwyu04ZSLw6 +/EfDexxq5WGuIowQgme6SDV9+VwgfGxRkBNTTx75MKRiFmevtyP4YFoH1zY5PA2c +LZWBygm5sJ+5ANlmBXUH17bundAIW4W09H9oznQWIAPshNDTaqI= +=HUcu +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.12.1.md b/pages/en/blog/release/v20.12.1.md new file mode 100644 index 0000000000000..cd6a3b12eda98 --- /dev/null +++ b/pages/en/blog/release/v20.12.1.md @@ -0,0 +1,106 @@ +--- +date: '2024-04-03T14:16:00.934Z' +category: release +title: Node v20.12.1 (LTS) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-03, Version 20.12.1 'Iron' (LTS), @RafaelGSS + +This is a security release + +### Notable Changes + +- CVE-2024-27983 - Assertion failed in node::http2::Http2Session::\~Http2Session() leads to HTTP/2 server crash- (High) +- CVE-2024-27982 - HTTP Request Smuggling via Content Length Obfuscation - (Medium) +- llhttp version 9.2.1 +- undici version 5.28.4 + +### Commits + +- \[[`bd8f10a257`](https://github.com/nodejs/node/commit/bd8f10a257)] - **deps**: update undici to v5.28.4 (Matteo Collina) [nodejs-private/node-private#576](https://github.com/nodejs-private/node-private/pull/576) +- \[[`5e34540a96`](https://github.com/nodejs/node/commit/5e34540a96)] - **http**: do not allow OBS fold in headers by default (Paolo Insogna) [nodejs-private/node-private#557](https://github.com/nodejs-private/node-private/pull/557) +- \[[`ba1ae6d188`](https://github.com/nodejs/node/commit/ba1ae6d188)] - **src**: ensure to close stream when destroying session (Anna Henningsen) [nodejs-private/node-private#561](https://github.com/nodejs-private/node-private/pull/561) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.12.1/node-v20.12.1-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.12.1/node-v20.12.1-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.12.1/node-v20.12.1-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.12.1/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.12.1/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.12.1/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.12.1/node-v20.12.1.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.12.1/node-v20.12.1-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.12.1/node-v20.12.1.tar.gz \ +Other release files: https://nodejs.org/dist/v20.12.1/ \ +Documentation: https://nodejs.org/docs/v20.12.1/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +2a75c3cc9ed139b2ee82be709a04c171ed2d96d962082d4ab5fbf7f486846f4f node-v20.12.1-aix-ppc64.tar.gz +70f9921efbebd58dbcc77ee40d1e64fb6d27bb48a5befdcad9ad172287315df4 node-v20.12.1-arm64.msi +65df8cb0724e3a58c7757b75a70cc1057e1f67ffc5e852bfe6241de0b37c70a0 node-v20.12.1-darwin-arm64.tar.gz +f8a9a78dd9130db80844132bcef6045ceaa51166fc8f4223a97d82a99b87a946 node-v20.12.1-darwin-arm64.tar.xz +f5dc3c71c87c58c9b019d9f85302db3a6a6c47167c5a0480b697f153d02ac316 node-v20.12.1-darwin-x64.tar.gz +7ca444b4f05c588f27eb96e960dd07de98c18e20aaad2c05ef6cf2cee2f2a71a node-v20.12.1-darwin-x64.tar.xz +170844da1e1e2c853ae8e998734ce2a4d888d922aa575975d279104b81455f46 node-v20.12.1-headers.tar.gz +172cbe26f23b4f7d28dc4cdc1e05fa8c9586bc0be113a599be770f723b13e556 node-v20.12.1-headers.tar.xz +6eb199eaa4f83a729242c69792a126cb58ca6a60d791dffd9cedb4cfd32b96c0 node-v20.12.1-linux-arm64.tar.gz +cce8245b22953495efa105bf37621cfee0b62d76e330bd7899a0e702676a884b node-v20.12.1-linux-arm64.tar.xz +d4058aee344df896215eabbf367bbc9bf6504531e75016081565416c6e335e2a node-v20.12.1-linux-armv7l.tar.gz +01a98fbebd2e31a1de4aa174215765f4d906a920ec4120becbb4b572e1b379a5 node-v20.12.1-linux-armv7l.tar.xz +f79c53a39c559e35da24e67a9ca85557bc54a0560a34bea67c4610ac7007ac0c node-v20.12.1-linux-ppc64le.tar.gz +31e4ad7a8696bb2b8cc0169db1657149a19a759e70cd9997d1aeed2d7e825cc4 node-v20.12.1-linux-ppc64le.tar.xz +2cc1c25374995aed79194a50166927dcb2b10473683407a173119d45c42de419 node-v20.12.1-linux-s390x.tar.gz +8bf2fe299750f4591cd3b96f83fa591894550fcce7601b2c682c87f73b1a94ce node-v20.12.1-linux-s390x.tar.xz +da2f590a39717792dcf8c4bf6b9e4b269601e6ce3a3f150a3c4b379f7eea6d83 node-v20.12.1-linux-x64.tar.gz +042844eeea4e19fa46687cc028dd5e323602d81784a9da8386c24463e3984e11 node-v20.12.1-linux-x64.tar.xz +17efd39f30e46b82ce94061ccee058fce3e1c3f1e5538a3f30463c52e5ab82e8 node-v20.12.1-win-arm64.7z +70a8d7a444ffd87f2d06477ccb20c58d8791caaf7be4a1eddf5a9578c81b8028 node-v20.12.1-win-arm64.zip +2628e9698f3bdada3fd36096fba0433fbd8f85832350bd5d2537f8f0ac50320f node-v20.12.1-win-x64.7z +629e2619ef88c5a8ce9944201f00ca3124f079c43ceef7ab0826c6fd19e09d75 node-v20.12.1-win-x64.zip +552c6fec6a0b28e9c49ad8574e4e67c35d9cfa718a3f940552e594e948caa6d9 node-v20.12.1-win-x86.7z +5883ad36b8607801cdb4d5aa6b6c0683df782daecda3ad761204916fbcea860c node-v20.12.1-win-x86.zip +d0a6cfef17f54ceb4cff874cae03725259c2ac62999a97add026bb0e65271065 node-v20.12.1-x64.msi +8cfaf9c5ca56b469ad8a7d9e2119cbfdc086168651b2355946c6b6beac529be9 node-v20.12.1-x86.msi +b1f762be19806ab5070e0df75f585da48238edc1dcf86c57d09a3e16db270fac node-v20.12.1.pkg +b9bef0314e12773ef004368ee56a2db509a948d4170b9efb07441bac1f1407a0 node-v20.12.1.tar.gz +6840d490ba4d1d51655e0fbe1209956a15db405510d7ea166bad98a8c9d37a4e node-v20.12.1.tar.xz +73d58b74b79875417f20c73b0d64087d4e1cf817cd718959dafec76340b36616 win-arm64/node.exe +e780ac993543d4705ba5bffa79a53854fcb5e77b6845464074ca590dab194539 win-arm64/node.lib +d20319df9c67ffbed2866cd41f86b94570368f1e62fcd7cc6aaf813bd978a00a win-arm64/node_pdb.7z +6da9206f3cba1f6ff0551f1ce61ab9832d11f151d97ee1870fd17e0c09b8edf8 win-arm64/node_pdb.zip +ea392e1b5503f2294c24f2ff17a01471faab98c3ec67d75df5754bb6ee0a7b71 win-x64/node.exe +c6e9da74f78f98a465edfb8b51c84c9d33a047a71c4624a854b2af2b4e6a0d50 win-x64/node.lib +0966f51fc43f851ddd1a8581480be83c730abf7ade1a7744c702fcfcff965759 win-x64/node_pdb.7z +f8f78377ce2cc73f84dae58955caaa876b39a1a1c36bde48edad7469165bd205 win-x64/node_pdb.zip +a59bacb81d7440f0b4897d0cb86637a485876be98e6b2be7a476736e81364ce7 win-x86/node.exe +08399fc4d42a0ce0bad33dd9a9bcc9c845bfb0d5d1393e8c330b5a243411d8a9 win-x86/node.lib +66d0e23c21410cd35a1cd61ac4ada5fa3d8f3dd38a2de53c337b689ba71a23c6 win-x86/node_pdb.7z +47c9d17824c96cc51585d5f693be97ba4f9d674ab86548f1af78143fc862b008 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYNYskACgkQi+q0389V +XvToAAwApB+3C/H9VywVFwQbxYq/KIvjvtqBfFMPd7at0z8KU6q/ffsql5v1XaML +ZQwX9H7NpQPGX9S4oJtDnI7cDf6ZQJDCMDAOMO1lzSlfWPZFOTBlZkV26PHGjgaN +LsqMJ5mXrAYsU6pmCuf00BZfcmb6BmK576Jw6xrIg96oIidsDXjtaKnRZ7u41wm0 +uPXVgLQEc6xJanwvpTlVnCotDE0DAq5NkImT8MabyarAbqYcJoCEQI9O4qJbruk2 +6zBhznWENLVrpvo599V3Seb1iYaLlxMP87pCiqAX7ydKPS8+6rKqERCLpp6Z1ZbT +Xft5Ic252QnWlIl0YZ8eNLG3r467nAnKzb1gmun1gGYMEaJ/sB60UDk3jlJ82PeI +rDq9Y2n2UbMwnHpoXsdEghH5cmjPavqT/mYE10qhy7OFQGHOzzN9YWeubQvTfal3 +axX3sHUwcTWQkVFbIvRi5NdDwJrNH7bRLREBJcd1B84gwAgu6yEETuMOFSSoDNAJ +V+5SAhlx +=v6Ae +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.12.2.md b/pages/en/blog/release/v20.12.2.md new file mode 100644 index 0000000000000..40b7a41e3c1cb --- /dev/null +++ b/pages/en/blog/release/v20.12.2.md @@ -0,0 +1,101 @@ +--- +date: '2024-04-10T16:38:15.626Z' +category: release +title: Node v20.12.2 (LTS) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-10, Version 20.12.2 'Iron' (LTS), @RafaelGSS + +This is a security release. + +### Notable Changes + +- CVE-2024-27980 - Command injection via args parameter of `child_process.spawn` without shell option enabled on Windows + +### Commits + +- \[[`69ffc6d50d`](https://github.com/nodejs/node/commit/69ffc6d50d)] - **src**: disallow direct .bat and .cmd file spawning (Ben Noordhuis) [nodejs-private/node-private#563](https://github.com/nodejs-private/node-private/pull/563) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.12.2/node-v20.12.2-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.12.2/node-v20.12.2-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.12.2/node-v20.12.2-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.12.2/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.12.2/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.12.2/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.12.2/node-v20.12.2.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.12.2/node-v20.12.2.tar.gz \ +Other release files: https://nodejs.org/dist/v20.12.2/ \ +Documentation: https://nodejs.org/docs/v20.12.2/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +b1e8241fb06f3f27a3336b4beb193f1cb92f05f1aaaa904e5c62df1cd4f599f5 node-v20.12.2-aix-ppc64.tar.gz +2d05b1cc83d3ecfd52624b3d2a99909f1219510ce63cc0967f8c9bfa9284044f node-v20.12.2-arm64.msi +98eb624b52efec2530079e1d11296ec0ac20771b94b087d21649250339cf5332 node-v20.12.2-darwin-arm64.tar.gz +37a0cf0d1ea5067040586b34c76d4e2b78bd2246c51106218489e60008475209 node-v20.12.2-darwin-arm64.tar.xz +cd5e9a80a38ccffc036a87b232a5402339c7bf8fa9a494ae0731a1a671687718 node-v20.12.2-darwin-x64.tar.gz +226c2d475091da92892c46e40d058668cf236eb298c1769a3b27151352932b42 node-v20.12.2-darwin-x64.tar.xz +e41474f0db0c63f55e8137fd3836ccb9d9bbcffefaac88a51e0cd61494b503ac node-v20.12.2-headers.tar.gz +643992acac9f0a80b184d5c4a6144abea7822fbbdac5b97365136e4e6df29eeb node-v20.12.2-headers.tar.xz +2dc8ffa0da135bf493f881d2d38aac610772c801bb7b6208fcc5de9350f119f7 node-v20.12.2-linux-arm64.tar.gz +b5fc7983fb9506b8c3de53dfa85ff63f9f49cedc94984e29e4c89328536ba4b9 node-v20.12.2-linux-arm64.tar.xz +5861b891815ae8d42835db52bc57191858f348e0521b162c670c8ed4df417f1c node-v20.12.2-linux-armv7l.tar.gz +b470878c1a0d656805e6d1b9d97883f5cd25b895d573ccee9779950a56198733 node-v20.12.2-linux-armv7l.tar.xz +c33968d78e06af64bd8d89a74781fef71ff126f862f7ed0ff2417d612dd64abb node-v20.12.2-linux-ppc64le.tar.gz +b48351a23685a85884a2cc69a274b684243a3be18e8fa520105df2c6368cc116 node-v20.12.2-linux-ppc64le.tar.xz +29fe0d5142a3f3d7957d6ccf03cc08cd1c76c41d0460c92dd5800d46caa08d31 node-v20.12.2-linux-s390x.tar.gz +ce7c180ff62d5ad7f40ccc5ccca0d031c9e56edb8795c9be5378359c81c288f8 node-v20.12.2-linux-s390x.tar.xz +f8f9b6877778ed2d5f920a5bd853f0f8a8be1c42f6d448c763a95625cbbb4b0d node-v20.12.2-linux-x64.tar.gz +595272130310cbe12301430756f23d153f7ab95d00174c02adc11a2e3703d183 node-v20.12.2-linux-x64.tar.xz +ab4b990c2c1d4a55d565813e7a2f71669dc4d1005faa47185d30bde4416975ab node-v20.12.2-win-arm64.7z +010d488af3adad98e44b2d3f61afb7e3d87b5a620f7a406fe75ab0909b72e7ca node-v20.12.2-win-arm64.zip +a92f5bb065bbe7b429e573b83604e8e039de3f0dac37e16674de0dea303c5283 node-v20.12.2-win-x64.7z +66dda1717cae30a13be6bb17ad96ee54b69f2c23c85acd9c3299b095fa26b452 node-v20.12.2-win-x64.zip +de8dd5dde38c3e2d5b4269534360414e4ae853496835226b4b1df567e4bf3d3c node-v20.12.2-win-x86.7z +acf7d7fedf3a50aaa12c4e2bf0aa6220727b22eb24ad1b37264d46e12421d03d node-v20.12.2-win-x86.zip +20c578361911d7b0cf153b293b025970eca383a2c802e0df438ac254aaca165d node-v20.12.2-x64.msi +2655083616f0afc6c7a619069506614c4ef32c12bc31b5c455fe1e4815f03d23 node-v20.12.2-x86.msi +bcd2b4289313640639d9822655b80b2aff4689e189da0bf4f5d9c8ac12dec427 node-v20.12.2.pkg +bc57ee721a12cc8be55bb90b4a9a2f598aed5581d5199ec3bd171a4781bfecda node-v20.12.2.tar.gz +d7cbcc5fbfb31e9001f3f0150bbeda59abe5dd7137aaa6273958cd59ce35ced7 node-v20.12.2.tar.xz +f5e42cbd380a9788bdd86b4316cd1eaaf432777d519b52758ccbe70d1f0f821a win-arm64/node.exe +e780ac993543d4705ba5bffa79a53854fcb5e77b6845464074ca590dab194539 win-arm64/node.lib +ee59a80e5606dd736bb7610de8eb1a195d12fb9995bf8c1ca7d0950f8827e150 win-arm64/node_pdb.7z +91589548ea260794a8f6a141be6e25cd59b3bb32d8c7dfe84f9998890e3cab3b win-arm64/node_pdb.zip +d2cfb2cd6cf37c3a654964f01c1333d5692907d20ca172dfb37025114af742e9 win-x64/node.exe +c6e9da74f78f98a465edfb8b51c84c9d33a047a71c4624a854b2af2b4e6a0d50 win-x64/node.lib +1fa139447711a77c4d16791bf0807210e6e08723f1ba257cf9769fe5c7848a48 win-x64/node_pdb.7z +9554b9bfabad3a46cb580d659cb747f1c1a9816fe5e885337ab1490359fe21d6 win-x64/node_pdb.zip +4f65b294b3071a6e73df7f02ab0c360a3fc9661ce897b823c2c48043fbdcaa70 win-x86/node.exe +08399fc4d42a0ce0bad33dd9a9bcc9c845bfb0d5d1393e8c330b5a243411d8a9 win-x86/node.lib +e89ff44159e90f12ba9ee64e8ce4941b6d9216bd69f012e536e670a973e19a61 win-x86/node_pdb.7z +9406e7b1bbde6e4e6043c72f40e39e8e018d5a7397bdffe34fbc00a4d6f2db71 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYWvuEACgkQi+q0389V +XvToVwv8DSHqiPiPIrpV1l7FORBYlfzxGSJ9SprPylQdwoDCskXtF4VlNDk/2rNq +i4MWSK0FwXT8BE5du4XUMkGsL8V+MfEv4DMSdt1oZrSErXzf2Td+bBPsO21Ihgl6 +5Vqo0viMgvnmpdZg1f+Rl9GFiGcv6lLM3zgK/agP5J4HFzuRwwPB3QGZ5pZ2j52Z +8QYT6MpZ4eQ27yZbyoYR10EGDixZixL0Ixl90S/WuOvGoCoTczF2BNRjWF69FZaT +tV4kVG6WIadEZjDH/dsVp7Y9c04X+2HcJEWrhozbUN0vkFab7ON302nk7nxO2dd+ +JmDvxXWEyH+6W3pjTmQJx6WT2tK9VlqXcQQifWX42skEsg20Q+NWxBtOPoJJ01PJ +iQ5NQIEeAZ0wwVtMweWay6BLEFow/dqzL4IRt95hwXb0k7VPKO5+B6Jj42CmbT/i +UNL3xgHOUzxYqgTOMC6FIpjobdivDVuvHQgb8R110ldzlKPsh2bUeQfwo18nCcYy +XRC8PD8H +=IlUn +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.13.0.md b/pages/en/blog/release/v20.13.0.md new file mode 100644 index 0000000000000..d4e378a30c9c0 --- /dev/null +++ b/pages/en/blog/release/v20.13.0.md @@ -0,0 +1,460 @@ +--- +date: '2024-05-07T15:50:05.186Z' +category: release +title: Node v20.13.0 (LTS) +layout: blog-post +author: Marco Ippolito +--- + +## 2024-05-07, Version 20.13.0 'Iron' (LTS), @marco-ippolito + +### buffer: improve `base64` and `base64url` performance + +The performance of the `base64` and `base64url` encoding and decoding functions has been improved significantly. + +Contributed by Yagiz Nizipli in [#52428](https://github.com/nodejs/node/pull/52428) + +### crypto: deprecate implicitly shortened GCM tags + +This release, introduces a doc-only deprecation of using GCM authentication tags that are shorter than the cipher's block size, unless the user specified the `authTagLength` option. + +Contributed by Tobias Nießen in [#52345](https://github.com/nodejs/node/pull/52345) + +### events,doc: mark CustomEvent as stable + +From this release `CustomEvent` has been marked stable. + +Contributed by Daeyeon Jeong in [#52618](https://github.com/nodejs/node/pull/52618) + +### fs: add stacktrace to fs/promises + +Sync functions in fs throwed an error with a stacktrace which is helpful for debugging. But functions in fs/promises throwed an error without a stacktrace. This commit adds stacktraces by calling `Error.captureStacktrace` and re-throwing the error. + +Contributed by 翠 / green in [#49849](https://github.com/nodejs/node/pull/49849) + +### report: add `--report-exclude-network` option + +New option `--report-exclude-network`, also available as `report.excludeNetwork`, enables the user to exclude networking interfaces in their diagnostic report. On some systems, this can cause the report to take minutes to generate so this option can be used to optimize that. + +Contributed by Ethan Arrowood in [#51645](https://github.com/nodejs/node/pull/51645) + +### src: add uv_get_available_memory to report and process + +From this release it is possible to get the available memory in the system by calling `process.getAvailableMemory()`. + +Contributed by theanarkh [#52023](https://github.com/nodejs/node/pull/52023) + +### stream: support typed arrays + +This commit adds support for typed arrays in streams. + +Contributed by IlyasShabi [#51866](https://github.com/nodejs/node/pull/51866) + +### util: support array of formats in util.styleText + +It is now possible to pass an array of format strings to `util.styleText` to apply multiple formats to the same text. + +```js +console.log( + util.styleText(['underline', 'italic'], 'My italic underlined message') +); +``` + +Contributed by Marco Ippolito in [#52040](https://github.com/nodejs/node/pull/52040) + +### v8: implement v8.queryObjects() for memory leak regression testing + +This is similar to the queryObjects() console API provided by the Chromium DevTools console. It can be used to search for objects that have the matching constructor on its prototype chain in the heap after a full garbage collection, which can be useful for memory leak regression tests. +To avoid surprising results, users should avoid using this API on constructors whose implementation they don't control, or on constructors that can be invoked by other parties in the application. + +To avoid accidental leaks, this API does not return raw references to the objects found. By default, it returns the count of the objects found. If options.format is 'summary', it returns an array containing brief string representations for each object. The visibility provided in this API is similar to what the heap snapshot provides, while users can save the cost of serialization and parsing and directly filer the target objects during the search. + +We have been using this API internally for the test suite, which has been more stable than any other leak regression testing strategies in the CI. With a public implementation we can now use the public API instead. + +```js +const { queryObjects } = require('node:v8'); +class A { + foo = 'bar'; +} +console.log(queryObjects(A)); // 0 +let a = new A(); +console.log(queryObjects(A)); // 1 +// [ "A { foo: 'bar' }" ] +console.log(queryObjects(A, { format: 'summary' })); + +// Release the object. +a = null; +// Search again. queryObjects() includes a full garbage collection +// so a should disappear. +console.log(queryObjects(A)); // 0 + +class B extends A { + bar = 'qux'; +} +// The child class B's prototype has A's prototype on its prototype chain +// so the prototype object shows up too. +console.log(queryObjects(A, { format: 'summary' })); // [ A {}' ] +``` + +Contributed by Joyee Cheung in [#51927](https://github.com/nodejs/node/pull/51927) + +### watch: mark as stable + +From this release Watch Mode is considered stable. +When in watch mode, changes in the watched files cause the Node.js process to restart. + +Contributed by Moshe Atlow in [#52074](https://github.com/nodejs/node/pull/52074) + +### Other Notable Changes + +- \[[`f8ad30048d`](https://github.com/nodejs/node/commit/f8ad30048d)] - **benchmark**: add AbortSignal.abort benchmarks (Raz Luvaton) [#52408](https://github.com/nodejs/node/pull/52408) +- \[[`3b41da9a56`](https://github.com/nodejs/node/commit/3b41da9a56)] - **(SEMVER-MINOR)** **deps**: update simdutf to 5.0.0 (Daniel Lemire) [#52138](https://github.com/nodejs/node/pull/52138) +- \[[`0a08c4a7b3`](https://github.com/nodejs/node/commit/0a08c4a7b3)] - **(SEMVER-MINOR)** **deps**: update undici to 6.3.0 (Node.js GitHub Bot) [#51462](https://github.com/nodejs/node/pull/51462) +- \[[`f1b7bda4f5`](https://github.com/nodejs/node/commit/f1b7bda4f5)] - **(SEMVER-MINOR)** **deps**: update undici to 6.2.1 (Node.js GitHub Bot) [#51278](https://github.com/nodejs/node/pull/51278) +- \[[`4acca8ed84`](https://github.com/nodejs/node/commit/4acca8ed84)] - **(SEMVER-MINOR)** **dns**: add order option and support ipv6first (Paolo Insogna) [#52492](https://github.com/nodejs/node/pull/52492) +- \[[`cc67720ff9`](https://github.com/nodejs/node/commit/cc67720ff9)] - **doc**: update release gpg keyserver (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`c2def7df96`](https://github.com/nodejs/node/commit/c2def7df96)] - **doc**: add release key for marco-ippolito (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`807c89cb26`](https://github.com/nodejs/node/commit/807c89cb26)] - **doc**: add UlisesGascon as a collaborator (Ulises Gascón) [#51991](https://github.com/nodejs/node/pull/51991) +- \[[`5e78a20ef9`](https://github.com/nodejs/node/commit/5e78a20ef9)] - **(SEMVER-MINOR)** **doc**: deprecate fs.Stats public constructor (Marco Ippolito) [#51879](https://github.com/nodejs/node/pull/51879) +- \[[`722fe64ff7`](https://github.com/nodejs/node/commit/722fe64ff7)] - **(SEMVER-MINOR)** **lib, url**: add a `windows` option to path parsing (Aviv Keller) [#52509](https://github.com/nodejs/node/pull/52509) +- \[[`d116fa1568`](https://github.com/nodejs/node/commit/d116fa1568)] - **(SEMVER-MINOR)** **net**: add CLI option for autoSelectFamilyAttemptTimeout (Paolo Insogna) [#52474](https://github.com/nodejs/node/pull/52474) +- \[[`6af7b78b0d`](https://github.com/nodejs/node/commit/6af7b78b0d)] - **(SEMVER-MINOR)** **src**: add `string_view` overload to snapshot FromBlob (Anna Henningsen) [#52595](https://github.com/nodejs/node/pull/52595) +- \[[`b3a11b574b`](https://github.com/nodejs/node/commit/b3a11b574b)] - **(SEMVER-MINOR)** **src**: preload function for Environment (Cheng Zhao) [#51539](https://github.com/nodejs/node/pull/51539) +- \[[`41646d9c9e`](https://github.com/nodejs/node/commit/41646d9c9e)] - **(SEMVER-MINOR)** **test_runner**: add suite() (Colin Ihrig) [#52127](https://github.com/nodejs/node/pull/52127) +- \[[`fc9ba17f6c`](https://github.com/nodejs/node/commit/fc9ba17f6c)] - **(SEMVER-MINOR)** **test_runner**: add `test:complete` event to reflect execution order (Moshe Atlow) [#51909](https://github.com/nodejs/node/pull/51909) + +### Commits + +- \[[`6fdd748b21`](https://github.com/nodejs/node/commit/6fdd748b21)] - **benchmark**: reduce the buffer size for blob (Debadree Chatterjee) [#52548](https://github.com/nodejs/node/pull/52548) +- \[[`2274d0c868`](https://github.com/nodejs/node/commit/2274d0c868)] - **benchmark**: inherit stdio/stderr instead of pipe (Ali Hassan) [#52456](https://github.com/nodejs/node/pull/52456) +- \[[`0300598315`](https://github.com/nodejs/node/commit/0300598315)] - **benchmark**: add ipc support to spawn stdio config (Ali Hassan) [#52456](https://github.com/nodejs/node/pull/52456) +- \[[`f8ad30048d`](https://github.com/nodejs/node/commit/f8ad30048d)] - **benchmark**: add AbortSignal.abort benchmarks (Raz Luvaton) [#52408](https://github.com/nodejs/node/pull/52408) +- \[[`7508d48736`](https://github.com/nodejs/node/commit/7508d48736)] - **benchmark**: conditionally use spawn with taskset for cpu pinning (Ali Hassan) [#52253](https://github.com/nodejs/node/pull/52253) +- \[[`ea8e72e185`](https://github.com/nodejs/node/commit/ea8e72e185)] - **benchmark**: add toNamespacedPath bench (Rafael Gonzaga) [#52236](https://github.com/nodejs/node/pull/52236) +- \[[`c00715cc1e`](https://github.com/nodejs/node/commit/c00715cc1e)] - **benchmark**: add style-text benchmark (Rafael Gonzaga) [#52004](https://github.com/nodejs/node/pull/52004) +- \[[`1c1a6935ee`](https://github.com/nodejs/node/commit/1c1a6935ee)] - **buffer**: add missing ARG_TYPE(ArrayBuffer) for isUtf8 (Jungku Lee) [#52477](https://github.com/nodejs/node/pull/52477) +- \[[`1b2aff7dce`](https://github.com/nodejs/node/commit/1b2aff7dce)] - **buffer**: improve `base64` and `base64url` performance (Yagiz Nizipli) [#52428](https://github.com/nodejs/node/pull/52428) +- \[[`328bded5ab`](https://github.com/nodejs/node/commit/328bded5ab)] - **buffer**: improve `btoa` performance (Yagiz Nizipli) [#52427](https://github.com/nodejs/node/pull/52427) +- \[[`e67bc34326`](https://github.com/nodejs/node/commit/e67bc34326)] - **buffer**: use simdutf for `atob` implementation (Yagiz Nizipli) [#52381](https://github.com/nodejs/node/pull/52381) +- \[[`5abddb45d8`](https://github.com/nodejs/node/commit/5abddb45d8)] - **build**: fix typo in node.gyp (Michaël Zasso) [#52719](https://github.com/nodejs/node/pull/52719) +- \[[`7d1f304f5e`](https://github.com/nodejs/node/commit/7d1f304f5e)] - **build**: fix headers install for shared mode on Win (Segev Finer) [#52442](https://github.com/nodejs/node/pull/52442) +- \[[`6826bbf267`](https://github.com/nodejs/node/commit/6826bbf267)] - **build**: fix arm64 cross-compilation bug on non-arm machines (Mahdi Sharifi) [#52559](https://github.com/nodejs/node/pull/52559) +- \[[`6e85bc431a`](https://github.com/nodejs/node/commit/6e85bc431a)] - **build**: temporary disable ubsan (Rafael Gonzaga) [#52560](https://github.com/nodejs/node/pull/52560) +- \[[`297368a1ed`](https://github.com/nodejs/node/commit/297368a1ed)] - **build**: fix arm64 cross-compilation (Michaël Zasso) [#51256](https://github.com/nodejs/node/pull/51256) +- \[[`93bddb598f`](https://github.com/nodejs/node/commit/93bddb598f)] - **build,tools**: add test-ubsan ci (Rafael Gonzaga) [#46297](https://github.com/nodejs/node/pull/46297) +- \[[`20bb16582f`](https://github.com/nodejs/node/commit/20bb16582f)] - **build,tools,node-api**: fix building node-api tests for Windows Debug (Vladimir Morozov) [#52632](https://github.com/nodejs/node/pull/52632) +- \[[`9af15cfff1`](https://github.com/nodejs/node/commit/9af15cfff1)] - **child_process**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`a4847c4619`](https://github.com/nodejs/node/commit/a4847c4619)] - **crypto**: simplify assertions in Safe\*Print (David Benjamin) [#49709](https://github.com/nodejs/node/pull/49709) +- \[[`0ec4d9d734`](https://github.com/nodejs/node/commit/0ec4d9d734)] - **crypto**: enable NODE_EXTRA_CA_CERTS with BoringSSL (Shelley Vohr) [#52217](https://github.com/nodejs/node/pull/52217) +- \[[`03e05b092c`](https://github.com/nodejs/node/commit/03e05b092c)] - **crypto**: deprecate implicitly shortened GCM tags (Tobias Nießen) [#52345](https://github.com/nodejs/node/pull/52345) +- \[[`0f784c96ba`](https://github.com/nodejs/node/commit/0f784c96ba)] - **crypto**: make timingSafeEqual faster for Uint8Array (Tobias Nießen) [#52341](https://github.com/nodejs/node/pull/52341) +- \[[`739958e472`](https://github.com/nodejs/node/commit/739958e472)] - **crypto**: reject Ed25519/Ed448 in Sign/Verify prototypes (Filip Skokan) [#52340](https://github.com/nodejs/node/pull/52340) +- \[[`197b61f210`](https://github.com/nodejs/node/commit/197b61f210)] - **crypto**: validate RSA-PSS saltLength in subtle.sign and subtle.verify (Filip Skokan) [#52262](https://github.com/nodejs/node/pull/52262) +- \[[`a6eede33f3`](https://github.com/nodejs/node/commit/a6eede33f3)] - **crypto**: fix `input` validation in `crypto.hash` (Antoine du Hamel) [#52070](https://github.com/nodejs/node/pull/52070) +- \[[`bfa4986e5d`](https://github.com/nodejs/node/commit/bfa4986e5d)] - **deps**: update corepack to 0.28.0 (Node.js GitHub Bot) [#52616](https://github.com/nodejs/node/pull/52616) +- \[[`70546698d7`](https://github.com/nodejs/node/commit/70546698d7)] - **deps**: update ada to 2.7.8 (Node.js GitHub Bot) [#52517](https://github.com/nodejs/node/pull/52517) +- \[[`a135027f84`](https://github.com/nodejs/node/commit/a135027f84)] - **deps**: update icu to 75.1 (Node.js GitHub Bot) [#52573](https://github.com/nodejs/node/pull/52573) +- \[[`c96f1043d4`](https://github.com/nodejs/node/commit/c96f1043d4)] - **deps**: update undici to 6.13.0 (Node.js GitHub Bot) [#52493](https://github.com/nodejs/node/pull/52493) +- \[[`9c330b610b`](https://github.com/nodejs/node/commit/9c330b610b)] - **deps**: update zlib to 1.3.0.1-motley-7d77fb7 (Node.js GitHub Bot) [#52516](https://github.com/nodejs/node/pull/52516) +- \[[`7e5bbeebab`](https://github.com/nodejs/node/commit/7e5bbeebab)] - **deps**: update nghttp2 to 1.61.0 (Node.js GitHub Bot) [#52395](https://github.com/nodejs/node/pull/52395) +- \[[`b42a4735d9`](https://github.com/nodejs/node/commit/b42a4735d9)] - **deps**: update minimatch to 9.0.4 (Node.js GitHub Bot) [#52524](https://github.com/nodejs/node/pull/52524) +- \[[`d34fd21bc2`](https://github.com/nodejs/node/commit/d34fd21bc2)] - **deps**: update simdutf to 5.2.4 (Node.js GitHub Bot) [#52473](https://github.com/nodejs/node/pull/52473) +- \[[`ecc180f830`](https://github.com/nodejs/node/commit/ecc180f830)] - **deps**: upgrade npm to 10.5.2 (npm team) [#52458](https://github.com/nodejs/node/pull/52458) +- \[[`606c183344`](https://github.com/nodejs/node/commit/606c183344)] - **deps**: update simdutf to 5.2.3 (Yagiz Nizipli) [#52381](https://github.com/nodejs/node/pull/52381) +- \[[`0a103e99fe`](https://github.com/nodejs/node/commit/0a103e99fe)] - **deps**: upgrade npm to 10.5.1 (npm team) [#52351](https://github.com/nodejs/node/pull/52351) +- \[[`cce861e670`](https://github.com/nodejs/node/commit/cce861e670)] - **deps**: update c-ares to 1.28.1 (Node.js GitHub Bot) [#52285](https://github.com/nodejs/node/pull/52285) +- \[[`5258b547ea`](https://github.com/nodejs/node/commit/5258b547ea)] - **deps**: update undici to 6.11.1 (Node.js GitHub Bot) [#52328](https://github.com/nodejs/node/pull/52328) +- \[[`923a77c80a`](https://github.com/nodejs/node/commit/923a77c80a)] - **deps**: update undici to 6.10.2 (Node.js GitHub Bot) [#52227](https://github.com/nodejs/node/pull/52227) +- \[[`bd3c6a231c`](https://github.com/nodejs/node/commit/bd3c6a231c)] - **deps**: update zlib to 1.3.0.1-motley-24c07df (Node.js GitHub Bot) [#52199](https://github.com/nodejs/node/pull/52199) +- \[[`3b41da9a56`](https://github.com/nodejs/node/commit/3b41da9a56)] - **(SEMVER-MINOR)** **deps**: update simdutf to 5.0.0 (Daniel Lemire) [#52138](https://github.com/nodejs/node/pull/52138) +- \[[`d6f9ca385c`](https://github.com/nodejs/node/commit/d6f9ca385c)] - **deps**: update zlib to 1.3.0.1-motley-24342f6 (Node.js GitHub Bot) [#52123](https://github.com/nodejs/node/pull/52123) +- \[[`f5512897b0`](https://github.com/nodejs/node/commit/f5512897b0)] - **deps**: update corepack to 0.26.0 (Node.js GitHub Bot) [#52027](https://github.com/nodejs/node/pull/52027) +- \[[`d891275178`](https://github.com/nodejs/node/commit/d891275178)] - **deps**: update ada to 2.7.7 (Node.js GitHub Bot) [#52028](https://github.com/nodejs/node/pull/52028) +- \[[`18838f2db3`](https://github.com/nodejs/node/commit/18838f2db3)] - **deps**: update simdutf to 4.0.9 (Node.js GitHub Bot) [#51655](https://github.com/nodejs/node/pull/51655) +- \[[`503c034abc`](https://github.com/nodejs/node/commit/503c034abc)] - **deps**: update undici to 6.6.2 (Node.js GitHub Bot) [#51667](https://github.com/nodejs/node/pull/51667) +- \[[`256bcba52e`](https://github.com/nodejs/node/commit/256bcba52e)] - **deps**: update undici to 6.6.0 (Node.js GitHub Bot) [#51630](https://github.com/nodejs/node/pull/51630) +- \[[`7a1e321d95`](https://github.com/nodejs/node/commit/7a1e321d95)] - **deps**: update undici to 6.4.0 (Node.js GitHub Bot) [#51527](https://github.com/nodejs/node/pull/51527) +- \[[`dde9e08224`](https://github.com/nodejs/node/commit/dde9e08224)] - **deps**: update ngtcp2 to 1.1.0 (Node.js GitHub Bot) [#51319](https://github.com/nodejs/node/pull/51319) +- \[[`0a08c4a7b3`](https://github.com/nodejs/node/commit/0a08c4a7b3)] - **(SEMVER-MINOR)** **deps**: update undici to 6.3.0 (Node.js GitHub Bot) [#51462](https://github.com/nodejs/node/pull/51462) +- \[[`f1b7bda4f5`](https://github.com/nodejs/node/commit/f1b7bda4f5)] - **(SEMVER-MINOR)** **deps**: update undici to 6.2.1 (Node.js GitHub Bot) [#51278](https://github.com/nodejs/node/pull/51278) +- \[[`ecadd638cd`](https://github.com/nodejs/node/commit/ecadd638cd)] - **deps**: V8: remove references to non-existent flags (Richard Lau) [#52256](https://github.com/nodejs/node/pull/52256) +- \[[`27d364491f`](https://github.com/nodejs/node/commit/27d364491f)] - **dgram**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`b94d11935a`](https://github.com/nodejs/node/commit/b94d11935a)] - **diagnostics_channel**: early-exit tracing channel trace methods (Stephen Belanger) [#51915](https://github.com/nodejs/node/pull/51915) +- \[[`4acca8ed84`](https://github.com/nodejs/node/commit/4acca8ed84)] - **(SEMVER-MINOR)** **dns**: add order option and support ipv6first (Paolo Insogna) [#52492](https://github.com/nodejs/node/pull/52492) +- \[[`bcc06ac5a9`](https://github.com/nodejs/node/commit/bcc06ac5a9)] - **doc**: remove relative limitation to pm (Rafael Gonzaga) [#52648](https://github.com/nodejs/node/pull/52648) +- \[[`4d5ef4f7af`](https://github.com/nodejs/node/commit/4d5ef4f7af)] - **doc**: fix info string causing duplicated code blocks (Mathieu Leenhardt) [#52660](https://github.com/nodejs/node/pull/52660) +- \[[`d5a316f5ea`](https://github.com/nodejs/node/commit/d5a316f5ea)] - **doc**: run license-builder (github-actions\[bot]) [#52631](https://github.com/nodejs/node/pull/52631) +- \[[`d7434fe411`](https://github.com/nodejs/node/commit/d7434fe411)] - **doc**: deprecate --experimental-policy (RafaelGSS) [#52602](https://github.com/nodejs/node/pull/52602) +- \[[`02a83d89f7`](https://github.com/nodejs/node/commit/02a83d89f7)] - **doc**: add info on contributor spotlight program (Michael Dawson) [#52598](https://github.com/nodejs/node/pull/52598) +- \[[`a905eaace1`](https://github.com/nodejs/node/commit/a905eaace1)] - **doc**: correct unsafe URL example in http docs (Malte Legenhausen) [#52555](https://github.com/nodejs/node/pull/52555) +- \[[`69c21a6522`](https://github.com/nodejs/node/commit/69c21a6522)] - **doc**: replace U+00A0 with U+0020 (Luigi Pinca) [#52590](https://github.com/nodejs/node/pull/52590) +- \[[`5df34c7d0a`](https://github.com/nodejs/node/commit/5df34c7d0a)] - **doc**: sort options alphabetically (Luigi Pinca) [#52589](https://github.com/nodejs/node/pull/52589) +- \[[`b49464bc9d`](https://github.com/nodejs/node/commit/b49464bc9d)] - **doc**: correct stream.finished changes (KaKa) [#52551](https://github.com/nodejs/node/pull/52551) +- \[[`4d051ba89b`](https://github.com/nodejs/node/commit/4d051ba89b)] - **doc**: add RedYetiDev to triage team (Aviv Keller) [#52556](https://github.com/nodejs/node/pull/52556) +- \[[`4ed55bf16c`](https://github.com/nodejs/node/commit/4ed55bf16c)] - **doc**: fix issue detected in markdown lint update (Rich Trott) [#52566](https://github.com/nodejs/node/pull/52566) +- \[[`a8bc40fd07`](https://github.com/nodejs/node/commit/a8bc40fd07)] - **doc**: update test runner coverage limitations (Moshe Atlow) [#52515](https://github.com/nodejs/node/pull/52515) +- \[[`17d5ba9fed`](https://github.com/nodejs/node/commit/17d5ba9fed)] - **doc**: add lint-js-fix into BUILDING.md (jakecastelli) [#52290](https://github.com/nodejs/node/pull/52290) +- \[[`88adbd0991`](https://github.com/nodejs/node/commit/88adbd0991)] - **doc**: remove Internet Explorer mention in BUILDING.md (Rich Trott) [#52455](https://github.com/nodejs/node/pull/52455) +- \[[`e8cb29d66d`](https://github.com/nodejs/node/commit/e8cb29d66d)] - **doc**: accommodate upcoming stricter .md linting (Rich Trott) [#52454](https://github.com/nodejs/node/pull/52454) +- \[[`e2ea984c7b`](https://github.com/nodejs/node/commit/e2ea984c7b)] - **doc**: add Rafael to steward list (Rafael Gonzaga) [#52452](https://github.com/nodejs/node/pull/52452) +- \[[`93d684097a`](https://github.com/nodejs/node/commit/93d684097a)] - **doc**: correct naming convention in C++ style guide (Mohammed Keyvanzadeh) [#52424](https://github.com/nodejs/node/pull/52424) +- \[[`b9bdb947ac`](https://github.com/nodejs/node/commit/b9bdb947ac)] - **doc**: update `process.execArg` example to be more useful (Jacob Smith) [#52412](https://github.com/nodejs/node/pull/52412) +- \[[`f3f67ff84a`](https://github.com/nodejs/node/commit/f3f67ff84a)] - **doc**: call out http(s).globalAgent default (mathis-west-1) [#52392](https://github.com/nodejs/node/pull/52392) +- \[[`392a0d310e`](https://github.com/nodejs/node/commit/392a0d310e)] - **doc**: update the location of `build_with_cmake` (Emmanuel Ferdman) [#52356](https://github.com/nodejs/node/pull/52356) +- \[[`3ad62f1cc7`](https://github.com/nodejs/node/commit/3ad62f1cc7)] - **doc**: reserve 125 for Electron 31 (Shelley Vohr) [#52379](https://github.com/nodejs/node/pull/52379) +- \[[`bfd4c7844b`](https://github.com/nodejs/node/commit/bfd4c7844b)] - **doc**: use consistent plural form of "index" (Rich Trott) [#52373](https://github.com/nodejs/node/pull/52373) +- \[[`6f31cc8361`](https://github.com/nodejs/node/commit/6f31cc8361)] - **doc**: add Rafael to sec release stewards (Rafael Gonzaga) [#52354](https://github.com/nodejs/node/pull/52354) +- \[[`c55a3be789`](https://github.com/nodejs/node/commit/c55a3be789)] - **doc**: document missing options of events.on (Chemi Atlow) [#52080](https://github.com/nodejs/node/pull/52080) +- \[[`1a843f7c6d`](https://github.com/nodejs/node/commit/1a843f7c6d)] - **doc**: add missing space (Augustin Mauroy) [#52360](https://github.com/nodejs/node/pull/52360) +- \[[`8ee20d8693`](https://github.com/nodejs/node/commit/8ee20d8693)] - **doc**: add tips about vcpkg cause build faild on windows (Cong Zhang) [#52181](https://github.com/nodejs/node/pull/52181) +- \[[`a86705c113`](https://github.com/nodejs/node/commit/a86705c113)] - **doc**: replace "below" with "following" (Rich Trott) [#52315](https://github.com/nodejs/node/pull/52315) +- \[[`f3e8d1159a`](https://github.com/nodejs/node/commit/f3e8d1159a)] - **doc**: fix email pattern to be wrapped with `<<` instead of single `<` (Raz Luvaton) [#52284](https://github.com/nodejs/node/pull/52284) +- \[[`cc67720ff9`](https://github.com/nodejs/node/commit/cc67720ff9)] - **doc**: update release gpg keyserver (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`c2def7df96`](https://github.com/nodejs/node/commit/c2def7df96)] - **doc**: add release key for marco-ippolito (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`2509f3be18`](https://github.com/nodejs/node/commit/2509f3be18)] - **doc**: fix arrow vertical alignment in HTML version (Akash Yeole) [#52193](https://github.com/nodejs/node/pull/52193) +- \[[`2abaea3cdc`](https://github.com/nodejs/node/commit/2abaea3cdc)] - **doc**: move TSC members from regular to emeritus (Michael Dawson) [#52209](https://github.com/nodejs/node/pull/52209) +- \[[`65618a3d7b`](https://github.com/nodejs/node/commit/65618a3d7b)] - **doc**: add section explaining todo tests (Colin Ihrig) [#52204](https://github.com/nodejs/node/pull/52204) +- \[[`bf0ed95b04`](https://github.com/nodejs/node/commit/bf0ed95b04)] - **doc**: edit `ChildProcess` `'message'` event docs (theanarkh) [#52154](https://github.com/nodejs/node/pull/52154) +- \[[`3d67b6b5e8`](https://github.com/nodejs/node/commit/3d67b6b5e8)] - **doc**: add mold to speeding up section (Cong Zhang) [#52179](https://github.com/nodejs/node/pull/52179) +- \[[`8ba308a838`](https://github.com/nodejs/node/commit/8ba308a838)] - **doc**: http event order correction (wh0) [#51464](https://github.com/nodejs/node/pull/51464) +- \[[`9771f41069`](https://github.com/nodejs/node/commit/9771f41069)] - **doc**: move gabrielschulhof to TSC emeritus (Gabriel Schulhof) [#52192](https://github.com/nodejs/node/pull/52192) +- \[[`72bd2b0d62`](https://github.com/nodejs/node/commit/72bd2b0d62)] - **doc**: fix `--env-file` docs for valid quotes for defining values (Gabriel Bota) [#52157](https://github.com/nodejs/node/pull/52157) +- \[[`4f19203dfb`](https://github.com/nodejs/node/commit/4f19203dfb)] - **doc**: clarify what is supported in NODE_OPTIONS (Michael Dawson) [#52076](https://github.com/nodejs/node/pull/52076) +- \[[`5bce596838`](https://github.com/nodejs/node/commit/5bce596838)] - **doc**: fix typos in maintaining-dependencies.md (RoboSchmied) [#52160](https://github.com/nodejs/node/pull/52160) +- \[[`f5241e20cc`](https://github.com/nodejs/node/commit/f5241e20cc)] - **doc**: add spec for contains module syntax (Geoffrey Booth) [#52059](https://github.com/nodejs/node/pull/52059) +- \[[`bda3cdea86`](https://github.com/nodejs/node/commit/bda3cdea86)] - **doc**: optimize the doc about Unix abstract socket (theanarkh) [#52043](https://github.com/nodejs/node/pull/52043) +- \[[`8d7d6eff81`](https://github.com/nodejs/node/commit/8d7d6eff81)] - **doc**: update pnpm link (Superchupu) [#52113](https://github.com/nodejs/node/pull/52113) +- \[[`af7c55f62d`](https://github.com/nodejs/node/commit/af7c55f62d)] - **doc**: remove ableist language from crypto (Jamie King) [#52063](https://github.com/nodejs/node/pull/52063) +- \[[`f8362b0a5a`](https://github.com/nodejs/node/commit/f8362b0a5a)] - **doc**: update collaborator email (Ruy Adorno) [#52088](https://github.com/nodejs/node/pull/52088) +- \[[`48cbd5f71e`](https://github.com/nodejs/node/commit/48cbd5f71e)] - **doc**: state that removing npm is a non-goal (Geoffrey Booth) [#51951](https://github.com/nodejs/node/pull/51951) +- \[[`0ef2708131`](https://github.com/nodejs/node/commit/0ef2708131)] - **doc**: mention NodeSource in RafaelGSS steward list (Rafael Gonzaga) [#52057](https://github.com/nodejs/node/pull/52057) +- \[[`a6473a89be`](https://github.com/nodejs/node/commit/a6473a89be)] - **doc**: remove ArrayBuffer from crypto.hash() data parameter type (fengmk2) [#52069](https://github.com/nodejs/node/pull/52069) +- \[[`ae7a11c787`](https://github.com/nodejs/node/commit/ae7a11c787)] - **doc**: add some commonly used lables up gront (Michael Dawson) [#52006](https://github.com/nodejs/node/pull/52006) +- \[[`01aaddde3c`](https://github.com/nodejs/node/commit/01aaddde3c)] - **doc**: document that `const c2 = vm.createContext(c1); c1 === c2` is true (Daniel Kaplan) [#51960](https://github.com/nodejs/node/pull/51960) +- \[[`912145fac4`](https://github.com/nodejs/node/commit/912145fac4)] - **doc**: clarify what moderation issues are for (Antoine du Hamel) [#51990](https://github.com/nodejs/node/pull/51990) +- \[[`807c89cb26`](https://github.com/nodejs/node/commit/807c89cb26)] - **doc**: add UlisesGascon as a collaborator (Ulises Gascón) [#51991](https://github.com/nodejs/node/pull/51991) +- \[[`53ff3e5682`](https://github.com/nodejs/node/commit/53ff3e5682)] - **doc**: deprecate hmac public constructor (Marco Ippolito) [#51881](https://github.com/nodejs/node/pull/51881) +- \[[`5e78a20ef9`](https://github.com/nodejs/node/commit/5e78a20ef9)] - **(SEMVER-MINOR)** **doc**: deprecate fs.Stats public constructor (Marco Ippolito) [#51879](https://github.com/nodejs/node/pull/51879) +- \[[`7bfb0b43e6`](https://github.com/nodejs/node/commit/7bfb0b43e6)] - **events**: rename high & low watermark for consistency (Chemi Atlow) [#52080](https://github.com/nodejs/node/pull/52080) +- \[[`5e6967359b`](https://github.com/nodejs/node/commit/5e6967359b)] - **events**: extract addAbortListener for safe internal use (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`6930205272`](https://github.com/nodejs/node/commit/6930205272)] - **events**: remove abort listener from signal in `on` (Neal Beeken) [#51091](https://github.com/nodejs/node/pull/51091) +- \[[`235ab4f99f`](https://github.com/nodejs/node/commit/235ab4f99f)] - **events,doc**: mark CustomEvent as stable (Daeyeon Jeong) [#52618](https://github.com/nodejs/node/pull/52618) +- \[[`ca5b827148`](https://github.com/nodejs/node/commit/ca5b827148)] - **fs**: fix read / readSync positional offset types (Ruy Adorno) [#52603](https://github.com/nodejs/node/pull/52603) +- \[[`e7d0d804b2`](https://github.com/nodejs/node/commit/e7d0d804b2)] - **fs**: fixes recursive fs.watch crash on Linux when deleting files (Matteo Collina) [#52349](https://github.com/nodejs/node/pull/52349) +- \[[`c5fd193d6b`](https://github.com/nodejs/node/commit/c5fd193d6b)] - **fs**: refactor maybeCallback function (Yagiz Nizipli) [#52129](https://github.com/nodejs/node/pull/52129) +- \[[`0a9910c2c1`](https://github.com/nodejs/node/commit/0a9910c2c1)] - **fs**: fix edge case in readFileSync utf8 fast path (Richard Lau) [#52101](https://github.com/nodejs/node/pull/52101) +- \[[`51d7cd5de8`](https://github.com/nodejs/node/commit/51d7cd5de8)] - **fs**: validate fd from cpp on `fchown` (Yagiz Nizipli) [#52051](https://github.com/nodejs/node/pull/52051) +- \[[`33ad86c2be`](https://github.com/nodejs/node/commit/33ad86c2be)] - **fs**: validate fd from cpp on `close` (Yagiz Nizipli) [#52051](https://github.com/nodejs/node/pull/52051) +- \[[`34667c0a7e`](https://github.com/nodejs/node/commit/34667c0a7e)] - **fs**: validate file mode from cpp (Yagiz Nizipli) [#52050](https://github.com/nodejs/node/pull/52050) +- \[[`c530520be3`](https://github.com/nodejs/node/commit/c530520be3)] - **fs**: add stacktrace to fs/promises (翠 / green) [#49849](https://github.com/nodejs/node/pull/49849) +- \[[`edecd464b9`](https://github.com/nodejs/node/commit/edecd464b9)] - **fs,permission**: make handling of buffers consistent (Tobias Nießen) [#52348](https://github.com/nodejs/node/pull/52348) +- \[[`3bcd68337e`](https://github.com/nodejs/node/commit/3bcd68337e)] - **http2**: fix excessive CPU usage when using `allowHTTP1=true` (Eugene) [#52713](https://github.com/nodejs/node/pull/52713) +- \[[`e01015996a`](https://github.com/nodejs/node/commit/e01015996a)] - **http2**: fix h2-over-h2 connection proxying (Tim Perry) [#52368](https://github.com/nodejs/node/pull/52368) +- \[[`9f88736860`](https://github.com/nodejs/node/commit/9f88736860)] - **http2**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`acd7758959`](https://github.com/nodejs/node/commit/acd7758959)] - **lib**: use predefined variable instead of bit operation (Deokjin Kim) [#52580](https://github.com/nodejs/node/pull/52580) +- \[[`18ae7a46f6`](https://github.com/nodejs/node/commit/18ae7a46f6)] - **lib**: refactor lazy loading of undici for fetch method (Victor Chen) [#52275](https://github.com/nodejs/node/pull/52275) +- \[[`64c2c2a7ac`](https://github.com/nodejs/node/commit/64c2c2a7ac)] - **lib**: replace string prototype usage with alternatives (Aviv Keller) [#52440](https://github.com/nodejs/node/pull/52440) +- \[[`ee11b5315c`](https://github.com/nodejs/node/commit/ee11b5315c)] - **lib**: .load .save add proper error message when no file passed (Thomas Mauran) [#52225](https://github.com/nodejs/node/pull/52225) +- \[[`e5521b537f`](https://github.com/nodejs/node/commit/e5521b537f)] - **lib**: fix type error for \_refreshLine (Jackson Tian) [#52133](https://github.com/nodejs/node/pull/52133) +- \[[`d5d6e041c8`](https://github.com/nodejs/node/commit/d5d6e041c8)] - **lib**: emit listening event once when call listen twice (theanarkh) [#52119](https://github.com/nodejs/node/pull/52119) +- \[[`d33fc36784`](https://github.com/nodejs/node/commit/d33fc36784)] - **lib**: make sure clear the old timer in http server (theanarkh) [#52118](https://github.com/nodejs/node/pull/52118) +- \[[`ea4905c0f5`](https://github.com/nodejs/node/commit/ea4905c0f5)] - **lib**: fix listen with handle in cluster worker (theanarkh) [#52056](https://github.com/nodejs/node/pull/52056) +- \[[`8fd8130507`](https://github.com/nodejs/node/commit/8fd8130507)] - **lib, doc**: rename readme.md to README.md (Aviv Keller) [#52471](https://github.com/nodejs/node/pull/52471) +- \[[`722fe64ff7`](https://github.com/nodejs/node/commit/722fe64ff7)] - **(SEMVER-MINOR)** **lib, url**: add a `windows` option to path parsing (Aviv Keller) [#52509](https://github.com/nodejs/node/pull/52509) +- \[[`26691e6032`](https://github.com/nodejs/node/commit/26691e6032)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52633](https://github.com/nodejs/node/pull/52633) +- \[[`befb90dc83`](https://github.com/nodejs/node/commit/befb90dc83)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52457](https://github.com/nodejs/node/pull/52457) +- \[[`22b7167e72`](https://github.com/nodejs/node/commit/22b7167e72)] - **meta**: bump actions/download-artifact from 4.1.3 to 4.1.4 (dependabot\[bot]) [#52314](https://github.com/nodejs/node/pull/52314) +- \[[`4dafd3ede2`](https://github.com/nodejs/node/commit/4dafd3ede2)] - **meta**: bump rtCamp/action-slack-notify from 2.2.1 to 2.3.0 (dependabot\[bot]) [#52313](https://github.com/nodejs/node/pull/52313) +- \[[`2760db7640`](https://github.com/nodejs/node/commit/2760db7640)] - **meta**: bump github/codeql-action from 3.24.6 to 3.24.9 (dependabot\[bot]) [#52312](https://github.com/nodejs/node/pull/52312) +- \[[`542aaf9ca9`](https://github.com/nodejs/node/commit/542aaf9ca9)] - **meta**: bump actions/cache from 4.0.1 to 4.0.2 (dependabot\[bot]) [#52311](https://github.com/nodejs/node/pull/52311) +- \[[`df330998d9`](https://github.com/nodejs/node/commit/df330998d9)] - **meta**: bump actions/setup-python from 5.0.0 to 5.1.0 (dependabot\[bot]) [#52310](https://github.com/nodejs/node/pull/52310) +- \[[`5f40fe0cc2`](https://github.com/nodejs/node/commit/5f40fe0cc2)] - **meta**: bump codecov/codecov-action from 4.1.0 to 4.1.1 (dependabot\[bot]) [#52308](https://github.com/nodejs/node/pull/52308) +- \[[`481420f25c`](https://github.com/nodejs/node/commit/481420f25c)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52300](https://github.com/nodejs/node/pull/52300) +- \[[`3121949f85`](https://github.com/nodejs/node/commit/3121949f85)] - **meta**: pass Codecov upload token to codecov action (Michaël Zasso) [#51982](https://github.com/nodejs/node/pull/51982) +- \[[`882a64e639`](https://github.com/nodejs/node/commit/882a64e639)] - **module**: fix detect-module not retrying as esm for cjs-only errors (Geoffrey Booth) [#52024](https://github.com/nodejs/node/pull/52024) +- \[[`5fcc1d32a8`](https://github.com/nodejs/node/commit/5fcc1d32a8)] - **module**: refactor ESM loader initialization and entry point handling (Joyee Cheung) [#51999](https://github.com/nodejs/node/pull/51999) +- \[[`d116fa1568`](https://github.com/nodejs/node/commit/d116fa1568)] - **(SEMVER-MINOR)** **net**: add CLI option for autoSelectFamilyAttemptTimeout (Paolo Insogna) [#52474](https://github.com/nodejs/node/pull/52474) +- \[[`37abad86ae`](https://github.com/nodejs/node/commit/37abad86ae)] - **net**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`a920489a1f`](https://github.com/nodejs/node/commit/a920489a1f)] - **node-api**: address coverity report (Michael Dawson) [#52584](https://github.com/nodejs/node/pull/52584) +- \[[`0a225a4b40`](https://github.com/nodejs/node/commit/0a225a4b40)] - **node-api**: copy external type tags when they are set (Niels Martignène) [#52426](https://github.com/nodejs/node/pull/52426) +- \[[`f9d95674be`](https://github.com/nodejs/node/commit/f9d95674be)] - **node-api**: make tsfn accept napi_finalize once more (Gabriel Schulhof) [#51801](https://github.com/nodejs/node/pull/51801) +- \[[`72aabe1139`](https://github.com/nodejs/node/commit/72aabe1139)] - **perf_hooks**: reduce overhead of createHistogram (Vinícius Lourenço) [#50074](https://github.com/nodejs/node/pull/50074) +- \[[`fb601c3a94`](https://github.com/nodejs/node/commit/fb601c3a94)] - **readline**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`29f09f05f7`](https://github.com/nodejs/node/commit/29f09f05f7)] - **(SEMVER-MINOR)** **report**: add `--report-exclude-network` option (Ethan Arrowood) [#51645](https://github.com/nodejs/node/pull/51645) +- \[[`7e6d923f5b`](https://github.com/nodejs/node/commit/7e6d923f5b)] - **src**: cast to v8::Value before using v8::EmbedderGraph::V8Node (Joyee Cheung) [#52638](https://github.com/nodejs/node/pull/52638) +- \[[`6af7b78b0d`](https://github.com/nodejs/node/commit/6af7b78b0d)] - **(SEMVER-MINOR)** **src**: add `string_view` overload to snapshot FromBlob (Anna Henningsen) [#52595](https://github.com/nodejs/node/pull/52595) +- \[[`27491e55c1`](https://github.com/nodejs/node/commit/27491e55c1)] - **src**: remove regex usage for env file parsing (IlyasShabi) [#52406](https://github.com/nodejs/node/pull/52406) +- \[[`b05e639e27`](https://github.com/nodejs/node/commit/b05e639e27)] - **src**: fix loadEnvFile ENOENT error (mathis-west-1) [#52438](https://github.com/nodejs/node/pull/52438) +- \[[`1b4d2814d1`](https://github.com/nodejs/node/commit/1b4d2814d1)] - **src**: update branch name in node_revert.h (Tobias Nießen) [#52390](https://github.com/nodejs/node/pull/52390) +- \[[`7e35a169ea`](https://github.com/nodejs/node/commit/7e35a169ea)] - **src**: stop using `v8::BackingStore::Reallocate` (Michaël Zasso) [#52292](https://github.com/nodejs/node/pull/52292) +- \[[`2449d2606a`](https://github.com/nodejs/node/commit/2449d2606a)] - **src**: fix move after use reported by coverity (Michael Dawson) [#52141](https://github.com/nodejs/node/pull/52141) +- \[[`b33eff887d`](https://github.com/nodejs/node/commit/b33eff887d)] - **(SEMVER-MINOR)** **src**: add C++ ProcessEmitWarningSync() (Joyee Cheung) [#51977](https://github.com/nodejs/node/pull/51977) +- \[[`f2c7408927`](https://github.com/nodejs/node/commit/f2c7408927)] - **src**: return a number from process.constrainedMemory() constantly (Chengzhong Wu) [#52039](https://github.com/nodejs/node/pull/52039) +- \[[`7f575c886b`](https://github.com/nodejs/node/commit/7f575c886b)] - **(SEMVER-MINOR)** **src**: add uv_get_available_memory to report and process (theanarkh) [#52023](https://github.com/nodejs/node/pull/52023) +- \[[`e161e62313`](https://github.com/nodejs/node/commit/e161e62313)] - **src**: use dedicated routine to compile function for builtin CJS loader (Joyee Cheung) [#52016](https://github.com/nodejs/node/pull/52016) +- \[[`07322b490f`](https://github.com/nodejs/node/commit/07322b490f)] - **src**: fix reading empty string views in Blob\[De]serializer (Joyee Cheung) [#52000](https://github.com/nodejs/node/pull/52000) +- \[[`e216192390`](https://github.com/nodejs/node/commit/e216192390)] - **src**: refactor out FormatErrorMessage for error formatting (Joyee Cheung) [#51999](https://github.com/nodejs/node/pull/51999) +- \[[`b3a11b574b`](https://github.com/nodejs/node/commit/b3a11b574b)] - **(SEMVER-MINOR)** **src**: preload function for Environment (Cheng Zhao) [#51539](https://github.com/nodejs/node/pull/51539) +- \[[`09bd367ef6`](https://github.com/nodejs/node/commit/09bd367ef6)] - **stream**: make Duplex inherit destroy from Writable (Luigi Pinca) [#52318](https://github.com/nodejs/node/pull/52318) +- \[[`0b853a7576`](https://github.com/nodejs/node/commit/0b853a7576)] - **(SEMVER-MINOR)** **stream**: support typed arrays (IlyasShabi) [#51866](https://github.com/nodejs/node/pull/51866) +- \[[`f8209ffe45`](https://github.com/nodejs/node/commit/f8209ffe45)] - **stream**: add `new` when constructing `ERR_MULTIPLE_CALLBACK` (haze) [#52110](https://github.com/nodejs/node/pull/52110) +- \[[`8442457117`](https://github.com/nodejs/node/commit/8442457117)] - **stream**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`8d20b641a2`](https://github.com/nodejs/node/commit/8d20b641a2)] - _**Revert**_ "**stream**: fix cloned webstreams not being unref'd" (Matteo Collina) [#51491](https://github.com/nodejs/node/pull/51491) +- \[[`a923adffab`](https://github.com/nodejs/node/commit/a923adffab)] - **test**: mark `test-error-serdes` as flaky (Antoine du Hamel) [#52739](https://github.com/nodejs/node/pull/52739) +- \[[`d4f1803f0b`](https://github.com/nodejs/node/commit/d4f1803f0b)] - **test**: mark test as flaky (Michael Dawson) [#52671](https://github.com/nodejs/node/pull/52671) +- \[[`1e88e042c2`](https://github.com/nodejs/node/commit/1e88e042c2)] - **test**: skip test-fs-watch-recursive-delete.js on IBM i (Abdirahim Musse) [#52645](https://github.com/nodejs/node/pull/52645) +- \[[`6da558af8b`](https://github.com/nodejs/node/commit/6da558af8b)] - **test**: ensure that all worker servers are ready (Luigi Pinca) [#52563](https://github.com/nodejs/node/pull/52563) +- \[[`c871fadb85`](https://github.com/nodejs/node/commit/c871fadb85)] - **test**: fix test-tls-ticket-cluster.js (Hüseyin Açacak) [#52431](https://github.com/nodejs/node/pull/52431) +- \[[`b6cb74d775`](https://github.com/nodejs/node/commit/b6cb74d775)] - **test**: split wasi poll test for windows (Hüseyin Açacak) [#52538](https://github.com/nodejs/node/pull/52538) +- \[[`4ad159bb75`](https://github.com/nodejs/node/commit/4ad159bb75)] - **test**: write tests for assertIsArray http2 util (Sinan Sonmez (Chaush)) [#52511](https://github.com/nodejs/node/pull/52511) +- \[[`1f7a28cbe7`](https://github.com/nodejs/node/commit/1f7a28cbe7)] - **test**: fix watch test with require not testing pid (Raz Luvaton) [#52353](https://github.com/nodejs/node/pull/52353) +- \[[`5b758b93d5`](https://github.com/nodejs/node/commit/5b758b93d5)] - **test**: simplify ASan build checks (Michaël Zasso) [#52430](https://github.com/nodejs/node/pull/52430) +- \[[`375c3db5ea`](https://github.com/nodejs/node/commit/375c3db5ea)] - **test**: fix Windows compiler warnings in overlapped-checker (Michaël Zasso) [#52405](https://github.com/nodejs/node/pull/52405) +- \[[`a1dd92cdee`](https://github.com/nodejs/node/commit/a1dd92cdee)] - **test**: add test for skip+todo combinations (Colin Ihrig) [#52204](https://github.com/nodejs/node/pull/52204) +- \[[`8a0b721930`](https://github.com/nodejs/node/commit/8a0b721930)] - **test**: fix incorrect test fixture (Colin Ihrig) [#52185](https://github.com/nodejs/node/pull/52185) +- \[[`dd1f761f3b`](https://github.com/nodejs/node/commit/dd1f761f3b)] - **test**: add missing cctest/test_path.cc (Yagiz Nizipli) [#52148](https://github.com/nodejs/node/pull/52148) +- \[[`6da446d9e1`](https://github.com/nodejs/node/commit/6da446d9e1)] - **test**: add `spawnSyncAndAssert` util (Antoine du Hamel) [#52132](https://github.com/nodejs/node/pull/52132) +- \[[`d7bfb4e8d8`](https://github.com/nodejs/node/commit/d7bfb4e8d8)] - **test**: reduce flakiness of test-runner-output.mjs (Colin Ihrig) [#52146](https://github.com/nodejs/node/pull/52146) +- \[[`e4981b3d75`](https://github.com/nodejs/node/commit/e4981b3d75)] - **test**: add test for using `--print` with promises (Antoine du Hamel) [#52137](https://github.com/nodejs/node/pull/52137) +- \[[`5cc540078e`](https://github.com/nodejs/node/commit/5cc540078e)] - **test**: un-set test-emit-after-on-destroyed as flaky (Abdirahim Musse) [#51995](https://github.com/nodejs/node/pull/51995) +- \[[`b9eb0035dd`](https://github.com/nodejs/node/commit/b9eb0035dd)] - **test**: skip test for dynamically linked OpenSSL (Richard Lau) [#52542](https://github.com/nodejs/node/pull/52542) +- \[[`32014f5601`](https://github.com/nodejs/node/commit/32014f5601)] - **test**: avoid v8 deadcode on performance function (Vinícius Lourenço) [#50074](https://github.com/nodejs/node/pull/50074) +- \[[`29d2011f51`](https://github.com/nodejs/node/commit/29d2011f51)] - **test_runner**: better error handing for test hook (Alex Yang) [#52401](https://github.com/nodejs/node/pull/52401) +- \[[`9497097fb3`](https://github.com/nodejs/node/commit/9497097fb3)] - **test_runner**: fix clearing final timeout in own callback (Ben Richeson) [#52332](https://github.com/nodejs/node/pull/52332) +- \[[`0f690f0b9e`](https://github.com/nodejs/node/commit/0f690f0b9e)] - **test_runner**: fix recursive run (Moshe Atlow) [#52322](https://github.com/nodejs/node/pull/52322) +- \[[`34ab1a36ee`](https://github.com/nodejs/node/commit/34ab1a36ee)] - **test_runner**: hide new line when no error in spec reporter (Moshe Atlow) [#52297](https://github.com/nodejs/node/pull/52297) +- \[[`379535abe3`](https://github.com/nodejs/node/commit/379535abe3)] - **test_runner**: disable highWatermark on TestsStream (Colin Ihrig) [#52287](https://github.com/nodejs/node/pull/52287) +- \[[`35588cff39`](https://github.com/nodejs/node/commit/35588cff39)] - **test_runner**: run afterEach hooks in correct order (Colin Ihrig) [#52239](https://github.com/nodejs/node/pull/52239) +- \[[`5cd3df8fe1`](https://github.com/nodejs/node/commit/5cd3df8fe1)] - **test_runner**: simplify test end time tracking (Colin Ihrig) [#52182](https://github.com/nodejs/node/pull/52182) +- \[[`07e4a42e4b`](https://github.com/nodejs/node/commit/07e4a42e4b)] - **test_runner**: simplify test start time tracking (Colin Ihrig) [#52182](https://github.com/nodejs/node/pull/52182) +- \[[`caec996831`](https://github.com/nodejs/node/commit/caec996831)] - **test_runner**: emit diagnostics when watch mode drains (Moshe Atlow) [#52130](https://github.com/nodejs/node/pull/52130) +- \[[`41646d9c9e`](https://github.com/nodejs/node/commit/41646d9c9e)] - **(SEMVER-MINOR)** **test_runner**: add suite() (Colin Ihrig) [#52127](https://github.com/nodejs/node/pull/52127) +- \[[`fd1489a623`](https://github.com/nodejs/node/commit/fd1489a623)] - **test_runner**: skip each hooks for skipped tests (Colin Ihrig) [#52115](https://github.com/nodejs/node/pull/52115) +- \[[`73b38bfa9e`](https://github.com/nodejs/node/commit/73b38bfa9e)] - **test_runner**: remove redundant report call (Colin Ihrig) [#52089](https://github.com/nodejs/node/pull/52089) +- \[[`68187c4d9e`](https://github.com/nodejs/node/commit/68187c4d9e)] - **test_runner**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`61e7ae05ef`](https://github.com/nodejs/node/commit/61e7ae05ef)] - **test_runner**: use source maps when reporting coverage (Moshe Atlow) [#52060](https://github.com/nodejs/node/pull/52060) +- \[[`e64a25af61`](https://github.com/nodejs/node/commit/e64a25af61)] - **test_runner**: handle undefined test locations (Colin Ihrig) [#52036](https://github.com/nodejs/node/pull/52036) +- \[[`590decf202`](https://github.com/nodejs/node/commit/590decf202)] - **test_runner**: avoid overwriting root start time (Colin Ihrig) [#52020](https://github.com/nodejs/node/pull/52020) +- \[[`a4cbb61c65`](https://github.com/nodejs/node/commit/a4cbb61c65)] - **test_runner**: abort unfinished tests on async error (Colin Ihrig) [#51996](https://github.com/nodejs/node/pull/51996) +- \[[`a223ca4868`](https://github.com/nodejs/node/commit/a223ca4868)] - **test_runner**: run before hook immediately if test started (Moshe Atlow) [#52003](https://github.com/nodejs/node/pull/52003) +- \[[`956ee74c7e`](https://github.com/nodejs/node/commit/956ee74c7e)] - **test_runner**: add support for null and date value output (Malthe Borch) [#51920](https://github.com/nodejs/node/pull/51920) +- \[[`fc9ba17f6c`](https://github.com/nodejs/node/commit/fc9ba17f6c)] - **(SEMVER-MINOR)** **test_runner**: add `test:complete` event to reflect execution order (Moshe Atlow) [#51909](https://github.com/nodejs/node/pull/51909) +- \[[`d5ac979aeb`](https://github.com/nodejs/node/commit/d5ac979aeb)] - **test_runner**: format coverage report for tap reporter (Pulkit Gupta) [#51119](https://github.com/nodejs/node/pull/51119) +- \[[`c925bc18dc`](https://github.com/nodejs/node/commit/c925bc18dc)] - **tools**: take co-authors into account in `find-inactive-collaborators` (Antoine du Hamel) [#52669](https://github.com/nodejs/node/pull/52669) +- \[[`1d37e772ec`](https://github.com/nodejs/node/commit/1d37e772ec)] - **tools**: fix invalid escape sequence in mkssldef (Michaël Zasso) [#52624](https://github.com/nodejs/node/pull/52624) +- \[[`5b22fc3a81`](https://github.com/nodejs/node/commit/5b22fc3a81)] - **tools**: update lint-md-dependencies to rollup\@4.15.0 (Node.js GitHub Bot) [#52617](https://github.com/nodejs/node/pull/52617) +- \[[`9cf47bb2f1`](https://github.com/nodejs/node/commit/9cf47bb2f1)] - **tools**: update lint-md-dependencies (Rich Trott) [#52581](https://github.com/nodejs/node/pull/52581) +- \[[`c0c60d13c0`](https://github.com/nodejs/node/commit/c0c60d13c0)] - **tools**: fix heading spaces for osx-entitlements.plist (Jackson Tian) [#52561](https://github.com/nodejs/node/pull/52561) +- \[[`7c349d7819`](https://github.com/nodejs/node/commit/7c349d7819)] - **tools**: update lint-md-dependencies to rollup\@4.14.2 vfile-reporter\@8.1.1 (Node.js GitHub Bot) [#52518](https://github.com/nodejs/node/pull/52518) +- \[[`b4d703297b`](https://github.com/nodejs/node/commit/b4d703297b)] - **tools**: use stylistic ESLint plugin for formatting (Michaël Zasso) [#50714](https://github.com/nodejs/node/pull/50714) +- \[[`c6813360c2`](https://github.com/nodejs/node/commit/c6813360c2)] - **tools**: update minimatch index path (Marco Ippolito) [#52523](https://github.com/nodejs/node/pull/52523) +- \[[`8464c0253c`](https://github.com/nodejs/node/commit/8464c0253c)] - **tools**: add a linter for README lists (Antoine du Hamel) [#52476](https://github.com/nodejs/node/pull/52476) +- \[[`55a3fbc842`](https://github.com/nodejs/node/commit/55a3fbc842)] - **tools**: change inactive limit to 12 months (Yagiz Nizipli) [#52425](https://github.com/nodejs/node/pull/52425) +- \[[`74a171f130`](https://github.com/nodejs/node/commit/74a171f130)] - **tools**: update stale bot messaging (Wes Todd) [#52423](https://github.com/nodejs/node/pull/52423) +- \[[`b2a3dcec2a`](https://github.com/nodejs/node/commit/b2a3dcec2a)] - **tools**: update lint-md-dependencies to rollup\@4.14.0 (Node.js GitHub Bot) [#52398](https://github.com/nodejs/node/pull/52398) +- \[[`f71a777e6e`](https://github.com/nodejs/node/commit/f71a777e6e)] - **tools**: update Ruff to v0.3.4 (Michaël Zasso) [#52302](https://github.com/nodejs/node/pull/52302) +- \[[`e3e0c68f8f`](https://github.com/nodejs/node/commit/e3e0c68f8f)] - **tools**: run test-ubsan on ubuntu-latest (Michaël Zasso) [#52375](https://github.com/nodejs/node/pull/52375) +- \[[`893b5aac31`](https://github.com/nodejs/node/commit/893b5aac31)] - **tools**: update lint-md-dependencies to rollup\@4.13.2 (Node.js GitHub Bot) [#52286](https://github.com/nodejs/node/pull/52286) +- \[[`049cca419e`](https://github.com/nodejs/node/commit/049cca419e)] - _**Revert**_ "**tools**: run `build-windows` workflow only on source changes" (Michaël Zasso) [#52320](https://github.com/nodejs/node/pull/52320) +- \[[`b3dfc62cee`](https://github.com/nodejs/node/commit/b3dfc62cee)] - **tools**: use Python 3.12 in GitHub Actions workflows (Michaël Zasso) [#52301](https://github.com/nodejs/node/pull/52301) +- \[[`c7238d0c04`](https://github.com/nodejs/node/commit/c7238d0c04)] - **tools**: allow local updates for llhttp (Paolo Insogna) [#52085](https://github.com/nodejs/node/pull/52085) +- \[[`c39f15cafd`](https://github.com/nodejs/node/commit/c39f15cafd)] - **tools**: install npm PowerShell scripts on Windows (Luke Karrys) [#52009](https://github.com/nodejs/node/pull/52009) +- \[[`b36fea064a`](https://github.com/nodejs/node/commit/b36fea064a)] - **tools**: update lint-md-dependencies to rollup\@4.13.0 (Node.js GitHub Bot) [#52122](https://github.com/nodejs/node/pull/52122) +- \[[`a5204eb915`](https://github.com/nodejs/node/commit/a5204eb915)] - **tools**: fix error reported by coverity in js2c.cc (Michael Dawson) [#52142](https://github.com/nodejs/node/pull/52142) +- \[[`cef4b7ef3d`](https://github.com/nodejs/node/commit/cef4b7ef3d)] - **tools**: sync ubsan workflow with asan (Michaël Zasso) [#52152](https://github.com/nodejs/node/pull/52152) +- \[[`d406976bbe`](https://github.com/nodejs/node/commit/d406976bbe)] - **tools**: update github_reporter to 1.7.0 (Node.js GitHub Bot) [#52121](https://github.com/nodejs/node/pull/52121) +- \[[`fb100a2ac8`](https://github.com/nodejs/node/commit/fb100a2ac8)] - **tools**: remove gyp-next .github folder (Marco Ippolito) [#52064](https://github.com/nodejs/node/pull/52064) +- \[[`5f1e7a0de2`](https://github.com/nodejs/node/commit/5f1e7a0de2)] - **tools**: update gyp-next to 0.16.2 (Node.js GitHub Bot) [#52062](https://github.com/nodejs/node/pull/52062) +- \[[`1f1253446b`](https://github.com/nodejs/node/commit/1f1253446b)] - **tools**: install manpage to share/man for FreeBSD (Po-Chuan Hsieh) [#51791](https://github.com/nodejs/node/pull/51791) +- \[[`4b8b92fccc`](https://github.com/nodejs/node/commit/4b8b92fccc)] - **tools**: automate gyp-next update (Marco Ippolito) [#52014](https://github.com/nodejs/node/pull/52014) +- \[[`1ec9e58692`](https://github.com/nodejs/node/commit/1ec9e58692)] - **typings**: fix invalid JSDoc declarations (Yagiz Nizipli) [#52659](https://github.com/nodejs/node/pull/52659) +- \[[`2d6b19970b`](https://github.com/nodejs/node/commit/2d6b19970b)] - **(SEMVER-MINOR)** **util**: support array of formats in util.styleText (Marco Ippolito) [#52040](https://github.com/nodejs/node/pull/52040) +- \[[`d30cccdf8c`](https://github.com/nodejs/node/commit/d30cccdf8c)] - **(SEMVER-MINOR)** **v8**: implement v8.queryObjects() for memory leak regression testing (Joyee Cheung) [#51927](https://github.com/nodejs/node/pull/51927) +- \[[`7f3b7fdeff`](https://github.com/nodejs/node/commit/7f3b7fdeff)] - **watch**: fix some node argument not passed to watched process (Raz Luvaton) [#52358](https://github.com/nodejs/node/pull/52358) +- \[[`8ba6f9bc9a`](https://github.com/nodejs/node/commit/8ba6f9bc9a)] - **watch**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`5a922232da`](https://github.com/nodejs/node/commit/5a922232da)] - **watch**: mark as stable (Moshe Atlow) [#52074](https://github.com/nodejs/node/pull/52074) +- \[[`508e968a5f`](https://github.com/nodejs/node/commit/508e968a5f)] - **watch**: batch file restarts (Moshe Atlow) [#51992](https://github.com/nodejs/node/pull/51992) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.13.0/node-v20.13.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.13.0/node-v20.13.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.13.0/node-v20.13.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.13.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.13.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.13.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.13.0/node-v20.13.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.13.0/node-v20.13.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.13.0/node-v20.13.0.tar.gz \ +Other release files: https://nodejs.org/dist/v20.13.0/ \ +Documentation: https://nodejs.org/docs/v20.13.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +d75b994a79a60fb5ae06cc1e46d9e5cae3baed4a02bebd63f699391dd663e7c3 node-v20.13.0-aix-ppc64.tar.gz +47832625845673017ab90c3fa037ddd0b767cfbc7feb471e76f60f59ff66a412 node-v20.13.0-arm64.msi +ef850bf9045d756c7a703c30fc09d7d9de9c7e7f254c6f4c02a1531381a806fd node-v20.13.0-darwin-arm64.tar.gz +46890acbe8107a87786af601e5fa17bdde3c6c54caf2ac15474bfa0690025ea2 node-v20.13.0-darwin-arm64.tar.xz +417fb4a3a3a70547d5f6d05e068e6d6ec226a6d12c94d91661641e4e11eaeb63 node-v20.13.0-darwin-x64.tar.gz +9101e1bd6de7dc657d97c7ed9dde2ceabbe9054992d891c54c5570a9be782b30 node-v20.13.0-darwin-x64.tar.xz +73235e1ff7eac21e50e44a4b4791613116004c3a605ddfdac6802afe21162bcf node-v20.13.0-headers.tar.gz +2dc7ccbf7a45804e5d35ebc67d10f88a6f14fa27b60d805b440a1aad5210c1c6 node-v20.13.0-headers.tar.xz +29e904b9dd7325911ab38f79c5462f1d562d5573b97e8f63d700870a270ef43a node-v20.13.0-linux-arm64.tar.gz +44abc8a22d723fd0946b18c6339016a8882eb850e8fc26ea4f470de9545be778 node-v20.13.0-linux-arm64.tar.xz +0dc649df1681cf7e6410b6136f1de6a8c7f97cead560c00ee7ab875c2c3f48f8 node-v20.13.0-linux-armv7l.tar.gz +b32e488675fb0c6fb7836a50c46149435511b245d365c0dd695c7a81b960a55b node-v20.13.0-linux-armv7l.tar.xz +ceb0c307f12e543d401f388ba6e70a5a35ff5eac491d1d517861681332a69682 node-v20.13.0-linux-ppc64le.tar.gz +46a9be427c940378d8dffcde54880bfb348c1bb0e333c00aa52c4cba16451de1 node-v20.13.0-linux-ppc64le.tar.xz +911d4c0ff6632594508d404d84b8c0e80bbe6ec3a44babb9a9f907306d03385f node-v20.13.0-linux-s390x.tar.gz +00f7928a37c8e3f1850a05200f25b5a546851580dccebbe7d402f8b106624b21 node-v20.13.0-linux-s390x.tar.xz +a74ceb142362d152aa871710ef9fb338ab72c76415f5afa802fc0aea445397b3 node-v20.13.0-linux-x64.tar.gz +a58d5d99b4ccf95d966dd1e3d3a560f4686e3e1e4f7331258860d429f13fc7eb node-v20.13.0-linux-x64.tar.xz +04e0bf402c8e0c8670b1bc0aa370069918011cc3632f0f5df36d525840f7b88a node-v20.13.0.pkg +733ab5d27a805056b674f12ae5493ad3a40e39c97f4d27407a85003a8b7a570e node-v20.13.0.tar.gz +11d229fcad7e6e10f450301223c602043f021cda51259ffafc7e55e484b37dc7 node-v20.13.0.tar.xz +6816afb856a6ace88dfb9f00e680d62a4b1df46e03d0ba232a2b4e84b9b677b6 node-v20.13.0-win-arm64.7z +58cb1430ff203e688d6954607518e69d4cab2ccecc2dd36e32430d740ad0d555 node-v20.13.0-win-arm64.zip +498b9a18889ce1f6cdfb2037af77a17886ba87308b759037ca42c0590b730446 node-v20.13.0-win-x64.7z +085cca6645d483ac38708a8206c8e1c97f94f99f179e5e26e454b578f40e383c node-v20.13.0-win-x64.zip +87bb42cd4a8e746bd333c35c6bc1ca477b9e61fec5fb5db1d1c1e16a3c45fcb0 node-v20.13.0-win-x86.7z +0211523086033d18c0720b15146178eb7057ee7afc8c4009c8e59ecd94778a48 node-v20.13.0-win-x86.zip +d41e6aa0673a400d14c536ffa9c5897d03d682f58ac033ac00c7b2e71bbc97c2 node-v20.13.0-x64.msi +7dc6c9cac8d3d2e55e3c253ed4a544127bed3d46799f409c8b6562a7edb1cef6 node-v20.13.0-x86.msi +04a99b63a91492bd1331e67df611ec9880636f5be17b0872c7bd8bb113452c2e win-arm64/node.exe +6855c9b01fc23139ccf9a2c4e079e629d1935df57f6d01075952d29e017b3642 win-arm64/node.lib +edf2c699456f8aa800b64fbaa3a467bf525d80664454461c2791e0226f1fd643 win-arm64/node_pdb.7z +37ffa759ca50db7e20e9a356795c84272f4c680297e17fef6f9b51e88022080c win-arm64/node_pdb.zip +46039bf12adab32ba5a2c335d46e7df503d7f70b6390e237048479fc8a539b3c win-x64/node.exe +bd5890fac4571d1cdfaca31d74ae791feef1edad3b70421969de2aa83f330797 win-x64/node.lib +aba5c53f8374ac40c144717e5894d5113d2af2d5196be8612d2671220522f05f win-x64/node_pdb.7z +f77d54ce337aaf72a594edf85f81109b2da08625c75c4a2045654cc0c2bdef03 win-x64/node_pdb.zip +ef558ed3f5ffa982d3d8e7e2149338d4230b94b217f67f725a559055a6004806 win-x86/node.exe +be02221a3f8c8e9fc2946bfec6d1b43da8798281857507730b3fee0a154af851 win-x86/node.lib +3dee053946533e469d6a539eab2af8ac30d61208645cc8d618e120ceaa7311b7 win-x86/node_pdb.7z +9fc149ca5aa6f6a9741d8edb115aa742d474b0285054d6068d2cf9466e62f5f2 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEzGj1oxBv9EgyLkjtJ/XjjVsKIV8FAmY6TEoACgkQJ/XjjVsK +IV9VRw/+OoH9SHRb7MzWj2LJh4HA0gisWjhYUzhYCFxEfIbg8ia0EtkH+mfL3/46 +mvPV2xvf5HIaJyqXXfIkUAbObq47AWa/meuspUmqQDirdgCcMFiDS/uA729XCa9R +BjhxhA3bqx7g84EsvyWWFqyTbgcU9865u9Luo+M93wewTfWEC2Mk9mmAXm2+oI4L +g6A0gSw5fw+UErLtqclqSJE/fg8dNf82B0UT9s/HQ0RsNfeNIA+LtrdDjjWXam8z +SvKo/0/EXZtaOwtulBG2fz67ccg9kgElRCbclLftQWOJnp3ma8ktDkvfok0tQYNR +Oj1XPvNL8PMVVWB9NxJTiKT30RVYQmyDia9pHYmNdalW5h5IqHCXtxTrpV8ZT9Uv +Ty/ocP8hbSKYf3J5Uiv2YzLelqEpth+KgAGlUSVHKO8zoBM09T8SnSXrhUd2HNm9 +vFvLs25GhwC1owzlQGTz0w0Z2nV8R6fwZ+Uv9f8/gankotsiQmaga2G+PRv8IheL +mOHne7eue2VSo/9bvHKR4/6I8G9npuK/x7W80kSwfMmy8PAfCekBsXhKHouAfEmG +YmSZ4OL+gBeYhlLEI7weoMLB6w1ZoN+LSusWW5+mW4Ri4fODGOSrey36NHGT2CMn +XTiDRXpJka67CZ2krLn5DyaaBfxDtSqYpBsa89c5ckHsW1vBiVc= +=VFxj +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.13.1.md b/pages/en/blog/release/v20.13.1.md new file mode 100644 index 0000000000000..361d4b7176211 --- /dev/null +++ b/pages/en/blog/release/v20.13.1.md @@ -0,0 +1,101 @@ +--- +date: '2024-05-09T10:38:21.154Z' +category: release +title: Node v20.13.1 (LTS) +layout: blog-post +author: Marco Ippolito +--- + +## 2024-05-09, Version 20.13.1 'Iron' (LTS), @marco-ippolito + +### Revert "tools: install npm PowerShell scripts on Windows" + +Due to a regression in the npm installation on Windows, this commit reverts the change that installed npm PowerShell scripts on Windows. + +### Commits + +- \[[`b7d80802cc`](https://github.com/nodejs/node/commit/b7d80802cc)] - _**Revert**_ "**tools**: install npm PowerShell scripts on Windows" (marco-ippolito) [#52897](https://github.com/nodejs/node/pull/52897) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.13.1/node-v20.13.1-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.13.1/node-v20.13.1-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.13.1/node-v20.13.1-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.13.1/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.13.1/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.13.1/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.13.1/node-v20.13.1.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.13.1/node-v20.13.1-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.13.1/node-v20.13.1.tar.gz \ +Other release files: https://nodejs.org/dist/v20.13.1/ \ +Documentation: https://nodejs.org/docs/v20.13.1/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +941d645cc804274934a06813c87b0b7cee7a6c3f5a3c82e62e1f6f8dc7f0030c node-v20.13.1-aix-ppc64.tar.gz +adee910ad7603adfc198bbcf114fbe38635e305d29b0ea36435d8c1c2f2da275 node-v20.13.1-arm64.msi +c30fe595f59dcd2c5158da6bf8bc251ffc85ca37304afa89db150fb3c62c4507 node-v20.13.1-darwin-arm64.tar.gz +e8a8e78b91485bc95d20f2aa86201485593685c828ee609245ce21c5680d07ce node-v20.13.1-darwin-arm64.tar.xz +80bde95dc976b84db5ca566738c07305087ae578f5f3b05191e0e6ff54aaeaf2 node-v20.13.1-darwin-x64.tar.gz +c83bffeb4eb793da6cb61a44c422b399048a73d7a9c5eb735d9c7f5b0e8659b6 node-v20.13.1-darwin-x64.tar.xz +f81607966d511276eec291231a2329e2b626d5ed73e8cb5a13616a6a320f60b2 node-v20.13.1-headers.tar.gz +3a9b24eb11175c71e50f1eea40156df622ddb7f93b9616f639b4e6cffb2ba1a9 node-v20.13.1-headers.tar.xz +4f9c2ffb116855d6fa4b6654e453f403e31b53284b81c789b73d1d2e20c6f710 node-v20.13.1-linux-arm64.tar.gz +d251cda3ee0a539d8aea4ea2327e98998cb23487569073902e35efb0526d574b node-v20.13.1-linux-arm64.tar.xz +0f65dddc797ce7f76976e3720b7a1bca67d1465b113daf82878b66c541ae649f node-v20.13.1-linux-armv7l.tar.gz +af16f17ce87a0d51d0003ea60437d6c323c6514d187d5c3bd52a887bf0b4adf4 node-v20.13.1-linux-armv7l.tar.xz +d964b4ebc4f6fb2255dfb259f2e2489318c712a3b12ec2f5a1cb36a9ca208180 node-v20.13.1-linux-ppc64le.tar.gz +05f85b05d2aa1c0a2e0e7531fa54664fe47622cb346d18983908f100de8805fb node-v20.13.1-linux-ppc64le.tar.xz +efabff9fc928821325139b853c8edcd25a828b8f2fdc1e227cc282655424cf90 node-v20.13.1-linux-s390x.tar.gz +0bbe63d4ba09527e40ba59e606ea31fdc44f9552b9e726bf2817ac7fe986961e node-v20.13.1-linux-s390x.tar.xz +80b978a9fe544b1892e73a4bf89e0b3792b1d459b621874efdc2ddd2270c03fe node-v20.13.1-linux-x64.tar.gz +efc0f295dd878e510ab12ea36bbadc3db03c687ab30c07e86c7cdba7eed879a9 node-v20.13.1-linux-x64.tar.xz +e22c5087b64cb6e4e8ea43aa68147b0b12025f2d53fe8f8da826c874348a268c node-v20.13.1.pkg +a85ee53aa0a5c2f5ca94fa414cdbceb91eb7d18a77fc498358512c14cc6c6991 node-v20.13.1.tar.gz +791786a09023241cb7e4f7d65ec90aa924bb39141ff7bb6d5a1dedf7def4b4e7 node-v20.13.1.tar.xz +acd05435cba201ed43dace61750d2ce65ef3fab0a0752cedd614085e93806992 node-v20.13.1-win-arm64.7z +d6d3019fb03c9918dfb4ba9dbdadb701b781a661283689f95053849c3afc70c8 node-v20.13.1-win-arm64.zip +a3aacbadf432c03b13428b55d33e5a6af238c30c340d97d47cc9ce0b57bfa3b8 node-v20.13.1-win-x64.7z +555a55c0c7441cb90e441115c81f610fca712dd5b192034d5eaafd7c29924425 node-v20.13.1-win-x64.zip +20df3d7b90876aff5a952d6613c629707b0d04e7d03e0a86ff2d1524f0906969 node-v20.13.1-win-x86.7z +d9e6a4c0b72d63ae2c6e71fab868392bc394238f2027f9603500eb2edf571495 node-v20.13.1-win-x86.zip +695eb534992f0d4aa10ab024aef596664493e19e0e1581c41eefe33050811c52 node-v20.13.1-x64.msi +7d14bdc418e77f74b75ae424047039e73e004d2ebf917f491e481d4cb1c4676a node-v20.13.1-x86.msi +6e7ec3dc7b8874eec281e8ea1a44c9a1f1034784853aacba47531ebc4bed6ceb win-arm64/node.exe +4935c9a662de9421bc69e3e8a2146f6dabed40a7fd486ca46e697df30378b89f win-arm64/node.lib +8264792d2db82c78dcc2d52bcbbb37ce199f7b1730dfe6998bf6ef6d5c0d4a18 win-arm64/node_pdb.7z +204c4fd540f44ab4e52b80d2277c97092af8a67a38ee883abf1e44dc4fa86d34 win-arm64/node_pdb.zip +11dfd8204bf09a95574ae69c524792f47bc61c693a53cca8a0185f831130740f win-x64/node.exe +bd5890fac4571d1cdfaca31d74ae791feef1edad3b70421969de2aa83f330797 win-x64/node.lib +a77be6d0f8142f9c01a0d3312289b949703f262759ce5bd1843fb2f2773c7eed win-x64/node_pdb.7z +688602fd42def373fb4bf4f9f5ae2badd846b1faec6c77eea0bd0e1b5ed0b379 win-x64/node_pdb.zip +7d3f344bb628d331563723dbb5855a118ba26484c96f9d5cc007d1d2aa74f3f0 win-x86/node.exe +f82b299d4498b58e549a11cdcb5ce9efa2162f7efa20f527903f5ac5a0387ca0 win-x86/node.lib +df200297b0a6b860a7fae8ee6b0eea1e0ca83bae168dd51cc93372454353bdcd win-x86/node_pdb.7z +f48664ea50da26bc2f42c157be2b89412d105f5124d5fcc847eb91c4f14cfd00 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEzGj1oxBv9EgyLkjtJ/XjjVsKIV8FAmY8pv0ACgkQJ/XjjVsK +IV+Bfw//ahWJYxt6xsIqCmOzKiXyPnSHJNutRp4pbGpXBVYwAEOCMcztOC4z/AOu +8K2WElhDHHf0/LwhCgNIcg5J3Gh3059EW1RAdwx9MuYkt8wFO4TCoK/mrdN1XqjP +lRXp45YD01O9igebgILHd70vSz3UG9msdhndp1FuHC3THEMiQ7FRJRJ9Mz9nA3TQ +UV3zvAXdrOTKqFWLkoFAFp5DSutdplkzUnQ9oW69Jlw0X0Wr2wOFyHOSVRtQwjBT +v2dg5/FoPZoEDWBhyIlARD5UXF2ruy93KucBUza8SjuHPocG1QQzOcfphUc5biPE +XFz77Gh1M9raxn/guQLfpj0scFwm7nvVo7QOGDlEjQkWyyoTHEe/GdU9fBquQRhX +HcFRYMucFv87cHR8Rem1Mb59oM/GA9k8frpFKgVa+4oT8Yp+6VQukHbiK5SGqU1D +GXJwqwYoIA7eeAllHA3Jh5WBeJxm9JlbV7fYEWIBK62E5Wayj0OYTBaag3uSYJt/ +aPBJzYFFCT259Pe8Q5CfThajVuiCUOUa+Wwx+4Wd60oKF3aFlURZ7zckzjLgX4ne +yDwOW+5FXG/I8qCtQ6onCdlhir0/hiVI6dZ92GtXpQJ3kPYcUIAq5XoGZ7PhYwwJ +LDTd9SRji+EDqq9uk2z0hGZ5SbbcSyY8MWmMqCYeiD0AopWkLOI= +=d095 +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v20.14.0.md b/pages/en/blog/release/v20.14.0.md new file mode 100644 index 0000000000000..94c7023389ed8 --- /dev/null +++ b/pages/en/blog/release/v20.14.0.md @@ -0,0 +1,143 @@ +--- +date: '2024-05-28T16:50:55.754Z' +category: release +title: Node v20.14.0 (LTS) +layout: blog-post +author: Marco Ippolito +--- + +## 2024-05-28, Version 20.14.0 'Iron' (LTS), @marco-ippolito + +### Notable Changes + +- \[[`28d2baa17c`](https://github.com/nodejs/node/commit/28d2baa17c)] - **src,permission**: throw async errors on async APIs (Rafael Gonzaga) [#52730](https://github.com/nodejs/node/pull/52730) +- \[[`77e2bf029a`](https://github.com/nodejs/node/commit/77e2bf029a)] - **(SEMVER-MINOR)** **test_runner**: support forced exit (Colin Ihrig) [#52038](https://github.com/nodejs/node/pull/52038) + +### Commits + +- \[[`e3ad05d8b0`](https://github.com/nodejs/node/commit/e3ad05d8b0)] - **deps**: V8: cherry-pick 500de8bd371b (Richard Lau) [#52676](https://github.com/nodejs/node/pull/52676) +- \[[`053282e661`](https://github.com/nodejs/node/commit/053282e661)] - **deps**: V8: backport c4be0a97f981 (Richard Lau) [#52183](https://github.com/nodejs/node/pull/52183) +- \[[`200dadb879`](https://github.com/nodejs/node/commit/200dadb879)] - **deps**: V8: cherry-pick f8d5e576b814 (Richard Lau) [#52183](https://github.com/nodejs/node/pull/52183) +- \[[`f5cd125e02`](https://github.com/nodejs/node/commit/f5cd125e02)] - **deps**: update googletest to fa6de7f (Node.js GitHub Bot) [#52949](https://github.com/nodejs/node/pull/52949) +- \[[`bbbfd7f4e1`](https://github.com/nodejs/node/commit/bbbfd7f4e1)] - **deps**: update corepack to 0.28.1 (Node.js GitHub Bot) [#52946](https://github.com/nodejs/node/pull/52946) +- \[[`7ba30a57a6`](https://github.com/nodejs/node/commit/7ba30a57a6)] - **deps**: update simdutf to 5.2.8 (Node.js GitHub Bot) [#52727](https://github.com/nodejs/node/pull/52727) +- \[[`b21a480a28`](https://github.com/nodejs/node/commit/b21a480a28)] - **deps**: update simdutf to 5.2.6 (Node.js GitHub Bot) [#52727](https://github.com/nodejs/node/pull/52727) +- \[[`6cfad60d97`](https://github.com/nodejs/node/commit/6cfad60d97)] - **deps**: update googletest to 2d16ed0 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`34708d1429`](https://github.com/nodejs/node/commit/34708d1429)] - **deps**: update googletest to d83fee1 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`c1d3e558e8`](https://github.com/nodejs/node/commit/c1d3e558e8)] - **deps**: update googletest to 5a37b51 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`69959d0fca`](https://github.com/nodejs/node/commit/69959d0fca)] - **deps**: update googletest to 5197b1a (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`c8305f6057`](https://github.com/nodejs/node/commit/c8305f6057)] - **deps**: update googletest to eff443c (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`760b788704`](https://github.com/nodejs/node/commit/760b788704)] - **deps**: update googletest to c231e6f (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`301541cc8f`](https://github.com/nodejs/node/commit/301541cc8f)] - **deps**: update googletest to e4fdb87 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`981d57e401`](https://github.com/nodejs/node/commit/981d57e401)] - **deps**: update googletest to 5df0241 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`a1817f534d`](https://github.com/nodejs/node/commit/a1817f534d)] - **deps**: update googletest to b75ecf1 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`42070ca189`](https://github.com/nodejs/node/commit/42070ca189)] - **deps**: update googletest to 4565741 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`edc3e5d056`](https://github.com/nodejs/node/commit/edc3e5d056)] - **deps**: update uvwasi to 0.0.21 (Node.js GitHub Bot) [#52863](https://github.com/nodejs/node/pull/52863) +- \[[`26b1231ffb`](https://github.com/nodejs/node/commit/26b1231ffb)] - **deps**: upgrade npm to 10.7.0 (npm team) [#52767](https://github.com/nodejs/node/pull/52767) +- \[[`e6d9fbece2`](https://github.com/nodejs/node/commit/e6d9fbece2)] - **doc**: update process.versions properties (ishabi) [#52736](https://github.com/nodejs/node/pull/52736) +- \[[`8c1f837c0a`](https://github.com/nodejs/node/commit/8c1f837c0a)] - **doc**: remove mold use on mac for speeding up build (Cong Zhang) [#52252](https://github.com/nodejs/node/pull/52252) +- \[[`d9c5114694`](https://github.com/nodejs/node/commit/d9c5114694)] - **doc**: fix grammatical mistake (codershiba) [#52808](https://github.com/nodejs/node/pull/52808) +- \[[`b350f435b7`](https://github.com/nodejs/node/commit/b350f435b7)] - **meta**: add mailmap entry for legendecas (Chengzhong Wu) [#52795](https://github.com/nodejs/node/pull/52795) +- \[[`61f9f12eff`](https://github.com/nodejs/node/commit/61f9f12eff)] - **meta**: bump actions/checkout from 4.1.1 to 4.1.4 (dependabot\[bot]) [#52787](https://github.com/nodejs/node/pull/52787) +- \[[`ac563667d6`](https://github.com/nodejs/node/commit/ac563667d6)] - **meta**: bump github/codeql-action from 3.24.9 to 3.25.3 (dependabot\[bot]) [#52786](https://github.com/nodejs/node/pull/52786) +- \[[`70611d7924`](https://github.com/nodejs/node/commit/70611d7924)] - **meta**: bump actions/upload-artifact from 4.3.1 to 4.3.3 (dependabot\[bot]) [#52785](https://github.com/nodejs/node/pull/52785) +- \[[`30482ea273`](https://github.com/nodejs/node/commit/30482ea273)] - **meta**: bump actions/download-artifact from 4.1.4 to 4.1.7 (dependabot\[bot]) [#52784](https://github.com/nodejs/node/pull/52784) +- \[[`d1607cdebb`](https://github.com/nodejs/node/commit/d1607cdebb)] - **meta**: bump codecov/codecov-action from 4.1.1 to 4.3.1 (dependabot\[bot]) [#52783](https://github.com/nodejs/node/pull/52783) +- \[[`21f1b6bfc3`](https://github.com/nodejs/node/commit/21f1b6bfc3)] - **meta**: bump step-security/harden-runner from 2.7.0 to 2.7.1 (dependabot\[bot]) [#52782](https://github.com/nodejs/node/pull/52782) +- \[[`0c6019a222`](https://github.com/nodejs/node/commit/0c6019a222)] - **meta**: standardize regex (Aviv Keller) [#52693](https://github.com/nodejs/node/pull/52693) +- \[[`28d2baa17c`](https://github.com/nodejs/node/commit/28d2baa17c)] - **src,permission**: throw async errors on async APIs (Rafael Gonzaga) [#52730](https://github.com/nodejs/node/pull/52730) +- \[[`cffd2cc0c9`](https://github.com/nodejs/node/commit/cffd2cc0c9)] - _**Revert**_ "**stream**: revert fix cloned webstreams not being unref'd" (Marco Ippolito) [#53144](https://github.com/nodejs/node/pull/53144) +- \[[`3dd96f1fab`](https://github.com/nodejs/node/commit/3dd96f1fab)] - **stream**: implement TransformStream cleanup using "transformer.cancel" (Debadree Chatterjee) [#50126](https://github.com/nodejs/node/pull/50126) +- \[[`8e7e778e01`](https://github.com/nodejs/node/commit/8e7e778e01)] - **test**: skip v8-updates/test-linux-perf (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`f8e18869e9`](https://github.com/nodejs/node/commit/f8e18869e9)] - **test**: replace always-opt flag with alway-turbofan (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`a501860d63`](https://github.com/nodejs/node/commit/a501860d63)] - **test_runner**: don't await the same promise for each test (Colin Ihrig) [#52185](https://github.com/nodejs/node/pull/52185) +- \[[`e2ae4367f4`](https://github.com/nodejs/node/commit/e2ae4367f4)] - **test_runner**: run top level tests in a microtask (Colin Ihrig) [#52092](https://github.com/nodejs/node/pull/52092) +- \[[`77e2bf029a`](https://github.com/nodejs/node/commit/77e2bf029a)] - **(SEMVER-MINOR)** **test_runner**: support forced exit (Colin Ihrig) [#52038](https://github.com/nodejs/node/pull/52038) +- \[[`b7bc63565e`](https://github.com/nodejs/node/commit/b7bc63565e)] - **test_runner**: ignore todo flag when running suites (Colin Ihrig) [#52117](https://github.com/nodejs/node/pull/52117) +- \[[`be587e3ae3`](https://github.com/nodejs/node/commit/be587e3ae3)] - **test_runner**: use paths for test locations (Colin Ihrig) [#52010](https://github.com/nodejs/node/pull/52010) +- \[[`743281ab25`](https://github.com/nodejs/node/commit/743281ab25)] - **test_runner**: support source mapped test locations (Colin Ihrig) [#52010](https://github.com/nodejs/node/pull/52010) +- \[[`4051316d95`](https://github.com/nodejs/node/commit/4051316d95)] - **tools**: update lint-md-dependencies to rollup\@4.17.0 (Node.js GitHub Bot) [#52729](https://github.com/nodejs/node/pull/52729) + +Windows 32-bit Installer: https://nodejs.org/dist/v20.14.0/node-v20.14.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v20.14.0/node-v20.14.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.14.0/node-v20.14.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v20.14.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v20.14.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.14.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v20.14.0/node-v20.14.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v20.14.0/node-v20.14.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v20.14.0/node-v20.14.0.tar.gz \ +Other release files: https://nodejs.org/dist/v20.14.0/ \ +Documentation: https://nodejs.org/docs/v20.14.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +06ac9b1f35de7b05dc0aea58b99804edf608ee500b2e9b303d1a6044eb3eeab2 node-v20.14.0-aix-ppc64.tar.gz +7aa32a400a8d10bac35dcc22ff09ca2eccf2842dd3a762f94c77db096d6a8220 node-v20.14.0-arm64.msi +d2148d79e9ff04d2982d00faeae942ceba488ca327a91065e528235167b9e9d6 node-v20.14.0-darwin-arm64.tar.gz +63ee914bdbb1552213ec4e21ea83685e11d969d50fc7801d6db981089cd607fe node-v20.14.0-darwin-arm64.tar.xz +1dcc18a199cb5f46d43ed1c3c61b87a247d1a1a11dd6b32a36a9c46ac1088f86 node-v20.14.0-darwin-x64.tar.gz +78e05a047b61f312db2de5e0127aeeb1274753c7f215f8892f3e5f76a629a022 node-v20.14.0-darwin-x64.tar.xz +289ecd13b5d8edfff527b258fd752f049e1c85351e6833de00daf088b17ef3b2 node-v20.14.0-headers.tar.gz +7c94f0f0d0b2a3a53ef9515aa24510dbfd6bc71373723edda309b85ecb8eaf12 node-v20.14.0-headers.tar.xz +d63e83fca4f81801396620c46a42892a2ef26e21a4508f68de373e61a12bd9c5 node-v20.14.0-linux-arm64.tar.gz +8fb7012589850390ec658f58aaa11656031f64a7a8efb0b37607ca140cefe3a9 node-v20.14.0-linux-arm64.tar.xz +af45ea0d09e55a4f05c0190636532bdf9f70b2eaf0a1c4d7594207cf21284df0 node-v20.14.0-linux-armv7l.tar.gz +73d7808e7f8d4ea0370c285cee9e63febdd07604ec400e3fc51213d4d9e9beec node-v20.14.0-linux-armv7l.tar.xz +2405a23249ddb4d2495f212255f5f5f11892fac77f9835c491b9ffaee1404078 node-v20.14.0-linux-ppc64le.tar.gz +2476aa037046e707c1fd755be624f0144438c3ce02fa0a4d0bb8b29fae84b5af node-v20.14.0-linux-ppc64le.tar.xz +74668f3e337980acf1579e31f6f9490ec28d98603bb2ff17390c115606af7806 node-v20.14.0-linux-s390x.tar.gz +fafd8e3ac753f7e1468c9390f9f40dd9227172b9cac0ae3902e6df91861519da node-v20.14.0-linux-s390x.tar.xz +5b9bf40cfc7c21de14a1b4c367650e3c96eb101156bf9368ffc2f947414b6581 node-v20.14.0-linux-x64.tar.gz +fedf8fa73b6f51c4ffcc5da8f86cd1ed381bc9dceae0829832c7d683a78b8e36 node-v20.14.0-linux-x64.tar.xz +257caf3ae34ddf14aebe2a9cecba6994842548af94565af5369d3a834637273e node-v20.14.0.pkg +f01109d3102754ac360fcf25aa588f3bef5c090a8eed3fb1d0be194149c46cf2 node-v20.14.0.tar.gz +08655028f0d8436e88163f9186044d635d3f36a85ee528f36bd05b6c5e46c1bb node-v20.14.0.tar.xz +81530d6a3f62f2b2dc758ecda6510656b20d64fcdd24ef5befd08a94bf5c2408 node-v20.14.0-win-arm64.7z +4169ea1d91bbcdd1483cd6569f5c7402f6954ea01364204d7c3968d8a80046c8 node-v20.14.0-win-arm64.zip +2f287555ee39462995b8a728c41bba1ad5afd8d27cfeaed0946d5ac0df1b9b7a node-v20.14.0-win-x64.7z +04cc745e572ff53a6b9ce5b573e4a18303e32351e60c278a93b84466b60d532f node-v20.14.0-win-x64.zip +e808e46b4f4003b1080a90c29e1115deea20a94bac4d2a619c9413602915c77f node-v20.14.0-win-x86.7z +370f08c5b80586a2b5123b6c6e4d92915988868de5f940280679e1faa54d9b0f node-v20.14.0-win-x86.zip +4235f05b99ae5dabadb5c10c124a0f7f7d4223e52df0857e4c4462b13f19c40e node-v20.14.0-x64.msi +148fffe0e2b68eb9ba5105d596b5302dda436fc1fca5e0e1bbd2994e729eca4a node-v20.14.0-x86.msi +a6ec02119098cf92592539e06289953c4365be20ab15d4ad264669f931000b0c win-arm64/node.exe +6855c9b01fc23139ccf9a2c4e079e629d1935df57f6d01075952d29e017b3642 win-arm64/node.lib +0eb75fe22b0e55302e3847a63c9e808d1d5f1ffc36c24cef1fbc69c0a3542208 win-arm64/node_pdb.7z +1967bc8ae74261492b355026a542c6174defaa7bd77302c471ac74b63662a1e9 win-arm64/node_pdb.zip +8f45741ec6ba07be8d199c0cebc838a58c0430c9228dbe50f8ac5d4859e58bae win-x64/node.exe +bd5890fac4571d1cdfaca31d74ae791feef1edad3b70421969de2aa83f330797 win-x64/node.lib +2b739175308eeb31fb475b0f0f38e76453e69179f368c35aa7643ef5f03ae570 win-x64/node_pdb.7z +8e64314e79dfe3ef8c9e3f8fb9708645af3b4f5abe36718ba8b1141fc934b9cb win-x64/node_pdb.zip +096e3d8e0e28b1683eab761fd5a43df978f93fa7bf0a42dfbda915340716f242 win-x86/node.exe +be02221a3f8c8e9fc2946bfec6d1b43da8798281857507730b3fee0a154af851 win-x86/node.lib +01e3b6c808cbd4051b318d26a565bea7710a511b60c7ae973c590c2615bc56d4 win-x86/node_pdb.7z +7601c510d956858c36f1c83697ac055c7d4b75876fb3519b68f69f07f41ca12f win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEzGj1oxBv9EgyLkjtJ/XjjVsKIV8FAmZWCokACgkQJ/XjjVsK +IV9BgxAAiR+7wu+SvNDhEyNRIHaviXeIwH04RLISm/72jvi22LbGfKT1/4F5GvcY +OvMOHQAgrx0rbF5i6CC2e6SmWWNsD+oFT0ksxRNGgAwl5aCyzjPSn9yfLEJzHJPa ++XZ3KOQ+Yuq9qPeIUVuiJWov/Yq6hU+XjVrmwpE4FILhR+pPwOdJirjY0eE+pGuE +RSKa1KdYJFMrlN40Wzhjqabj+YjT9YXsnlt/AgC2OfY/OwfKLTCkos+ZD8E62Xn7 +GvRSfe7YLEue0YgN5XLxdCiOnxhwfco73pjOiNEO/ZGOcSZ3StNKWYelEUUq+GGx +crE2CuoXps6F3aPvHYmqur4arBuIKTOB/jO76ApvIjdWdGgRVP+ORdtwSItglwdy +9XldjrQzCvpJQlrArboeQBnXK972EgMEqe0iD6rwaIuNtcoupOa0HFhMb8x/uT9R +Y3vuAomwbM042rTC/wfF4u2/vZz2/qna/wDQ06l3g9oP9D/050REQri+4rembpFy +Q02IpehDtfD7NXD+4wfeeRB+ZvlNFWrCIy9Lrbt5UCGv638bXKOwTnOqnxpG2xIK +t17s3bw0aQV0wXeDDO2RCQu/izU+64jOGvl3UI8bKMsYYYMkD13mY4w3QrH/gY6u +/fKdLqmFzSUrxSeWp2Zy3Ymbuk5rkBUzP6Z3n0DRfSp8LHZehkk= +=5Spr +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v21.7.0.md b/pages/en/blog/release/v21.7.0.md new file mode 100644 index 0000000000000..662af05ec5a8a --- /dev/null +++ b/pages/en/blog/release/v21.7.0.md @@ -0,0 +1,444 @@ +--- +date: '2024-03-06T18:38:37.085Z' +category: release +title: Node v21.7.0 (Current) +layout: blog-post +author: Rafael Gonzaga & Marco Ippolito +--- + +## 2024-03-06, Version 21.7.0 (Current), @RafaelGSS prepared by @marco-ippolito + +### Text Styling + +- `util.styleText(format, text)`: This function returns a formatted text considering the `format` passed. + +A new API has been created to format text based on `util.inspect.colors`, enabling you to style text in different colors (such as red, blue, ...) and emphasis (italic, bold, ...). + +```cjs +const { styleText } = require('node:util'); +const errorMessage = styleText('red', 'Error! Error!'); +console.log(errorMessage); +``` + +Contributed by Rafael Gonzaga and Hemanth HM in [#51850](https://github.com/nodejs/node/pull/51850). + +### Loading and parsing environment variables + +- `process.loadEnvFile(path)`: + + - Use this function to load the `.env` file. If no path is specified, it automatically loads the .env file in the current directory. Example: `process.loadEnvFile()`. + - Load a specific .env file by specifying its path. Example: `process.loadEnvFile('./development.env')`. + +- `util.parseEnv(content)`: + - Use this function to parse an existing string containing environment variable assignments. + - Example usage: `require('node:util').parseEnv('HELLO=world')`. + +Contributed by Yagiz Nizipli in [#51476](https://github.com/nodejs/node/pull/51476) + +### Support for multi-line values for `.env` file + +Node.js 21.7.0 will now support multi-line values in the .env file: + +```text +MULTI_LINE="HELLO +WORLD" +``` + +Contributed by Ilyas Shabi [#51289](https://github.com/nodejs/node/pull/51289) + +### sea: support embedding assets + +Users can now include assets by adding a key-path dictionary +to the configuration as the `assets` field. At build time, Node.js +would read the assets from the specified paths and bundle them into +the preparation blob. In the generated executable, users can retrieve +the assets using the `sea.getAsset()` and `sea.getAssetAsBlob()` API. + +```json +{ + "main": "/path/to/bundled/script.js", + "output": "/path/to/write/the/generated/blob.blob", + "assets": { + "a.jpg": "/path/to/a.jpg", + "b.txt": "/path/to/b.txt" + } +} +``` + +The single-executable application can access the assets as follows: + +```cjs +const { getAsset } = require('node:sea'); +// Returns a copy of the data in an ArrayBuffer +const image = getAsset('a.jpg'); +// Returns a string decoded from the asset as UTF8. +const text = getAsset('b.txt', 'utf8'); +// Returns a Blob containing the asset without copying. +const blob = getAssetAsBlob('a.jpg'); +``` + +Contributed by Joyee Cheung in [#50960](https://github.com/nodejs/node/pull/50960) + +### vm: support using the default loader to handle dynamic import() + +This patch adds support for using `vm.constants.USE_MAIN_CONTEXT_DEFAULT_LOADER` as the +`importModuleDynamically` option in all vm APIs that take this option except `vm.SourceTextModule`. This allows users to have a shortcut to support dynamic `import()` in the compiled code without missing the compilation cache if they don't need customization of the loading process. We emit an experimental warning when the `import()` is actually handled by the default loader through this option instead of requiring `--experimental-vm-modules`. + +```js +const { Script, constants } = require('node:vm'); +const { resolve } = require('node:path'); +const { writeFileSync } = require('node:fs'); + +// Write test.js and test.txt to the directory where the current script +// being run is located. +writeFileSync( + resolve(__dirname, 'test.mjs'), + 'export const filename = "./test.json";' +); +writeFileSync(resolve(__dirname, 'test.json'), '{"hello": "world"}'); + +// Compile a script that loads test.mjs and then test.json +// as if the script is placed in the same directory. +const script = new Script( + `(async function() { + const { filename } = await import('./test.mjs'); + return import(filename, { with: { type: 'json' } }) + })();`, + { + filename: resolve(__dirname, 'test-with-default.js'), + importModuleDynamically: constants.USE_MAIN_CONTEXT_DEFAULT_LOADER, + } +); + +// { default: { hello: 'world' } } +script.runInThisContext().then(console.log); +``` + +Contributed by Joyee Cheung in [#51244](https://github.com/nodejs/node/pull/51244) + +### crypto: implement crypto.hash() + +This patch introduces a helper crypto.hash() that computes +a digest from the input at one shot. This can be 1.2-2x faster +than the object-based createHash() for smaller inputs (<= 5MB) +that are readily available (not streamed) and incur less memory +overhead since no intermediate objects will be created. + +```js +const crypto = require('node:crypto'); + +// Hashing a string and return the result as a hex-encoded string. +const string = 'Node.js'; +// 10b3493287f831e81a438811a1ffba01f8cec4b7 +console.log(crypto.hash('sha1', string)); +``` + +Contributed by Joyee Cheung in [#51044](https://github.com/nodejs/node/pull/51044) + +### Other Notable Changes + +- \[[`8ae0eeb7f4`](https://github.com/nodejs/node/commit/8ae0eeb7f4)] - **(SEMVER-MINOR)** **build**: build opt to set local location of headers (Michael Dawson) [#51525](https://github.com/nodejs/node/pull/51525) +- \[[`496776cc78`](https://github.com/nodejs/node/commit/496776cc78)] - **crypto**: update root certificates to NSS 3.98 (Node.js GitHub Bot) [#51794](https://github.com/nodejs/node/pull/51794) +- \[[`a8c9e6f7e9`](https://github.com/nodejs/node/commit/a8c9e6f7e9)] - **doc**: add zcbenz to collaborators (Cheng Zhao) [#51812](https://github.com/nodejs/node/pull/51812) +- \[[`adbf2d3837`](https://github.com/nodejs/node/commit/adbf2d3837)] - **doc**: add lemire to collaborators (Daniel Lemire) [#51572](https://github.com/nodejs/node/pull/51572) +- \[[`4b1c6839f4`](https://github.com/nodejs/node/commit/4b1c6839f4)] - **(SEMVER-MINOR)** **http2**: add h2 compat support for appendHeader (Tim Perry) [#51412](https://github.com/nodejs/node/pull/51412) +- \[[`d8aa2bac0b`](https://github.com/nodejs/node/commit/d8aa2bac0b)] - **(SEMVER-MINOR)** **http2**: add server handshake utility (snek) [#51172](https://github.com/nodejs/node/pull/51172) +- \[[`b9275d9039`](https://github.com/nodejs/node/commit/b9275d9039)] - **(SEMVER-MINOR)** **http2**: receive customsettings (Marten Richter) [#51323](https://github.com/nodejs/node/pull/51323) +- \[[`5a2d2daad5`](https://github.com/nodejs/node/commit/5a2d2daad5)] - **(SEMVER-MINOR)** **lib**: move encodingsMap to internal/util (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`e8d9065262`](https://github.com/nodejs/node/commit/e8d9065262)] - **(SEMVER-MINOR)** **sea**: support sea.getRawAsset() (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`47186fbad5`](https://github.com/nodejs/node/commit/47186fbad5)] - **(SEMVER-MINOR)** **src**: print string content better in BlobDeserializer (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`119e045053`](https://github.com/nodejs/node/commit/119e045053)] - **(SEMVER-MINOR)** **src**: do not coerce dotenv paths (Tobias Nießen) [#51425](https://github.com/nodejs/node/pull/51425) +- \[[`9ab353af00`](https://github.com/nodejs/node/commit/9ab353af00)] - **(SEMVER-MINOR)** **stream**: implement `min` option for `ReadableStreamBYOBReader.read` (Mattias Buelens) [#50888](https://github.com/nodejs/node/pull/50888) + +### Commits + +- \[[`4ddb9b33d5`](https://github.com/nodejs/node/commit/4ddb9b33d5)] - **async_hooks,inspector**: implement inspector api without async_wrap (Gabriel Bota) [#51501](https://github.com/nodejs/node/pull/51501) +- \[[`7e06c11f55`](https://github.com/nodejs/node/commit/7e06c11f55)] - **benchmark**: update iterations of assert/deepequal-typedarrays.js (Lei Shi) [#51419](https://github.com/nodejs/node/pull/51419) +- \[[`72be232006`](https://github.com/nodejs/node/commit/72be232006)] - **benchmark**: update iterations of benchmark/assert/deepequal-map.js (Lei Shi) [#51416](https://github.com/nodejs/node/pull/51416) +- \[[`92e7c310cb`](https://github.com/nodejs/node/commit/92e7c310cb)] - **benchmark**: rename startup.js to startup-core.js (Joyee Cheung) [#51669](https://github.com/nodejs/node/pull/51669) +- \[[`c9ada533a2`](https://github.com/nodejs/node/commit/c9ada533a2)] - **build**: remove `librt` libs link for Android compatibility (BuShe Pie) [#51632](https://github.com/nodejs/node/pull/51632) +- \[[`86ac787889`](https://github.com/nodejs/node/commit/86ac787889)] - **build**: do not rely on gn_helpers in GN build (Cheng Zhao) [#51439](https://github.com/nodejs/node/pull/51439) +- \[[`9be6b7ccf0`](https://github.com/nodejs/node/commit/9be6b7ccf0)] - **build**: fix warning in cares under GN build (Cheng Zhao) [#51687](https://github.com/nodejs/node/pull/51687) +- \[[`d1a8c2e989`](https://github.com/nodejs/node/commit/d1a8c2e989)] - **build**: fix building js2c with GN (Cheng Zhao) [#51818](https://github.com/nodejs/node/pull/51818) +- \[[`9840715dc0`](https://github.com/nodejs/node/commit/9840715dc0)] - **build**: encode non-ASCII Latin1 characters as one byte in JS2C (Joyee Cheung) [#51605](https://github.com/nodejs/node/pull/51605) +- \[[`8ae0eeb7f4`](https://github.com/nodejs/node/commit/8ae0eeb7f4)] - **(SEMVER-MINOR)** **build**: build opt to set local location of headers (Michael Dawson) [#51525](https://github.com/nodejs/node/pull/51525) +- \[[`1999719877`](https://github.com/nodejs/node/commit/1999719877)] - **build**: use macOS m1 machines for testing (Yagiz Nizipli) [#51620](https://github.com/nodejs/node/pull/51620) +- \[[`85f63f3d7d`](https://github.com/nodejs/node/commit/85f63f3d7d)] - **build**: check before removing %config% link (liudonghua) [#51437](https://github.com/nodejs/node/pull/51437) +- \[[`cc37959232`](https://github.com/nodejs/node/commit/cc37959232)] - **build**: increase parallel executions in github (Yagiz Nizipli) [#51554](https://github.com/nodejs/node/pull/51554) +- \[[`2921d55121`](https://github.com/nodejs/node/commit/2921d55121)] - **build**: remove copyright header in node.gni (Cheng Zhao) [#51535](https://github.com/nodejs/node/pull/51535) +- \[[`9da0926396`](https://github.com/nodejs/node/commit/9da0926396)] - **build**: update GN build files for ngtcp2 (Cheng Zhao) [#51313](https://github.com/nodejs/node/pull/51313) +- \[[`59117317f3`](https://github.com/nodejs/node/commit/59117317f3)] - **build,tools**: make addons tests work with GN (Cheng Zhao) [#50737](https://github.com/nodejs/node/pull/50737) +- \[[`78c226281c`](https://github.com/nodejs/node/commit/78c226281c)] - **(SEMVER-MINOR)** **crypto**: implement crypto.hash() (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`496776cc78`](https://github.com/nodejs/node/commit/496776cc78)] - **crypto**: update root certificates to NSS 3.98 (Node.js GitHub Bot) [#51794](https://github.com/nodejs/node/pull/51794) +- \[[`17c554f1ca`](https://github.com/nodejs/node/commit/17c554f1ca)] - **crypto**: use EVP_MD_fetch and cache EVP_MD for hashes (Joyee Cheung) [#51034](https://github.com/nodejs/node/pull/51034) +- \[[`014cc53541`](https://github.com/nodejs/node/commit/014cc53541)] - **deps**: upgrade npm to 10.5.0 (npm team) [#51913](https://github.com/nodejs/node/pull/51913) +- \[[`4ebb944800`](https://github.com/nodejs/node/commit/4ebb944800)] - **deps**: update undici to 6.6.2 (Michaël Zasso) [#51667](https://github.com/nodejs/node/pull/51667) +- \[[`3b29dff0ed`](https://github.com/nodejs/node/commit/3b29dff0ed)] - **deps**: update ngtcp2 to 1.3.0 (Node.js GitHub Bot) [#51796](https://github.com/nodejs/node/pull/51796) +- \[[`28c0ffb363`](https://github.com/nodejs/node/commit/28c0ffb363)] - **deps**: update simdjson to 3.7.0 (Daniel Lemire) [#51859](https://github.com/nodejs/node/pull/51859) +- \[[`58b1403693`](https://github.com/nodejs/node/commit/58b1403693)] - **deps**: update corepack to 0.25.2 (Node.js GitHub Bot) [#51810](https://github.com/nodejs/node/pull/51810) +- \[[`c7083720cc`](https://github.com/nodejs/node/commit/c7083720cc)] - **deps**: update c-ares to 1.27.0 (Node.js GitHub Bot) [#51846](https://github.com/nodejs/node/pull/51846) +- \[[`6d2699d40b`](https://github.com/nodejs/node/commit/6d2699d40b)] - **deps**: update timezone to 2024a (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`8d2222714d`](https://github.com/nodejs/node/commit/8d2222714d)] - **deps**: update icu to 74.2 (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`c3dbd7cccd`](https://github.com/nodejs/node/commit/c3dbd7cccd)] - **deps**: update c-ares to 1.26.0 (Node.js GitHub Bot) [#51582](https://github.com/nodejs/node/pull/51582) +- \[[`dfc3811056`](https://github.com/nodejs/node/commit/dfc3811056)] - **deps**: update googletest to 6a59382 (Node.js GitHub Bot) [#51580](https://github.com/nodejs/node/pull/51580) +- \[[`8235c2676e`](https://github.com/nodejs/node/commit/8235c2676e)] - **deps**: update nghttp2 to 1.59.0 (Node.js GitHub Bot) [#51581](https://github.com/nodejs/node/pull/51581) +- \[[`2ad665e24f`](https://github.com/nodejs/node/commit/2ad665e24f)] - **deps**: V8: cherry-pick efb1133eb894 (Joyee Cheung) [#51551](https://github.com/nodejs/node/pull/51551) +- \[[`e5db8d416f`](https://github.com/nodejs/node/commit/e5db8d416f)] - **deps**: update corepack to 0.24.1 (Node.js GitHub Bot) [#51459](https://github.com/nodejs/node/pull/51459) +- \[[`fe597de72e`](https://github.com/nodejs/node/commit/fe597de72e)] - **deps**: update ada to 2.7.6 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`5aca6f54f9`](https://github.com/nodejs/node/commit/5aca6f54f9)] - **deps**: update ada to 2.7.5 (Node.js GitHub Bot) [#51542](https://github.com/nodejs/node/pull/51542) +- \[[`8f63f6ff57`](https://github.com/nodejs/node/commit/8f63f6ff57)] - **deps**: update ngtcp2 to 1.2.0 (Node.js GitHub Bot) [#51584](https://github.com/nodejs/node/pull/51584) +- \[[`a04aa36ce8`](https://github.com/nodejs/node/commit/a04aa36ce8)] - **deps**: update googletest to 7c07a86 (Node.js GitHub Bot) [#51458](https://github.com/nodejs/node/pull/51458) +- \[[`4b1d25b68d`](https://github.com/nodejs/node/commit/4b1d25b68d)] - **deps**: update ngtcp2 to 1.1.0 (Node.js GitHub Bot) [#51319](https://github.com/nodejs/node/pull/51319) +- \[[`682f4f67b0`](https://github.com/nodejs/node/commit/682f4f67b0)] - **deps**: update acorn-walk to 8.3.2 (Node.js GitHub Bot) [#51457](https://github.com/nodejs/node/pull/51457) +- \[[`365a9dc2cb`](https://github.com/nodejs/node/commit/365a9dc2cb)] - **deps**: update timezone to 2023d (Node.js GitHub Bot) [#51461](https://github.com/nodejs/node/pull/51461) +- \[[`40e8b362a2`](https://github.com/nodejs/node/commit/40e8b362a2)] - **deps**: update base64 to 0.5.2 (Node.js GitHub Bot) [#51455](https://github.com/nodejs/node/pull/51455) +- \[[`139a626264`](https://github.com/nodejs/node/commit/139a626264)] - **deps**: compile c-ares with C11 support (Michaël Zasso) [#51410](https://github.com/nodejs/node/pull/51410) +- \[[`1cc37c4355`](https://github.com/nodejs/node/commit/1cc37c4355)] - **deps**: upgrade npm to 10.3.0 (npm team) [#51431](https://github.com/nodejs/node/pull/51431) +- \[[`942e10f5b5`](https://github.com/nodejs/node/commit/942e10f5b5)] - **deps**: update c-ares to 1.25.0 (Node.js GitHub Bot) [#51385](https://github.com/nodejs/node/pull/51385) +- \[[`17cb4af5a9`](https://github.com/nodejs/node/commit/17cb4af5a9)] - **deps**: update uvwasi to 0.0.20 and fixup tests (Michael Dawson) [#51355](https://github.com/nodejs/node/pull/51355) +- \[[`76582e434c`](https://github.com/nodejs/node/commit/76582e434c)] - **deps**: add nghttp3/\*\*/.deps to .gitignore (Luigi Pinca) [#51400](https://github.com/nodejs/node/pull/51400) +- \[[`4a889e8ea3`](https://github.com/nodejs/node/commit/4a889e8ea3)] - **doc**: add stability index to crypto.hash() (Joyee Cheung) [#51978](https://github.com/nodejs/node/pull/51978) +- \[[`3fdaeba9e6`](https://github.com/nodejs/node/commit/3fdaeba9e6)] - **doc**: remove redundant backquote which breaks sentence (JounQin) [#51904](https://github.com/nodejs/node/pull/51904) +- \[[`58747734a2`](https://github.com/nodejs/node/commit/58747734a2)] - **doc**: update node-api/node-addon-api team link to sharing project news (Ulises Gascón) [#51877](https://github.com/nodejs/node/pull/51877) +- \[[`2cdfe35437`](https://github.com/nodejs/node/commit/2cdfe35437)] - **doc**: add website team to sharing project news (Ulises Gascón) [#49002](https://github.com/nodejs/node/pull/49002) +- \[[`db30428f06`](https://github.com/nodejs/node/commit/db30428f06)] - **doc**: update guide link for Event Loop (Shrujal Shah) [#51874](https://github.com/nodejs/node/pull/51874) +- \[[`a5a17a18e3`](https://github.com/nodejs/node/commit/a5a17a18e3)] - **doc**: change `ExperimentalWarnings` to `ExperimentalWarning` (Ameet Kaustav) [#51741](https://github.com/nodejs/node/pull/51741) +- \[[`32d92aca1f`](https://github.com/nodejs/node/commit/32d92aca1f)] - **doc**: add Paolo to TSC members (Michael Dawson) [#51825](https://github.com/nodejs/node/pull/51825) +- \[[`2de1e85268`](https://github.com/nodejs/node/commit/2de1e85268)] - **doc**: reserve 123 for Electron 30 (Keeley Hammond) [#51803](https://github.com/nodejs/node/pull/51803) +- \[[`ad8cefcbf1`](https://github.com/nodejs/node/commit/ad8cefcbf1)] - **doc**: add mention to GPG_TTY (Rafael Gonzaga) [#51806](https://github.com/nodejs/node/pull/51806) +- \[[`a8c9e6f7e9`](https://github.com/nodejs/node/commit/a8c9e6f7e9)] - **doc**: add zcbenz to collaborators (Cheng Zhao) [#51812](https://github.com/nodejs/node/pull/51812) +- \[[`4e0c79bea9`](https://github.com/nodejs/node/commit/4e0c79bea9)] - **doc**: add entry to stewards (Rafael Gonzaga) [#51760](https://github.com/nodejs/node/pull/51760) +- \[[`7fa30812ea`](https://github.com/nodejs/node/commit/7fa30812ea)] - **doc**: update technical priorities for 2023 (Jean Burellier) [#47523](https://github.com/nodejs/node/pull/47523) +- \[[`af6b5b1722`](https://github.com/nodejs/node/commit/af6b5b1722)] - **doc**: mark isWebAssemblyCompiledModule eol (Marco Ippolito) [#51442](https://github.com/nodejs/node/pull/51442) +- \[[`a62f69ecad`](https://github.com/nodejs/node/commit/a62f69ecad)] - **doc**: fix `globals.md` introduction (Antoine du Hamel) [#51742](https://github.com/nodejs/node/pull/51742) +- \[[`519dc8aad6`](https://github.com/nodejs/node/commit/519dc8aad6)] - **doc**: updates for better json generating (Dmitry Semigradsky) [#51592](https://github.com/nodejs/node/pull/51592) +- \[[`1b45ca4e38`](https://github.com/nodejs/node/commit/1b45ca4e38)] - **doc**: document the GN build (Cheng Zhao) [#51676](https://github.com/nodejs/node/pull/51676) +- \[[`37182c4c1f`](https://github.com/nodejs/node/commit/37182c4c1f)] - **doc**: fix uncaught exception example (Gabriel Schulhof) [#51638](https://github.com/nodejs/node/pull/51638) +- \[[`c9be260b7d`](https://github.com/nodejs/node/commit/c9be260b7d)] - **doc**: clarify execution of `after` hook on test suite completion (Ognjen Jevremović) [#51523](https://github.com/nodejs/node/pull/51523) +- \[[`8c0a257021`](https://github.com/nodejs/node/commit/8c0a257021)] - **doc**: fix `dns.lookup` and `dnsPromises.lookup` description (Duncan Chiu) [#51517](https://github.com/nodejs/node/pull/51517) +- \[[`177e13cb0d`](https://github.com/nodejs/node/commit/177e13cb0d)] - **doc**: note that path.normalize deviates from POSIX (Tobias Nießen) [#51513](https://github.com/nodejs/node/pull/51513) +- \[[`adbf2d3837`](https://github.com/nodejs/node/commit/adbf2d3837)] - **doc**: add lemire to collaborators (Daniel Lemire) [#51572](https://github.com/nodejs/node/pull/51572) +- \[[`fd2a3cef57`](https://github.com/nodejs/node/commit/fd2a3cef57)] - **doc**: fix historical experimental fetch flag (Kenrick) [#51506](https://github.com/nodejs/node/pull/51506) +- \[[`1d40a0067a`](https://github.com/nodejs/node/commit/1d40a0067a)] - **doc**: fix type of connectionAttempt parameter (Rafael Gonzaga) [#51490](https://github.com/nodejs/node/pull/51490) +- \[[`d3b78051ce`](https://github.com/nodejs/node/commit/d3b78051ce)] - **doc**: remove reference to resolved child_process v8 issue (Ian Kerins) [#51467](https://github.com/nodejs/node/pull/51467) +- \[[`2bf371886a`](https://github.com/nodejs/node/commit/2bf371886a)] - **doc**: update typos (Aranđel Šarenac) [#51475](https://github.com/nodejs/node/pull/51475) +- \[[`10f95283c6`](https://github.com/nodejs/node/commit/10f95283c6)] - **doc**: add notes on inspector breakpoints (Chengzhong Wu) [#51417](https://github.com/nodejs/node/pull/51417) +- \[[`4ea194ab33`](https://github.com/nodejs/node/commit/4ea194ab33)] - **doc**: add links in `offboarding.md` (Antoine du Hamel) [#51440](https://github.com/nodejs/node/pull/51440) +- \[[`fc5629616b`](https://github.com/nodejs/node/commit/fc5629616b)] - **doc**: fix spelling mistake (u9g) [#51454](https://github.com/nodejs/node/pull/51454) +- \[[`70e88cf159`](https://github.com/nodejs/node/commit/70e88cf159)] - **doc**: add check for security reverts (Michael Dawson) [#51376](https://github.com/nodejs/node/pull/51376) +- \[[`74d4e382a7`](https://github.com/nodejs/node/commit/74d4e382a7)] - **doc**: fix some policy scope typos (Tim Kuijsten) [#51234](https://github.com/nodejs/node/pull/51234) +- \[[`d7658ca6a2`](https://github.com/nodejs/node/commit/d7658ca6a2)] - **doc**: improve subtests documentation (Marco Ippolito) [#51379](https://github.com/nodejs/node/pull/51379) +- \[[`c18a813638`](https://github.com/nodejs/node/commit/c18a813638)] - **doc**: add missing word in `child_process.md` (Joseph Joy) [#50370](https://github.com/nodejs/node/pull/50370) +- \[[`fabd5c4b21`](https://github.com/nodejs/node/commit/fabd5c4b21)] - **doc**: fixup alignment of warning subsection (James M Snell) [#51374](https://github.com/nodejs/node/pull/51374) +- \[[`80c750c8c1`](https://github.com/nodejs/node/commit/80c750c8c1)] - **doc,crypto**: further clarify RSA_PKCS1_PADDING support (Tobias Nießen) [#51799](https://github.com/nodejs/node/pull/51799) +- \[[`b53919d988`](https://github.com/nodejs/node/commit/b53919d988)] - **doc,crypto**: add changelog and note about disabled RSA_PKCS1_PADDING (Filip Skokan) [#51782](https://github.com/nodejs/node/pull/51782) +- \[[`08832e76d3`](https://github.com/nodejs/node/commit/08832e76d3)] - **esm**: improve error when calling `import.meta.resolve` from `data:` URL (Antoine du Hamel) [#49516](https://github.com/nodejs/node/pull/49516) +- \[[`78f818069a`](https://github.com/nodejs/node/commit/78f818069a)] - **events**: no stopPropagation call in cancelBubble (mert.altin) [#50405](https://github.com/nodejs/node/pull/50405) +- \[[`f130a33438`](https://github.com/nodejs/node/commit/f130a33438)] - _**Revert**_ "**fs**: remove workaround for `esm` package" (Jeremy Meng) [#50907](https://github.com/nodejs/node/pull/50907) +- \[[`5a8af3d362`](https://github.com/nodejs/node/commit/5a8af3d362)] - **fs**: load rimraf lazily in fs/promises (Joyee Cheung) [#51617](https://github.com/nodejs/node/pull/51617) +- \[[`15a7f2103b`](https://github.com/nodejs/node/commit/15a7f2103b)] - **fs**: remove race condition for recursive watch on Linux (Matteo Collina) [#51406](https://github.com/nodejs/node/pull/51406) +- \[[`d8bb4b2c1e`](https://github.com/nodejs/node/commit/d8bb4b2c1e)] - **fs**: update jsdoc for `filehandle.createWriteStream` and `appendFile` (Jungku Lee) [#51494](https://github.com/nodejs/node/pull/51494) +- \[[`e8fffebdd3`](https://github.com/nodejs/node/commit/e8fffebdd3)] - **fs,test**: add URL to string to fs.watch (Rafael Gonzaga) [#51346](https://github.com/nodejs/node/pull/51346) +- \[[`ec17fd73cc`](https://github.com/nodejs/node/commit/ec17fd73cc)] - **http**: fix `close` return value mismatch between doc and implementation (kylo5aby) [#51797](https://github.com/nodejs/node/pull/51797) +- \[[`b8e7a87aa9`](https://github.com/nodejs/node/commit/b8e7a87aa9)] - **http**: split set-cookie when using setHeaders (Marco Ippolito) [#51649](https://github.com/nodejs/node/pull/51649) +- \[[`682951af60`](https://github.com/nodejs/node/commit/682951af60)] - **http2**: close idle connections when allowHTTP1 is true (xsbchen) [#51569](https://github.com/nodejs/node/pull/51569) +- \[[`4b1c6839f4`](https://github.com/nodejs/node/commit/4b1c6839f4)] - **(SEMVER-MINOR)** **http2**: add h2 compat support for appendHeader (Tim Perry) [#51412](https://github.com/nodejs/node/pull/51412) +- \[[`d8aa2bac0b`](https://github.com/nodejs/node/commit/d8aa2bac0b)] - **(SEMVER-MINOR)** **http2**: add server handshake utility (snek) [#51172](https://github.com/nodejs/node/pull/51172) +- \[[`b9275d9039`](https://github.com/nodejs/node/commit/b9275d9039)] - **(SEMVER-MINOR)** **http2**: receive customsettings (Marten Richter) [#51323](https://github.com/nodejs/node/pull/51323) +- \[[`58e2015a03`](https://github.com/nodejs/node/commit/58e2015a03)] - **inspector**: add NodeRuntime.waitingForDebugger event (mary marchini) [#51560](https://github.com/nodejs/node/pull/51560) +- \[[`af32d433ee`](https://github.com/nodejs/node/commit/af32d433ee)] - **lib**: account for cwd access from snapshot serialization cb (Anna Henningsen) [#51901](https://github.com/nodejs/node/pull/51901) +- \[[`1edbc7d353`](https://github.com/nodejs/node/commit/1edbc7d353)] - **lib**: fix http client socket path (theanarkh) [#51900](https://github.com/nodejs/node/pull/51900) +- \[[`4dfc9e092e`](https://github.com/nodejs/node/commit/4dfc9e092e)] - **lib**: only build the ESM facade for builtins when they are needed (Joyee Cheung) [#51669](https://github.com/nodejs/node/pull/51669) +- \[[`5a2d2daad5`](https://github.com/nodejs/node/commit/5a2d2daad5)] - **(SEMVER-MINOR)** **lib**: move encodingsMap to internal/util (Joyee Cheung) [#51044](https://github.com/nodejs/node/pull/51044) +- \[[`eb1089ab17`](https://github.com/nodejs/node/commit/eb1089ab17)] - **lib**: do not access process.noDeprecation at build time (Joyee Cheung) [#51447](https://github.com/nodejs/node/pull/51447) +- \[[`614ca327c8`](https://github.com/nodejs/node/commit/614ca327c8)] - **lib**: add assertion for user ESM execution (Joyee Cheung) [#51748](https://github.com/nodejs/node/pull/51748) +- \[[`77ae03f723`](https://github.com/nodejs/node/commit/77ae03f723)] - **lib**: create global console properties at snapshot build time (Joyee Cheung) [#51700](https://github.com/nodejs/node/pull/51700) +- \[[`7f698f064e`](https://github.com/nodejs/node/commit/7f698f064e)] - **lib**: define FormData and fetch etc. in the built-in snapshot (Joyee Cheung) [#51598](https://github.com/nodejs/node/pull/51598) +- \[[`4b583bfcc5`](https://github.com/nodejs/node/commit/4b583bfcc5)] - **lib**: allow checking the test result from afterEach (Tim Stableford) [#51485](https://github.com/nodejs/node/pull/51485) +- \[[`ec60639cc0`](https://github.com/nodejs/node/commit/ec60639cc0)] - **lib**: remove unnecessary refreshHrtimeBuffer() (Joyee Cheung) [#51446](https://github.com/nodejs/node/pull/51446) +- \[[`8dc3f91eb4`](https://github.com/nodejs/node/commit/8dc3f91eb4)] - **lib,src**: extract sourceMappingURL from module (unbyte) [#51690](https://github.com/nodejs/node/pull/51690) +- \[[`84c71fa895`](https://github.com/nodejs/node/commit/84c71fa895)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51726](https://github.com/nodejs/node/pull/51726) +- \[[`e5c52a2a6b`](https://github.com/nodejs/node/commit/e5c52a2a6b)] - **meta**: bump codecov/codecov-action from 3.1.4 to 4.0.1 (dependabot\[bot]) [#51648](https://github.com/nodejs/node/pull/51648) +- \[[`16aa6e5341`](https://github.com/nodejs/node/commit/16aa6e5341)] - **meta**: bump actions/download-artifact from 4.1.0 to 4.1.1 (dependabot\[bot]) [#51644](https://github.com/nodejs/node/pull/51644) +- \[[`97825603ae`](https://github.com/nodejs/node/commit/97825603ae)] - **meta**: bump actions/upload-artifact from 4.0.0 to 4.3.0 (dependabot\[bot]) [#51643](https://github.com/nodejs/node/pull/51643) +- \[[`51f0d80876`](https://github.com/nodejs/node/commit/51f0d80876)] - **meta**: bump step-security/harden-runner from 2.6.1 to 2.7.0 (dependabot\[bot]) [#51641](https://github.com/nodejs/node/pull/51641) +- \[[`97e3cb5844`](https://github.com/nodejs/node/commit/97e3cb5844)] - **meta**: bump actions/cache from 3.3.2 to 4.0.0 (dependabot\[bot]) [#51640](https://github.com/nodejs/node/pull/51640) +- \[[`dcf5f28d68`](https://github.com/nodejs/node/commit/dcf5f28d68)] - **meta**: bump github/codeql-action from 3.22.12 to 3.23.2 (dependabot\[bot]) [#51639](https://github.com/nodejs/node/pull/51639) +- \[[`c4a28b2211`](https://github.com/nodejs/node/commit/c4a28b2211)] - **meta**: add .mailmap entry for lemire (Daniel Lemire) [#51600](https://github.com/nodejs/node/pull/51600) +- \[[`dbf44744ba`](https://github.com/nodejs/node/commit/dbf44744ba)] - **meta**: mark security-wg codeowner for deps folder (Marco Ippolito) [#51529](https://github.com/nodejs/node/pull/51529) +- \[[`16fea71d08`](https://github.com/nodejs/node/commit/16fea71d08)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51468](https://github.com/nodejs/node/pull/51468) +- \[[`015c4dcacf`](https://github.com/nodejs/node/commit/015c4dcacf)] - **meta**: move RaisinTen to emeritus and remove from strategic initiatives (Darshan Sen) [#51411](https://github.com/nodejs/node/pull/51411) +- \[[`e942dc1d0c`](https://github.com/nodejs/node/commit/e942dc1d0c)] - **meta**: add .temp and .lock tags to ignore (Rafael Gonzaga) [#51343](https://github.com/nodejs/node/pull/51343) +- \[[`595542e330`](https://github.com/nodejs/node/commit/595542e330)] - **meta**: bump actions/setup-python from 4.7.1 to 5.0.0 (dependabot\[bot]) [#51335](https://github.com/nodejs/node/pull/51335) +- \[[`6c3ba73d03`](https://github.com/nodejs/node/commit/6c3ba73d03)] - **meta**: bump actions/setup-node from 4.0.0 to 4.0.1 (dependabot\[bot]) [#51334](https://github.com/nodejs/node/pull/51334) +- \[[`e4f9f0a260`](https://github.com/nodejs/node/commit/e4f9f0a260)] - **meta**: bump github/codeql-action from 2.22.8 to 3.22.12 (dependabot\[bot]) [#51333](https://github.com/nodejs/node/pull/51333) +- \[[`77598c3a8e`](https://github.com/nodejs/node/commit/77598c3a8e)] - **meta**: bump actions/stale from 8.0.0 to 9.0.0 (dependabot\[bot]) [#51332](https://github.com/nodejs/node/pull/51332) +- \[[`22a11c32c0`](https://github.com/nodejs/node/commit/22a11c32c0)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#51329](https://github.com/nodejs/node/pull/51329) +- \[[`391aeb1996`](https://github.com/nodejs/node/commit/391aeb1996)] - **module**: fix crash when built-in module export a `default` key (Antoine du Hamel) [#51481](https://github.com/nodejs/node/pull/51481) +- \[[`615b0ae307`](https://github.com/nodejs/node/commit/615b0ae307)] - **module**: fix `--preserve-symlinks-main` (per4uk) [#51312](https://github.com/nodejs/node/pull/51312) +- \[[`c6cc3ed3b4`](https://github.com/nodejs/node/commit/c6cc3ed3b4)] - **net**: fix connect crash when call destroy in lookup handler (theanarkh) [#51826](https://github.com/nodejs/node/pull/51826) +- \[[`63e0ceb48f`](https://github.com/nodejs/node/commit/63e0ceb48f)] - **net**: fix example IPv4 in dns docs (Aras Abbasi) [#51377](https://github.com/nodejs/node/pull/51377) +- \[[`bc6f33d8d1`](https://github.com/nodejs/node/commit/bc6f33d8d1)] - **node-api**: make napi_get_buffer_info check if passed buffer is valid (Janrupf) [#51571](https://github.com/nodejs/node/pull/51571) +- \[[`5b94ff44ec`](https://github.com/nodejs/node/commit/5b94ff44ec)] - **node-api**: move NAPI_EXPERIMENTAL definition to gyp file (Gabriel Schulhof) [#51254](https://github.com/nodejs/node/pull/51254) +- \[[`66c11f31c3`](https://github.com/nodejs/node/commit/66c11f31c3)] - **node-api**: optimize napi_set_property for perf (Mert Can Altın) [#50282](https://github.com/nodejs/node/pull/50282) +- \[[`cb621863c6`](https://github.com/nodejs/node/commit/cb621863c6)] - **perf_hooks**: performance milestone time origin timestamp improvement (IlyasShabi) [#51713](https://github.com/nodejs/node/pull/51713) +- \[[`4d06d80675`](https://github.com/nodejs/node/commit/4d06d80675)] - **quic**: various additional cleanups, fixes in Endpoint (James M Snell) [#51310](https://github.com/nodejs/node/pull/51310) +- \[[`3e579ab2fd`](https://github.com/nodejs/node/commit/3e579ab2fd)] - **repl**: fix `NO_COLORS` env var is ignored (Moshe Atlow) [#51568](https://github.com/nodejs/node/pull/51568) +- \[[`7ceb6d6700`](https://github.com/nodejs/node/commit/7ceb6d6700)] - **sea**: update stability index (Joyee Cheung) [#51774](https://github.com/nodejs/node/pull/51774) +- \[[`e8d9065262`](https://github.com/nodejs/node/commit/e8d9065262)] - **(SEMVER-MINOR)** **sea**: support sea.getRawAsset() (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`cea5295c16`](https://github.com/nodejs/node/commit/cea5295c16)] - **(SEMVER-MINOR)** **sea**: support embedding assets (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`7543e774bd`](https://github.com/nodejs/node/commit/7543e774bd)] - **src**: simplify direct queries of env vars in C++ land (Joyee Cheung) [#51829](https://github.com/nodejs/node/pull/51829) +- \[[`8f10543c58`](https://github.com/nodejs/node/commit/8f10543c58)] - **src**: stop the profiler and the inspector before snapshot serialization (Joyee Cheung) [#51815](https://github.com/nodejs/node/pull/51815) +- \[[`ccc76bbfd7`](https://github.com/nodejs/node/commit/ccc76bbfd7)] - **src**: simplify embedder entry point execution (Joyee Cheung) [#51557](https://github.com/nodejs/node/pull/51557) +- \[[`0c41210865`](https://github.com/nodejs/node/commit/0c41210865)] - **src**: compile code eagerly in snapshot builder (Joyee Cheung) [#51672](https://github.com/nodejs/node/pull/51672) +- \[[`2a46dc7b86`](https://github.com/nodejs/node/commit/2a46dc7b86)] - **src**: check empty before accessing string (Cheng Zhao) [#51665](https://github.com/nodejs/node/pull/51665) +- \[[`47186fbad5`](https://github.com/nodejs/node/commit/47186fbad5)] - **(SEMVER-MINOR)** **src**: print string content better in BlobDeserializer (Joyee Cheung) [#50960](https://github.com/nodejs/node/pull/50960) +- \[[`6603d32ce3`](https://github.com/nodejs/node/commit/6603d32ce3)] - **src**: fix vm bug for configurable globalThis (F. Hinkelmann) [#51602](https://github.com/nodejs/node/pull/51602) +- \[[`c7912c3d5a`](https://github.com/nodejs/node/commit/c7912c3d5a)] - **(SEMVER-MINOR)** **src**: support multi-line values for .env file (IlyasShabi) [#51289](https://github.com/nodejs/node/pull/51289) +- \[[`b8ae5c27c6`](https://github.com/nodejs/node/commit/b8ae5c27c6)] - **(SEMVER-MINOR)** **src**: add `process.loadEnvFile` and `util.parseEnv` (Yagiz Nizipli) [#51476](https://github.com/nodejs/node/pull/51476) +- \[[`e3a63843f2`](https://github.com/nodejs/node/commit/e3a63843f2)] - **src**: terminate correctly double-quote in env variable (Marco Ippolito) [#51510](https://github.com/nodejs/node/pull/51510) +- \[[`119e045053`](https://github.com/nodejs/node/commit/119e045053)] - **(SEMVER-MINOR)** **src**: do not coerce dotenv paths (Tobias Nießen) [#51425](https://github.com/nodejs/node/pull/51425) +- \[[`b271cc5b16`](https://github.com/nodejs/node/commit/b271cc5b16)] - **src**: refactor `GetCreationContext` calls (Jungku Lee) [#51367](https://github.com/nodejs/node/pull/51367) +- \[[`36e42aa570`](https://github.com/nodejs/node/commit/36e42aa570)] - **src**: do not read string out of bounds (Cheng Zhao) [#51358](https://github.com/nodejs/node/pull/51358) +- \[[`8ea7d79082`](https://github.com/nodejs/node/commit/8ea7d79082)] - **src**: avoid shadowed string in fs_permission (Shelley Vohr) [#51123](https://github.com/nodejs/node/pull/51123) +- \[[`5b06af7814`](https://github.com/nodejs/node/commit/5b06af7814)] - **stream**: fix eventNames() to not return not defined events (IlyasShabi) [#51331](https://github.com/nodejs/node/pull/51331) +- \[[`438b7fd049`](https://github.com/nodejs/node/commit/438b7fd049)] - **stream**: fix cloned webstreams not being unref correctly (tsctx) [#51526](https://github.com/nodejs/node/pull/51526) +- \[[`9ab353af00`](https://github.com/nodejs/node/commit/9ab353af00)] - **(SEMVER-MINOR)** **stream**: implement `min` option for `ReadableStreamBYOBReader.read` (Mattias Buelens) [#50888](https://github.com/nodejs/node/pull/50888) +- \[[`17ab5ae570`](https://github.com/nodejs/node/commit/17ab5ae570)] - **test**: fix unreliable assumption in js-native-api/test_cannot_run_js (Joyee Cheung) [#51898](https://github.com/nodejs/node/pull/51898) +- \[[`e2c51385c7`](https://github.com/nodejs/node/commit/e2c51385c7)] - **test**: test surrogate pair filenames on windows (Mert Can Altın) [#51800](https://github.com/nodejs/node/pull/51800) +- \[[`049e5f5e8c`](https://github.com/nodejs/node/commit/049e5f5e8c)] - **test**: deflake test-http2-large-write-multiple-requests (Joyee Cheung) [#51863](https://github.com/nodejs/node/pull/51863) +- \[[`2bf03ee678`](https://github.com/nodejs/node/commit/2bf03ee678)] - **test**: fix test-debugger-profile for coverage generation (Joyee Cheung) [#51816](https://github.com/nodejs/node/pull/51816) +- \[[`d47a95f3b1`](https://github.com/nodejs/node/commit/d47a95f3b1)] - **test**: fix test-bootstrap-modules for coverage generation (Joyee Cheung) [#51816](https://github.com/nodejs/node/pull/51816) +- \[[`c0918f082f`](https://github.com/nodejs/node/commit/c0918f082f)] - **test**: ensure delay in recursive fs watch tests (Joyee Cheung) [#51842](https://github.com/nodejs/node/pull/51842) +- \[[`1f6551dda2`](https://github.com/nodejs/node/commit/1f6551dda2)] - **test**: fix test-child-process-fork-net (Joyee Cheung) [#51841](https://github.com/nodejs/node/pull/51841) +- \[[`f845a16c58`](https://github.com/nodejs/node/commit/f845a16c58)] - **test**: split wasi tests (Joyee Cheung) [#51836](https://github.com/nodejs/node/pull/51836) +- \[[`275cea0fdb`](https://github.com/nodejs/node/commit/275cea0fdb)] - **test**: mark test-wasi as flaky on Windows on ARM (Joyee Cheung) [#51834](https://github.com/nodejs/node/pull/51834) +- \[[`2fb620cd00`](https://github.com/nodejs/node/commit/2fb620cd00)] - **test**: remove test-fs-stat-bigint flaky designation (Luigi Pinca) [#51735](https://github.com/nodejs/node/pull/51735) +- \[[`b046712e86`](https://github.com/nodejs/node/commit/b046712e86)] - **test**: skip test-http-correct-hostname on loong64 (Shi Pujin) [#51663](https://github.com/nodejs/node/pull/51663) +- \[[`83f581d4c1`](https://github.com/nodejs/node/commit/83f581d4c1)] - **test**: increase platform timeout zlib-brotli-16gb (Rafael Gonzaga) [#51792](https://github.com/nodejs/node/pull/51792) +- \[[`ea08350c83`](https://github.com/nodejs/node/commit/ea08350c83)] - **test**: remove test-cli-node-options flaky designation (Luigi Pinca) [#51716](https://github.com/nodejs/node/pull/51716) +- \[[`9d3a014f67`](https://github.com/nodejs/node/commit/9d3a014f67)] - **test**: remove test-domain-error-types flaky designation (Luigi Pinca) [#51717](https://github.com/nodejs/node/pull/51717) +- \[[`d7563a5448`](https://github.com/nodejs/node/commit/d7563a5448)] - **test**: fix `internet/test-inspector-help-page` (Richard Lau) [#51693](https://github.com/nodejs/node/pull/51693) +- \[[`e9299255ca`](https://github.com/nodejs/node/commit/e9299255ca)] - **test**: remove duplicate entry for flaky test (Luigi Pinca) [#51654](https://github.com/nodejs/node/pull/51654) +- \[[`a8ac337250`](https://github.com/nodejs/node/commit/a8ac337250)] - **test**: remove test-crypto-keygen flaky designation (Luigi Pinca) [#51567](https://github.com/nodejs/node/pull/51567) +- \[[`c820166e4b`](https://github.com/nodejs/node/commit/c820166e4b)] - **test**: remove test-fs-rmdir-recursive flaky designation (Luigi Pinca) [#51566](https://github.com/nodejs/node/pull/51566) +- \[[`db88bf185f`](https://github.com/nodejs/node/commit/db88bf185f)] - **test**: remove common.expectsError calls for asserts (Paulo Chaves) [#51504](https://github.com/nodejs/node/pull/51504) +- \[[`fc0c1309b2`](https://github.com/nodejs/node/commit/fc0c1309b2)] - **test**: mark test-http2-large-file as flaky (Michaël Zasso) [#51549](https://github.com/nodejs/node/pull/51549) +- \[[`c88f0b6db9`](https://github.com/nodejs/node/commit/c88f0b6db9)] - **test**: use checkIfCollectableByCounting in SourceTextModule leak test (Joyee Cheung) [#51512](https://github.com/nodejs/node/pull/51512) +- \[[`d4d07f4a44`](https://github.com/nodejs/node/commit/d4d07f4a44)] - **test**: remove test-file-write-stream4 flaky designation (Luigi Pinca) [#51472](https://github.com/nodejs/node/pull/51472) +- \[[`7420a7d2f8`](https://github.com/nodejs/node/commit/7420a7d2f8)] - **test**: add URL tests to fs-write (Rafael Gonzaga) [#51352](https://github.com/nodejs/node/pull/51352) +- \[[`28c2bf3e42`](https://github.com/nodejs/node/commit/28c2bf3e42)] - **test**: remove unneeded common.expectsError for asserts (Andrés Morelos) [#51353](https://github.com/nodejs/node/pull/51353) +- \[[`9dfb36fbe5`](https://github.com/nodejs/node/commit/9dfb36fbe5)] - **test,crypto**: update WebCryptoAPI WPT (Filip Skokan) [#51533](https://github.com/nodejs/node/pull/51533) +- \[[`e4d4bc6f9a`](https://github.com/nodejs/node/commit/e4d4bc6f9a)] - **test_runner**: serialize 'expected' and 'actual' in isolation (Malthe Borch) [#51851](https://github.com/nodejs/node/pull/51851) +- \[[`5f9491237c`](https://github.com/nodejs/node/commit/5f9491237c)] - **test_runner**: add ref methods to mocked timers (Marco Ippolito) [#51809](https://github.com/nodejs/node/pull/51809) +- \[[`af5875c6e8`](https://github.com/nodejs/node/commit/af5875c6e8)] - **test_runner**: check if timeout was cleared by own callback (Ben Richeson) [#51673](https://github.com/nodejs/node/pull/51673) +- \[[`e0789fbc8a`](https://github.com/nodejs/node/commit/e0789fbc8a)] - **test_runner**: do not invoke after hook when test is empty (Marco Ippolito) [#51389](https://github.com/nodejs/node/pull/51389) +- \[[`27f8549903`](https://github.com/nodejs/node/commit/27f8549903)] - **tools**: fix installing node with shared mode (Cheng Zhao) [#51910](https://github.com/nodejs/node/pull/51910) +- \[[`71a809bd43`](https://github.com/nodejs/node/commit/71a809bd43)] - **tools**: update eslint to 8.57.0 (Node.js GitHub Bot) [#51867](https://github.com/nodejs/node/pull/51867) +- \[[`20effe638a`](https://github.com/nodejs/node/commit/20effe638a)] - **tools**: update lint-md-dependencies to rollup\@4.12.0 (Node.js GitHub Bot) [#51795](https://github.com/nodejs/node/pull/51795) +- \[[`6c0a3b9c0d`](https://github.com/nodejs/node/commit/6c0a3b9c0d)] - **tools**: update lint-md-dependencies to rollup\@4.12.0 (Node.js GitHub Bot) [#51795](https://github.com/nodejs/node/pull/51795) +- \[[`03f926ddca`](https://github.com/nodejs/node/commit/03f926ddca)] - **tools**: fix missing \[\[fallthrough]] in js2c (Cheng Zhao) [#51845](https://github.com/nodejs/node/pull/51845) +- \[[`b502be1d09`](https://github.com/nodejs/node/commit/b502be1d09)] - **tools**: disable automated libuv updates (Rafael Gonzaga) [#51775](https://github.com/nodejs/node/pull/51775) +- \[[`787fb32557`](https://github.com/nodejs/node/commit/787fb32557)] - **tools**: fix update-icu.sh (Michaël Zasso) [#51723](https://github.com/nodejs/node/pull/51723) +- \[[`ba22c614c1`](https://github.com/nodejs/node/commit/ba22c614c1)] - **tools**: update lint-md-dependencies to rollup\@4.10.0 (Node.js GitHub Bot) [#51720](https://github.com/nodejs/node/pull/51720) +- \[[`751821fa21`](https://github.com/nodejs/node/commit/751821fa21)] - **tools**: update github_reporter to 1.6.0 (Node.js GitHub Bot) [#51658](https://github.com/nodejs/node/pull/51658) +- \[[`5fe493d0e4`](https://github.com/nodejs/node/commit/5fe493d0e4)] - **tools**: run `build-windows` workflow only on source changes (Antoine du Hamel) [#51596](https://github.com/nodejs/node/pull/51596) +- \[[`e1b9655bdc`](https://github.com/nodejs/node/commit/e1b9655bdc)] - **tools**: update lint-md-dependencies to rollup\@4.9.6 (Node.js GitHub Bot) [#51583](https://github.com/nodejs/node/pull/51583) +- \[[`d8e1058f18`](https://github.com/nodejs/node/commit/d8e1058f18)] - **tools**: fix loong64 build (Shi Pujin) [#51401](https://github.com/nodejs/node/pull/51401) +- \[[`e0eeebc960`](https://github.com/nodejs/node/commit/e0eeebc960)] - **tools**: set normalizeTD text default to empty string (Marco Ippolito) [#51543](https://github.com/nodejs/node/pull/51543) +- \[[`81fd7d1ca9`](https://github.com/nodejs/node/commit/81fd7d1ca9)] - **tools**: limit parallelism with ninja in V8 builds (Richard Lau) [#51473](https://github.com/nodejs/node/pull/51473) +- \[[`e88a301e98`](https://github.com/nodejs/node/commit/e88a301e98)] - **tools**: do not pass invalid flag to C compiler (Michaël Zasso) [#51409](https://github.com/nodejs/node/pull/51409) +- \[[`129d3b3293`](https://github.com/nodejs/node/commit/129d3b3293)] - **tools**: update lint-md-dependencies to rollup\@4.9.5 (Node.js GitHub Bot) [#51460](https://github.com/nodejs/node/pull/51460) +- \[[`f3845de204`](https://github.com/nodejs/node/commit/f3845de204)] - **tools**: update inspector_protocol to 83b1154 (Kohei Ueno) [#51309](https://github.com/nodejs/node/pull/51309) +- \[[`58901d08fd`](https://github.com/nodejs/node/commit/58901d08fd)] - **tools**: update github_reporter to 1.5.4 (Node.js GitHub Bot) [#51395](https://github.com/nodejs/node/pull/51395) +- \[[`29492e2c88`](https://github.com/nodejs/node/commit/29492e2c88)] - **tools**: fix version parsing in brotli update script (Richard Lau) [#51373](https://github.com/nodejs/node/pull/51373) +- \[[`17593d95ba`](https://github.com/nodejs/node/commit/17593d95ba)] - **tools**: update lint-md-dependencies to rollup\@4.9.4 (Node.js GitHub Bot) [#51396](https://github.com/nodejs/node/pull/51396) +- \[[`35f33d3a31`](https://github.com/nodejs/node/commit/35f33d3a31)] - **tools**: remove openssl v1 update script (Marco Ippolito) [#51378](https://github.com/nodejs/node/pull/51378) +- \[[`83b3aa838b`](https://github.com/nodejs/node/commit/83b3aa838b)] - **tools**: remove deprecated python api (Alex Yang) [#49731](https://github.com/nodejs/node/pull/49731) +- \[[`adb2c36f0f`](https://github.com/nodejs/node/commit/adb2c36f0f)] - **typings**: lib/internal/vm.js (Geoffrey Booth) [#50112](https://github.com/nodejs/node/pull/50112) +- \[[`407341e25c`](https://github.com/nodejs/node/commit/407341e25c)] - **url**: don't update URL immediately on update to URLSearchParams (Matt Cowley) [#51520](https://github.com/nodejs/node/pull/51520) +- \[[`88e08bbe80`](https://github.com/nodejs/node/commit/88e08bbe80)] - **(SEMVER-MINOR)** **util**: add styleText API to text formatting (Rafael Gonzaga) [#51850](https://github.com/nodejs/node/pull/51850) +- \[[`ba444a949d`](https://github.com/nodejs/node/commit/ba444a949d)] - **vm**: implement isContext() directly in JS land with private symbol (Joyee Cheung) [#51685](https://github.com/nodejs/node/pull/51685) +- \[[`4c508269cd`](https://github.com/nodejs/node/commit/4c508269cd)] - **(SEMVER-MINOR)** **vm**: support using the default loader to handle dynamic import() (Joyee Cheung) [#51244](https://github.com/nodejs/node/pull/51244) + +Windows 32-bit Installer: https://nodejs.org/dist/v21.7.0/node-v21.7.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v21.7.0/node-v21.7.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v21.7.0/node-v21.7.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v21.7.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v21.7.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v21.7.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v21.7.0/node-v21.7.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v21.7.0/node-v21.7.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v21.7.0/node-v21.7.0.tar.gz \ +Other release files: https://nodejs.org/dist/v21.7.0/ \ +Documentation: https://nodejs.org/docs/v21.7.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +c31d5b60c4a284c6855bd468d4aae4436a16b351362b2971d3c0db2a471d3f24 node-v21.7.0-aix-ppc64.tar.gz +7d7dc37aa30b6dbb52d698d01cfed1d99056c82396eadd41a49fc55a873c423d node-v21.7.0-arm64.msi +f48ad51cf3c2814bbf61c8c26efd810e5e22dcac980786fd7ac5b54365233d2c node-v21.7.0-darwin-arm64.tar.gz +0805239d8a7402dae49e0033b7ad8208fed498dbeee9a3194863e52f6f3c6d7f node-v21.7.0-darwin-arm64.tar.xz +3f81adca80b523b413e26f03f855f4a2ae52d9af20f0cda2e259dd26a0608607 node-v21.7.0-darwin-x64.tar.gz +6a755416292854f2be38e74704ccf09edeba247718e9f047f5e1939b0dba17bd node-v21.7.0-darwin-x64.tar.xz +628d9e4f866e3828b77ce812dc99f33d3e7c673d0c499f13eadff6fa6ccb4383 node-v21.7.0-headers.tar.gz +627d6552d2120660a51f74fff0d40573f4a35d8545462250d30592ce0ba4eec7 node-v21.7.0-headers.tar.xz +520a3e5c83a05a782b1f4959f150c2fdc03e2ea056e855ef6bbb74f6ccf7aa7d node-v21.7.0-linux-arm64.tar.gz +73ce1e4e956532e0916fc7014f5b649573bd2b5870fef5cfc26cc42f58358ae7 node-v21.7.0-linux-arm64.tar.xz +723abb32135ad4baa6e9671447a72f5c9a5bfc681fc540b0e4864e965171b6ed node-v21.7.0-linux-armv7l.tar.gz +8a367a3bf667f0bb3abb9e8121326911d47a31886419ad052d5a52d8c6531d9d node-v21.7.0-linux-armv7l.tar.xz +c2290cb35b11ee2b0f0ae34ad3c8372652688ff2dc3d9a89ada46c2b84ea5dda node-v21.7.0-linux-ppc64le.tar.gz +b85348211a4d195de2f850a17cdec77aedc8fc1c402864b2bc3501608e6c9c47 node-v21.7.0-linux-ppc64le.tar.xz +90b8678ed113950613edeae5eaf298cf795c72005fac6ffd9b7fbb90ddd86738 node-v21.7.0-linux-s390x.tar.gz +99a09f4c790f3210a6d26032bf69713ba199cf2e73af43e04b1b1d9bd1c8db76 node-v21.7.0-linux-s390x.tar.xz +0fce039e2b6af00766492127a49f959ae92ed22fede4c49e9a8c2543aadbd6e2 node-v21.7.0-linux-x64.tar.gz +68510c3851133a21c6a6f9940e58c5bc8fed39f1d91a08e34c5070dd0615fef1 node-v21.7.0-linux-x64.tar.xz +d680d5c3d0b2476a97d11b30cbbdaf1d7f92ffd1cc89e5c640782a6b52480666 node-v21.7.0-win-arm64.7z +11b11b9a3f2db7b5076cf16655e05cd63dc3d8843cd4836ecb12e11315f03441 node-v21.7.0-win-arm64.zip +31c8b4721f37e30ca8e2131a4cb848fc7347f67bf87618e82959b58481f17bc4 node-v21.7.0-win-x64.7z +204de88f4073b08ae3dbe4c412b071eee565fc681e163be205d5cc88065f0322 node-v21.7.0-win-x64.zip +b17ef0c5557e61610774cae5beb0f877699ab419c4672e9c6e3bb3da3d571ed1 node-v21.7.0-win-x86.7z +6aba3fe2258d5c0c40a89e81dfe90113a67489f2a67fd05b7f216b63b4c7bb02 node-v21.7.0-win-x86.zip +512945cf8816e1e906143ea2ee6816f8744a3d114ea38f3540c3ebe685fe3e3a node-v21.7.0-x64.msi +4bedb6069c94a71fd6f0b8fbea280468d5ecdcf209eef6da1a45808e8b15cba6 node-v21.7.0-x86.msi +ccac99782e587c6090b6ad82979210fa0c352322636a6cf290d37eb41152d0b5 node-v21.7.0.pkg +26d6b600e1076f132d4175a90ddc1a709263e75d81967300aa1ffbd86103b991 node-v21.7.0.tar.gz +e41eefe1e59624ee7f312c38f8f7dfc11595641acb2293d21176f03d2763e9d4 node-v21.7.0.tar.xz +25511d1e05d7d0b049945c5ef1cf2a4daa5d6ad16692ccd2c1399142a1c57a65 win-arm64/node.exe +7920932f7be355dbf4568492ab7d104fc059f689ba1a46ac0d6568884c8d201a win-arm64/node.lib +40c423a2b126fc5b6858f8617f0f8537fd8f8d2fa73a5c918607f3ccd386f8c9 win-arm64/node_pdb.7z +dec9eaa91a431ea0f3c243605f0556dbe6459df5c04c10df7935d678a6b3fca4 win-arm64/node_pdb.zip +c486fe72a3663379105538e886ef9d2deacad1deaa64b338e570cb086be592d3 win-x64/node.exe +96d09c2055c2f252122c86b65d2aabd5f90b1a075844f24bf8bcdbab05baf53e win-x64/node.lib +08990dd6bcce80710d59ef76cd74ab98b5bed36b0d2584ca3acbc029f92db4fc win-x64/node_pdb.7z +1a27a25c92f6339b3aa77588063cca537af389aee26bfdf1d0ef505d790e63a3 win-x64/node_pdb.zip +4aaa5b3a95ee4ab932a80b9708c31662a9c4a99d19fea7cb1f7b0ff79d8399ed win-x86/node.exe +6e2502e84c3a0e2da643f6399b59381ade5b525f544a5bcabae923188b8f9998 win-x86/node.lib +d0cd5494364039f558c76d4fc7a1db69739149873e10a5200fb9e2a0ab12fe10 win-x86/node_pdb.7z +354031f3f9576733ebeeccbcafcc691c8326427153a48978ff5cd6f2c8ef5d36 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmXouAIACgkQi+q0389V +XvRp+wv+IPHjBUmVC6YzAxFhRD4GHVUgjckfSbP2jH/acre1mYgm9LJ//7l2GaJy +oEOO85WaHgaKCHCdv9GBc3dDbbt1n9J2IGmBqcdE8e9cRko5qhBoVUvW7p7Ki7ci +nAq5DS3YkpWAocsY/k+LyR0Ky8mW466ARAucTp9kuZmxB2FW53B0bYK57++1qGuo +tr9kJPoGYQB0cUiTSwTaMbOIdl/4CL+a9J7mIrpaDVW5g3PnNy5y1vgDvtuU7Qcn +uEucciBlOn0Ib4mBnky+NX1ThL9WNwLjaivxdioFgc0E4sMwf0CjF3vMUuEvI8qi +PJ5lYndsHI4fdh1SbcgoFNZzTkMZbTr9xcZIGLzLkMX8r+ztLTiFtiLIUSQq0jgm +fqKQghuDN2SVi7WW4KAa7K1285zmV7L27N9mnNWH4ujTqCW73Wdo2XkG/TwM3yEC +5o+YookAV6RHT1X6RPJ8rQaC0BrBgpm/MQH1kvH4vUyF2HRVZ2ZgEYorvKtOwf9D +f7v3IC9J +=/YNz +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v21.7.1.md b/pages/en/blog/release/v21.7.1.md new file mode 100644 index 0000000000000..d5841859bf048 --- /dev/null +++ b/pages/en/blog/release/v21.7.1.md @@ -0,0 +1,130 @@ +--- +date: '2024-03-08T21:54:44.390Z' +category: release +title: Node v21.7.1 (Current) +layout: blog-post +author: Michaël Zasso +--- + +## 2024-03-08, Version 21.7.1 (Current), @targos + +### Notable Changes + +This release reverts [#51389](https://github.com/nodejs/node/pull/51389), which +landed in Node.js 21.7.0. It is a documented feature that `t.after()` hooks are +run even if a test has no subtests. The hook can be used to clean up the test +itself. + +### Commits + +- \[[`0dfe810ac7`](https://github.com/nodejs/node/commit/0dfe810ac7)] - **benchmark**: update iterations of benchmark/async_hooks/async-local- (Lei Shi) [#51420](https://github.com/nodejs/node/pull/51420) +- \[[`625c9e0ac9`](https://github.com/nodejs/node/commit/625c9e0ac9)] - **benchmark**: update iterations of benchmark/domain/domain-fn-args.js (Lei Shi) [#51408](https://github.com/nodejs/node/pull/51408) +- \[[`7ff3551bad`](https://github.com/nodejs/node/commit/7ff3551bad)] - **build**: fix arm64 host cross-compilation in GN (Cheng Zhao) [#51903](https://github.com/nodejs/node/pull/51903) +- \[[`fd86ea8b71`](https://github.com/nodejs/node/commit/fd86ea8b71)] - _**Revert**_ "**build**: workaround for node-core-utils" (Richard Lau) [#51975](https://github.com/nodejs/node/pull/51975) +- \[[`23c32ab3a7`](https://github.com/nodejs/node/commit/23c32ab3a7)] - **build**: respect the `NODE` env variable in `Makefile` (Antoine du Hamel) [#51743](https://github.com/nodejs/node/pull/51743) +- \[[`9617adc064`](https://github.com/nodejs/node/commit/9617adc064)] - _**Revert**_ "**build**: fix warning in cares under GN build" (Luigi Pinca) [#51865](https://github.com/nodejs/node/pull/51865) +- \[[`5864534095`](https://github.com/nodejs/node/commit/5864534095)] - **deps**: update nghttp2 to 1.60.0 (Node.js GitHub Bot) [#51948](https://github.com/nodejs/node/pull/51948) +- \[[`fcf235d623`](https://github.com/nodejs/node/commit/fcf235d623)] - **doc**: add policy for distribution (Geoffrey Booth) [#51918](https://github.com/nodejs/node/pull/51918) +- \[[`87d2acc8b1`](https://github.com/nodejs/node/commit/87d2acc8b1)] - **doc**: fix actual result of example is different in events (Deokjin Kim) [#51925](https://github.com/nodejs/node/pull/51925) +- \[[`5908c121c6`](https://github.com/nodejs/node/commit/5908c121c6)] - **doc**: clarify Corepack threat model (Antoine du Hamel) [#51917](https://github.com/nodejs/node/pull/51917) +- \[[`20e0ba3b94`](https://github.com/nodejs/node/commit/20e0ba3b94)] - **doc,module**: clarify hook chain execution sequence (Jacob Smith) [#51884](https://github.com/nodejs/node/pull/51884) +- \[[`4d997971ac`](https://github.com/nodejs/node/commit/4d997971ac)] - **lib**: make sure close net server (theanarkh) [#51929](https://github.com/nodejs/node/pull/51929) +- \[[`fcc6d54aa3`](https://github.com/nodejs/node/commit/fcc6d54aa3)] - **lib**: return directly if udp socket close before lookup (theanarkh) [#51914](https://github.com/nodejs/node/pull/51914) +- \[[`10aaabd158`](https://github.com/nodejs/node/commit/10aaabd158)] - **meta**: bump github/codeql-action from 3.23.2 to 3.24.6 (dependabot\[bot]) [#51942](https://github.com/nodejs/node/pull/51942) +- \[[`78f38a0143`](https://github.com/nodejs/node/commit/78f38a0143)] - **meta**: bump actions/upload-artifact from 4.3.0 to 4.3.1 (dependabot\[bot]) [#51941](https://github.com/nodejs/node/pull/51941) +- \[[`42ca5452c4`](https://github.com/nodejs/node/commit/42ca5452c4)] - **meta**: bump codecov/codecov-action from 4.0.1 to 4.1.0 (dependabot\[bot]) [#51940](https://github.com/nodejs/node/pull/51940) +- \[[`015a157375`](https://github.com/nodejs/node/commit/015a157375)] - **meta**: bump actions/cache from 4.0.0 to 4.0.1 (dependabot\[bot]) [#51939](https://github.com/nodejs/node/pull/51939) +- \[[`e476cb4a32`](https://github.com/nodejs/node/commit/e476cb4a32)] - **meta**: bump actions/download-artifact from 4.1.1 to 4.1.3 (dependabot\[bot]) [#51938](https://github.com/nodejs/node/pull/51938) +- \[[`67e8001790`](https://github.com/nodejs/node/commit/67e8001790)] - **meta**: bump actions/setup-node from 4.0.1 to 4.0.2 (dependabot\[bot]) [#51937](https://github.com/nodejs/node/pull/51937) +- \[[`50343636e8`](https://github.com/nodejs/node/commit/50343636e8)] - **src**: fix --disable-single-executable-application (Joyee Cheung) [#51808](https://github.com/nodejs/node/pull/51808) +- \[[`a48c9ca0db`](https://github.com/nodejs/node/commit/a48c9ca0db)] - **stream**: do not defer construction by one microtick (Matteo Collina) [#52005](https://github.com/nodejs/node/pull/52005) +- \[[`bee3b364f9`](https://github.com/nodejs/node/commit/bee3b364f9)] - **test**: add regression test for test_runner after hook (Colin Ihrig) [#51998](https://github.com/nodejs/node/pull/51998) +- \[[`fff7f48f50`](https://github.com/nodejs/node/commit/fff7f48f50)] - **test**: reduce flakiness of `test-runner-output` (Antoine du Hamel) [#51952](https://github.com/nodejs/node/pull/51952) +- \[[`57ba8f5acb`](https://github.com/nodejs/node/commit/57ba8f5acb)] - **test**: fix flaky http-chunk-extensions-limit test (Ethan Arrowood) [#51943](https://github.com/nodejs/node/pull/51943) +- \[[`9d2c03990a`](https://github.com/nodejs/node/commit/9d2c03990a)] - **test**: remove flaky designation (Luigi Pinca) [#51736](https://github.com/nodejs/node/pull/51736) +- \[[`e992af81d3`](https://github.com/nodejs/node/commit/e992af81d3)] - **test**: skip SEA tests when SEA generation fails (Joyee Cheung) [#51887](https://github.com/nodejs/node/pull/51887) +- \[[`85aa6ca850`](https://github.com/nodejs/node/commit/85aa6ca850)] - _**Revert**_ "**test_runner**: do not invoke after hook when test is empty" (Colin Ihrig) [#51998](https://github.com/nodejs/node/pull/51998) + +Windows 32-bit Installer: https://nodejs.org/dist/v21.7.1/node-v21.7.1-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v21.7.1/node-v21.7.1-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v21.7.1/node-v21.7.1-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v21.7.1/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v21.7.1/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v21.7.1/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v21.7.1/node-v21.7.1.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v21.7.1/node-v21.7.1-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v21.7.1/node-v21.7.1.tar.gz \ +Other release files: https://nodejs.org/dist/v21.7.1/ \ +Documentation: https://nodejs.org/docs/v21.7.1/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +cba4d1d6c05684edeb88f06351c61c3acdb3d8d6df46b9dcd8ca89af847268e5 node-v21.7.1-aix-ppc64.tar.gz +d21f34e3864d93a8491591002e67a704a8a8ac5f9035d9da890327f884edd1c6 node-v21.7.1-arm64.msi +0a4dde483479dcf272f3d4d7afb509c3d45cf7a1ea451ce108f434dad4fa43e4 node-v21.7.1-darwin-arm64.tar.gz +20b26630c1c6d2c3db9815fca135931bdbe2b5c1c228a3f1f6a9ed6dde91ef76 node-v21.7.1-darwin-arm64.tar.xz +a406f4fbe68ff33319d513fa645aa7b9508c2cb65299f0a2de1757c2a6333c85 node-v21.7.1-darwin-x64.tar.gz +9212f90b3aaaadaf38fe32639e12ceee3c82380b50cc67402f660a9daecb7e87 node-v21.7.1-darwin-x64.tar.xz +deb71c9d4698eb835ff748671d5f04b2e0c7f53e0de457d4ee9f926ab9d285d9 node-v21.7.1-headers.tar.gz +c33217484a2f8a3aa556a4c46144757031d1a8955867e004a3db6996b67c3415 node-v21.7.1-headers.tar.xz +466647785722c5b9b9f2e430e11645e16f1d112b303b0ffdf2d5fa0eb95e647c node-v21.7.1-linux-arm64.tar.gz +d384c843621ccb80f1367fdff85d4e3870bc934ffe37ed48eb320ebebba8ddbb node-v21.7.1-linux-arm64.tar.xz +75a2787505079e972fe91d9507be0a13be2a7cf009db7a520a725bc280225704 node-v21.7.1-linux-armv7l.tar.gz +e375b24d57c8126d58ae31b807c91df6532c52e3441e22d2b3cde5116553c8fb node-v21.7.1-linux-armv7l.tar.xz +5c70f1b4d960130751334c064e5b164c3366900baf8d3ee2a11d8c444ba9c84f node-v21.7.1-linux-ppc64le.tar.gz +28b98d0ec62937bd0769327272615683caabef5c0a5112bd19b9b02d9332e732 node-v21.7.1-linux-ppc64le.tar.xz +6bf591654202c04037ee24de8c3940aff0b54d7449b9c13850f204a9bee11bce node-v21.7.1-linux-s390x.tar.gz +30d5f6eeb3b94ff150d0fc2c07527cd70c8a1ff0384b3ef191663ffe66cb4934 node-v21.7.1-linux-s390x.tar.xz +c7b15146aed968b781c235b6a8f67608be559c4615de9526a9851ae28660cc09 node-v21.7.1-linux-x64.tar.gz +cb25d7a4aa57d15f280ce45cd72f95e9d2020702b7ca75c7fe632444f7c0452c node-v21.7.1-linux-x64.tar.xz +3a8ecf4f887cbe37a1c7a1b720ed259c9e5cdb3648986a148a02211b4a77c6fa node-v21.7.1.pkg +0ba90deb3e4de7c4665cdaabafe2c50d48c6b47e44863bb557ae1b7f01112f40 node-v21.7.1.tar.gz +1272b6e129d564dbde17527b844210b971c20a70ae729268186b7cb9d990a64b node-v21.7.1.tar.xz +6ae0f60b24443708b4673b856c66827c2361957c01ee0c9628281486f0191615 node-v21.7.1-win-arm64.7z +c8931f7130c38e175aa55dfbe4235b20af033ec59d174f4dabf8809b79abe0d5 node-v21.7.1-win-arm64.zip +7c55e73c25e491a22e302e3919dd58145030a2f14bc6e9b2fed0a45c7dd6f867 node-v21.7.1-win-x64.7z +debff16a17e92d084dc19b98b21be35b15d9627befab1c8311b4ff946bf51773 node-v21.7.1-win-x64.zip +a64136c1aeafb096e8461c304c18eaa910d81f75e1ead5155a5548f4e3733a9b node-v21.7.1-win-x86.7z +5db22af240445b0afadadedac497c8b57960f6d27828bb03040be90dfe7561f6 node-v21.7.1-win-x86.zip +e6354ee73967ce6b2ae401edb1d54adaedb321123308e2af1dec71a497e73eaa node-v21.7.1-x64.msi +8673470064c13f491e594b4f4522eba504fc9082db728eed9ba43987b88de69b node-v21.7.1-x86.msi +00d60e58adb4884085675d48064426c0745799169c79e553e1523ffe88f26fd4 win-arm64/node.exe +b068c2ffb9fa47420d55d44bb24ae42211007bbc34426cf68a663b34f8187a41 win-arm64/node.lib +600be209fe1a2a4693eef98393cea9ab3bbc3f08b974ad004cf0aaa944ed2488 win-arm64/node_pdb.7z +53273a368d2079975617d3a5566c5006ee25af68e58408b7cd0842e342acac17 win-arm64/node_pdb.zip +39908c8a16f867e5a2e9666ba8089dd497c4fa48a8008bed9d52cd78181944b2 win-x64/node.exe +96d09c2055c2f252122c86b65d2aabd5f90b1a075844f24bf8bcdbab05baf53e win-x64/node.lib +1f4ece18dbfb3ea96f242f1ca94b309c1e56a50bc6138c33c842d45b198abc7f win-x64/node_pdb.7z +73f6d43a1678df35720662d9052a0a80321c9e92e9c87ef7dc9d70da31197fe9 win-x64/node_pdb.zip +1f8c02748de3c6aefe7f40939db330ec03afe95fff23bbe12ba93fa9f0c180bc win-x86/node.exe +19f86a492bf3b2a2854ebf0d05734afd9866348fc6474ed5b8c53c62ec9b7aa2 win-x86/node.lib +316254a7e269bcdcc37bb831b280c59f565745be01294b4024b8aef19507fe0b win-x86/node_pdb.7z +36186f7fa5b9eb53ed12945b9506d91c487e0fc78b27267c949f609f0e36803e win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEj8yhP+8dDC6RAI4Jdw96mlrhVgAFAmXriKcACgkQdw96mlrh +VgBrkw//SzO0ZJzCWC0IbIEiQdhMwsC/MAtO1xM1icSKq8aY1egcQBFVN+e3j+Bz +tYKcNRfl6+N+pnGHP3ilWUQlmVnZSu7LwBCz9RO78mTRJ/a+iwAJRXiuH632DbKj +JX9vRhkPn6I57Yl5G1xswA5vdfwSFksFARtFGasnGvW1R1fcxvQqpwpkU6Mm4SdM +k2YtOoWjrg6NzE2J+36IsYvd/6Ld7BqJrUqnLEgqitLODgcgwgDYD1eteUiTNnEX +UMn2VFXYtNGT4P67pfaGPOqyKNisVsbS+V3LfV+uaOicMVO9TLm2Q0OQjjNU1QaF +VkpdS6iJ0/hGokG8V1FI+Ev/S+U8qCsO8e/ZEegZuh5bbhwpfq2EImhGLMozARsD +S6OyNuvjg66GamSp8/Cg32rfhYzIk9UAZVf7BOocuXMSNS/gUwQGwSItoOp0lepP +kiAiOq13CgPIQW/ULWTnmbtkKWfx6MWiyEqNGTPnl5gy7/MRfwMKiHtXUBjecNwL ++3xunOeABKzM2KeGFMTl8ePYjPZPdpNewN4gYXafKPcErrg8NLnguhU52Ut94Uu2 +tY00SqJdqmyGYTGfUtfwm/aRxeF1pUA4B8rGMVxbw3pyXONRXBVjwv6st1VWP5CU +yxDkt8AQlEj70zoXQcCK5vYgHbQ6c0kmtnDlqPWUCPOG5nr8Aes= +=hnXW +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v21.7.2.md b/pages/en/blog/release/v21.7.2.md new file mode 100644 index 0000000000000..9b47c00669e74 --- /dev/null +++ b/pages/en/blog/release/v21.7.2.md @@ -0,0 +1,108 @@ +--- +date: '2024-04-03T14:18:52.972Z' +category: release +title: Node v21.7.2 (Current) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-03, Version 21.7.2 (Current), @RafaelGSS prepared by @marco-ippolito + +This is a security release. + +### Notable changes + +- CVE-2024-27983 - Assertion failed in node::http2::Http2Session::\~Http2Session() leads to HTTP/2 server crash- (High) +- CVE-2024-27982 - HTTP Request Smuggling via Content Length Obfuscation- (Medium) +- llhttp version 9.2.1 +- undici version 6.11.1 + +### Commits + +- \[[`3dfc10c851`](https://github.com/nodejs/node/commit/3dfc10c851)] - **deps**: update undici to 6.11.1 (Node.js GitHub Bot) [#52328](https://github.com/nodejs/node/pull/52328) +- \[[`aceea1c5e7`](https://github.com/nodejs/node/commit/aceea1c5e7)] - **deps**: update undici to 6.10.2 (Node.js GitHub Bot) [#52227](https://github.com/nodejs/node/pull/52227) +- \[[`5f0f96b275`](https://github.com/nodejs/node/commit/5f0f96b275)] - **deps**: update llhttp to 9.2.0 (Node.js GitHub Bot) [#51719](https://github.com/nodejs/node/pull/51719) +- \[[`1a65e98e22`](https://github.com/nodejs/node/commit/1a65e98e22)] - **http**: do not allow OBS fold in headers by default (Paolo Insogna) [nodejs-private/node-private#556](https://github.com/nodejs-private/node-private/pull/556) +- \[[`3bd39fb474`](https://github.com/nodejs/node/commit/3bd39fb474)] - **src**: ensure to close stream when destroying session (RafaelGSS) [nodejs-private/node-private#561](https://github.com/nodejs-private/node-private/pull/561) + +Windows 32-bit Installer: https://nodejs.org/dist/v21.7.2/node-v21.7.2-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v21.7.2/node-v21.7.2-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v21.7.2/node-v21.7.2-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v21.7.2/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v21.7.2/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v21.7.2/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v21.7.2/node-v21.7.2.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v21.7.2/node-v21.7.2-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v21.7.2/node-v21.7.2.tar.gz \ +Other release files: https://nodejs.org/dist/v21.7.2/ \ +Documentation: https://nodejs.org/docs/v21.7.2/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +6290bc006ee81332da8345b2d254ecf75674de0898a6dd5e348c7685ca0df325 node-v21.7.2-aix-ppc64.tar.gz +92b1d9ecd1e4520a1ac82963719dd7fd80b3f250751e34d67a8a7553fd149720 node-v21.7.2-arm64.msi +d00a2b5002db121d798f1c9556342abb6ec6a4fac9d6197bc86c922a796812ae node-v21.7.2-darwin-arm64.tar.gz +47784735ff348e9ca6eed5a1482d58582949f0ace7d74ba5d510ab763d5e1327 node-v21.7.2-darwin-arm64.tar.xz +6211829236013582fb654b4b9f8c6528dcb07620f6f82878ef514fae1b30685e node-v21.7.2-darwin-x64.tar.gz +309457de4a2e87db456b5656383be8590d8a69aacd1e161015d98a88697a206f node-v21.7.2-darwin-x64.tar.xz +32bc006ce485d8726e72c666feb08de567098d881b8e79ee37fc9aa9854329c6 node-v21.7.2-headers.tar.gz +66fa0952f5b207c1e1771492d04285a2199bf0dc756e392fe03d3be54ca3733d node-v21.7.2-headers.tar.xz +5cf1cb89feb40404adad999307659754dd17fc9afa6c086aaff690ecbf8af66c node-v21.7.2-linux-arm64.tar.gz +0a07d44da8324ad0514ccd4d588d5aa8d749d76b01b69d55343c2132d1efbe3b node-v21.7.2-linux-arm64.tar.xz +73df605f0aaa18c4a8e9789206d18045b277f4233f50837b1563f9b3dd50f696 node-v21.7.2-linux-armv7l.tar.gz +8c23b9f1d6a9022b04cda94c85bbfd329a178d7710c1bbd25587a668078d9915 node-v21.7.2-linux-armv7l.tar.xz +4ece271c97fc434c34328081245e406e23a23fed32868f90fe901f1a232a27bd node-v21.7.2-linux-ppc64le.tar.gz +11750d12cec45b7f7451b18dcd98ddcdce07afbb68db57bb0dc89e883b78ab6b node-v21.7.2-linux-ppc64le.tar.xz +9df7a1c8c9be7a7f4a62b822c3cbbc0f4c66ad185b7383c6bfb021e99a9441b0 node-v21.7.2-linux-s390x.tar.gz +ba8e598921c29e2ff5efd6f42a3e11c765a77339ac7ef7e1b55c6aba95f3bf8b node-v21.7.2-linux-s390x.tar.xz +06b891c82c9b19b8d8553222de5de8afd43a38c1b898f9ca323e1d2e22da9075 node-v21.7.2-linux-x64.tar.gz +9d55843dd4b2400fe4034de3281003de718dbd0c6f61ce6b53e94e987b16c9dc node-v21.7.2-linux-x64.tar.xz +f9e642aa9e729842b289c0314be8c7d468aca2994b1b8d8a8c2143382f1c4136 node-v21.7.2-win-arm64.7z +a9a62973ac69adb98d62f5aa6d3a7ca668fb7b1a5c84833e93ff330eef1d972b node-v21.7.2-win-arm64.zip +a532dd8dae519c78100497f398621574431757afa933ab32d39b1ba3fcf44d9b node-v21.7.2-win-x64.7z +99102e5964c6cd3c3ba5562243dbfda8e1f265e7fff2489aa1d806074893d88a node-v21.7.2-win-x64.zip +9987f8a12d2cb0439a9def11b449793b372d4ff96acceb9321a736f5c57e5f41 node-v21.7.2-win-x86.7z +ce346bb8e5d2722d653d8f6cee81fdcc80fb88c51ca945763ff12c7e4f659bbb node-v21.7.2-win-x86.zip +b936d30bbd0927157165fb09d2eaff2d939d1f13136bbddc50e64c31aa86b4ac node-v21.7.2-x64.msi +83b30683316bb2f8115d58af23b8bb154de9615632cf491fec6c365aff3b74f5 node-v21.7.2-x86.msi +f75990a446cd3512c80598d815243592776a99ac7f4e5f2cbccc5cf1369b7cfe node-v21.7.2.pkg +dc1b18771e7ed3da051fc2242806bfde5ae02b63fe7205e80156e92de8f8fa3d node-v21.7.2.tar.gz +b4b1e2a07e96f85f6ce34a2fbfea348691aefe5cb219aa6951e23ccc991f9e2f node-v21.7.2.tar.xz +80541446e8ef8a2d26d73e4517afbb560717d47e4ed0d122fdddd90f8662da53 win-arm64/node.exe +298d58a6fed36728a8d1b07f6fe3678c5a6faf4c77bdcd7288e155c117404eea win-arm64/node.lib +1881ceeab304bc003ed87c03a1206f9f9e7deb861a44af68361e493a23a5aec1 win-arm64/node_pdb.7z +c7824ff2aea7a565d81d3ba0e2992497fd7a0f776f39179681f326d9b6eab75b win-arm64/node_pdb.zip +64b5a1e9101e6281f072b385691affbe45b2cb93ba84a592f1a9941d994e621f win-x64/node.exe +473d2b087bfa76b2746542c6c4bd019b0527545849e04cbc3d0872ebd9335f0a win-x64/node.lib +93d79e521d9f3513eee1cb9ad98f38c7b62b3845be285333ad3731cd50c983ab win-x64/node_pdb.7z +e8f7a31dae7239154e53f57e3b1545102b6905419c1545ffeed721509f95426c win-x64/node_pdb.zip +f16257e0cdae9de68cc3bff533ddac2bbfe42f3b7cba16a2a8fc1b40a98e3d3c win-x86/node.exe +8ecea23973c4e82d13c18f78f4e23beebac5b70f1d54c100d08d41f52ade421e win-x86/node.lib +6ddf27e2fcc6528a95fd5db9046a5629698714aeae43ff4e21d6b99904bb8cde win-x86/node_pdb.7z +91af5f3e3bb0e838a2c2e5c6a2d96331309fe52bb0897072774954eddc1976c4 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYNYywACgkQi+q0389V +XvTIxAv/ZsxjsMa99duTaIlj+ksfpVJwp+6ZI1jMkFmUltr9athMp/X1xIav9DG9 +HGw6nnFnPwtwua1N2UIIVnWR6yXwidqUqeJbYyCAbj83Z+UnhV4YQhZRb1IECiQX +yjANfR/cK3lpITM/vWH8DFQWHPggtke2GAH3bNs+scGovJGlpIAHphALsZv8eMqy +xJD3u/Dala1wr5xSQFamFe4O4F+deuSVR9aRhmtBiw6p8NTojgdV8RfJ5PLc7je3 +mCDFY9ODOnYGgzNOR5Z6UYDEYCdKWNIJH48CBQ6Ke6X+JIdKVUUPOXh9P1CDpVra +bX8H4+Qi5b2q0rNzyRsAD67xh0UEhAdQ3WCQo39NFjf1p98TIctYGuA4yYEcQFVn +4t+MxivP7vtzGgWv0pLZkZ/CzxaCo/jaiBt/ZEmAlu2Aoror69V62S0IRfnBdy1n +hJDbif3sLlc4Ba0dVbz26Y/qG7bN9qdYwz9+sruDWJo0sFqQSBVTbbkKifxKxzkh +aVmcPGYB +=W6mj +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v21.7.3.md b/pages/en/blog/release/v21.7.3.md new file mode 100644 index 0000000000000..0e0a09725a0a5 --- /dev/null +++ b/pages/en/blog/release/v21.7.3.md @@ -0,0 +1,101 @@ +--- +date: '2024-04-10T16:38:50.587Z' +category: release +title: Node v21.7.3 (Current) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-10, Version 21.7.3 (Current), @RafaelGSS + +This is a security release. + +### Notable Changes + +- CVE-2024-27980 - Command injection via args parameter of `child_process.spawn` without shell option enabled on Windows + +### Commits + +- \[[`9095c914ed`](https://github.com/nodejs/node/commit/9095c914ed)] - **src**: disallow direct .bat and .cmd file spawning (Ben Noordhuis) [nodejs-private/node-private#562](https://github.com/nodejs-private/node-private/pull/562) + +Windows 32-bit Installer: https://nodejs.org/dist/v21.7.3/node-v21.7.3-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v21.7.3/node-v21.7.3-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v21.7.3/node-v21.7.3-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v21.7.3/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v21.7.3/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v21.7.3/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v21.7.3/node-v21.7.3.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v21.7.3/node-v21.7.3-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v21.7.3/node-v21.7.3.tar.gz \ +Other release files: https://nodejs.org/dist/v21.7.3/ \ +Documentation: https://nodejs.org/docs/v21.7.3/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +3ae059cab0a4f18ce79676bbc37112cd428b2f22ba66277bf12873ef9eb34143 node-v21.7.3-aix-ppc64.tar.gz +e0f70657ad7ee7dac2b2b6e137b319a9967da95676567451f92d7a9f39e4cd65 node-v21.7.3-arm64.msi +165d3ba3500cfc8708f85d3815aaaa21ce418164c933d5419c30825ccad3a99c node-v21.7.3-darwin-arm64.tar.gz +6725de89be5852b403456bba2892e3ef2f12cd533e129705d9f4ffcdfe763e05 node-v21.7.3-darwin-arm64.tar.xz +58d0212e169764c3424d2d5bec73e8a098d34b4e82fca6e1dd54083ea3049c5f node-v21.7.3-darwin-x64.tar.gz +ab6efddd4a83be1be705ae519740d837582acb743bab53a361e5ba804a97a97d node-v21.7.3-darwin-x64.tar.xz +3211b00464b626e3a5890461edbae75488d5f02665834455eb2c019e54488588 node-v21.7.3-headers.tar.gz +bb6a3602b2a2a7f6baaabb2c7a33be15a25cc3c85d1095f8d13c2e9795b894b6 node-v21.7.3-headers.tar.xz +15390ba8509b71c0051e61f75a6fdb0a2eb38318c03a01bf60c93d33d414d138 node-v21.7.3-linux-arm64.tar.gz +d48a76d02c5940a6dc0738bc0af22551d15cb58b30a5ddddb54fe6e00021f3c1 node-v21.7.3-linux-arm64.tar.xz +89e430a705d0855b044ba42d3b48f052cffbd4530cc12029ed2965d299167151 node-v21.7.3-linux-armv7l.tar.gz +5cceefa6803781a3f3fbb52e5e28e99b9bbaf3c7eac26950ea031a8f7c77c5fc node-v21.7.3-linux-armv7l.tar.xz +7421c811185c8b4e349af9eefb7c0d54b6451f82c0935e5207da334f8d00a133 node-v21.7.3-linux-ppc64le.tar.gz +abdca8b36e378cbd7500fa3e839259cfa103db42d2b747948d69e70c28853f91 node-v21.7.3-linux-ppc64le.tar.xz +837b88c7a1bf030ea210cafaa62d378ba464f5849ada47ad7afba9d95c225aec node-v21.7.3-linux-s390x.tar.gz +d4975ba2c87ece52d6d10aee8117b90a2d35412672997645be1b4e4594e9904b node-v21.7.3-linux-s390x.tar.xz +a64cbb12282cb60d35743ef4f51561f8d89946a5f0a484f99168f4de602d7c3d node-v21.7.3-linux-x64.tar.gz +19e17a77e59044de169cd19be3f3bccae686982fba022f9634421b44724ee90c node-v21.7.3-linux-x64.tar.xz +3de6fe25a494ed982adc81a585c88b62147a37d8ca74b26a184ff5959ebd771a node-v21.7.3-win-arm64.7z +686a1ed8ec076ec25e198b0e6e31fdd4198aaabbeb384ff137c1e3bf57664bc3 node-v21.7.3-win-arm64.zip +22e771e992119ef5e6e1553601a301c6fe796a1485dae605ce10a5388834fea2 node-v21.7.3-win-x64.7z +d2314f496782b53ad2fe5fa82fca6ff7f39f07fe59dd007116404ad92179c78e node-v21.7.3-win-x64.zip +17c50f9aaba6fe07f6468888614e36261a5b232333cd31478a6e33f243cddd49 node-v21.7.3-win-x86.7z +e96df935994addbbb51228f1724e8411ea685cb60fa26d84cc7c5d74806c38da node-v21.7.3-win-x86.zip +de33d68e92e8948b96515bafee206d0b5c1f5440eb2e07aa15d6ce2f6493f53b node-v21.7.3-x64.msi +b152d667112572c7293408a6968429f20db117aef2f01d6ca652c0dcae9423b0 node-v21.7.3-x86.msi +b8bccb2ec100c6db213d54deaa5aa064a254ec2f4730ca2810262caf425a9173 node-v21.7.3.pkg +ce1f61347671ef219d9c2925313d629d3fef98fc8d7f5ef38dd4656f7d0f58e7 node-v21.7.3.tar.gz +668b26fb1bfc1cff60622bbcf3d715843e16f50c8f30e9f64fb4141814d79a21 node-v21.7.3.tar.xz +509c04ca7909d2bb715cab80e72da1b19f033eea0e0a84ea5de9145b6d3e75b9 win-arm64/node.exe +0e271f1dff6290e15709869e78160b34277427f905f71afe621e6b22c06c0359 win-arm64/node.lib +cff87c002f27b5d72722539749bc584192bc0f8c01d0d24e11501ee0df1c9e18 win-arm64/node_pdb.7z +e826fdee0df83477d20aa73dbb930dfac03f43d9138b51940a1042cc43e833de win-arm64/node_pdb.zip +37901cb69f7de95891b5e5cead529393a18dc8886a7bb4c6c36e35ac955c70fa win-x64/node.exe +473d2b087bfa76b2746542c6c4bd019b0527545849e04cbc3d0872ebd9335f0a win-x64/node.lib +40f3e3f2bc1885ed318a70ffb4cae58358f09e4bc6da82227251d0133a015ce7 win-x64/node_pdb.7z +2e39aa4be528bdc6182c1629d6ad7ebc57e7188a77963050df988b9116a7a7bc win-x64/node_pdb.zip +823764a39291d2693867c9d3cb953c660995b22f3ae4e5c1d164aa68c67c6609 win-x86/node.exe +3b5733c6ef1ab0e6bc303eb01300c93d7671cb58e5991293bd9da732268b364b win-x86/node.lib +4f72d3d4448c66d71b5d016428ba385462d6e7ddac963c0b5ebb4e41ed0c2ca7 win-x86/node_pdb.7z +a6c2907f9b3d5e6be1c06d8e98cdf20cd87de4481e3c68c71a50c225ecb05692 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYWv0YACgkQi+q0389V +XvTKTAwAlEHgCQo5XNCnAC9abgGwd5thgXBBvGz/7lp+DJaGdkxbtjlwtSEzbjH/ +torHGIT8t7MfKMDoFvrs88CGwBEajWTUaBAlwJaBuNVCLcIzw/SQhW9XOBDnqQxr +mPKdECK/VEVgJWFl++BvAA9O8T/ttc/ac3ZSgucAPu2Sc6+XHqX/5K1GiY1PksW/ +3WsTBfhacS98gMKtu6I4PYwdIQrRMjFzgtJb7CeblzoERQeoHZd++6UZEIv0zHlC +mE/LpV4zYdTk4p27cm1QYtTujp/WUFnJ2Eplx28N9+5mBYXOBo5SWB12eAf52p+0 +ztfMkFYFDnLpNzrraPDjyax7/3M5nQqBiDQMBKht+5Csz8x5gvD1Yqt74KUSRhO/ +dpNevERHLAhvdIvSIiWP7NPhnLIBPSIkTQit9KRl1mCPm+W6T6Iel3yJ8SzdWfDl +xDSwLujFGpdi2vbNd/IG/IiLT6ZJW5XbQPXfncrpIYRe5uL179Pri0TkxEfi1mgw +RGVwEA6l +=eha0 +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v22.0.0.md b/pages/en/blog/release/v22.0.0.md new file mode 100644 index 0000000000000..ab0107307ceeb --- /dev/null +++ b/pages/en/blog/release/v22.0.0.md @@ -0,0 +1,434 @@ +--- +date: '2024-04-24T18:23:41.746Z' +category: release +title: Node v22.0.0 (Current) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-04-24, Version 22.0.0 (Current), @RafaelGSS and @marco-ippolito + +We're excited to announce the release of Node.js 22! +Highlights include require()ing ESM graphs, WebSocket client, updates of the V8 JavaScript engine, and more! +As a reminder, Node.js 22 will enter long-term support (LTS) in October, but until then, it will be the "Current" release for the next six months. +We encourage you to explore the new features and benefits offered by this latest release and evaluate their potential impact on your applications. + +### Other Notable Changes + +- \[[`25c79f3331`](https://github.com/nodejs/node/commit/25c79f3331)] - **esm**: drop support for import assertions (Nicolò Ribaudo) [#52104](https://github.com/nodejs/node/pull/52104) +- \[[`818c10e86d`](https://github.com/nodejs/node/commit/818c10e86d)] - **lib**: improve perf of `AbortSignal` creation (Raz Luvaton) [#52408](https://github.com/nodejs/node/pull/52408) +- \[[`4f68c7c1c9`](https://github.com/nodejs/node/commit/4f68c7c1c9)] - **watch**: mark as stable (Moshe Atlow) [#52074](https://github.com/nodejs/node/pull/52074) +- \[[`02b0bc01fe`](https://github.com/nodejs/node/commit/02b0bc01fe)] - **(SEMVER-MAJOR)** **deps**: update V8 to 12.4.254.14 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`c975384264`](https://github.com/nodejs/node/commit/c975384264)] - **(SEMVER-MAJOR)** **lib**: enable WebSocket by default (Aras Abbasi) [#51594](https://github.com/nodejs/node/pull/51594) +- \[[`1abff07392`](https://github.com/nodejs/node/commit/1abff07392)] - **(SEMVER-MAJOR)** **stream**: bump default highWaterMark (Robert Nagy) [#52037](https://github.com/nodejs/node/pull/52037) +- \[[`1a5acd0638`](https://github.com/nodejs/node/commit/1a5acd0638)] - **(SEMVER-MAJOR)** **v8**: enable maglev on supported architectures (Keyhan Vakil) [#51360](https://github.com/nodejs/node/pull/51360) +- \[[`128c60d906`](https://github.com/nodejs/node/commit/128c60d906)] - **(SEMVER-MINOR)** **cli**: implement `node --run ` (Yagiz Nizipli) [#52190](https://github.com/nodejs/node/pull/52190) +- \[[`151d365ad1`](https://github.com/nodejs/node/commit/151d365ad1)] - **(SEMVER-MINOR)** **fs**: expose glob and globSync (Moshe Atlow) [#51912](https://github.com/nodejs/node/pull/51912) +- \[[`5f7fad2605`](https://github.com/nodejs/node/commit/5f7fad2605)] - **(SEMVER-MINOR)** **module**: support require()ing synchronous ESM graphs (Joyee Cheung) [#51977](https://github.com/nodejs/node/pull/51977) + +### Semver-Major Commits + +- \[[`2b1e7c2fcb`](https://github.com/nodejs/node/commit/2b1e7c2fcb)] - **(SEMVER-MAJOR)** **build**: compile with C++20 support on Windows (StefanStojanovic) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`12d00f1479`](https://github.com/nodejs/node/commit/12d00f1479)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`5f08e11a3c`](https://github.com/nodejs/node/commit/5f08e11a3c)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`94f0369d1d`](https://github.com/nodejs/node/commit/94f0369d1d)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`58674cd1d8`](https://github.com/nodejs/node/commit/58674cd1d8)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`60e836427e`](https://github.com/nodejs/node/commit/60e836427e)] - **(SEMVER-MAJOR)** **console**: treat non-strings as separate argument in console.assert() (Jacob Hummer) [#49722](https://github.com/nodejs/node/pull/49722) +- \[[`d62ab3a1ef`](https://github.com/nodejs/node/commit/d62ab3a1ef)] - **(SEMVER-MAJOR)** **crypto**: runtime deprecate hmac constructor (Marco Ippolito) [#52071](https://github.com/nodejs/node/pull/52071) +- \[[`de0602d190`](https://github.com/nodejs/node/commit/de0602d190)] - **(SEMVER-MAJOR)** **crypto**: runtime deprecate Hash constructor (Marco Ippolito) [#51880](https://github.com/nodejs/node/pull/51880) +- \[[`215f4d04b7`](https://github.com/nodejs/node/commit/215f4d04b7)] - **(SEMVER-MAJOR)** **crypto**: move createCipher and createDecipher to eol (Marco Ippolito) [#50973](https://github.com/nodejs/node/pull/50973) +- \[[`30801b8aaf`](https://github.com/nodejs/node/commit/30801b8aaf)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick cd10ad7cdbe5 (Joyee Cheung) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`521b629ab1`](https://github.com/nodejs/node/commit/521b629ab1)] - **(SEMVER-MAJOR)** **deps**: V8: revert CL 5331688 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`3795e97e6c`](https://github.com/nodejs/node/commit/3795e97e6c)] - **(SEMVER-MAJOR)** **deps**: patch V8 to support compilation with MSVC (StefanStojanovic) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`5bde9e677d`](https://github.com/nodejs/node/commit/5bde9e677d)] - **(SEMVER-MAJOR)** **deps**: silence internal V8 deprecation warning (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`46e628c6f2`](https://github.com/nodejs/node/commit/46e628c6f2)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`f824e40a82`](https://github.com/nodejs/node/commit/f824e40a82)] - **(SEMVER-MAJOR)** **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`d2c84c9a13`](https://github.com/nodejs/node/commit/d2c84c9a13)] - **(SEMVER-MAJOR)** **deps**: avoid compilation error with ASan (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`95d6045bdb`](https://github.com/nodejs/node/commit/95d6045bdb)] - **(SEMVER-MAJOR)** **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`00f55f5743`](https://github.com/nodejs/node/commit/00f55f5743)] - **(SEMVER-MAJOR)** **deps**: silence irrelevant V8 warning (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`764085aa66`](https://github.com/nodejs/node/commit/764085aa66)] - **(SEMVER-MAJOR)** **deps**: always define V8_EXPORT_PRIVATE as no-op (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`02b0bc01fe`](https://github.com/nodejs/node/commit/02b0bc01fe)] - **(SEMVER-MAJOR)** **deps**: update V8 to 12.4.254.14 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`0ec50a19dd`](https://github.com/nodejs/node/commit/0ec50a19dd)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick cd10ad7cdbe5 (Joyee Cheung) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`021b0b7dee`](https://github.com/nodejs/node/commit/021b0b7dee)] - **(SEMVER-MAJOR)** **deps**: V8: backport c4be0a97f981 (Richard Lau) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`681aaf85c7`](https://github.com/nodejs/node/commit/681aaf85c7)] - **(SEMVER-MAJOR)** **deps**: silence internal V8 deprecation warning (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`c563a1c4e4`](https://github.com/nodejs/node/commit/c563a1c4e4)] - **(SEMVER-MAJOR)** **deps**: patch V8 to support compilation with MSVC (Stefan Stojanovic) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`11e94b9987`](https://github.com/nodejs/node/commit/11e94b9987)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`856163e23c`](https://github.com/nodejs/node/commit/856163e23c)] - **(SEMVER-MAJOR)** **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`b530214127`](https://github.com/nodejs/node/commit/b530214127)] - **(SEMVER-MAJOR)** **deps**: avoid compilation error with ASan (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`8054f69dd9`](https://github.com/nodejs/node/commit/8054f69dd9)] - **(SEMVER-MAJOR)** **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`dee908be42`](https://github.com/nodejs/node/commit/dee908be42)] - **(SEMVER-MAJOR)** **deps**: silence irrelevant V8 warning (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`cf069414ee`](https://github.com/nodejs/node/commit/cf069414ee)] - **(SEMVER-MAJOR)** **deps**: always define V8_EXPORT_PRIVATE as no-op (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`cc5792dd85`](https://github.com/nodejs/node/commit/cc5792dd85)] - **(SEMVER-MAJOR)** **deps**: update V8 to 12.3.219.16 (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`61a0d3b4c4`](https://github.com/nodejs/node/commit/61a0d3b4c4)] - **(SEMVER-MAJOR)** **deps**: V8: backport c4be0a97f981 (Richard Lau) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`f55380a725`](https://github.com/nodejs/node/commit/f55380a725)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick f8d5e576b814 (Richard Lau) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`b9d806a2dd`](https://github.com/nodejs/node/commit/b9d806a2dd)] - **(SEMVER-MAJOR)** **deps**: patch V8 to support compilation with MSVC (StefanStojanovic) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`63b58bc17b`](https://github.com/nodejs/node/commit/63b58bc17b)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`86056353c4`](https://github.com/nodejs/node/commit/86056353c4)] - **(SEMVER-MAJOR)** **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`2e0efc1c8d`](https://github.com/nodejs/node/commit/2e0efc1c8d)] - **(SEMVER-MAJOR)** **deps**: avoid compilation error with ASan (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`59e6f62e34`](https://github.com/nodejs/node/commit/59e6f62e34)] - **(SEMVER-MAJOR)** **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`0423f7e27e`](https://github.com/nodejs/node/commit/0423f7e27e)] - **(SEMVER-MAJOR)** **deps**: silence irrelevant V8 warning (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`f36620806d`](https://github.com/nodejs/node/commit/f36620806d)] - **(SEMVER-MAJOR)** **deps**: always define V8_EXPORT_PRIVATE as no-op (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`09a8440b45`](https://github.com/nodejs/node/commit/09a8440b45)] - **(SEMVER-MAJOR)** **deps**: update V8 to 12.2.281.27 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`0da3beebfc`](https://github.com/nodejs/node/commit/0da3beebfc)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick de611e69ad51 (Keyhan Vakil) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`b982335637`](https://github.com/nodejs/node/commit/b982335637)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 0fd478bcdabd (Joyee Cheung) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`481a90116c`](https://github.com/nodejs/node/commit/481a90116c)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 0f9ebbc672c7 (Chengzhong Wu) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`782addbdc3`](https://github.com/nodejs/node/commit/782addbdc3)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 8f0b94671ddb (Lu Yahan) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`b682e7f540`](https://github.com/nodejs/node/commit/b682e7f540)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick f7d000a7ae7b (Luke Albao) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`a60090c52f`](https://github.com/nodejs/node/commit/a60090c52f)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 25902244ad1a (Joyee Cheung) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`8441d1fc18`](https://github.com/nodejs/node/commit/8441d1fc18)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`e8e9bbd7a9`](https://github.com/nodejs/node/commit/e8e9bbd7a9)] - **(SEMVER-MAJOR)** **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`785d5cd006`](https://github.com/nodejs/node/commit/785d5cd006)] - **(SEMVER-MAJOR)** **deps**: avoid compilation error with ASan (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`7071c1dafd`](https://github.com/nodejs/node/commit/7071c1dafd)] - **(SEMVER-MAJOR)** **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`d1d60b297d`](https://github.com/nodejs/node/commit/d1d60b297d)] - **(SEMVER-MAJOR)** **deps**: silence irrelevant V8 warning (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`5b240c62f9`](https://github.com/nodejs/node/commit/5b240c62f9)] - **(SEMVER-MAJOR)** **deps**: always define V8_EXPORT_PRIVATE as no-op (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`d8c97e4857`](https://github.com/nodejs/node/commit/d8c97e4857)] - **(SEMVER-MAJOR)** **deps**: update V8 to 11.9.169.7 (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`b9df88a8c2`](https://github.com/nodejs/node/commit/b9df88a8c2)] - **(SEMVER-MAJOR)** **doc**: runtime deprecate flag --trace-atomics-wait (marco-ippolito) [#51179](https://github.com/nodejs/node/pull/51179) +- \[[`9ba5df30b4`](https://github.com/nodejs/node/commit/9ba5df30b4)] - **(SEMVER-MAJOR)** **doc**: bump FreeBSD experimental support to 13.2 (Michaël Zasso) [#51231](https://github.com/nodejs/node/pull/51231) +- \[[`900d79caf2`](https://github.com/nodejs/node/commit/900d79caf2)] - **(SEMVER-MAJOR)** **doc**: add migration paths for deprecated utils (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`8206f6bb7f`](https://github.com/nodejs/node/commit/8206f6bb7f)] - **(SEMVER-MAJOR)** **fs**: runtime deprecate fs.Stats constructor (Marco Ippolito) [#52067](https://github.com/nodejs/node/pull/52067) +- \[[`c14133503a`](https://github.com/nodejs/node/commit/c14133503a)] - **(SEMVER-MAJOR)** **fs**: use private fields instead of symbols for `Dir` (Jungku Lee) [#51037](https://github.com/nodejs/node/pull/51037) +- \[[`abbdc3efaa`](https://github.com/nodejs/node/commit/abbdc3efaa)] - **(SEMVER-MAJOR)** **fs**: make stats date fields lazy (Yagiz Nizipli) [#50908](https://github.com/nodejs/node/pull/50908) +- \[[`4b76ccea95`](https://github.com/nodejs/node/commit/4b76ccea95)] - **(SEMVER-MAJOR)** **http**: preserve raw header duplicates in writeHead after setHeader calls (Tim Perry) [#50394](https://github.com/nodejs/node/pull/50394) +- \[[`c975384264`](https://github.com/nodejs/node/commit/c975384264)] - **(SEMVER-MAJOR)** **lib**: enable WebSocket by default (Aras Abbasi) [#51594](https://github.com/nodejs/node/pull/51594) +- \[[`351495e938`](https://github.com/nodejs/node/commit/351495e938)] - **(SEMVER-MAJOR)** **lib,test**: handle new Iterator global (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`a8b21fdc90`](https://github.com/nodejs/node/commit/a8b21fdc90)] - **(SEMVER-MAJOR)** **process**: wait for `'exit'` before printing result (Antoine du Hamel) [#52172](https://github.com/nodejs/node/pull/52172) +- \[[`582ff5037c`](https://github.com/nodejs/node/commit/582ff5037c)] - **(SEMVER-MAJOR)** **src**: update NODE_MODULE_VERSION to 127 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`c5c4b50260`](https://github.com/nodejs/node/commit/c5c4b50260)] - **(SEMVER-MAJOR)** **src**: update NODE_MODULE_VERSION to 126 (Michaël Zasso) [#52293](https://github.com/nodejs/node/pull/52293) +- \[[`d248639285`](https://github.com/nodejs/node/commit/d248639285)] - **(SEMVER-MAJOR)** **src**: use supported API to get stalled TLA messages (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`d34b02db4c`](https://github.com/nodejs/node/commit/d34b02db4c)] - **(SEMVER-MAJOR)** **src**: update default V8 platform to override functions with location (Etienne Pierre-Doray) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`d9c47e9b5f`](https://github.com/nodejs/node/commit/d9c47e9b5f)] - **(SEMVER-MAJOR)** **src**: add missing TryCatch (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`5cddd3b2d8`](https://github.com/nodejs/node/commit/5cddd3b2d8)] - **(SEMVER-MAJOR)** **src**: update NODE_MODULE_VERSION to 124 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`1528846ada`](https://github.com/nodejs/node/commit/1528846ada)] - **(SEMVER-MAJOR)** **src**: use non-deprecated v8::Uint8Array::kMaxLength (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`7166986626`](https://github.com/nodejs/node/commit/7166986626)] - **(SEMVER-MAJOR)** **src**: adapt to v8::Exception API change (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`4782818020`](https://github.com/nodejs/node/commit/4782818020)] - **(SEMVER-MAJOR)** **src**: use non-deprecated version of CreateSyntheticModule (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`2cff0ce411`](https://github.com/nodejs/node/commit/2cff0ce411)] - **(SEMVER-MAJOR)** **src**: update NODE_MODULE_VERSION to 122 (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`1abff07392`](https://github.com/nodejs/node/commit/1abff07392)] - **(SEMVER-MAJOR)** **stream**: bump default highWaterMark (Robert Nagy) [#52037](https://github.com/nodejs/node/pull/52037) +- \[[`9efc84a2cb`](https://github.com/nodejs/node/commit/9efc84a2cb)] - **(SEMVER-MAJOR)** **test**: mark test-worker-arraybuffer-zerofill as flaky (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`84c2e712eb`](https://github.com/nodejs/node/commit/84c2e712eb)] - **(SEMVER-MAJOR)** **test**: mark some GC-related tests as flaky (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`cdc4437b87`](https://github.com/nodejs/node/commit/cdc4437b87)] - **(SEMVER-MAJOR)** **test**: allow slightly more diff in memory leak test (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`515b007fae`](https://github.com/nodejs/node/commit/515b007fae)] - **(SEMVER-MAJOR)** **test**: replace always-opt flag with alway-turbofan (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`2341805eb2`](https://github.com/nodejs/node/commit/2341805eb2)] - **(SEMVER-MAJOR)** **test**: remove tests that create very large buffers (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`941cef5636`](https://github.com/nodejs/node/commit/941cef5636)] - **(SEMVER-MAJOR)** **test**: adapt to new V8 trusted memory spaces (Michaël Zasso) [#50115](https://github.com/nodejs/node/pull/50115) +- \[[`29de7f82cd`](https://github.com/nodejs/node/commit/29de7f82cd)] - **(SEMVER-MAJOR)** **test_runner**: omit filtered test from output (Colin Ihrig) [#52221](https://github.com/nodejs/node/pull/52221) +- \[[`00dc6d9d97`](https://github.com/nodejs/node/commit/00dc6d9d97)] - **(SEMVER-MAJOR)** **test_runner**: improve `--test-name-pattern` to allow matching single test (Michał Drobniak) [#51577](https://github.com/nodejs/node/pull/51577) +- \[[`5def8019d5`](https://github.com/nodejs/node/commit/5def8019d5)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 12.4 (Michaël Zasso) [#52465](https://github.com/nodejs/node/pull/52465) +- \[[`c22793d050`](https://github.com/nodejs/node/commit/c22793d050)] - **(SEMVER-MAJOR)** **tools**: roughly port v8_abseil to gyp (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`ffb0302f0c`](https://github.com/nodejs/node/commit/ffb0302f0c)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 12.2 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`aadea12440`](https://github.com/nodejs/node/commit/aadea12440)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 12.1 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`7784773967`](https://github.com/nodejs/node/commit/7784773967)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 12.0 (Michaël Zasso) [#51362](https://github.com/nodejs/node/pull/51362) +- \[[`9fe0424baa`](https://github.com/nodejs/node/commit/9fe0424baa)] - **(SEMVER-MAJOR)** **trace_events**: use private fields instead of symbols for `Tracing` (Jungku Lee) [#51180](https://github.com/nodejs/node/pull/51180) +- \[[`e96cd25007`](https://github.com/nodejs/node/commit/e96cd25007)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.log (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`6cf20d5e43`](https://github.com/nodejs/node/commit/6cf20d5e43)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isUndefined (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`09e424921f`](https://github.com/nodejs/node/commit/09e424921f)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isSymbol (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`80b6bfd4e9`](https://github.com/nodejs/node/commit/80b6bfd4e9)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isString (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`d419edded9`](https://github.com/nodejs/node/commit/d419edded9)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isRegExp (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`e0b8de78ed`](https://github.com/nodejs/node/commit/e0b8de78ed)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isPrimitive (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`5478e1129a`](https://github.com/nodejs/node/commit/5478e1129a)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isObject (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`b05b1dd541`](https://github.com/nodejs/node/commit/b05b1dd541)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isNumber (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`5af9bf5f6a`](https://github.com/nodejs/node/commit/5af9bf5f6a)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isNullOrUndefined (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`860a10e10e`](https://github.com/nodejs/node/commit/860a10e10e)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isNull (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`70330f5c2b`](https://github.com/nodejs/node/commit/70330f5c2b)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isFunction (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`7c69c33acc`](https://github.com/nodejs/node/commit/7c69c33acc)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isError (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`a0c5b871a9`](https://github.com/nodejs/node/commit/a0c5b871a9)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isDate (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`3c670cb15d`](https://github.com/nodejs/node/commit/3c670cb15d)] - **(SEMVER-MAJOR)** **util**: runtime deprecation util.isBuffer (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`c17a448ca9`](https://github.com/nodejs/node/commit/c17a448ca9)] - **(SEMVER-MAJOR)** **util**: runtime deprecation util.isBoolean (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`fbb2f891aa`](https://github.com/nodejs/node/commit/fbb2f891aa)] - **(SEMVER-MAJOR)** **util**: runtime deprecate util.isArray (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`22d8062e42`](https://github.com/nodejs/node/commit/22d8062e42)] - **(SEMVER-MAJOR)** **util**: runtime deprecation util.\_extend (Marco Ippolito) [#50488](https://github.com/nodejs/node/pull/50488) +- \[[`1a5acd0638`](https://github.com/nodejs/node/commit/1a5acd0638)] - **(SEMVER-MAJOR)** **v8**: enable maglev on supported architectures (Keyhan Vakil) [#51360](https://github.com/nodejs/node/pull/51360) + +### Semver-Minor Commits + +- \[[`128c60d906`](https://github.com/nodejs/node/commit/128c60d906)] - **(SEMVER-MINOR)** **cli**: implement `node --run ` (Yagiz Nizipli) [#52190](https://github.com/nodejs/node/pull/52190) +- \[[`f69946b905`](https://github.com/nodejs/node/commit/f69946b905)] - **(SEMVER-MINOR)** **deps**: update simdutf to 5.0.0 (Daniel Lemire) [#52138](https://github.com/nodejs/node/pull/52138) +- \[[`828ad42eee`](https://github.com/nodejs/node/commit/828ad42eee)] - **(SEMVER-MINOR)** **deps**: update undici to 6.3.0 (Node.js GitHub Bot) [#51462](https://github.com/nodejs/node/pull/51462) +- \[[`05f8172188`](https://github.com/nodejs/node/commit/05f8172188)] - **(SEMVER-MINOR)** **deps**: update undici to 6.2.1 (Node.js GitHub Bot) [#51278](https://github.com/nodejs/node/pull/51278) +- \[[`a0c466810a`](https://github.com/nodejs/node/commit/a0c466810a)] - **(SEMVER-MINOR)** **doc**: deprecate fs.Stats public constructor (Marco Ippolito) [#51879](https://github.com/nodejs/node/pull/51879) +- \[[`151d365ad1`](https://github.com/nodejs/node/commit/151d365ad1)] - **(SEMVER-MINOR)** **fs**: expose glob and globSync (Moshe Atlow) [#51912](https://github.com/nodejs/node/pull/51912) +- \[[`5f7fad2605`](https://github.com/nodejs/node/commit/5f7fad2605)] - **(SEMVER-MINOR)** **module**: support require()ing synchronous ESM graphs (Joyee Cheung) [#51977](https://github.com/nodejs/node/pull/51977) +- \[[`009665fb56`](https://github.com/nodejs/node/commit/009665fb56)] - **(SEMVER-MINOR)** **report**: add `--report-exclude-network` option (Ethan Arrowood) [#51645](https://github.com/nodejs/node/pull/51645) +- \[[`80f86e5d02`](https://github.com/nodejs/node/commit/80f86e5d02)] - **(SEMVER-MINOR)** **src**: add C++ ProcessEmitWarningSync() (Joyee Cheung) [#51977](https://github.com/nodejs/node/pull/51977) +- \[[`78be0d0f1c`](https://github.com/nodejs/node/commit/78be0d0f1c)] - **(SEMVER-MINOR)** **src**: add uv_get_available_memory to report and process (theanarkh) [#52023](https://github.com/nodejs/node/pull/52023) +- \[[`b34512e38e`](https://github.com/nodejs/node/commit/b34512e38e)] - **(SEMVER-MINOR)** **src**: preload function for Environment (Cheng Zhao) [#51539](https://github.com/nodejs/node/pull/51539) +- \[[`7d258db1d7`](https://github.com/nodejs/node/commit/7d258db1d7)] - **(SEMVER-MINOR)** **stream**: support typed arrays (IlyasShabi) [#51866](https://github.com/nodejs/node/pull/51866) +- \[[`5276c0d5d4`](https://github.com/nodejs/node/commit/5276c0d5d4)] - **(SEMVER-MINOR)** **test_runner**: add suite() (Colin Ihrig) [#52127](https://github.com/nodejs/node/pull/52127) +- \[[`84de97a61e`](https://github.com/nodejs/node/commit/84de97a61e)] - **(SEMVER-MINOR)** **test_runner**: support forced exit (Colin Ihrig) [#52038](https://github.com/nodejs/node/pull/52038) +- \[[`aac5ad901d`](https://github.com/nodejs/node/commit/aac5ad901d)] - **(SEMVER-MINOR)** **test_runner**: add `test:complete` event to reflect execution order (Moshe Atlow) [#51909](https://github.com/nodejs/node/pull/51909) +- \[[`9a1e01c4ce`](https://github.com/nodejs/node/commit/9a1e01c4ce)] - **(SEMVER-MINOR)** **util**: support array of formats in util.styleText (Marco Ippolito) [#52040](https://github.com/nodejs/node/pull/52040) +- \[[`7f2d61f82a`](https://github.com/nodejs/node/commit/7f2d61f82a)] - **(SEMVER-MINOR)** **v8**: implement v8.queryObjects() for memory leak regression testing (Joyee Cheung) [#51927](https://github.com/nodejs/node/pull/51927) +- \[[`d1d5da22e4`](https://github.com/nodejs/node/commit/d1d5da22e4)] - **(SEMVER-MINOR)** **vm**: harden module type checks (Chengzhong Wu) [#52162](https://github.com/nodejs/node/pull/52162) + +### Semver-Patch Commits + +- \[[`a760dadec3`](https://github.com/nodejs/node/commit/a760dadec3)] - **benchmark**: add AbortSignal.abort benchmarks (Raz Luvaton) [#52408](https://github.com/nodejs/node/pull/52408) +- \[[`47c934e464`](https://github.com/nodejs/node/commit/47c934e464)] - **benchmark**: conditionally use spawn with taskset for cpu pinning (Ali Hassan) [#52253](https://github.com/nodejs/node/pull/52253) +- \[[`dde0cffb2e`](https://github.com/nodejs/node/commit/dde0cffb2e)] - **benchmark**: add toNamespacedPath bench (Rafael Gonzaga) [#52236](https://github.com/nodejs/node/pull/52236) +- \[[`bda66ad711`](https://github.com/nodejs/node/commit/bda66ad711)] - **benchmark**: add style-text benchmark (Rafael Gonzaga) [#52004](https://github.com/nodejs/node/pull/52004) +- \[[`21211a3fa9`](https://github.com/nodejs/node/commit/21211a3fa9)] - **buffer**: improve `btoa` performance (Yagiz Nizipli) [#52427](https://github.com/nodejs/node/pull/52427) +- \[[`6f504b71ac`](https://github.com/nodejs/node/commit/6f504b71ac)] - **buffer**: use simdutf for `atob` implementation (Yagiz Nizipli) [#52381](https://github.com/nodejs/node/pull/52381) +- \[[`0ce7365856`](https://github.com/nodejs/node/commit/0ce7365856)] - **build**: temporary disable ubsan (Rafael Gonzaga) [#52560](https://github.com/nodejs/node/pull/52560) +- \[[`4e278f0253`](https://github.com/nodejs/node/commit/4e278f0253)] - **build**: speed up compilation of some V8 files (Michaël Zasso) [#52083](https://github.com/nodejs/node/pull/52083) +- \[[`ba06c5c509`](https://github.com/nodejs/node/commit/ba06c5c509)] - **build,tools**: add test-ubsan ci (Rafael Gonzaga) [#46297](https://github.com/nodejs/node/pull/46297) +- \[[`562369f348`](https://github.com/nodejs/node/commit/562369f348)] - **child_process**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`8f61b658de`](https://github.com/nodejs/node/commit/8f61b658de)] - **crypto**: deprecate implicitly shortened GCM tags (Tobias Nießen) [#52345](https://github.com/nodejs/node/pull/52345) +- \[[`08609b5222`](https://github.com/nodejs/node/commit/08609b5222)] - **crypto**: make timingSafeEqual faster for Uint8Array (Tobias Nießen) [#52341](https://github.com/nodejs/node/pull/52341) +- \[[`9f939f5af7`](https://github.com/nodejs/node/commit/9f939f5af7)] - **crypto**: reject Ed25519/Ed448 in Sign/Verify prototypes (Filip Skokan) [#52340](https://github.com/nodejs/node/pull/52340) +- \[[`2241e8c5b3`](https://github.com/nodejs/node/commit/2241e8c5b3)] - **crypto**: validate RSA-PSS saltLength in subtle.sign and subtle.verify (Filip Skokan) [#52262](https://github.com/nodejs/node/pull/52262) +- \[[`6dd1c75f4a`](https://github.com/nodejs/node/commit/6dd1c75f4a)] - **crypto**: fix `input` validation in `crypto.hash` (Antoine du Hamel) [#52070](https://github.com/nodejs/node/pull/52070) +- \[[`a1d48f4a26`](https://github.com/nodejs/node/commit/a1d48f4a26)] - **deps**: update simdutf to 5.2.4 (Node.js GitHub Bot) [#52473](https://github.com/nodejs/node/pull/52473) +- \[[`08ff4a0c9d`](https://github.com/nodejs/node/commit/08ff4a0c9d)] - **deps**: update nghttp2 to 1.61.0 (Node.js GitHub Bot) [#52395](https://github.com/nodejs/node/pull/52395) +- \[[`cf629366b9`](https://github.com/nodejs/node/commit/cf629366b9)] - **deps**: update simdutf to 5.2.3 (Yagiz Nizipli) [#52381](https://github.com/nodejs/node/pull/52381) +- \[[`ad86a12964`](https://github.com/nodejs/node/commit/ad86a12964)] - **deps**: upgrade npm to 10.5.1 (npm team) [#52351](https://github.com/nodejs/node/pull/52351) +- \[[`45cc32c9c6`](https://github.com/nodejs/node/commit/45cc32c9c6)] - **deps**: update c-ares to 1.28.1 (Node.js GitHub Bot) [#52285](https://github.com/nodejs/node/pull/52285) +- \[[`38161c38d9`](https://github.com/nodejs/node/commit/38161c38d9)] - **deps**: update zlib to 1.3.0.1-motley-24c07df (Node.js GitHub Bot) [#52199](https://github.com/nodejs/node/pull/52199) +- \[[`1264414700`](https://github.com/nodejs/node/commit/1264414700)] - **deps**: update simdjson to 3.8.0 (Node.js GitHub Bot) [#52124](https://github.com/nodejs/node/pull/52124) +- \[[`f6996ee150`](https://github.com/nodejs/node/commit/f6996ee150)] - **deps**: V8: backport c4be0a97f981 (Richard Lau) [#52183](https://github.com/nodejs/node/pull/52183) +- \[[`0d4bc4c40e`](https://github.com/nodejs/node/commit/0d4bc4c40e)] - **deps**: V8: cherry-pick f8d5e576b814 (Richard Lau) [#52183](https://github.com/nodejs/node/pull/52183) +- \[[`70a05103c8`](https://github.com/nodejs/node/commit/70a05103c8)] - **deps**: update zlib to 1.3.0.1-motley-24342f6 (Node.js GitHub Bot) [#52123](https://github.com/nodejs/node/pull/52123) +- \[[`4c3e9659ed`](https://github.com/nodejs/node/commit/4c3e9659ed)] - **deps**: update corepack to 0.26.0 (Node.js GitHub Bot) [#52027](https://github.com/nodejs/node/pull/52027) +- \[[`0b4cdb4b42`](https://github.com/nodejs/node/commit/0b4cdb4b42)] - **deps**: update ada to 2.7.7 (Node.js GitHub Bot) [#52028](https://github.com/nodejs/node/pull/52028) +- \[[`b241a1d0ae`](https://github.com/nodejs/node/commit/b241a1d0ae)] - **deps**: update simdutf to 4.0.9 (Node.js GitHub Bot) [#51655](https://github.com/nodejs/node/pull/51655) +- \[[`36dcd399c0`](https://github.com/nodejs/node/commit/36dcd399c0)] - **deps**: upgrade libuv to 1.48.0 (Santiago Gimeno) [#51697](https://github.com/nodejs/node/pull/51697) +- \[[`8cf313cd72`](https://github.com/nodejs/node/commit/8cf313cd72)] - **deps**: update undici to 6.6.0 (Node.js GitHub Bot) [#51630](https://github.com/nodejs/node/pull/51630) +- \[[`dd4767f99f`](https://github.com/nodejs/node/commit/dd4767f99f)] - **deps**: update undici to 6.4.0 (Node.js GitHub Bot) [#51527](https://github.com/nodejs/node/pull/51527) +- \[[`8362caa7d8`](https://github.com/nodejs/node/commit/8362caa7d8)] - **dgram**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`4f3cf4e89a`](https://github.com/nodejs/node/commit/4f3cf4e89a)] - **diagnostics_channel**: early-exit tracing channel trace methods (Stephen Belanger) [#51915](https://github.com/nodejs/node/pull/51915) +- \[[`204018bba6`](https://github.com/nodejs/node/commit/204018bba6)] - **doc**: deprecate --experimental-policy (RafaelGSS) [#52602](https://github.com/nodejs/node/pull/52602) +- \[[`d32a914ac7`](https://github.com/nodejs/node/commit/d32a914ac7)] - **doc**: add lint-js-fix into BUILDING.md (jakecastelli) [#52290](https://github.com/nodejs/node/pull/52290) +- \[[`411503bacd`](https://github.com/nodejs/node/commit/411503bacd)] - **doc**: remove Internet Explorer mention in BUILDING.md (Rich Trott) [#52455](https://github.com/nodejs/node/pull/52455) +- \[[`e9ccf5aba2`](https://github.com/nodejs/node/commit/e9ccf5aba2)] - **doc**: accommodate upcoming stricter .md linting (Rich Trott) [#52454](https://github.com/nodejs/node/pull/52454) +- \[[`b4186ec2c1`](https://github.com/nodejs/node/commit/b4186ec2c1)] - **doc**: add Rafael to steward list (Rafael Gonzaga) [#52452](https://github.com/nodejs/node/pull/52452) +- \[[`7b01bfb2be`](https://github.com/nodejs/node/commit/7b01bfb2be)] - **doc**: correct naming convention in C++ style guide (Mohammed Keyvanzadeh) [#52424](https://github.com/nodejs/node/pull/52424) +- \[[`c82f3c9e80`](https://github.com/nodejs/node/commit/c82f3c9e80)] - **doc**: update `process.execArg` example to be more useful (Jacob Smith) [#52412](https://github.com/nodejs/node/pull/52412) +- \[[`655b327a4d`](https://github.com/nodejs/node/commit/655b327a4d)] - **doc**: call out http(s).globalAgent default (mathis-west-1) [#52392](https://github.com/nodejs/node/pull/52392) +- \[[`2c77be5488`](https://github.com/nodejs/node/commit/2c77be5488)] - **doc**: update the location of `build_with_cmake` (Emmanuel Ferdman) [#52356](https://github.com/nodejs/node/pull/52356) +- \[[`7dd514f2db`](https://github.com/nodejs/node/commit/7dd514f2db)] - **doc**: reserve 125 for Electron 31 (Shelley Vohr) [#52379](https://github.com/nodejs/node/pull/52379) +- \[[`756acd0877`](https://github.com/nodejs/node/commit/756acd0877)] - **doc**: use consistent plural form of "index" (Rich Trott) [#52373](https://github.com/nodejs/node/pull/52373) +- \[[`ba07e4e5e6`](https://github.com/nodejs/node/commit/ba07e4e5e6)] - **doc**: fix typo in cli.md (Daeyeon Jeong) [#52388](https://github.com/nodejs/node/pull/52388) +- \[[`461d9d665d`](https://github.com/nodejs/node/commit/461d9d665d)] - **doc**: add Rafael to sec release stewards (Rafael Gonzaga) [#52354](https://github.com/nodejs/node/pull/52354) +- \[[`d0c364a844`](https://github.com/nodejs/node/commit/d0c364a844)] - **doc**: document missing options of events.on (Chemi Atlow) [#52080](https://github.com/nodejs/node/pull/52080) +- \[[`a63261cf2c`](https://github.com/nodejs/node/commit/a63261cf2c)] - **doc**: add missing space (Augustin Mauroy) [#52360](https://github.com/nodejs/node/pull/52360) +- \[[`dd711d221a`](https://github.com/nodejs/node/commit/dd711d221a)] - **doc**: add tips about vcpkg cause build faild on windows (Cong Zhang) [#52181](https://github.com/nodejs/node/pull/52181) +- \[[`4df34cf6dd`](https://github.com/nodejs/node/commit/4df34cf6dd)] - **doc**: replace "below" with "following" (Rich Trott) [#52315](https://github.com/nodejs/node/pull/52315) +- \[[`d9aa33fdbf`](https://github.com/nodejs/node/commit/d9aa33fdbf)] - **doc**: fix email pattern to be wrapped with `<<` instead of single `<` (Raz Luvaton) [#52284](https://github.com/nodejs/node/pull/52284) +- \[[`903f28e684`](https://github.com/nodejs/node/commit/903f28e684)] - **doc**: update release gpg keyserver (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`fd55458770`](https://github.com/nodejs/node/commit/fd55458770)] - **doc**: add release key for marco-ippolito (marco-ippolito) [#52257](https://github.com/nodejs/node/pull/52257) +- \[[`27493a1dd7`](https://github.com/nodejs/node/commit/27493a1dd7)] - **doc**: fix arrow vertical alignment in HTML version (Akash Yeole) [#52193](https://github.com/nodejs/node/pull/52193) +- \[[`af48641993`](https://github.com/nodejs/node/commit/af48641993)] - **doc**: move TSC members from regular to emeritus (Michael Dawson) [#52209](https://github.com/nodejs/node/pull/52209) +- \[[`fa13ed6d79`](https://github.com/nodejs/node/commit/fa13ed6d79)] - **doc**: add section explaining todo tests (Colin Ihrig) [#52204](https://github.com/nodejs/node/pull/52204) +- \[[`312ebd97c2`](https://github.com/nodejs/node/commit/312ebd97c2)] - **doc**: edit `ChildProcess` `'message'` event docs (theanarkh) [#52154](https://github.com/nodejs/node/pull/52154) +- \[[`f1635f442f`](https://github.com/nodejs/node/commit/f1635f442f)] - **doc**: quote test_runner glob parameters (Fabian Meyer) [#52201](https://github.com/nodejs/node/pull/52201) +- \[[`fc029181df`](https://github.com/nodejs/node/commit/fc029181df)] - **doc**: add mold to speeding up section (Cong Zhang) [#52179](https://github.com/nodejs/node/pull/52179) +- \[[`8bd3cb2f8c`](https://github.com/nodejs/node/commit/8bd3cb2f8c)] - **doc**: http event order correction (wh0) [#51464](https://github.com/nodejs/node/pull/51464) +- \[[`a7f170e45a`](https://github.com/nodejs/node/commit/a7f170e45a)] - **doc**: move gabrielschulhof to TSC emeritus (Gabriel Schulhof) [#52192](https://github.com/nodejs/node/pull/52192) +- \[[`305375ac16`](https://github.com/nodejs/node/commit/305375ac16)] - **doc**: fix `--env-file` docs for valid quotes for defining values (Gabriel Bota) [#52157](https://github.com/nodejs/node/pull/52157) +- \[[`3fcaf7b900`](https://github.com/nodejs/node/commit/3fcaf7b900)] - **doc**: clarify what is supported in NODE_OPTIONS (Michael Dawson) [#52076](https://github.com/nodejs/node/pull/52076) +- \[[`4fe87357f3`](https://github.com/nodejs/node/commit/4fe87357f3)] - **doc**: fix typos in maintaining-dependencies.md (RoboSchmied) [#52160](https://github.com/nodejs/node/pull/52160) +- \[[`f1949ac1ae`](https://github.com/nodejs/node/commit/f1949ac1ae)] - **doc**: add spec for contains module syntax (Geoffrey Booth) [#52059](https://github.com/nodejs/node/pull/52059) +- \[[`707155424b`](https://github.com/nodejs/node/commit/707155424b)] - **doc**: optimize the doc about Unix abstract socket (theanarkh) [#52043](https://github.com/nodejs/node/pull/52043) +- \[[`8a191e4e6a`](https://github.com/nodejs/node/commit/8a191e4e6a)] - **doc**: update pnpm link (Superchupu) [#52113](https://github.com/nodejs/node/pull/52113) +- \[[`454d0806a1`](https://github.com/nodejs/node/commit/454d0806a1)] - **doc**: remove ableist language from crypto (Jamie King) [#52063](https://github.com/nodejs/node/pull/52063) +- \[[`dafe004703`](https://github.com/nodejs/node/commit/dafe004703)] - **doc**: update collaborator email (Ruy Adorno) [#52088](https://github.com/nodejs/node/pull/52088) +- \[[`8824adb031`](https://github.com/nodejs/node/commit/8824adb031)] - **doc**: state that removing npm is a non-goal (Geoffrey Booth) [#51951](https://github.com/nodejs/node/pull/51951) +- \[[`b360532f1a`](https://github.com/nodejs/node/commit/b360532f1a)] - **doc**: mention NodeSource in RafaelGSS steward list (Rafael Gonzaga) [#52057](https://github.com/nodejs/node/pull/52057) +- \[[`57d2e4881c`](https://github.com/nodejs/node/commit/57d2e4881c)] - **doc**: remove ArrayBuffer from crypto.hash() data parameter type (fengmk2) [#52069](https://github.com/nodejs/node/pull/52069) +- \[[`e11c1d2315`](https://github.com/nodejs/node/commit/e11c1d2315)] - **doc**: add some commonly used lables up gront (Michael Dawson) [#52006](https://github.com/nodejs/node/pull/52006) +- \[[`8f9f5db1e8`](https://github.com/nodejs/node/commit/8f9f5db1e8)] - **doc**: document that `const c2 = vm.createContext(c1); c1 === c2` is true (Daniel Kaplan) [#51960](https://github.com/nodejs/node/pull/51960) +- \[[`d78a565713`](https://github.com/nodejs/node/commit/d78a565713)] - **doc**: clarify what moderation issues are for (Antoine du Hamel) [#51990](https://github.com/nodejs/node/pull/51990) +- \[[`4cac07c931`](https://github.com/nodejs/node/commit/4cac07c931)] - **doc**: add Hemanth HM mention to v21.7.0 changelog (Rafael Gonzaga) [#52008](https://github.com/nodejs/node/pull/52008) +- \[[`73025c4dec`](https://github.com/nodejs/node/commit/73025c4dec)] - **doc**: add UlisesGascon as a collaborator (Ulises Gascón) [#51991](https://github.com/nodejs/node/pull/51991) +- \[[`999c6b34fb`](https://github.com/nodejs/node/commit/999c6b34fb)] - **doc**: test for cli options (Aras Abbasi) [#51623](https://github.com/nodejs/node/pull/51623) +- \[[`edd6190836`](https://github.com/nodejs/node/commit/edd6190836)] - **doc**: deprecate hmac public constructor (Marco Ippolito) [#51881](https://github.com/nodejs/node/pull/51881) +- \[[`25c79f3331`](https://github.com/nodejs/node/commit/25c79f3331)] - **esm**: drop support for import assertions (Nicolò Ribaudo) [#52104](https://github.com/nodejs/node/pull/52104) +- \[[`d619aab575`](https://github.com/nodejs/node/commit/d619aab575)] - **events**: rename high & low watermark for consistency (Chemi Atlow) [#52080](https://github.com/nodejs/node/pull/52080) +- \[[`e263946c2e`](https://github.com/nodejs/node/commit/e263946c2e)] - **events**: extract addAbortListener for safe internal use (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`40ef2da8d6`](https://github.com/nodejs/node/commit/40ef2da8d6)] - **events**: remove abort listener from signal in `on` (Neal Beeken) [#51091](https://github.com/nodejs/node/pull/51091) +- \[[`61e5de1268`](https://github.com/nodejs/node/commit/61e5de1268)] - **fs**: refactor maybeCallback function (Yagiz Nizipli) [#52129](https://github.com/nodejs/node/pull/52129) +- \[[`39f1b899cd`](https://github.com/nodejs/node/commit/39f1b899cd)] - **fs**: fix edge case in readFileSync utf8 fast path (Richard Lau) [#52101](https://github.com/nodejs/node/pull/52101) +- \[[`639c096004`](https://github.com/nodejs/node/commit/639c096004)] - **fs**: validate fd from cpp on `fchown` (Yagiz Nizipli) [#52051](https://github.com/nodejs/node/pull/52051) +- \[[`9ac1fe05d7`](https://github.com/nodejs/node/commit/9ac1fe05d7)] - **fs**: validate fd from cpp on `close` (Yagiz Nizipli) [#52051](https://github.com/nodejs/node/pull/52051) +- \[[`3ec20f25df`](https://github.com/nodejs/node/commit/3ec20f25df)] - **fs**: validate file mode from cpp (Yagiz Nizipli) [#52050](https://github.com/nodejs/node/pull/52050) +- \[[`8c0b723ccb`](https://github.com/nodejs/node/commit/8c0b723ccb)] - **fs,permission**: make handling of buffers consistent (Tobias Nießen) [#52348](https://github.com/nodejs/node/pull/52348) +- \[[`3fc8d2200e`](https://github.com/nodejs/node/commit/3fc8d2200e)] - **http2**: fix h2-over-h2 connection proxying (Tim Perry) [#52368](https://github.com/nodejs/node/pull/52368) +- \[[`b9d8a14a03`](https://github.com/nodejs/node/commit/b9d8a14a03)] - **http2**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`818c10e86d`](https://github.com/nodejs/node/commit/818c10e86d)] - **lib**: improve perf of `AbortSignal` creation (Raz Luvaton) [#52408](https://github.com/nodejs/node/pull/52408) +- \[[`3f5ff8dc20`](https://github.com/nodejs/node/commit/3f5ff8dc20)] - **lib**: .load .save add proper error message when no file passed (Thomas Mauran) [#52225](https://github.com/nodejs/node/pull/52225) +- \[[`0a252c23d9`](https://github.com/nodejs/node/commit/0a252c23d9)] - **lib**: fix type error for \_refreshLine (Jackson Tian) [#52133](https://github.com/nodejs/node/pull/52133) +- \[[`14de082ab4`](https://github.com/nodejs/node/commit/14de082ab4)] - **lib**: emit listening event once when call listen twice (theanarkh) [#52119](https://github.com/nodejs/node/pull/52119) +- \[[`4e9ce7c035`](https://github.com/nodejs/node/commit/4e9ce7c035)] - **lib**: make sure clear the old timer in http server (theanarkh) [#52118](https://github.com/nodejs/node/pull/52118) +- \[[`20525f14b9`](https://github.com/nodejs/node/commit/20525f14b9)] - **lib**: fix listen with handle in cluster worker (theanarkh) [#52056](https://github.com/nodejs/node/pull/52056) +- \[[`8df54481f4`](https://github.com/nodejs/node/commit/8df54481f4)] - **meta**: bump actions/download-artifact from 4.1.3 to 4.1.4 (dependabot\[bot]) [#52314](https://github.com/nodejs/node/pull/52314) +- \[[`bcc102147a`](https://github.com/nodejs/node/commit/bcc102147a)] - **meta**: bump rtCamp/action-slack-notify from 2.2.1 to 2.3.0 (dependabot\[bot]) [#52313](https://github.com/nodejs/node/pull/52313) +- \[[`4e7e0ef9c3`](https://github.com/nodejs/node/commit/4e7e0ef9c3)] - **meta**: bump github/codeql-action from 3.24.6 to 3.24.9 (dependabot\[bot]) [#52312](https://github.com/nodejs/node/pull/52312) +- \[[`14a39881b8`](https://github.com/nodejs/node/commit/14a39881b8)] - **meta**: bump actions/cache from 4.0.1 to 4.0.2 (dependabot\[bot]) [#52311](https://github.com/nodejs/node/pull/52311) +- \[[`2f8f90dadb`](https://github.com/nodejs/node/commit/2f8f90dadb)] - **meta**: bump actions/setup-python from 5.0.0 to 5.1.0 (dependabot\[bot]) [#52310](https://github.com/nodejs/node/pull/52310) +- \[[`95efdaf01a`](https://github.com/nodejs/node/commit/95efdaf01a)] - **meta**: bump codecov/codecov-action from 4.1.0 to 4.1.1 (dependabot\[bot]) [#52308](https://github.com/nodejs/node/pull/52308) +- \[[`24c1a8e739`](https://github.com/nodejs/node/commit/24c1a8e739)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52300](https://github.com/nodejs/node/pull/52300) +- \[[`60dcfad91e`](https://github.com/nodejs/node/commit/60dcfad91e)] - **meta**: pass Codecov upload token to codecov action (Michaël Zasso) [#51982](https://github.com/nodejs/node/pull/51982) +- \[[`db1746182b`](https://github.com/nodejs/node/commit/db1746182b)] - **module**: disallow CJS <-> ESM edges in a cycle from require(esm) (Joyee Cheung) [#52264](https://github.com/nodejs/node/pull/52264) +- \[[`d6b57f6629`](https://github.com/nodejs/node/commit/d6b57f6629)] - **module**: centralize SourceTextModule compilation for builtin loader (Joyee Cheung) [#52291](https://github.com/nodejs/node/pull/52291) +- \[[`f4a0a3b04b`](https://github.com/nodejs/node/commit/f4a0a3b04b)] - **module**: warn on detection in typeless package (Geoffrey Booth) [#52168](https://github.com/nodejs/node/pull/52168) +- \[[`8bc745944e`](https://github.com/nodejs/node/commit/8bc745944e)] - **module**: eliminate performance cost of detection for cjs entry (Geoffrey Booth) [#52093](https://github.com/nodejs/node/pull/52093) +- \[[`63d04d4d80`](https://github.com/nodejs/node/commit/63d04d4d80)] - **module**: fix detect-module not retrying as esm for cjs-only errors (Geoffrey Booth) [#52024](https://github.com/nodejs/node/pull/52024) +- \[[`575ced8139`](https://github.com/nodejs/node/commit/575ced8139)] - **module**: print location of unsettled top-level await in entry points (Joyee Cheung) [#51999](https://github.com/nodejs/node/pull/51999) +- \[[`075c95f61f`](https://github.com/nodejs/node/commit/075c95f61f)] - **module**: refactor ESM loader initialization and entry point handling (Joyee Cheung) [#51999](https://github.com/nodejs/node/pull/51999) +- \[[`45f0dd0192`](https://github.com/nodejs/node/commit/45f0dd0192)] - **module,win**: fix long path resolve (Stefan Stojanovic) [#51097](https://github.com/nodejs/node/pull/51097) +- \[[`d89fc73d45`](https://github.com/nodejs/node/commit/d89fc73d45)] - **net**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`f0e6acde2d`](https://github.com/nodejs/node/commit/f0e6acde2d)] - **node-api**: make tsfn accept napi_finalize once more (Gabriel Schulhof) [#51801](https://github.com/nodejs/node/pull/51801) +- \[[`ff93f3e1a8`](https://github.com/nodejs/node/commit/ff93f3e1a8)] - **readline**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`4a6ca7a1d4`](https://github.com/nodejs/node/commit/4a6ca7a1d4)] - **src**: remove erroneous CVE-2024-27980 revert option (Tobias Nießen) [#52543](https://github.com/nodejs/node/pull/52543) +- \[[`64b67779f7`](https://github.com/nodejs/node/commit/64b67779f7)] - **src**: disallow direct .bat and .cmd file spawning (Ben Noordhuis) [nodejs-private/node-private#560](https://github.com/nodejs-private/node-private/pull/560) +- \[[`9ef724bc81`](https://github.com/nodejs/node/commit/9ef724bc81)] - **src**: update branch name in node_revert.h (Tobias Nießen) [#52390](https://github.com/nodejs/node/pull/52390) +- \[[`ec1550407b`](https://github.com/nodejs/node/commit/ec1550407b)] - **src**: stop using `v8::BackingStore::Reallocate` (Michaël Zasso) [#52292](https://github.com/nodejs/node/pull/52292) +- \[[`681b0a3df3`](https://github.com/nodejs/node/commit/681b0a3df3)] - **src**: address coverity warning in module_wrap.cc (Michael Dawson) [#52143](https://github.com/nodejs/node/pull/52143) +- \[[`04319228e0`](https://github.com/nodejs/node/commit/04319228e0)] - **src**: fix move after use reported by coverity (Michael Dawson) [#52141](https://github.com/nodejs/node/pull/52141) +- \[[`0eb2b727f6`](https://github.com/nodejs/node/commit/0eb2b727f6)] - **src**: return a number from process.constrainedMemory() constantly (Chengzhong Wu) [#52039](https://github.com/nodejs/node/pull/52039) +- \[[`bec9b5fccc`](https://github.com/nodejs/node/commit/bec9b5fccc)] - **src**: use dedicated routine to compile function for builtin CJS loader (Joyee Cheung) [#52016](https://github.com/nodejs/node/pull/52016) +- \[[`1f193165b9`](https://github.com/nodejs/node/commit/1f193165b9)] - **src**: fix reading empty string views in Blob\[De]serializer (Joyee Cheung) [#52000](https://github.com/nodejs/node/pull/52000) +- \[[`fb356b3305`](https://github.com/nodejs/node/commit/fb356b3305)] - **src**: refactor out FormatErrorMessage for error formatting (Joyee Cheung) [#51999](https://github.com/nodejs/node/pull/51999) +- \[[`1a8ae9d6c0`](https://github.com/nodejs/node/commit/1a8ae9d6c0)] - **src**: use callback-based array iteration in Blob (Joyee Cheung) [#51758](https://github.com/nodejs/node/pull/51758) +- \[[`5cd2ec8bd5`](https://github.com/nodejs/node/commit/5cd2ec8bd5)] - **src**: implement v8 array iteration using the new callback-based API (Joyee Cheung) [#51758](https://github.com/nodejs/node/pull/51758) +- \[[`89a26b451e`](https://github.com/nodejs/node/commit/89a26b451e)] - **src**: fix node_version.h (Joyee Cheung) [#50375](https://github.com/nodejs/node/pull/50375) +- \[[`c02de658a1`](https://github.com/nodejs/node/commit/c02de658a1)] - **stream**: make Duplex inherit destroy from Writable (Luigi Pinca) [#52318](https://github.com/nodejs/node/pull/52318) +- \[[`63391e749d`](https://github.com/nodejs/node/commit/63391e749d)] - **stream**: add `new` when constructing `ERR_MULTIPLE_CALLBACK` (haze) [#52110](https://github.com/nodejs/node/pull/52110) +- \[[`a9528e87b9`](https://github.com/nodejs/node/commit/a9528e87b9)] - **stream**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`ee4fa77624`](https://github.com/nodejs/node/commit/ee4fa77624)] - **test**: fix watch test with require not testing pid (Raz Luvaton) [#52353](https://github.com/nodejs/node/pull/52353) +- \[[`05cb16dc1a`](https://github.com/nodejs/node/commit/05cb16dc1a)] - **test**: simplify ASan build checks (Michaël Zasso) [#52430](https://github.com/nodejs/node/pull/52430) +- \[[`eb53121b77`](https://github.com/nodejs/node/commit/eb53121b77)] - **test**: fix Windows compiler warnings in overlapped-checker (Michaël Zasso) [#52405](https://github.com/nodejs/node/pull/52405) +- \[[`7dfa4750af`](https://github.com/nodejs/node/commit/7dfa4750af)] - **test**: add test for skip+todo combinations (Colin Ihrig) [#52204](https://github.com/nodejs/node/pull/52204) +- \[[`5905596719`](https://github.com/nodejs/node/commit/5905596719)] - **test**: fix incorrect test fixture (Colin Ihrig) [#52185](https://github.com/nodejs/node/pull/52185) +- \[[`bae14b7914`](https://github.com/nodejs/node/commit/bae14b7914)] - **test**: do not set concurrency on parallelized runs (Antoine du Hamel) [#52177](https://github.com/nodejs/node/pull/52177) +- \[[`0b676736a0`](https://github.com/nodejs/node/commit/0b676736a0)] - **test**: add missing cctest/test_path.cc (Yagiz Nizipli) [#52148](https://github.com/nodejs/node/pull/52148) +- \[[`c714cda9a7`](https://github.com/nodejs/node/commit/c714cda9a7)] - **test**: add `spawnSyncAndAssert` util (Antoine du Hamel) [#52132](https://github.com/nodejs/node/pull/52132) +- \[[`978d5a26c9`](https://github.com/nodejs/node/commit/978d5a26c9)] - **test**: reduce flakiness of test-runner-output.mjs (Colin Ihrig) [#52146](https://github.com/nodejs/node/pull/52146) +- \[[`afaf889775`](https://github.com/nodejs/node/commit/afaf889775)] - **test**: skip test for dynamically linked OpenSSL (Richard Lau) [#52542](https://github.com/nodejs/node/pull/52542) +- \[[`be75821a12`](https://github.com/nodejs/node/commit/be75821a12)] - **test**: add test for using `--print` with promises (Antoine du Hamel) [#52137](https://github.com/nodejs/node/pull/52137) +- \[[`4e109e5958`](https://github.com/nodejs/node/commit/4e109e5958)] - **test**: un-set test-emit-after-on-destroyed as flaky (Abdirahim Musse) [#51995](https://github.com/nodejs/node/pull/51995) +- \[[`3f8cc88009`](https://github.com/nodejs/node/commit/3f8cc88009)] - **test_runner**: fix clearing final timeout in own callback (Ben Richeson) [#52332](https://github.com/nodejs/node/pull/52332) +- \[[`52f8dcfccc`](https://github.com/nodejs/node/commit/52f8dcfccc)] - **test_runner**: make end of work check stricter (Colin Ihrig) [#52326](https://github.com/nodejs/node/pull/52326) +- \[[`433bd1b04d`](https://github.com/nodejs/node/commit/433bd1b04d)] - **test_runner**: fix recursive run (Moshe Atlow) [#52322](https://github.com/nodejs/node/pull/52322) +- \[[`e57992ffb2`](https://github.com/nodejs/node/commit/e57992ffb2)] - **test_runner**: hide new line when no error in spec reporter (Moshe Atlow) [#52297](https://github.com/nodejs/node/pull/52297) +- \[[`ac9e5e7527`](https://github.com/nodejs/node/commit/ac9e5e7527)] - **test_runner**: improve describe.only behavior (Moshe Atlow) [#52296](https://github.com/nodejs/node/pull/52296) +- \[[`2c024cd24d`](https://github.com/nodejs/node/commit/2c024cd24d)] - **test_runner**: disable highWatermark on TestsStream (Colin Ihrig) [#52287](https://github.com/nodejs/node/pull/52287) +- \[[`7c02486f1f`](https://github.com/nodejs/node/commit/7c02486f1f)] - **test_runner**: run afterEach hooks in correct order (Colin Ihrig) [#52239](https://github.com/nodejs/node/pull/52239) +- \[[`6af4049810`](https://github.com/nodejs/node/commit/6af4049810)] - **test_runner**: simplify test end time tracking (Colin Ihrig) [#52182](https://github.com/nodejs/node/pull/52182) +- \[[`878047be0b`](https://github.com/nodejs/node/commit/878047be0b)] - **test_runner**: simplify test start time tracking (Colin Ihrig) [#52182](https://github.com/nodejs/node/pull/52182) +- \[[`4648c83dbc`](https://github.com/nodejs/node/commit/4648c83dbc)] - **test_runner**: don't await the same promise for each test (Colin Ihrig) [#52185](https://github.com/nodejs/node/pull/52185) +- \[[`f9755f6f79`](https://github.com/nodejs/node/commit/f9755f6f79)] - **test_runner**: emit diagnostics when watch mode drains (Moshe Atlow) [#52130](https://github.com/nodejs/node/pull/52130) +- \[[`4ba9f45d99`](https://github.com/nodejs/node/commit/4ba9f45d99)] - **test_runner**: ignore todo flag when running suites (Colin Ihrig) [#52117](https://github.com/nodejs/node/pull/52117) +- \[[`6f4d6011ea`](https://github.com/nodejs/node/commit/6f4d6011ea)] - **test_runner**: skip each hooks for skipped tests (Colin Ihrig) [#52115](https://github.com/nodejs/node/pull/52115) +- \[[`05db979c01`](https://github.com/nodejs/node/commit/05db979c01)] - **test_runner**: run top level tests in a microtask (Colin Ihrig) [#52092](https://github.com/nodejs/node/pull/52092) +- \[[`97b2c5344d`](https://github.com/nodejs/node/commit/97b2c5344d)] - **test_runner**: remove redundant report call (Colin Ihrig) [#52089](https://github.com/nodejs/node/pull/52089) +- \[[`780d030bdf`](https://github.com/nodejs/node/commit/780d030bdf)] - **test_runner**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`814fa1ae74`](https://github.com/nodejs/node/commit/814fa1ae74)] - **test_runner**: use source maps when reporting coverage (Moshe Atlow) [#52060](https://github.com/nodejs/node/pull/52060) +- \[[`3c5764a0e2`](https://github.com/nodejs/node/commit/3c5764a0e2)] - **test_runner**: handle undefined test locations (Colin Ihrig) [#52036](https://github.com/nodejs/node/pull/52036) +- \[[`328642bbb9`](https://github.com/nodejs/node/commit/328642bbb9)] - **test_runner**: use paths for test locations (Colin Ihrig) [#52010](https://github.com/nodejs/node/pull/52010) +- \[[`6d625fe616`](https://github.com/nodejs/node/commit/6d625fe616)] - **test_runner**: support source mapped test locations (Colin Ihrig) [#52010](https://github.com/nodejs/node/pull/52010) +- \[[`592c6907bf`](https://github.com/nodejs/node/commit/592c6907bf)] - **test_runner**: avoid overwriting root start time (Colin Ihrig) [#52020](https://github.com/nodejs/node/pull/52020) +- \[[`29b231763e`](https://github.com/nodejs/node/commit/29b231763e)] - **test_runner**: abort unfinished tests on async error (Colin Ihrig) [#51996](https://github.com/nodejs/node/pull/51996) +- \[[`5d13419dbd`](https://github.com/nodejs/node/commit/5d13419dbd)] - **test_runner**: run before hook immediately if test started (Moshe Atlow) [#52003](https://github.com/nodejs/node/pull/52003) +- \[[`8451990668`](https://github.com/nodejs/node/commit/8451990668)] - **test_runner**: add support for null and date value output (Malthe Borch) [#51920](https://github.com/nodejs/node/pull/51920) +- \[[`423ad47e0f`](https://github.com/nodejs/node/commit/423ad47e0f)] - **tools**: change inactive limit to 12 months (Yagiz Nizipli) [#52425](https://github.com/nodejs/node/pull/52425) +- \[[`0d1e64f64c`](https://github.com/nodejs/node/commit/0d1e64f64c)] - **tools**: update stale bot messaging (Wes Todd) [#52423](https://github.com/nodejs/node/pull/52423) +- \[[`5bae73df90`](https://github.com/nodejs/node/commit/5bae73df90)] - **tools**: update lint-md-dependencies to rollup\@4.14.0 (Node.js GitHub Bot) [#52398](https://github.com/nodejs/node/pull/52398) +- \[[`468cb99ba4`](https://github.com/nodejs/node/commit/468cb99ba4)] - **tools**: update Ruff to v0.3.4 (Michaël Zasso) [#52302](https://github.com/nodejs/node/pull/52302) +- \[[`67b9dda003`](https://github.com/nodejs/node/commit/67b9dda003)] - **tools**: run test-ubsan on ubuntu-latest (Michaël Zasso) [#52375](https://github.com/nodejs/node/pull/52375) +- \[[`f1f32d89e0`](https://github.com/nodejs/node/commit/f1f32d89e0)] - **tools**: update lint-md-dependencies to rollup\@4.13.2 (Node.js GitHub Bot) [#52286](https://github.com/nodejs/node/pull/52286) +- \[[`d7aa8fc9da`](https://github.com/nodejs/node/commit/d7aa8fc9da)] - _**Revert**_ "**tools**: run `build-windows` workflow only on source changes" (Michaël Zasso) [#52320](https://github.com/nodejs/node/pull/52320) +- \[[`a3b1fc3f27`](https://github.com/nodejs/node/commit/a3b1fc3f27)] - **tools**: use Python 3.12 in GitHub Actions workflows (Michaël Zasso) [#52301](https://github.com/nodejs/node/pull/52301) +- \[[`021cf91208`](https://github.com/nodejs/node/commit/021cf91208)] - **tools**: allow local updates for llhttp (Paolo Insogna) [#52085](https://github.com/nodejs/node/pull/52085) +- \[[`4d8602046e`](https://github.com/nodejs/node/commit/4d8602046e)] - **tools**: install npm PowerShell scripts on Windows (Luke Karrys) [#52009](https://github.com/nodejs/node/pull/52009) +- \[[`081319d762`](https://github.com/nodejs/node/commit/081319d762)] - **tools**: update lint-md-dependencies to rollup\@4.13.0 (Node.js GitHub Bot) [#52122](https://github.com/nodejs/node/pull/52122) +- \[[`c43a944231`](https://github.com/nodejs/node/commit/c43a944231)] - **tools**: fix error reported by coverity in js2c.cc (Michael Dawson) [#52142](https://github.com/nodejs/node/pull/52142) +- \[[`f05b241f07`](https://github.com/nodejs/node/commit/f05b241f07)] - **tools**: sync ubsan workflow with asan (Michaël Zasso) [#52152](https://github.com/nodejs/node/pull/52152) +- \[[`a21b15a14e`](https://github.com/nodejs/node/commit/a21b15a14e)] - **tools**: update github_reporter to 1.7.0 (Node.js GitHub Bot) [#52121](https://github.com/nodejs/node/pull/52121) +- \[[`d60a871db2`](https://github.com/nodejs/node/commit/d60a871db2)] - **tools**: remove gyp-next .github folder (Marco Ippolito) [#52064](https://github.com/nodejs/node/pull/52064) +- \[[`6ad5353764`](https://github.com/nodejs/node/commit/6ad5353764)] - **tools**: update gyp-next to 0.16.2 (Node.js GitHub Bot) [#52062](https://github.com/nodejs/node/pull/52062) +- \[[`dab85bdc06`](https://github.com/nodejs/node/commit/dab85bdc06)] - **tools**: install manpage to share/man for FreeBSD (Po-Chuan Hsieh) [#51791](https://github.com/nodejs/node/pull/51791) +- \[[`cde37e7b63`](https://github.com/nodejs/node/commit/cde37e7b63)] - **tools**: automate gyp-next update (Marco Ippolito) [#52014](https://github.com/nodejs/node/pull/52014) +- \[[`925a464cb8`](https://github.com/nodejs/node/commit/925a464cb8)] - **url**: remove #context from URLSearchParams (Matt Cowley) [#51520](https://github.com/nodejs/node/pull/51520) +- \[[`893e2cf22b`](https://github.com/nodejs/node/commit/893e2cf22b)] - **watch**: fix some node argument not passed to watched process (Raz Luvaton) [#52358](https://github.com/nodejs/node/pull/52358) +- \[[`fec7e505fc`](https://github.com/nodejs/node/commit/fec7e505fc)] - **watch**: use internal addAbortListener (Chemi Atlow) [#52081](https://github.com/nodejs/node/pull/52081) +- \[[`4f68c7c1c9`](https://github.com/nodejs/node/commit/4f68c7c1c9)] - **watch**: mark as stable (Moshe Atlow) [#52074](https://github.com/nodejs/node/pull/52074) +- \[[`257f32296d`](https://github.com/nodejs/node/commit/257f32296d)] - **watch**: batch file restarts (Moshe Atlow) [#51992](https://github.com/nodejs/node/pull/51992) + +Windows 32-bit Installer: https://nodejs.org/dist/v22.0.0/node-v22.0.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v22.0.0/node-v22.0.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v22.0.0/node-v22.0.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v22.0.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v22.0.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v22.0.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v22.0.0/node-v22.0.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v22.0.0/node-v22.0.0.tar.gz \ +Other release files: https://nodejs.org/dist/v22.0.0/ \ +Documentation: https://nodejs.org/docs/v22.0.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +d7743fddf5e867124f555a91f6c729104fd5c75d9382f10286c3fbb3fd12ef07 node-v22.0.0-aix-ppc64.tar.gz +ffb6e5a0c7e3720e242765ac68025ccd8ade5a35fb9e48d23b99df994f068fe1 node-v22.0.0-arm64.msi +ea96d349cfaa67aa87ceeaa3e5b52c9167f7ac302fd8d1ff162d0785e9dc0785 node-v22.0.0-darwin-arm64.tar.gz +1e4c5dc7144475f52fa7c86819a756126eb981e53469b8484b6dc30f9f08f26f node-v22.0.0-darwin-arm64.tar.xz +422a3887ff5418f0a4552d89cf99346ab8ab51bb5d384660baa88b8444d2c111 node-v22.0.0-darwin-x64.tar.gz +b8fc7ad15e8f8c3780eb79677400ad0a3f7b7d2aa076856b2719a995157f18d0 node-v22.0.0-darwin-x64.tar.xz +d33e48f25ba714a69c920c584710892f4a77dce90c9bba23a228c5c1136f7a53 node-v22.0.0-headers.tar.gz +124ca312ebe7249454cb62d13d56fba2979db6abb56544e85b4d35476898a76f node-v22.0.0-headers.tar.xz +1d3547226be7e59aceee5c7d01a9f8fc18de67e015c5a15d8cf385b6e02d062b node-v22.0.0-linux-arm64.tar.gz +83711d29cbe46375bdffab5419f3d831892e24294169272f6c39edc364556241 node-v22.0.0-linux-arm64.tar.xz +d21db7f57c5ce182aec2b9a83e3295abc37e1731abb73995d3d573e04409977c node-v22.0.0-linux-armv7l.tar.gz +a1f8dfb8fffef9822ec874732b48e6423d52b957ec15f0e758e057c1fc33b4ad node-v22.0.0-linux-armv7l.tar.xz +3b098dccf56d446bbb80845d35bbecbdb74612860d1690f3a216387c99c9d620 node-v22.0.0-linux-ppc64le.tar.gz +2b3fb8707a79243bfb3131312b86716ddc3855bce21bb168095b6b916798e5e9 node-v22.0.0-linux-ppc64le.tar.xz +7ec5fdad0c819eea17900eb43c1de948d620a783b1ac94062caa438778a92b30 node-v22.0.0-linux-s390x.tar.gz +89a8efeeb9f94ce9ea251b8109e079c14919f4c0dc2cbc9f545ec47ef0886737 node-v22.0.0-linux-s390x.tar.xz +74bb0f3a80307c529421c3ed84517b8f543867709f41e53cd73df99e6442af4d node-v22.0.0-linux-x64.tar.gz +9122e50f2642afd5f6078cafd1f52ede60fc464284384f05c18a04d13d07ae5a node-v22.0.0-linux-x64.tar.xz +467a0aee9a31a1ebe1a6934eb0b71c801ef9a60ffb4e9aacf2ef1e01f382b3fe node-v22.0.0-win-arm64.7z +376121cf46bd3c025c5e67adae190aff5e25d33a0b58fbc0d8652d73350b38f0 node-v22.0.0-win-arm64.zip +df03e48bd2f98e7e59da264eb27d2cf76b11408bb6fbf2250c1c2226d19c94e8 node-v22.0.0-win-x64.7z +32d639b47d4c0a651ff8f8d7d41a454168a3d4045be37985f9a810cf8cef6174 node-v22.0.0-win-x64.zip +22e77736e0c0e38e59f9d0122a633fbeb82c5973b72f1bfcc3c52be0b66303c7 node-v22.0.0-win-x86.7z +e0134f5017154a337672c7fbcd154e2b2c774b431091185601920d63d0c4b7d0 node-v22.0.0-win-x86.zip +b3f2df95a73c7ca378906dfd7d18e6112ff38965fa31a1e113a4b201db106fcf node-v22.0.0-x64.msi +8fa3c77f65445010351b9467736d9b42fc84c12ad4cc218bf340c2057af8d553 node-v22.0.0-x86.msi +2a7aa14f78d7b764d1552898bf1181da34d3ce40696742c137b8c3ab4079d078 node-v22.0.0.pkg +47cd57486564a8cb4728ec01f1d98b510c6547e19e96a7f7583cf882d803d0c6 node-v22.0.0.tar.gz +22e28fbff31f69073b8024cb42745e5105f84041f3475b260b97d5a141039d1a node-v22.0.0.tar.xz +cfcdd81430a39b2bdab0f99017ba5c8c6b8ad6b30e175a7e060dc5b7cb54e797 win-arm64/node.exe +974ffe43afcc27c334e44b92628df5942570f6490a3436c136201ca063e90cec win-arm64/node.lib +e9f4e1104aaf9b57712e0ef540e74703f3afc4cce7d50c29156ea63f832b049c win-arm64/node_pdb.7z +f761c807a65f6c15d592a6750b804103c963d8cc9607a0cf17f827434b2550f0 win-arm64/node_pdb.zip +db174445b3d28314772bc3918e39d8543cfbd18d542cf2a662f431f5cdc259ea win-x64/node.exe +8ded03c4ad28e5a64be37cd4c4278094c96a512569a8fa68a20bccbcc960339f win-x64/node.lib +2452af2e8bd356bd2a1cf596835cfd835f750ba1f52826e62bd015dd17d35703 win-x64/node_pdb.7z +c4b091dae6a217b4a871a9c8240f0c82330010c4ff35cf3166044356709213b6 win-x64/node_pdb.zip +f3f41409513928f3b0d11f799aa7e44bcb7bec74c0de53ebdf108c3c5c40c016 win-x86/node.exe +59393214b7ce16fd0017502f6feff62d651391f9ad02dc68c955ff13b99c5fb4 win-x86/node.lib +87f527249d447b8a79373d5d7cd8045a7e141049d80c0b2399bc6c62aaa20c57 win-x86/node_pdb.7z +4ec1e6bb26f87add5e3741a118957ff07bf91791a8ddf1f426de15e79e835ff0 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmYpTd0ACgkQi+q0389V +XvQxJQv/YNg/SFottus7N3W7IWJpf1WYZesLhNBtursfLpiSw14QlCa3fhBrUx+W +fTpHrDJQbLyyVqo9U1tQ4D3g2+rYBmOjeUQnmg8zfjvu6PHfWtwLGNc7pQelKYgN +mrMl709lCWqDfELtdyiXcTh4G+rAfLCb2u/ykxbDWncHUzeNuEyVjUVJVwDhTIgZ +QYQ6IfWB2TusVTBTEWEP2YouImupVyoQicrzb1wHHFHKaT16GVKBPG1phPU3O1hM +d2OeFCVjxqMJC7oBAwS+s5PHN8+Er9VUG1nfTBIyzSvj3z8zYmCqXCxlMOkRBYig +ePfh8bRXV8qeQd4Ps2vTxp5XmO8RpSQk2BNPULg3hZpZF3xtOEnLv4tT7WXMVYrI +o7HdBqv20/bEpr1oOQwzS/OeLZ3tn/cj7WjgLLRPVvEYE741D7LROQKOVw5RjBAQ +/4rbN1Pn0TPze34FVbPhvvWzmPrP2d0CyeAjsk8Fu0TOtuhtcrlQIrm0j2eUQ3To +puN9ZCv2 +=oENf +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v22.1.0.md b/pages/en/blog/release/v22.1.0.md new file mode 100644 index 0000000000000..ba167340ace77 --- /dev/null +++ b/pages/en/blog/release/v22.1.0.md @@ -0,0 +1,235 @@ +--- +date: '2024-05-02T14:35:52.972Z' +category: release +title: Node v22.1.0 (Current) +layout: blog-post +author: Michaël Zasso +--- + +## 2024-05-02, Version 22.1.0 (Current), @targos prepared by @aduh95 + +### module: implement `NODE_COMPILE_CACHE` for automatic on-disk code caching + +This patch implements automatic on-disk code caching that can be enabled +via an environment variable `NODE_COMPILE_CACHE=/path/to/cache/dir`. + +When set, whenever Node.js compiles a CommonJS or a ECMAScript Module, +it will use on-disk [V8 code cache](https://v8.dev/blog/code-caching-for-devs) +persisted in the specified directory +to speed up the compilation. This may slow down the first load of a +module graph, but subsequent loads of the same module graph may get +a significant speedup if the contents of the modules do not change. +Locally, this speeds up loading of `test/fixtures/snapshot/typescript.js` +from \~130ms to \~80ms. + +To clean up the generated code cache, simply remove the directory. +It will be recreated the next time the same directory is used for +`NODE_COMPILE_CACHE`. + +Compilation cache generated by one version of Node.js may not be used +by a different version of Node.js. Cache generated by different versions +of Node.js will be stored separately if the same directory is used +to persist the cache, so they can co-exist. + +Caveat: currently when using this with V8 JavaScript code coverage, the +coverage being collected by V8 may be less precise in functions that are +deserialized from the code cache. It's recommended to turn this off when +running tests to generate precise coverage. + +Contributed by Joyee Cheung in [#52535](https://github.com/nodejs/node/pull/52535). + +### Other Notable Changes + +- \[[`44ee04cf9f`](https://github.com/nodejs/node/commit/44ee04cf9f)] - **buffer**: improve `base64` and `base64url` performance (Yagiz Nizipli) [#52428](https://github.com/nodejs/node/pull/52428) +- \[[`3c37ce5710`](https://github.com/nodejs/node/commit/3c37ce5710)] - **(SEMVER-MINOR)** **dns**: add order option and support ipv6first (Paolo Insogna) [#52492](https://github.com/nodejs/node/pull/52492) +- \[[`3026401be1`](https://github.com/nodejs/node/commit/3026401be1)] - **events,doc**: mark CustomEvent as stable (Daeyeon Jeong) [#52618](https://github.com/nodejs/node/pull/52618) +- \[[`64428dc1c9`](https://github.com/nodejs/node/commit/64428dc1c9)] - **(SEMVER-MINOR)** **lib, url**: add a `windows` option to path parsing (Aviv Keller) [#52509](https://github.com/nodejs/node/pull/52509) +- \[[`d79ae74f71`](https://github.com/nodejs/node/commit/d79ae74f71)] - **(SEMVER-MINOR)** **net**: add CLI option for autoSelectFamilyAttemptTimeout (Paolo Insogna) [#52474](https://github.com/nodejs/node/pull/52474) +- \[[`43fa6a1a45`](https://github.com/nodejs/node/commit/43fa6a1a45)] - **(SEMVER-MINOR)** **src**: add `string_view` overload to snapshot FromBlob (Anna Henningsen) [#52595](https://github.com/nodejs/node/pull/52595) +- \[[`c6fe433d42`](https://github.com/nodejs/node/commit/c6fe433d42)] - **src,permission**: throw async errors on async APIs (Rafael Gonzaga) [#52730](https://github.com/nodejs/node/pull/52730) +- \[[`e247a61d15`](https://github.com/nodejs/node/commit/e247a61d15)] - **(SEMVER-MINOR)** **test_runner**: add --test-skip-pattern cli option (Aviv Keller) [#52529](https://github.com/nodejs/node/pull/52529) +- \[[`9b18df9dcb`](https://github.com/nodejs/node/commit/9b18df9dcb)] - **(SEMVER-MINOR)** **url**: implement parse method for safer URL parsing (Ali Hassan) [#52280](https://github.com/nodejs/node/pull/52280) + +### Commits + +- \[[`35643c18c0`](https://github.com/nodejs/node/commit/35643c18c0)] - **benchmark**: reduce the buffer size for blob (Debadree Chatterjee) [#52548](https://github.com/nodejs/node/pull/52548) +- \[[`7cdfe8a3fc`](https://github.com/nodejs/node/commit/7cdfe8a3fc)] - **benchmark**: inherit stdio/stderr instead of pipe (Ali Hassan) [#52456](https://github.com/nodejs/node/pull/52456) +- \[[`7b82c17f22`](https://github.com/nodejs/node/commit/7b82c17f22)] - **benchmark**: add ipc support to spawn stdio config (Ali Hassan) [#52456](https://github.com/nodejs/node/pull/52456) +- \[[`dfda6fed61`](https://github.com/nodejs/node/commit/dfda6fed61)] - **buffer**: add missing ARG_TYPE(ArrayBuffer) for isUtf8 (Jungku Lee) [#52477](https://github.com/nodejs/node/pull/52477) +- \[[`44ee04cf9f`](https://github.com/nodejs/node/commit/44ee04cf9f)] - **buffer**: improve `base64` and `base64url` performance (Yagiz Nizipli) [#52428](https://github.com/nodejs/node/pull/52428) +- \[[`c64a1a3b89`](https://github.com/nodejs/node/commit/c64a1a3b89)] - **build**: fix typo in node.gyp (Michaël Zasso) [#52719](https://github.com/nodejs/node/pull/52719) +- \[[`4f713fbc2e`](https://github.com/nodejs/node/commit/4f713fbc2e)] - **build**: fix headers install for shared mode on Win (Segev Finer) [#52442](https://github.com/nodejs/node/pull/52442) +- \[[`4baeb7b21d`](https://github.com/nodejs/node/commit/4baeb7b21d)] - **build**: fix arm64 cross-compilation bug on non-arm machines (Mahdi Sharifi) [#52559](https://github.com/nodejs/node/pull/52559) +- \[[`d5cd468ce8`](https://github.com/nodejs/node/commit/d5cd468ce8)] - **build,tools,node-api**: fix building node-api tests for Windows Debug (Vladimir Morozov) [#52632](https://github.com/nodejs/node/pull/52632) +- \[[`910533fcfd`](https://github.com/nodejs/node/commit/910533fcfd)] - **crypto**: simplify assertions in Safe\*Print (David Benjamin) [#49709](https://github.com/nodejs/node/pull/49709) +- \[[`61e1ac0b8c`](https://github.com/nodejs/node/commit/61e1ac0b8c)] - **crypto**: enable NODE_EXTRA_CA_CERTS with BoringSSL (Shelley Vohr) [#52217](https://github.com/nodejs/node/pull/52217) +- \[[`6e98eee256`](https://github.com/nodejs/node/commit/6e98eee256)] - **deps**: upgrade npm to 10.7.0 (npm team) [#52767](https://github.com/nodejs/node/pull/52767) +- \[[`27a5f9418c`](https://github.com/nodejs/node/commit/27a5f9418c)] - **deps**: V8: cherry-pick 500de8bd371b (Richard Lau) [#52676](https://github.com/nodejs/node/pull/52676) +- \[[`3b422ddcea`](https://github.com/nodejs/node/commit/3b422ddcea)] - **deps**: update corepack to 0.28.0 (Node.js GitHub Bot) [#52616](https://github.com/nodejs/node/pull/52616) +- \[[`d40e4d4c42`](https://github.com/nodejs/node/commit/d40e4d4c42)] - **deps**: update ada to 2.7.8 (Node.js GitHub Bot) [#52517](https://github.com/nodejs/node/pull/52517) +- \[[`5b52a4870a`](https://github.com/nodejs/node/commit/5b52a4870a)] - **deps**: update icu to 75.1 (Node.js GitHub Bot) [#52573](https://github.com/nodejs/node/pull/52573) +- \[[`80cbe72c1f`](https://github.com/nodejs/node/commit/80cbe72c1f)] - **deps**: update undici to 6.13.0 (Node.js GitHub Bot) [#52493](https://github.com/nodejs/node/pull/52493) +- \[[`9a44059055`](https://github.com/nodejs/node/commit/9a44059055)] - **deps**: update zlib to 1.3.0.1-motley-7d77fb7 (Node.js GitHub Bot) [#52516](https://github.com/nodejs/node/pull/52516) +- \[[`d67a9a5360`](https://github.com/nodejs/node/commit/d67a9a5360)] - **deps**: update minimatch to 9.0.4 (Node.js GitHub Bot) [#52524](https://github.com/nodejs/node/pull/52524) +- \[[`8738b89971`](https://github.com/nodejs/node/commit/8738b89971)] - **deps**: upgrade npm to 10.5.2 (npm team) [#52458](https://github.com/nodejs/node/pull/52458) +- \[[`8e4fd2842b`](https://github.com/nodejs/node/commit/8e4fd2842b)] - **deps,src**: simplify base64 encoding (Daniel Lemire) [#52714](https://github.com/nodejs/node/pull/52714) +- \[[`3c37ce5710`](https://github.com/nodejs/node/commit/3c37ce5710)] - **(SEMVER-MINOR)** **dns**: add order option and support ipv6first (Paolo Insogna) [#52492](https://github.com/nodejs/node/pull/52492) +- \[[`3987a28a9e`](https://github.com/nodejs/node/commit/3987a28a9e)] - **doc**: update process.versions properties (ishabi) [#52736](https://github.com/nodejs/node/pull/52736) +- \[[`c0b58e07f1`](https://github.com/nodejs/node/commit/c0b58e07f1)] - **doc**: remove mold use on mac for speeding up build (Cong Zhang) [#52252](https://github.com/nodejs/node/pull/52252) +- \[[`9a032cf6e2`](https://github.com/nodejs/node/commit/9a032cf6e2)] - **doc**: remove relative limitation to pm (Rafael Gonzaga) [#52648](https://github.com/nodejs/node/pull/52648) +- \[[`90c6e77238`](https://github.com/nodejs/node/commit/90c6e77238)] - **doc**: fix info string causing duplicated code blocks (Mathieu Leenhardt) [#52660](https://github.com/nodejs/node/pull/52660) +- \[[`4d577fa048`](https://github.com/nodejs/node/commit/4d577fa048)] - **doc**: add .gitattributes for md files (Hüseyin Açacak) [#52161](https://github.com/nodejs/node/pull/52161) +- \[[`04c8e110e5`](https://github.com/nodejs/node/commit/04c8e110e5)] - **doc**: run license-builder (github-actions\[bot]) [#52631](https://github.com/nodejs/node/pull/52631) +- \[[`3552829594`](https://github.com/nodejs/node/commit/3552829594)] - **doc**: add info on contributor spotlight program (Michael Dawson) [#52598](https://github.com/nodejs/node/pull/52598) +- \[[`eeb80ad836`](https://github.com/nodejs/node/commit/eeb80ad836)] - **doc**: correct unsafe URL example in http docs (Malte Legenhausen) [#52555](https://github.com/nodejs/node/pull/52555) +- \[[`c83526a688`](https://github.com/nodejs/node/commit/c83526a688)] - **doc**: replace U+00A0 with U+0020 (Luigi Pinca) [#52590](https://github.com/nodejs/node/pull/52590) +- \[[`31831e9db8`](https://github.com/nodejs/node/commit/31831e9db8)] - **doc**: sort options alphabetically (Luigi Pinca) [#52589](https://github.com/nodejs/node/pull/52589) +- \[[`a93f5d4aaa`](https://github.com/nodejs/node/commit/a93f5d4aaa)] - **doc**: correct stream.finished changes (KaKa) [#52551](https://github.com/nodejs/node/pull/52551) +- \[[`27ffa35540`](https://github.com/nodejs/node/commit/27ffa35540)] - **doc**: add RedYetiDev to triage team (Aviv Keller) [#52556](https://github.com/nodejs/node/pull/52556) +- \[[`63cc2b870e`](https://github.com/nodejs/node/commit/63cc2b870e)] - **doc**: fix issue detected in markdown lint update (Rich Trott) [#52566](https://github.com/nodejs/node/pull/52566) +- \[[`7e93c4892b`](https://github.com/nodejs/node/commit/7e93c4892b)] - **doc**: update test runner coverage limitations (Moshe Atlow) [#52515](https://github.com/nodejs/node/pull/52515) +- \[[`3026401be1`](https://github.com/nodejs/node/commit/3026401be1)] - **events,doc**: mark CustomEvent as stable (Daeyeon Jeong) [#52618](https://github.com/nodejs/node/pull/52618) +- \[[`c6e0fe2f22`](https://github.com/nodejs/node/commit/c6e0fe2f22)] - **fs**: allow setting Stat date properties (Nicolò Ribaudo) [#52708](https://github.com/nodejs/node/pull/52708) +- \[[`f23fa1de72`](https://github.com/nodejs/node/commit/f23fa1de72)] - **fs**: fix read / readSync positional offset types (Ruy Adorno) [#52603](https://github.com/nodejs/node/pull/52603) +- \[[`a7e03d301a`](https://github.com/nodejs/node/commit/a7e03d301a)] - **fs**: fixes recursive fs.watch crash on Linux when deleting files (Matteo Collina) [#52349](https://github.com/nodejs/node/pull/52349) +- \[[`d5ecb6cd00`](https://github.com/nodejs/node/commit/d5ecb6cd00)] - **http2**: fix excessive CPU usage when using `allowHTTP1=true` (Eugene) [#52713](https://github.com/nodejs/node/pull/52713) +- \[[`d1adc9b140`](https://github.com/nodejs/node/commit/d1adc9b140)] - **lib**: enforce ASCII order in error code imports (Antoine du Hamel) [#52625](https://github.com/nodejs/node/pull/52625) +- \[[`9ffdcade37`](https://github.com/nodejs/node/commit/9ffdcade37)] - **lib**: use predefined variable instead of bit operation (Deokjin Kim) [#52580](https://github.com/nodejs/node/pull/52580) +- \[[`fdcde845ee`](https://github.com/nodejs/node/commit/fdcde845ee)] - **lib**: refactor lazy loading of undici for fetch method (Victor Chen) [#52275](https://github.com/nodejs/node/pull/52275) +- \[[`f6145aa2ca`](https://github.com/nodejs/node/commit/f6145aa2ca)] - **lib**: convert WeakMaps in cjs loader with private symbol properties (Chengzhong Wu) [#52095](https://github.com/nodejs/node/pull/52095) +- \[[`014bf01efc`](https://github.com/nodejs/node/commit/014bf01efc)] - **lib**: replace string prototype usage with alternatives (Aviv Keller) [#52440](https://github.com/nodejs/node/pull/52440) +- \[[`dc399ddd03`](https://github.com/nodejs/node/commit/dc399ddd03)] - **lib, doc**: rename readme.md to README.md (Aviv Keller) [#52471](https://github.com/nodejs/node/pull/52471) +- \[[`64428dc1c9`](https://github.com/nodejs/node/commit/64428dc1c9)] - **(SEMVER-MINOR)** **lib, url**: add a `windows` option to path parsing (Aviv Keller) [#52509](https://github.com/nodejs/node/pull/52509) +- \[[`9b2b6abb62`](https://github.com/nodejs/node/commit/9b2b6abb62)] - **lib,src**: iterate module requests of a module wrap in JS (Chengzhong Wu) [#52058](https://github.com/nodejs/node/pull/52058) +- \[[`896a80e366`](https://github.com/nodejs/node/commit/896a80e366)] - **meta**: standardize regex (Aviv Keller) [#52693](https://github.com/nodejs/node/pull/52693) +- \[[`20c07e922e`](https://github.com/nodejs/node/commit/20c07e922e)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52633](https://github.com/nodejs/node/pull/52633) +- \[[`e70d8a4fa9`](https://github.com/nodejs/node/commit/e70d8a4fa9)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#52457](https://github.com/nodejs/node/pull/52457) +- \[[`20ab8f2a88`](https://github.com/nodejs/node/commit/20ab8f2a88)] - **module**: support ESM detection in the CJS loader (Joyee Cheung) [#52047](https://github.com/nodejs/node/pull/52047) +- \[[`544c602b75`](https://github.com/nodejs/node/commit/544c602b75)] - **module**: skip NODE_COMPILE_CACHE when policy is enabled (Joyee Cheung) [#52577](https://github.com/nodejs/node/pull/52577) +- \[[`3df3afc284`](https://github.com/nodejs/node/commit/3df3afc284)] - **module**: detect ESM syntax by trying to recompile as SourceTextModule (Joyee Cheung) [#52413](https://github.com/nodejs/node/pull/52413) +- \[[`4d77fd2c46`](https://github.com/nodejs/node/commit/4d77fd2c46)] - **(SEMVER-MINOR)** **module**: implement NODE_COMPILE_CACHE for automatic on-disk code caching (Joyee Cheung) [#52535](https://github.com/nodejs/node/pull/52535) +- \[[`9794d21b07`](https://github.com/nodejs/node/commit/9794d21b07)] - **module**: fix submodules loaded by require() and import() (Joyee Cheung) [#52487](https://github.com/nodejs/node/pull/52487) +- \[[`b00766d9e7`](https://github.com/nodejs/node/commit/b00766d9e7)] - **module**: tidy code and comments (Jacob Smith) [#52437](https://github.com/nodejs/node/pull/52437) +- \[[`d79ae74f71`](https://github.com/nodejs/node/commit/d79ae74f71)] - **(SEMVER-MINOR)** **net**: add CLI option for autoSelectFamilyAttemptTimeout (Paolo Insogna) [#52474](https://github.com/nodejs/node/pull/52474) +- \[[`b17cfea289`](https://github.com/nodejs/node/commit/b17cfea289)] - **node-api**: address coverity report (Michael Dawson) [#52584](https://github.com/nodejs/node/pull/52584) +- \[[`1fca8baac1`](https://github.com/nodejs/node/commit/1fca8baac1)] - **node-api**: copy external type tags when they are set (Niels Martignène) [#52426](https://github.com/nodejs/node/pull/52426) +- \[[`d086ab42a1`](https://github.com/nodejs/node/commit/d086ab42a1)] - **quic**: address recent coverity warnings (Michael Dawson) [#52647](https://github.com/nodejs/node/pull/52647) +- \[[`fb4edf70cf`](https://github.com/nodejs/node/commit/fb4edf70cf)] - **quic**: rework TLSContext, additional cleanups (James M Snell) [#51340](https://github.com/nodejs/node/pull/51340) +- \[[`0c58d0319b`](https://github.com/nodejs/node/commit/0c58d0319b)] - **src**: remove misplaced windows code under posix guard in node.cc (Ali Hassan) [#52545](https://github.com/nodejs/node/pull/52545) +- \[[`e20d2f1de3`](https://github.com/nodejs/node/commit/e20d2f1de3)] - **src**: cast to v8::Value before using v8::EmbedderGraph::V8Node (Joyee Cheung) [#52638](https://github.com/nodejs/node/pull/52638) +- \[[`43fa6a1a45`](https://github.com/nodejs/node/commit/43fa6a1a45)] - **(SEMVER-MINOR)** **src**: add `string_view` overload to snapshot FromBlob (Anna Henningsen) [#52595](https://github.com/nodejs/node/pull/52595) +- \[[`a56faff4d0`](https://github.com/nodejs/node/commit/a56faff4d0)] - **src**: parse inspector profiles with simdjson (Joyee Cheung) [#51783](https://github.com/nodejs/node/pull/51783) +- \[[`ac04c6434a`](https://github.com/nodejs/node/commit/ac04c6434a)] - **src**: remove regex usage for env file parsing (IlyasShabi) [#52406](https://github.com/nodejs/node/pull/52406) +- \[[`f283d27285`](https://github.com/nodejs/node/commit/f283d27285)] - **src**: fix loadEnvFile ENOENT error (mathis-west-1) [#52438](https://github.com/nodejs/node/pull/52438) +- \[[`c6fe433d42`](https://github.com/nodejs/node/commit/c6fe433d42)] - **src,permission**: throw async errors on async APIs (Rafael Gonzaga) [#52730](https://github.com/nodejs/node/pull/52730) +- \[[`9f9eca965a`](https://github.com/nodejs/node/commit/9f9eca965a)] - **stream**: update ongoing promise in async iterator return() method (Mattias Buelens) [#52657](https://github.com/nodejs/node/pull/52657) +- \[[`d568a9a38e`](https://github.com/nodejs/node/commit/d568a9a38e)] - **test**: mark `test-error-serdes` as flaky (Antoine du Hamel) [#52739](https://github.com/nodejs/node/pull/52739) +- \[[`45f7002b90`](https://github.com/nodejs/node/commit/45f7002b90)] - **test**: mark test as flaky (Michael Dawson) [#52671](https://github.com/nodejs/node/pull/52671) +- \[[`10596e20e8`](https://github.com/nodejs/node/commit/10596e20e8)] - **test**: fix backtick usage in docs (Aviv Keller) [#52643](https://github.com/nodejs/node/pull/52643) +- \[[`b2f754c9f1`](https://github.com/nodejs/node/commit/b2f754c9f1)] - **test**: skip test-fs-watch-recursive-delete.js on IBM i (Abdirahim Musse) [#52645](https://github.com/nodejs/node/pull/52645) +- \[[`ed080d868d`](https://github.com/nodejs/node/commit/ed080d868d)] - **test**: ensure that all worker servers are ready (Luigi Pinca) [#52563](https://github.com/nodejs/node/pull/52563) +- \[[`c8c61737e4`](https://github.com/nodejs/node/commit/c8c61737e4)] - **test**: fix test-tls-ticket-cluster.js (Hüseyin Açacak) [#52431](https://github.com/nodejs/node/pull/52431) +- \[[`18aa5d6640`](https://github.com/nodejs/node/commit/18aa5d6640)] - **test**: split wasi poll test for windows (Hüseyin Açacak) [#52538](https://github.com/nodejs/node/pull/52538) +- \[[`e34e0a9ba1`](https://github.com/nodejs/node/commit/e34e0a9ba1)] - **test**: write tests for assertIsArray http2 util (Sinan Sonmez (Chaush)) [#52511](https://github.com/nodejs/node/pull/52511) +- \[[`e247a61d15`](https://github.com/nodejs/node/commit/e247a61d15)] - **(SEMVER-MINOR)** **test_runner**: add --test-skip-pattern cli option (Aviv Keller) [#52529](https://github.com/nodejs/node/pull/52529) +- \[[`e066ba2ae4`](https://github.com/nodejs/node/commit/e066ba2ae4)] - **test_runner**: better error handing for test hook (Alex Yang) [#52401](https://github.com/nodejs/node/pull/52401) +- \[[`328755341d`](https://github.com/nodejs/node/commit/328755341d)] - **test_runner**: don't exceed call stack when filtering (Colin Ihrig) [#52488](https://github.com/nodejs/node/pull/52488) +- \[[`b4ccb6c626`](https://github.com/nodejs/node/commit/b4ccb6c626)] - **test_runner**: move end of work check to finalize() (Colin Ihrig) [#52488](https://github.com/nodejs/node/pull/52488) +- \[[`2ef9380472`](https://github.com/nodejs/node/commit/2ef9380472)] - **tools**: update lint-md-dependencies to rollup\@4.17.0 (Node.js GitHub Bot) [#52729](https://github.com/nodejs/node/pull/52729) +- \[[`db421bdefc`](https://github.com/nodejs/node/commit/db421bdefc)] - **tools**: take co-authors into account in `find-inactive-collaborators` (Antoine du Hamel) [#52669](https://github.com/nodejs/node/pull/52669) +- \[[`01103a85cb`](https://github.com/nodejs/node/commit/01103a85cb)] - **tools**: fix invalid escape sequence in mkssldef (Michaël Zasso) [#52624](https://github.com/nodejs/node/pull/52624) +- \[[`382d951b01`](https://github.com/nodejs/node/commit/382d951b01)] - **tools**: update lint-md-dependencies to rollup\@4.15.0 (Node.js GitHub Bot) [#52617](https://github.com/nodejs/node/pull/52617) +- \[[`f9ddd77ff3`](https://github.com/nodejs/node/commit/f9ddd77ff3)] - **tools**: add lint rule to keep primordials in ASCII order (Antoine du Hamel) [#52592](https://github.com/nodejs/node/pull/52592) +- \[[`552642a498`](https://github.com/nodejs/node/commit/552642a498)] - **tools**: update lint-md-dependencies (Rich Trott) [#52581](https://github.com/nodejs/node/pull/52581) +- \[[`df61feb655`](https://github.com/nodejs/node/commit/df61feb655)] - **tools**: fix heading spaces for osx-entitlements.plist (Jackson Tian) [#52561](https://github.com/nodejs/node/pull/52561) +- \[[`6b4bbfbb1f`](https://github.com/nodejs/node/commit/6b4bbfbb1f)] - **tools**: update lint-md-dependencies to rollup\@4.14.2 vfile-reporter\@8.1.1 (Node.js GitHub Bot) [#52518](https://github.com/nodejs/node/pull/52518) +- \[[`4e5ce3afb7`](https://github.com/nodejs/node/commit/4e5ce3afb7)] - **tools**: use stylistic ESLint plugin for formatting (Michaël Zasso) [#50714](https://github.com/nodejs/node/pull/50714) +- \[[`15c5686381`](https://github.com/nodejs/node/commit/15c5686381)] - **tools**: update minimatch index path (Marco Ippolito) [#52523](https://github.com/nodejs/node/pull/52523) +- \[[`8ae1507ae1`](https://github.com/nodejs/node/commit/8ae1507ae1)] - **tools**: add a linter for README lists (Antoine du Hamel) [#52476](https://github.com/nodejs/node/pull/52476) +- \[[`0b970316bc`](https://github.com/nodejs/node/commit/0b970316bc)] - **typings**: fix invalid JSDoc declarations (Yagiz Nizipli) [#52659](https://github.com/nodejs/node/pull/52659) +- \[[`9b18df9dcb`](https://github.com/nodejs/node/commit/9b18df9dcb)] - **(SEMVER-MINOR)** **url**: implement parse method for safer URL parsing (Ali Hassan) [#52280](https://github.com/nodejs/node/pull/52280) +- \[[`d33131af3a`](https://github.com/nodejs/node/commit/d33131af3a)] - **vm**: fix ASCII-betical order (Aviv Keller) [#52686](https://github.com/nodejs/node/pull/52686) + +Windows 32-bit Installer: https://nodejs.org/dist/v22.1.0/node-v22.1.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v22.1.0/node-v22.1.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v22.1.0/node-v22.1.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v22.1.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v22.1.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v22.1.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v22.1.0/node-v22.1.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v22.1.0/node-v22.1.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v22.1.0/node-v22.1.0.tar.gz \ +Other release files: https://nodejs.org/dist/v22.1.0/ \ +Documentation: https://nodejs.org/docs/v22.1.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +5a6ddbc1fb0035bc7fa76e8da108b7a9866b47ea2a9f34225ddc6aac2c9007a3 node-v22.1.0-aix-ppc64.tar.gz +5c0d1008bb8a2653f25d162fe9af6fdb264ab8e61a784a52eed5a84077269fae node-v22.1.0-arm64.msi +93904abf2b6afd0dc2a7c2947a83e10ed65cc39171db17663edb6f763aaa5a57 node-v22.1.0-darwin-arm64.tar.gz +f3222c15342919f16516e1d409dc885d4e448e4ce386ca6552f6d96c8a6d496b node-v22.1.0-darwin-arm64.tar.xz +3a2c351b3eeeb4d12dee978f93f8f510589384b66a09feb903b609a58cf1bb5b node-v22.1.0-darwin-x64.tar.gz +3e5bf773f01cdb9d03e12d89393ef12dee200c073163c82bc2eddffa36869747 node-v22.1.0-darwin-x64.tar.xz +5c00fa0f18d75c39a4a1068833999cc02620e467877e65ea59ecfaa092dc686a node-v22.1.0-headers.tar.gz +b2f2319803f4dde2c1e4ab2d6040680eedc98b76336a10019801f85b2c50b398 node-v22.1.0-headers.tar.xz +9c111af1f951e8869615bca3601ce7ab6969374933bdba6397469843b808f222 node-v22.1.0-linux-arm64.tar.gz +030fc4d4cfdd2a2dc5f19aa577bf3dadbc042363b28e0ef66b1e7c8072e7445e node-v22.1.0-linux-arm64.tar.xz +e2d46a045ab4e14e7234162c8167bed96c71ac82fbfae1feac21d77ea44c62d0 node-v22.1.0-linux-armv7l.tar.gz +48f197fa1ae7ad80f01c759ef0d91bb637f09cb04f7fa2eb57c7de79b2cf7bbd node-v22.1.0-linux-armv7l.tar.xz +df47c5506bc865b093cfa0411b4adbb66187da00decd05a83c22b9d5ffdca088 node-v22.1.0-linux-ppc64le.tar.gz +9cfbb9d64c51aa238a8f4697faeb71ccf846155f3a0b9f5acb686a8f3554eb07 node-v22.1.0-linux-ppc64le.tar.xz +1961314d0d51cf9c4719705ba809f8451597c577dfb0cb500a058115a05d586a node-v22.1.0-linux-s390x.tar.gz +da9d2f03bdaec5233adc360e517b8f4c2ebe283a9737f9065c829362b31c04de node-v22.1.0-linux-s390x.tar.xz +d8ae35a9e2bb0c0c0611ee9bacf564ea51cc8291ace1447f95ee6aeaf4f1d61d node-v22.1.0-linux-x64.tar.gz +22330ad3a1796ac30d75fab6f98cbe2b883239d4e31c2a52ec8f4e6cc52ace54 node-v22.1.0-linux-x64.tar.xz +969680f15ac27f88197735b18bc4d60b1b275a1b30dd6fb16104c5126d199a00 node-v22.1.0.pkg +1179664c69612f3f67df6fac32008df31f92e28c61d57c1e3297b84ea8879b5b node-v22.1.0.tar.gz +9d7d5f40d9dbd6260c99b5e494b5f9bc755e8f0ffac70e121adce5fb442f23cb node-v22.1.0.tar.xz +0a3d5932ff8d7aac36d5d763feb5de1da442a56ff7378222d9840d77e0db8b62 node-v22.1.0-win-arm64.7z +d32cf67728183026a236256ae488b27b77daa13c2faca83328dc5d188718ecdf node-v22.1.0-win-arm64.zip +c3c57c78d3a5fbd223a6e17efc3052c5eee19e827a591148d7e5f68cf98e504b node-v22.1.0-win-x64.7z +4b0f90bc3f1f41df16f9022ecded0c4eff55f8c3ece66ba348275c69fea4eb8e node-v22.1.0-win-x64.zip +d1933f9813da34fdef20a1c2c8e82fa735ec96c503ecd818795ad8fab4a92d08 node-v22.1.0-win-x86.7z +3db474ecb74ab91ed7a2edc282a9ee77e297db00afad150a7fe33f24c2181c7c node-v22.1.0-win-x86.zip +bae87f5171ec151846dff560dd78230e568b56151fd1bde41a1c7e9178d840e7 node-v22.1.0-x64.msi +7496b237a0ff72b120d7ce2f90d2c75dae85b128dd0c0c16c2536d1e7fa519cd node-v22.1.0-x86.msi +b424b2c9485e39ec031ef01f1fcbdc736e9d57b05b93a135fb723afc052e52bc win-arm64/node.exe +b552cb4f049fd4ce7b791ff9ab3964d5dfed118a737b0ac3ff67dad21c7de129 win-arm64/node.lib +d4e0f343358bab4d08309aec6d5d7531c253c34b187e0d5c9d9528b6f8a3115f win-arm64/node_pdb.7z +a75e9e3857acb8b13102c30f1eba8268a4531fd0eae94c185b5a5b2d004df20b win-arm64/node_pdb.zip +80db531026ff474745f03beb98f28c51914e0202e58cd87a1104f71ed0d8b118 win-x64/node.exe +7e8534fb900597f0d66c41bcae423f0bfe23290b09f20bb57cd07c2622db4ec4 win-x64/node.lib +10e8dd46f0d9b7a69ba73a38f45b7a866e4077a80a219489e5cfe820f1174db3 win-x64/node_pdb.7z +408fd5b2a28339051e0ce2830b4dc1ddfa2c4944abb24837644efaa8d78d8f96 win-x64/node_pdb.zip +cd6f3255b1ca77ed4dd81e56184329e5bf2a68c54152a93490c3f3e896bfc906 win-x86/node.exe +0f5f7f3178e3c605ecc460ed2157a7e02157c283cbf0274284e4258f3378135c win-x86/node.lib +e3eea39004ec58042bb46e80cd65286e4a8f34c484cb8c13bdaa3f7a74fff7ae win-x86/node_pdb.7z +3c3562e258ad58a271fc408ece941e6162f8a3e48a9e94818c44d2a93cbce726 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEj8yhP+8dDC6RAI4Jdw96mlrhVgAFAmYzpEQACgkQdw96mlrh +VgAX5w//fbVnd5ZJvNTCkLGLxgDAPmwcJ5hsHgbKbcrxksH6ZU1GFDA9faQaNY7I +ORIna3i3xd4aqQBYwL7cscEAnt0qy+wUDSxvZ/ymN0PVRGrVe2y/KbJUK7bK1IkR +36HgoukTdqTvZm4nN3uvinL60RrIZP+W/+hyhOmMEBx1yonqJlw3Ampwxakod5In +GN8Z+ASmDBFgtc0oG4ZuK+yc9Y4v9I2V1O9fkcGixJwYpqOXNOlHDjanciKDaqNA +sVwpJ1YJsvfSL0oiEDLX1n3H4ahOxHnpzJAsvt5lnBTAQgP3F1m/C5i+YKchbwG9 +zGMUBavX48NP0CkyykXFM0ikF5dxsLQlClVyPMsx3lgPLg9wI+dW0lEFvZFUG8lw +Znlr3veCvhC/ifdHr5snDwsjGPQiPl7dYV8FHO7apSKMC1yehKbDu/Qzj7+3mqGz +/8BMzh1iasSYrkD9PWfOMKFWP0uvf9z+zwOlTp9A3UgT+VCb/rU2hiLFx1fLWt2B +qEO5x3TCmAGHF5KG/m8smXb+wTarUa3YuBoEDBP+bC/E8S+vX90LSeCixUrcS0oF +epUSp1oiShKmaOtn7ltLuSr6FrG6URQZpWolQeEg+DHvNE28V+/jA2msULXR+EBT +XHgFFmFdVI0HgtsLfw9PQlf+/79YKVoRJEoOULfab6hNPXdJpGA= +=230W +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v22.2.0.md b/pages/en/blog/release/v22.2.0.md new file mode 100644 index 0000000000000..c26ad5753efbb --- /dev/null +++ b/pages/en/blog/release/v22.2.0.md @@ -0,0 +1,253 @@ +--- +date: '2024-05-15T19:25:43.852Z' +category: release +title: Node v22.2.0 (Current) +layout: blog-post +author: Michaël Zasso +--- + +## 2024-05-15, Version 22.2.0 (Current), @targos + +### Notable Changes + +- \[[`fb85d38e80`](https://github.com/nodejs/node/commit/fb85d38e80)] - **(SEMVER-MINOR)** **cli**: allow running wasm in limited vmem with --disable-wasm-trap-handler (Joyee Cheung) [#52766](https://github.com/nodejs/node/pull/52766) +- \[[`23a0d3339f`](https://github.com/nodejs/node/commit/23a0d3339f)] - **doc**: add pimterry to collaborators (Tim Perry) [#52874](https://github.com/nodejs/node/pull/52874) +- \[[`7d7a762156`](https://github.com/nodejs/node/commit/7d7a762156)] - **(SEMVER-MINOR)** **fs**: allow 'withFileTypes' to be used with globs (Aviv Keller) [#52837](https://github.com/nodejs/node/pull/52837) +- \[[`8748dd6477`](https://github.com/nodejs/node/commit/8748dd6477)] - **(SEMVER-MINOR)** **inspector**: introduce the `--inspect-wait` flag (Kohei Ueno) [#52734](https://github.com/nodejs/node/pull/52734) +- \[[`9a7ae9b6c4`](https://github.com/nodejs/node/commit/9a7ae9b6c4)] - **lib,src**: remove --experimental-policy (Rafael Gonzaga) [#52583](https://github.com/nodejs/node/pull/52583) +- \[[`1f7c2a93fc`](https://github.com/nodejs/node/commit/1f7c2a93fc)] - **(SEMVER-MINOR)** **perf_hooks**: add `deliveryType` and `responseStatus` fields (Matthew Aitken) [#51589](https://github.com/nodejs/node/pull/51589) +- \[[`2f59529dc5`](https://github.com/nodejs/node/commit/2f59529dc5)] - **(SEMVER-MINOR)** **test_runner**: support test plans (Colin Ihrig) [#52860](https://github.com/nodejs/node/pull/52860) +- \[[`6b4dac3eb5`](https://github.com/nodejs/node/commit/6b4dac3eb5)] - **(SEMVER-MINOR)** **zlib**: expose zlib.crc32() (Joyee Cheung) [#52692](https://github.com/nodejs/node/pull/52692) + +### Commits + +- \[[`0f5716c364`](https://github.com/nodejs/node/commit/0f5716c364)] - **assert**: add deep equal check for more Error type (Zhenwei Jin) [#51805](https://github.com/nodejs/node/pull/51805) +- \[[`2c7d7caa8a`](https://github.com/nodejs/node/commit/2c7d7caa8a)] - **benchmark**: filter non-present deps from `start-cli-version` (Adam Majer) [#51746](https://github.com/nodejs/node/pull/51746) +- \[[`5db4c54bd6`](https://github.com/nodejs/node/commit/5db4c54bd6)] - **bootstrap**: print `--help` message using `console.log` (Jacob Hummer) [#51463](https://github.com/nodejs/node/pull/51463) +- \[[`67fcb6b85e`](https://github.com/nodejs/node/commit/67fcb6b85e)] - **buffer**: even faster atob (Daniel Lemire) [#52443](https://github.com/nodejs/node/pull/52443) +- \[[`a5d63f9052`](https://github.com/nodejs/node/commit/a5d63f9052)] - **buffer**: use size_t instead of uint32_t to avoid segmentation fault (Xavier Stouder) [#48033](https://github.com/nodejs/node/pull/48033) +- \[[`f1bc994826`](https://github.com/nodejs/node/commit/f1bc994826)] - **buffer**: remove lines setting indexes to integer value (Zhenwei Jin) [#52588](https://github.com/nodejs/node/pull/52588) +- \[[`a97ff753ab`](https://github.com/nodejs/node/commit/a97ff753ab)] - **build**: add option to enable clang-cl on Windows (Michaël Zasso) [#52870](https://github.com/nodejs/node/pull/52870) +- \[[`f96466a92c`](https://github.com/nodejs/node/commit/f96466a92c)] - **build**: enable building with shared uvwasi lib (Pooja D P) [#43987](https://github.com/nodejs/node/pull/43987) +- \[[`b463385aa8`](https://github.com/nodejs/node/commit/b463385aa8)] - **build**: remove deprecated calls for argument groups (Mohammed Keyvanzadeh) [#52913](https://github.com/nodejs/node/pull/52913) +- \[[`daeb7dbb3e`](https://github.com/nodejs/node/commit/daeb7dbb3e)] - **build**: sync V8 warning cflags with BUILD.gn (Michaël Zasso) [#52873](https://github.com/nodejs/node/pull/52873) +- \[[`eed967430d`](https://github.com/nodejs/node/commit/eed967430d)] - **build**: harmonize Clang checks (Michaël Zasso) [#52873](https://github.com/nodejs/node/pull/52873) +- \[[`e4b187433d`](https://github.com/nodejs/node/commit/e4b187433d)] - **build**: compile with C++20 support (Michaël Zasso) [#52838](https://github.com/nodejs/node/pull/52838) +- \[[`aea6ca25ba`](https://github.com/nodejs/node/commit/aea6ca25ba)] - **build**: drop base64 dep in GN build (Cheng) [#52856](https://github.com/nodejs/node/pull/52856) +- \[[`7f866a8225`](https://github.com/nodejs/node/commit/7f866a8225)] - **build**: make simdjson a public dep in GN build (Cheng) [#52755](https://github.com/nodejs/node/pull/52755) +- \[[`e1bd53c098`](https://github.com/nodejs/node/commit/e1bd53c098)] - **build**: define `NOMINMAX` in common.gypi (Chengzhong Wu) [#52794](https://github.com/nodejs/node/pull/52794) +- \[[`18c530f8f7`](https://github.com/nodejs/node/commit/18c530f8f7)] - **build, tools**: copy release assets to staging R2 bucket once built (flakey5) [#51394](https://github.com/nodejs/node/pull/51394) +- \[[`fb85d38e80`](https://github.com/nodejs/node/commit/fb85d38e80)] - **(SEMVER-MINOR)** **cli**: allow running wasm in limited vmem with --disable-wasm-trap-handler (Joyee Cheung) [#52766](https://github.com/nodejs/node/pull/52766) +- \[[`11e978916f`](https://github.com/nodejs/node/commit/11e978916f)] - **cluster**: replace `forEach` with `for-of` loop (Jérôme Benoit) [#50317](https://github.com/nodejs/node/pull/50317) +- \[[`db76c58d68`](https://github.com/nodejs/node/commit/db76c58d68)] - **console**: colorize console error and warn (Jithil P Ponnan) [#51629](https://github.com/nodejs/node/pull/51629) +- \[[`0d040a3035`](https://github.com/nodejs/node/commit/0d040a3035)] - **crypto**: fix duplicated switch-case return values (Mustafa Ateş UZUN) [#49030](https://github.com/nodejs/node/pull/49030) +- \[[`ab7219f0b2`](https://github.com/nodejs/node/commit/ab7219f0b2)] - **deps**: update googletest to fa6de7f (Node.js GitHub Bot) [#52949](https://github.com/nodejs/node/pull/52949) +- \[[`4ab096eccc`](https://github.com/nodejs/node/commit/4ab096eccc)] - **deps**: update simdjson to 3.9.2 (Node.js GitHub Bot) [#52947](https://github.com/nodejs/node/pull/52947) +- \[[`89f275b1df`](https://github.com/nodejs/node/commit/89f275b1df)] - **deps**: update corepack to 0.28.1 (Node.js GitHub Bot) [#52946](https://github.com/nodejs/node/pull/52946) +- \[[`fc568b4b42`](https://github.com/nodejs/node/commit/fc568b4b42)] - **deps**: update simdutf to 5.2.8 (Node.js GitHub Bot) [#52727](https://github.com/nodejs/node/pull/52727) +- \[[`e399360182`](https://github.com/nodejs/node/commit/e399360182)] - **deps**: update simdutf to 5.2.6 (Node.js GitHub Bot) [#52727](https://github.com/nodejs/node/pull/52727) +- \[[`232831f013`](https://github.com/nodejs/node/commit/232831f013)] - **deps**: enable unbundling of simdjson, simdutf, ada (Daniel Lemire) [#52924](https://github.com/nodejs/node/pull/52924) +- \[[`7ca83a5abc`](https://github.com/nodejs/node/commit/7ca83a5abc)] - **deps**: update googletest to 2d16ed0 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`3b15eb5911`](https://github.com/nodejs/node/commit/3b15eb5911)] - **deps**: update googletest to d83fee1 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`4190d70035`](https://github.com/nodejs/node/commit/4190d70035)] - **deps**: update googletest to 5a37b51 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`7a166a2871`](https://github.com/nodejs/node/commit/7a166a2871)] - **deps**: update googletest to 5197b1a (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`812dbd749f`](https://github.com/nodejs/node/commit/812dbd749f)] - **deps**: update googletest to eff443c (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`cb3ae4b9ef`](https://github.com/nodejs/node/commit/cb3ae4b9ef)] - **deps**: update googletest to c231e6f (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`d97317aaa1`](https://github.com/nodejs/node/commit/d97317aaa1)] - **deps**: update googletest to e4fdb87 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`ad8ca1259f`](https://github.com/nodejs/node/commit/ad8ca1259f)] - **deps**: update googletest to 5df0241 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`828f0d7096`](https://github.com/nodejs/node/commit/828f0d7096)] - **deps**: update googletest to b75ecf1 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`3b60dbcf7b`](https://github.com/nodejs/node/commit/3b60dbcf7b)] - **deps**: update googletest to 4565741 (Node.js GitHub Bot) [#51657](https://github.com/nodejs/node/pull/51657) +- \[[`37098eb880`](https://github.com/nodejs/node/commit/37098eb880)] - **deps**: update simdjson to 3.9.1 (Node.js GitHub Bot) [#52397](https://github.com/nodejs/node/pull/52397) +- \[[`a13cf1c049`](https://github.com/nodejs/node/commit/a13cf1c049)] - **deps**: update uvwasi to 0.0.21 (Node.js GitHub Bot) [#52863](https://github.com/nodejs/node/pull/52863) +- \[[`faf8ada719`](https://github.com/nodejs/node/commit/faf8ada719)] - **deps**: V8: cherry-pick f6bef09b3b0a (Richard Lau) [#52802](https://github.com/nodejs/node/pull/52802) +- \[[`8e5844c2a4`](https://github.com/nodejs/node/commit/8e5844c2a4)] - **doc**: remove reference to AUTHORS file (Marco Ippolito) [#52960](https://github.com/nodejs/node/pull/52960) +- \[[`1f3634e30f`](https://github.com/nodejs/node/commit/1f3634e30f)] - **doc**: update hljs with the latest styles (Aviv Keller) [#52911](https://github.com/nodejs/node/pull/52911) +- \[[`9102255749`](https://github.com/nodejs/node/commit/9102255749)] - **doc**: mention quicker way to build docs (Alex Crawford) [#52937](https://github.com/nodejs/node/pull/52937) +- \[[`15db3ef5fb`](https://github.com/nodejs/node/commit/15db3ef5fb)] - **doc**: mention push.followTags config (Rafael Gonzaga) [#52906](https://github.com/nodejs/node/pull/52906) +- \[[`80fa675af2`](https://github.com/nodejs/node/commit/80fa675af2)] - **doc**: document pipeline with `end` option (Alois Klink) [#48970](https://github.com/nodejs/node/pull/48970) +- \[[`c0000f4118`](https://github.com/nodejs/node/commit/c0000f4118)] - **doc**: add example for `execFileSync` method and ref to stdio (Evan Shortiss) [#39412](https://github.com/nodejs/node/pull/39412) +- \[[`e0148e2653`](https://github.com/nodejs/node/commit/e0148e2653)] - **doc**: add examples and notes to http server.close et al (mary marchini) [#49091](https://github.com/nodejs/node/pull/49091) +- \[[`030f56ee6d`](https://github.com/nodejs/node/commit/030f56ee6d)] - **doc**: fix `dns.lookup` family `0` and `all` descriptions (Adam Jones) [#51653](https://github.com/nodejs/node/pull/51653) +- \[[`a6d624cd5a`](https://github.com/nodejs/node/commit/a6d624cd5a)] - **doc**: update `fs.realpath` documentation (sinkhaha) [#48170](https://github.com/nodejs/node/pull/48170) +- \[[`5dab187ca8`](https://github.com/nodejs/node/commit/5dab187ca8)] - **doc**: update fs read documentation for clarity (Mert Can Altin) [#52453](https://github.com/nodejs/node/pull/52453) +- \[[`5d3ee7205d`](https://github.com/nodejs/node/commit/5d3ee7205d)] - **doc**: watermark string behavior (Benjamin Gruenbaum) [#52842](https://github.com/nodejs/node/pull/52842) +- \[[`2dd8f092a8`](https://github.com/nodejs/node/commit/2dd8f092a8)] - **doc**: exclude commits with baking-for-lts (Marco Ippolito) [#52896](https://github.com/nodejs/node/pull/52896) +- \[[`0c2539b913`](https://github.com/nodejs/node/commit/0c2539b913)] - **doc**: add names next to release key bash commands (Aviv Keller) [#52878](https://github.com/nodejs/node/pull/52878) +- \[[`23a0d3339f`](https://github.com/nodejs/node/commit/23a0d3339f)] - **doc**: add pimterry to collaborators (Tim Perry) [#52874](https://github.com/nodejs/node/pull/52874) +- \[[`15aad62e0c`](https://github.com/nodejs/node/commit/15aad62e0c)] - **doc**: update BUILDING.md previous versions links (Michaël Zasso) [#52852](https://github.com/nodejs/node/pull/52852) +- \[[`f770a993d4`](https://github.com/nodejs/node/commit/f770a993d4)] - **doc**: add more definitions to GLOSSARY.md (Aviv Keller) [#52798](https://github.com/nodejs/node/pull/52798) +- \[[`f35b838a65`](https://github.com/nodejs/node/commit/f35b838a65)] - **doc**: make docs more welcoming and descriptive for newcomers (Serkan Özel) [#38056](https://github.com/nodejs/node/pull/38056) +- \[[`562a019a14`](https://github.com/nodejs/node/commit/562a019a14)] - **doc**: add OpenSSL errors to API docs (John Lamp) [#34213](https://github.com/nodejs/node/pull/34213) +- \[[`0cb7cf7aa9`](https://github.com/nodejs/node/commit/0cb7cf7aa9)] - **doc**: fix grammatical mistake (codershiba) [#52808](https://github.com/nodejs/node/pull/52808) +- \[[`a0147ff8d0`](https://github.com/nodejs/node/commit/a0147ff8d0)] - **doc**: simplify copy-pasting of `branch-diff` commands (Antoine du Hamel) [#52757](https://github.com/nodejs/node/pull/52757) +- \[[`fce31fc829`](https://github.com/nodejs/node/commit/fce31fc829)] - **doc**: add test_runner to subsystem (Raz Luvaton) [#52774](https://github.com/nodejs/node/pull/52774) +- \[[`ca5607bbc8`](https://github.com/nodejs/node/commit/ca5607bbc8)] - **events**: update MaxListenersExceededWarning message log (sinkhaha) [#51921](https://github.com/nodejs/node/pull/51921) +- \[[`96566fc696`](https://github.com/nodejs/node/commit/96566fc696)] - **events**: add stop propagation flag to `Event.stopImmediatePropagation` (Mickael Meausoone) [#39463](https://github.com/nodejs/node/pull/39463) +- \[[`5ee69243ed`](https://github.com/nodejs/node/commit/5ee69243ed)] - **events**: replace NodeCustomEvent with CustomEvent (Feng Yu) [#43876](https://github.com/nodejs/node/pull/43876) +- \[[`f076e721cb`](https://github.com/nodejs/node/commit/f076e721cb)] - **fs**: keep fs.promises.readFile read until EOF is reached (Zhenwei Jin) [#52178](https://github.com/nodejs/node/pull/52178) +- \[[`7d7a762156`](https://github.com/nodejs/node/commit/7d7a762156)] - **(SEMVER-MINOR)** **fs**: allow 'withFileTypes' to be used with globs (Aviv Keller) [#52837](https://github.com/nodejs/node/pull/52837) +- \[[`ad9c4bddb1`](https://github.com/nodejs/node/commit/ad9c4bddb1)] - **http**: correctly translate HTTP method (Paolo Insogna) [#52701](https://github.com/nodejs/node/pull/52701) +- \[[`8748dd6477`](https://github.com/nodejs/node/commit/8748dd6477)] - **(SEMVER-MINOR)** **inspector**: introduce the `--inspect-wait` flag (Kohei Ueno) [#52734](https://github.com/nodejs/node/pull/52734) +- \[[`9a7ae9b6c4`](https://github.com/nodejs/node/commit/9a7ae9b6c4)] - **lib,src**: remove --experimental-policy (Rafael Gonzaga) [#52583](https://github.com/nodejs/node/pull/52583) +- \[[`a850219600`](https://github.com/nodejs/node/commit/a850219600)] - **meta**: move `@anonrig` to TSC regular member (Yagiz Nizipli) [#52932](https://github.com/nodejs/node/pull/52932) +- \[[`4dc8a387b3`](https://github.com/nodejs/node/commit/4dc8a387b3)] - **meta**: add mailmap entry for legendecas (Chengzhong Wu) [#52795](https://github.com/nodejs/node/pull/52795) +- \[[`d10182d81d`](https://github.com/nodejs/node/commit/d10182d81d)] - **meta**: bump actions/checkout from 4.1.1 to 4.1.4 (dependabot\[bot]) [#52787](https://github.com/nodejs/node/pull/52787) +- \[[`48d0ac0665`](https://github.com/nodejs/node/commit/48d0ac0665)] - **meta**: bump github/codeql-action from 3.24.9 to 3.25.3 (dependabot\[bot]) [#52786](https://github.com/nodejs/node/pull/52786) +- \[[`7c7a25150e`](https://github.com/nodejs/node/commit/7c7a25150e)] - **meta**: bump actions/upload-artifact from 4.3.1 to 4.3.3 (dependabot\[bot]) [#52785](https://github.com/nodejs/node/pull/52785) +- \[[`d9abf18342`](https://github.com/nodejs/node/commit/d9abf18342)] - **meta**: bump actions/download-artifact from 4.1.4 to 4.1.7 (dependabot\[bot]) [#52784](https://github.com/nodejs/node/pull/52784) +- \[[`590e5c6c45`](https://github.com/nodejs/node/commit/590e5c6c45)] - **meta**: bump codecov/codecov-action from 4.1.1 to 4.3.1 (dependabot\[bot]) [#52783](https://github.com/nodejs/node/pull/52783) +- \[[`b3d1720515`](https://github.com/nodejs/node/commit/b3d1720515)] - **meta**: bump step-security/harden-runner from 2.7.0 to 2.7.1 (dependabot\[bot]) [#52782](https://github.com/nodejs/node/pull/52782) +- \[[`f74beb53de`](https://github.com/nodejs/node/commit/f74beb53de)] - **module**: cache synchronous module jobs before linking (Joyee Cheung) [#52868](https://github.com/nodejs/node/pull/52868) +- \[[`8fbf6628d6`](https://github.com/nodejs/node/commit/8fbf6628d6)] - **module**: have a single hooks thread for all workers (Gabriel Bota) [#52706](https://github.com/nodejs/node/pull/52706) +- \[[`609d90bb4b`](https://github.com/nodejs/node/commit/609d90bb4b)] - **path**: fix toNamespacedPath on Windows (Hüseyin Açacak) [#52915](https://github.com/nodejs/node/pull/52915) +- \[[`1f7c2a93fc`](https://github.com/nodejs/node/commit/1f7c2a93fc)] - **(SEMVER-MINOR)** **perf_hooks**: add `deliveryType` and `responseStatus` fields (Matthew Aitken) [#51589](https://github.com/nodejs/node/pull/51589) +- \[[`0bbc62c42a`](https://github.com/nodejs/node/commit/0bbc62c42a)] - **process**: improve event-loop (Aras Abbasi) [#52108](https://github.com/nodejs/node/pull/52108) +- \[[`619ac79abb`](https://github.com/nodejs/node/commit/619ac79abb)] - **quic**: address coverity warning (Michael Dawson) [#52824](https://github.com/nodejs/node/pull/52824) +- \[[`04de5766ee`](https://github.com/nodejs/node/commit/04de5766ee)] - **repl**: fix disruptive autocomplete without inspector (Nitzan Uziely) [#40661](https://github.com/nodejs/node/pull/40661) +- \[[`663bb973ab`](https://github.com/nodejs/node/commit/663bb973ab)] - **src**: fix Worker termination in `inspector.waitForDebugger` (Daeyeon Jeong) [#52527](https://github.com/nodejs/node/pull/52527) +- \[[`fca38b2d6e`](https://github.com/nodejs/node/commit/fca38b2d6e)] - **src**: use `S_ISDIR` to check if the file is a directory (theanarkh) [#52164](https://github.com/nodejs/node/pull/52164) +- \[[`b228db579f`](https://github.com/nodejs/node/commit/b228db579f)] - **src**: allow preventing debug signal handler start (Shelley Vohr) [#46681](https://github.com/nodejs/node/pull/46681) +- \[[`ace65a9aac`](https://github.com/nodejs/node/commit/ace65a9aac)] - **src**: make sure pass the `argv` to worker threads (theanarkh) [#52827](https://github.com/nodejs/node/pull/52827) +- \[[`75004d32ab`](https://github.com/nodejs/node/commit/75004d32ab)] - **src**: fix typo Unabled -> Unable (Simon Siefke) [#52820](https://github.com/nodejs/node/pull/52820) +- \[[`c40a8273ef`](https://github.com/nodejs/node/commit/c40a8273ef)] - **src**: avoid unused variable 'error' warning (Michaël Zasso) [#52886](https://github.com/nodejs/node/pull/52886) +- \[[`d169d0f181`](https://github.com/nodejs/node/commit/d169d0f181)] - **src**: fix positional args in task runner (Yagiz Nizipli) [#52810](https://github.com/nodejs/node/pull/52810) +- \[[`9c76c95c10`](https://github.com/nodejs/node/commit/9c76c95c10)] - **src**: only apply fix in main thread (Paolo Insogna) [#52702](https://github.com/nodejs/node/pull/52702) +- \[[`e1cba97df3`](https://github.com/nodejs/node/commit/e1cba97df3)] - **src**: fix test local edge case (Paolo Insogna) [#52702](https://github.com/nodejs/node/pull/52702) +- \[[`dc41c135d7`](https://github.com/nodejs/node/commit/dc41c135d7)] - **src**: reduce unnecessary serialization of CLI options in C++ (Joyee Cheung) [#52451](https://github.com/nodejs/node/pull/52451) +- \[[`fb24c4475c`](https://github.com/nodejs/node/commit/fb24c4475c)] - **src**: rewrite task runner in c++ (Yagiz Nizipli) [#52609](https://github.com/nodejs/node/pull/52609) +- \[[`323f95de9e`](https://github.com/nodejs/node/commit/323f95de9e)] - **src**: migrate to new V8 interceptors API (Michaël Zasso) [#52745](https://github.com/nodejs/node/pull/52745) +- \[[`850ff02931`](https://github.com/nodejs/node/commit/850ff02931)] - **src,permission**: resolve path on fs_permission (Rafael Gonzaga) [#52761](https://github.com/nodejs/node/pull/52761) +- \[[`8d3b0b7ade`](https://github.com/nodejs/node/commit/8d3b0b7ade)] - **stream**: use `ByteLengthQueuingStrategy` when not in `objectMode` (Jason) [#48847](https://github.com/nodejs/node/pull/48847) +- \[[`fa715437b0`](https://github.com/nodejs/node/commit/fa715437b0)] - **stream**: fix util.inspect for compression/decompressionStream (Mert Can Altin) [#52283](https://github.com/nodejs/node/pull/52283) +- \[[`b0e6a6b3d5`](https://github.com/nodejs/node/commit/b0e6a6b3d5)] - **string_decoder**: throw an error when writing a too long buffer (zhenweijin) [#52215](https://github.com/nodejs/node/pull/52215) +- \[[`e016e952e6`](https://github.com/nodejs/node/commit/e016e952e6)] - **test**: add `Debugger.setInstrumentationBreakpoint` known issue (Konstantin Ulitin) [#31137](https://github.com/nodejs/node/pull/31137) +- \[[`a589de0886`](https://github.com/nodejs/node/commit/a589de0886)] - **test**: use `for-of` instead of `forEach` (Gibby Free) [#49790](https://github.com/nodejs/node/pull/49790) +- \[[`578868ddf8`](https://github.com/nodejs/node/commit/578868ddf8)] - **test**: verify request payload is uploaded consistently (Austin Wright) [#34066](https://github.com/nodejs/node/pull/34066) +- \[[`c676e522e6`](https://github.com/nodejs/node/commit/c676e522e6)] - **test**: add fuzzer for native/js string conversion (Adam Korczynski) [#51120](https://github.com/nodejs/node/pull/51120) +- \[[`5f6415b41d`](https://github.com/nodejs/node/commit/5f6415b41d)] - **test**: add fuzzer for `ClientHelloParser` (AdamKorcz) [#51088](https://github.com/nodejs/node/pull/51088) +- \[[`4d50d51a5e`](https://github.com/nodejs/node/commit/4d50d51a5e)] - **test**: fix broken env fuzzer by initializing process (AdamKorcz) [#51080](https://github.com/nodejs/node/pull/51080) +- \[[`cd00cdcbc8`](https://github.com/nodejs/node/commit/cd00cdcbc8)] - **test**: replace `forEach()` in `test-stream-pipe-unpipe-stream` (Dario) [#50786](https://github.com/nodejs/node/pull/50786) +- \[[`5469adf458`](https://github.com/nodejs/node/commit/5469adf458)] - **test**: test pipeline `end` on transform streams (Alois Klink) [#48970](https://github.com/nodejs/node/pull/48970) +- \[[`ea6070b0e8`](https://github.com/nodejs/node/commit/ea6070b0e8)] - **test**: improve coverage of lib/readline.js (Rongjian Zhang) [#38646](https://github.com/nodejs/node/pull/38646) +- \[[`4f96b00307`](https://github.com/nodejs/node/commit/4f96b00307)] - **test**: updated for each to for of in test file (lyannel) [#50308](https://github.com/nodejs/node/pull/50308) +- \[[`5d91cf1976`](https://github.com/nodejs/node/commit/5d91cf1976)] - **test**: move `test-http-server-request-timeouts-mixed` to sequential (Madhuri) [#45722](https://github.com/nodejs/node/pull/45722) +- \[[`f47e8fccbb`](https://github.com/nodejs/node/commit/f47e8fccbb)] - **test**: fix DNS cancel tests (Szymon Marczak) [#44432](https://github.com/nodejs/node/pull/44432) +- \[[`0b073f885a`](https://github.com/nodejs/node/commit/0b073f885a)] - **test**: add http agent to `executionAsyncResource` (psj-tar-gz) [#34966](https://github.com/nodejs/node/pull/34966) +- \[[`fbce3178ba`](https://github.com/nodejs/node/commit/fbce3178ba)] - **test**: reduce memory usage of test-worker-stdio (Adam Majer) [#37769](https://github.com/nodejs/node/pull/37769) +- \[[`1f8eaec454`](https://github.com/nodejs/node/commit/1f8eaec454)] - **test**: add common.expectRequiredModule() (Joyee Cheung) [#52868](https://github.com/nodejs/node/pull/52868) +- \[[`5e731da572`](https://github.com/nodejs/node/commit/5e731da572)] - **test**: skip unstable shadow realm gc tests (Chengzhong Wu) [#52855](https://github.com/nodejs/node/pull/52855) +- \[[`30a35ae522`](https://github.com/nodejs/node/commit/30a35ae522)] - **test**: crypto-rsa-dsa testing for dynamic openssl (Michael Dawson) [#52781](https://github.com/nodejs/node/pull/52781) +- \[[`968fe6a8b1`](https://github.com/nodejs/node/commit/968fe6a8b1)] - **test**: skip some console tests on dumb terminal (Adam Majer) [#37770](https://github.com/nodejs/node/pull/37770) +- \[[`1448959e0d`](https://github.com/nodejs/node/commit/1448959e0d)] - **test**: skip v8-updates/test-linux-perf-logger (Michaël Zasso) [#52821](https://github.com/nodejs/node/pull/52821) +- \[[`30a4248b48`](https://github.com/nodejs/node/commit/30a4248b48)] - **test**: add env variable test for --run (Yagiz Nizipli) [#52811](https://github.com/nodejs/node/pull/52811) +- \[[`edb4ed3bc9`](https://github.com/nodejs/node/commit/edb4ed3bc9)] - **test**: drop test-crypto-timing-safe-equal-benchmarks (Rafael Gonzaga) [#52751](https://github.com/nodejs/node/pull/52751) +- \[[`944ae598b5`](https://github.com/nodejs/node/commit/944ae598b5)] - **test, crypto**: use correct object on assert (响马) [#51820](https://github.com/nodejs/node/pull/51820) +- \[[`a814e720fa`](https://github.com/nodejs/node/commit/a814e720fa)] - **test_runner**: fix watch mode race condition (Moshe Atlow) [#52954](https://github.com/nodejs/node/pull/52954) +- \[[`2f59529dc5`](https://github.com/nodejs/node/commit/2f59529dc5)] - **(SEMVER-MINOR)** **test_runner**: support test plans (Colin Ihrig) [#52860](https://github.com/nodejs/node/pull/52860) +- \[[`3267b3c063`](https://github.com/nodejs/node/commit/3267b3c063)] - **test_runner**: display failed test stack trace with dot reporter (Mihir Bhansali) [#52655](https://github.com/nodejs/node/pull/52655) +- \[[`b96868b4e7`](https://github.com/nodejs/node/commit/b96868b4e7)] - **test_runner**: preserve hook promise when executed twice (Moshe Atlow) [#52791](https://github.com/nodejs/node/pull/52791) +- \[[`74341ba3c9`](https://github.com/nodejs/node/commit/74341ba3c9)] - **tools**: fix v8-update workflow (Michaël Zasso) [#52957](https://github.com/nodejs/node/pull/52957) +- \[[`afe39ed0df`](https://github.com/nodejs/node/commit/afe39ed0df)] - **tools**: add --certify-safe to nci-ci (Matteo Collina) [#52940](https://github.com/nodejs/node/pull/52940) +- \[[`bb97e1ccdd`](https://github.com/nodejs/node/commit/bb97e1ccdd)] - **tools**: fix doc update action (Marco Ippolito) [#52890](https://github.com/nodejs/node/pull/52890) +- \[[`c6043fe6c8`](https://github.com/nodejs/node/commit/c6043fe6c8)] - **tools**: fix get_asan_state() in tools/test.py (Joyee Cheung) [#52766](https://github.com/nodejs/node/pull/52766) +- \[[`6e71accc5f`](https://github.com/nodejs/node/commit/6e71accc5f)] - **tools**: support max_virtual_memory test configuration (Joyee Cheung) [#52766](https://github.com/nodejs/node/pull/52766) +- \[[`1600bdac60`](https://github.com/nodejs/node/commit/1600bdac60)] - **tools**: support != in test status files (Joyee Cheung) [#52766](https://github.com/nodejs/node/pull/52766) +- \[[`8ce23dc9f3`](https://github.com/nodejs/node/commit/8ce23dc9f3)] - **tools**: update gyp-next to 0.18.0 (Node.js GitHub Bot) [#52835](https://github.com/nodejs/node/pull/52835) +- \[[`c5f832adc0`](https://github.com/nodejs/node/commit/c5f832adc0)] - **tools**: update gyp-next to 0.17.0 (Node.js GitHub Bot) [#52835](https://github.com/nodejs/node/pull/52835) +- \[[`646a094782`](https://github.com/nodejs/node/commit/646a094782)] - **tools**: prepare custom rules for ESLint v9 (Michaël Zasso) [#52889](https://github.com/nodejs/node/pull/52889) +- \[[`505566347d`](https://github.com/nodejs/node/commit/505566347d)] - **tools**: update lint-md-dependencies to rollup\@4.17.2 (Node.js GitHub Bot) [#52836](https://github.com/nodejs/node/pull/52836) +- \[[`466e0c1321`](https://github.com/nodejs/node/commit/466e0c1321)] - **tools**: update `gr2m/create-or-update-pull-request-action` (Antoine du Hamel) [#52843](https://github.com/nodejs/node/pull/52843) +- \[[`ce7a751ad1`](https://github.com/nodejs/node/commit/ce7a751ad1)] - **tools**: use sccache GitHub action (Michaël Zasso) [#52839](https://github.com/nodejs/node/pull/52839) +- \[[`1ee38a5ec1`](https://github.com/nodejs/node/commit/1ee38a5ec1)] - **tools**: specify a commit-message for V8 update workflow (Antoine du Hamel) [#52844](https://github.com/nodejs/node/pull/52844) +- \[[`317998a1e8`](https://github.com/nodejs/node/commit/317998a1e8)] - **tools**: fix V8 update workflow (Antoine du Hamel) [#52822](https://github.com/nodejs/node/pull/52822) +- \[[`ef6a2101e2`](https://github.com/nodejs/node/commit/ef6a2101e2)] - **url,tools,benchmark**: replace deprecated `substr()` (Jungku Lee) [#51546](https://github.com/nodejs/node/pull/51546) +- \[[`0deef2d2b1`](https://github.com/nodejs/node/commit/0deef2d2b1)] - **util**: fix `%s` format behavior with `Symbol.toPrimitive` (Chenyu Yang) [#50992](https://github.com/nodejs/node/pull/50992) +- \[[`a42b93b9aa`](https://github.com/nodejs/node/commit/a42b93b9aa)] - **util**: improve `isInsideNodeModules` (uzlopak) [#52147](https://github.com/nodejs/node/pull/52147) +- \[[`d71e16154a`](https://github.com/nodejs/node/commit/d71e16154a)] - **watch**: allow listening for grouped changes (Matthieu Sieben) [#52722](https://github.com/nodejs/node/pull/52722) +- \[[`e895f7cf32`](https://github.com/nodejs/node/commit/e895f7cf32)] - **watch**: enable passthrough ipc in watch mode (Zack) [#50890](https://github.com/nodejs/node/pull/50890) +- \[[`f5d925706a`](https://github.com/nodejs/node/commit/f5d925706a)] - **watch**: fix arguments parsing (Moshe Atlow) [#52760](https://github.com/nodejs/node/pull/52760) +- \[[`6b4dac3eb5`](https://github.com/nodejs/node/commit/6b4dac3eb5)] - **(SEMVER-MINOR)** **zlib**: expose zlib.crc32() (Joyee Cheung) [#52692](https://github.com/nodejs/node/pull/52692) + +Windows 32-bit Installer: https://nodejs.org/dist/v22.2.0/node-v22.2.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v22.2.0/node-v22.2.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v22.2.0/node-v22.2.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v22.2.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v22.2.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v22.2.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v22.2.0/node-v22.2.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v22.2.0/node-v22.2.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v22.2.0/node-v22.2.0.tar.gz \ +Other release files: https://nodejs.org/dist/v22.2.0/ \ +Documentation: https://nodejs.org/docs/v22.2.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +52d5cd604f2ac283c03f1ebb7746ee74e09e8f52d3e17d29fed1fd58da59d2a8 node-v22.2.0-aix-ppc64.tar.gz +c42ef85e163e696a377fa248c52aeea68a8e2ee14a92f900eb11a6a53b0128f2 node-v22.2.0-arm64.msi +66dd98bd28d19603f2e5ab0aa0e07b64f8cad28bbc446bb44fb61cc3da62e685 node-v22.2.0-darwin-arm64.tar.gz +c809cfaf7fc06bcf35ae469781c66dbc79be7fbea641937784fdefc297a2b335 node-v22.2.0-darwin-arm64.tar.xz +b3cd4ab4bb4ac7f9bd5c7603baf6bbdcf466c86bb6ca49abf5e221ab8fad7ceb node-v22.2.0-darwin-x64.tar.gz +3a3058cb460899587bf5a3129309826886c704b8ad9ff69d9b55ad99b2c843e2 node-v22.2.0-darwin-x64.tar.xz +c8cd9be91fc4f24260068c44424bc11168fe5d525a29ee204475c8cd22ea435b node-v22.2.0-headers.tar.gz +3dbef9a1558b0bbc1ac8d06ff8acdd1899d4509ee5a9e6af5a8e8b22e063d5bd node-v22.2.0-headers.tar.xz +7fc74ddeb3e2317c905fdebd2b681d565fc2a2980515430d4f01dad4ce312175 node-v22.2.0-linux-arm64.tar.gz +e3d580cb7738dd9a0f8672f684de86b621d8755a6cf349df8c01b8dd875b59ab node-v22.2.0-linux-arm64.tar.xz +eb14ff993a1a4b6c0417b5f086b1629c82a3665edfa1c83f3b5ab1250b721307 node-v22.2.0-linux-armv7l.tar.gz +a979f384fea317053ed435a245e3d3663280859b17487fc2b6515e14c6770711 node-v22.2.0-linux-armv7l.tar.xz +e70cb8c5dde31c5e0ee998124f74f7fb7dc7efd7e1549fa162e7fbc20bd937cc node-v22.2.0-linux-ppc64le.tar.gz +235dc30116f378d1ec326b49ad0ea08c3d84cc057238749e7ada6bb4307b1186 node-v22.2.0-linux-ppc64le.tar.xz +48a1999e35c5f8b7cf2240239d588d52fad424635b4dd4933062eb9f2a3608f4 node-v22.2.0-linux-s390x.tar.gz +cb3cce70aeb29072aad450fd0b09130d34a36e38ad689f3bc4a6d72caade281f node-v22.2.0-linux-s390x.tar.xz +2c6eaf8bfd0f886ed8764ffce19c795e909639105e4056b1d9f8f917bad12cf1 node-v22.2.0-linux-x64.tar.gz +3544eee9cb1414d6e9003efd56bc807ffb0f4445d2fc383e1df04c3e5e72c91b node-v22.2.0-linux-x64.tar.xz +e8cdad84c555a6281487890d56676f385e35dc13b35089963e4d624a6c9f58f4 node-v22.2.0.pkg +2210ce0a40aa6aec3cc118228fdad6536607002319b1fde24260d179118c1055 node-v22.2.0.tar.gz +889908a8828d1484910d7e659b6aa57ade8d528ff0e390e9a77ef659a7628474 node-v22.2.0.tar.xz +10e5a2bcf72e568933643a652bd7728231f8d5dfc59d623f5fcca550b3f1d799 node-v22.2.0-win-arm64.7z +4b7c296503da5737448b9f5f620e0f961f23f53eafc0e04688a96944afb08fd7 node-v22.2.0-win-arm64.zip +740a4d3c613a77268ac856c2c209603236c51745506be1d3237b47491c27e7c7 node-v22.2.0-win-x64.7z +f83e956bd90c7f5066a7e96e9372839fcc263795525fa0c03cfdf4b43be9457f node-v22.2.0-win-x64.zip +6c9bd5337b87ce6c31eae8145ccb9ce70d78ab5527125f0ab2fbbc170362953a node-v22.2.0-win-x86.7z +efec272a434043b439ac32f7b11fa674d595772a4636b50481fa2aedb68578ac node-v22.2.0-win-x86.zip +a2fbc72550ade8f9e391ea054af8fd91a3c2f224ea6d7f8eccdef215a5c30fde node-v22.2.0-x64.msi +c03be5bc511dc5825471ee14d80b74d4de06e2ab3676a56fbe5fed10b6a48c92 node-v22.2.0-x86.msi +767231a4a8667fa41559a04857f5824a01ec46075289d4e1f868cc86dc8186fd win-arm64/node.exe +30e63a6726cda6539eeb37c311adf915bccd5c1462723b97a6c07ac91e8ae728 win-arm64/node.lib +aa7fe0d9948ff3aab51c960e8d85dd7e28c66fd8f1a7c0e173c34a4862504d32 win-arm64/node_pdb.7z +376ee1f8d4b1870838466c9b33c60c6100ace5693ba1c955c6a4cc926a0dc56e win-arm64/node_pdb.zip +9f281fc885999757b43ad229aec5b53206d1088abacb49cc5b3e830d39521a2f win-x64/node.exe +c4d08d45267da3625a30730bf5c8e41518f25d9809179feb267f1b393f5c5f05 win-x64/node.lib +fb44de8c670d8c53a08c94ddfa2484f384af5e5c4caa0b9114224d0bb678796f win-x64/node_pdb.7z +cb68da2ff89514145941181d89508f87b2248da0b011ba4ef1e2df697ad47a9d win-x64/node_pdb.zip +6c7509b76bec8e0421be417555fe49619c4360f9c7f56e5622910bae73c835db win-x86/node.exe +fc3bf3c1e561da1e1c152be9aa5ed1bce8d263a5124841a4ba41ebc37c727f3e win-x86/node.lib +e83aa6ddd82ffb8e9ea7d22bf2d09b03880dd959c89e5c0cc7beab8fbb9d6da7 win-x86/node_pdb.7z +582f22f08bb045e8b6b59e6e8e0f3394eb1305157d48370084ae80e80b237fce win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEj8yhP+8dDC6RAI4Jdw96mlrhVgAFAmZFC6UACgkQdw96mlrh +VgChoA//djlP5Qq5QeNxYwguqKf2s9tjiMUqntC/rZygrFP1zFXDK4ceIngOOm1F +CI5JRAtvOSuoakJiw/oq8RNQf5ydUx1m8nQICPAAywxNlYIvUV2SLySlN4PAey5o +rRqeCamc3Hucsr5zXCl1yGNmDPYgBCmKugKyIVhbCt0FpndM6tm+MNTrdrpO2JPw ++zJLxX5K6B1DFVPzxI85aAgUoetgwruWvMjQaSMkEJvFrweu5h1Lt2KH4Q1t4iwF +RSvOcIlTU1tzz0CYB0kg8SXHhFn36W1bYlx+tr1JMlDy3L+D0KLHRARbSTT2mI9o +U2ZySxbpy4eCypVW+QMAW8mLMJT20UBG/+SkBr13na1moLeNrQ2H3hj+ykxSSxJQ +gZJI+NY4MLuwx1K74ADERyGHvMhQuHOWTGxqo5wQewDTS2qUramJxLzfKXVkzgSZ +F8KgPYzCN+rZ8SN4Cv7BelXk3s4ui+ZRFS4AOv3T3aKM/56vnRvg+pqWym4kzwQ2 +cNiW+yni4KYO3VdN8IWbQXv61HKRs0cfZe1YvTju89KQon4XBrUBrselDv10IFjD +eQkzP4Rj2Docula8vnPmqwYStpiEEBwyMSLdf5H7e1Vi4e7LCn2bf/v7W/33ZoB1 +EI19IVphrFgI1KhauV+OIuE3/+DWDXQ6EUkBexdQz8CdVQvnkkg= +=Y3mv +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/release/v22.3.0.md b/pages/en/blog/release/v22.3.0.md new file mode 100644 index 0000000000000..054d76484a8ed --- /dev/null +++ b/pages/en/blog/release/v22.3.0.md @@ -0,0 +1,247 @@ +--- +date: '2024-06-11T19:00:57.015Z' +category: release +title: Node v22.3.0 (Current) +layout: blog-post +author: Rafael Gonzaga +--- + +## 2024-06-11, Version 22.3.0 (Current), @RafaelGSS + +### Notable Changes + +- \[[`5a41bcf9ca`](https://github.com/nodejs/node/commit/5a41bcf9ca)] - **(SEMVER-MINOR)** **src**: traverse parent folders while running `--run` (Yagiz Nizipli) [#53154](https://github.com/nodejs/node/pull/53154) +- \[[`1d5934524b`](https://github.com/nodejs/node/commit/1d5934524b)] - **(SEMVER-MINOR)** **buffer**: add .bytes() method to Blob (Matthew Aitken) [#53221](https://github.com/nodejs/node/pull/53221) +- \[[`75e5612fae`](https://github.com/nodejs/node/commit/75e5612fae)] - **(SEMVER-MINOR)** **src,permission**: --allow-wasi & prevent WASI exec (Rafael Gonzaga) [#53124](https://github.com/nodejs/node/pull/53124) +- \[[`b5c30e2f5e`](https://github.com/nodejs/node/commit/b5c30e2f5e)] - **(SEMVER-MINOR)** **module**: print amount of load time of a cjs module (Vinicius Lourenço) [#52213](https://github.com/nodejs/node/pull/52213) +- \[[`8c6dffc269`](https://github.com/nodejs/node/commit/8c6dffc269)] - **(SEMVER-MINOR)** **test_runner**: add snapshot testing (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`048478d351`](https://github.com/nodejs/node/commit/048478d351)] - **(SEMVER-MINOR)** **doc**: add context.assert docs (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`f6d2af8ee7`](https://github.com/nodejs/node/commit/f6d2af8ee7)] - **(SEMVER-MINOR)** **test_runner**: add context.fullName (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`a0766bdf0e`](https://github.com/nodejs/node/commit/a0766bdf0e)] - **(SEMVER-MINOR)** **net**: add new net.server.listen tracing channel (Paolo Insogna) [#53136](https://github.com/nodejs/node/pull/53136) +- \[[`374743cd4e`](https://github.com/nodejs/node/commit/374743cd4e)] - **(SEMVER-MINOR)** **process**: add process.getBuiltinModule(id) (Joyee Cheung) [#52762](https://github.com/nodejs/node/pull/52762) +- \[[`1eb55f3550`](https://github.com/nodejs/node/commit/1eb55f3550)] - **(SEMVER-MINOR)** **doc**: improve explanation about built-in modules (Joyee Cheung) [#52762](https://github.com/nodejs/node/pull/52762) +- \[[`6165894774`](https://github.com/nodejs/node/commit/6165894774)] - **fs**: mark recursive cp methods as stable (Théo LUDWIG) [#53127](https://github.com/nodejs/node/pull/53127) +- \[[`db5dd0c6df`](https://github.com/nodejs/node/commit/db5dd0c6df)] - **doc**: add StefanStojanovic to collaborators (StefanStojanovic) [#53118](https://github.com/nodejs/node/pull/53118) +- \[[`cfcde78513`](https://github.com/nodejs/node/commit/cfcde78513)] - **(SEMVER-MINOR)** **cli**: add `NODE_RUN_PACKAGE_JSON_PATH` env (Yagiz Nizipli) [#53058](https://github.com/nodejs/node/pull/53058) +- \[[`7a67ecf161`](https://github.com/nodejs/node/commit/7a67ecf161)] - **(SEMVER-MINOR)** **test_runner**: support module mocking (Colin Ihrig) [#52848](https://github.com/nodejs/node/pull/52848) +- \[[`ee56aecced`](https://github.com/nodejs/node/commit/ee56aecced)] - **(SEMVER-MINOR)** **lib**: add EventSource Client (Aras Abbasi) [#51575](https://github.com/nodejs/node/pull/51575) +- \[[`6413769bc7`](https://github.com/nodejs/node/commit/6413769bc7)] - **(SEMVER-MINOR)** **lib**: replace MessageEvent with undici's (Matthew Aitken) [#52370](https://github.com/nodejs/node/pull/52370) +- \[[`c70b2f7a76`](https://github.com/nodejs/node/commit/c70b2f7a76)] - **(SEMVER-MINOR)** **cli**: add `NODE_RUN_SCRIPT_NAME` env to `node --run` (Yagiz Nizipli) [#53032](https://github.com/nodejs/node/pull/53032) +- \[[`badec0c38b`](https://github.com/nodejs/node/commit/badec0c38b)] - **doc**: add Marco Ippolito to TSC (Rafael Gonzaga) [#53008](https://github.com/nodejs/node/pull/53008) + +### Commits + +- \[[`feb0ba2860`](https://github.com/nodejs/node/commit/feb0ba2860)] - **benchmark**: fix napi/ref addon (Michaël Zasso) [#53233](https://github.com/nodejs/node/pull/53233) +- \[[`bb844de4e1`](https://github.com/nodejs/node/commit/bb844de4e1)] - **benchmark**: fix api restriction for the permission category (Ryan Tsien) [#51528](https://github.com/nodejs/node/pull/51528) +- \[[`1d5934524b`](https://github.com/nodejs/node/commit/1d5934524b)] - **(SEMVER-MINOR)** **buffer**: add .bytes() method to Blob (Matthew Aitken) [#53221](https://github.com/nodejs/node/pull/53221) +- \[[`d87f9af5aa`](https://github.com/nodejs/node/commit/d87f9af5aa)] - **buffer**: make compare/equals faster (Tobias Nießen) [#52993](https://github.com/nodejs/node/pull/52993) +- \[[`ec83431d71`](https://github.com/nodejs/node/commit/ec83431d71)] - **build**: generate binlog in out directories (Chengzhong Wu) [#53325](https://github.com/nodejs/node/pull/53325) +- \[[`0976439417`](https://github.com/nodejs/node/commit/0976439417)] - **build**: fix --v8-lite-mode build (Daeyeon Jeong) [#52725](https://github.com/nodejs/node/pull/52725) +- \[[`350c733ae6`](https://github.com/nodejs/node/commit/350c733ae6)] - **build**: support python 3.13 (Chengzhong Wu) [#53190](https://github.com/nodejs/node/pull/53190) +- \[[`74cefa55a2`](https://github.com/nodejs/node/commit/74cefa55a2)] - **build**: update ruff to v0.4.5 (Yagiz Nizipli) [#53180](https://github.com/nodejs/node/pull/53180) +- \[[`33242ff042`](https://github.com/nodejs/node/commit/33242ff042)] - **build**: add `--skip-tests` to `test-ci-js` target (Antoine du Hamel) [#53105](https://github.com/nodejs/node/pull/53105) +- \[[`edcadf7f8a`](https://github.com/nodejs/node/commit/edcadf7f8a)] - **build**: fix building embedtest in GN build (Cheng) [#53145](https://github.com/nodejs/node/pull/53145) +- \[[`d711942fce`](https://github.com/nodejs/node/commit/d711942fce)] - **build**: use broader detection for 'help' (Aviv Keller) [#53045](https://github.com/nodejs/node/pull/53045) +- \[[`ca655b61a7`](https://github.com/nodejs/node/commit/ca655b61a7)] - **build**: fix -j propagation to ninja (Tobias Nießen) [#53088](https://github.com/nodejs/node/pull/53088) +- \[[`5fba67ff9f`](https://github.com/nodejs/node/commit/5fba67ff9f)] - **build**: exit on unsupported host OS for Android (Mohammed Keyvanzadeh) [#52882](https://github.com/nodejs/node/pull/52882) +- \[[`b7d7e9a084`](https://github.com/nodejs/node/commit/b7d7e9a084)] - **build**: fix `--enable-d8` builds (Richard Lau) [#53106](https://github.com/nodejs/node/pull/53106) +- \[[`14547c5d32`](https://github.com/nodejs/node/commit/14547c5d32)] - **build**: fix ./configure --help format error (Zhenwei Jin) [#53066](https://github.com/nodejs/node/pull/53066) +- \[[`f9490806d3`](https://github.com/nodejs/node/commit/f9490806d3)] - **build**: set "clang" in config.gypi in GN build (Cheng) [#53004](https://github.com/nodejs/node/pull/53004) +- \[[`638b510ce7`](https://github.com/nodejs/node/commit/638b510ce7)] - **cli**: add `--expose-gc` flag available to `NODE_OPTIONS` (Juan José) [#53078](https://github.com/nodejs/node/pull/53078) +- \[[`cfcde78513`](https://github.com/nodejs/node/commit/cfcde78513)] - **(SEMVER-MINOR)** **cli**: add `NODE_RUN_PACKAGE_JSON_PATH` env (Yagiz Nizipli) [#53058](https://github.com/nodejs/node/pull/53058) +- \[[`c70b2f7a76`](https://github.com/nodejs/node/commit/c70b2f7a76)] - **(SEMVER-MINOR)** **cli**: add `NODE_RUN_SCRIPT_NAME` env to `node --run` (Yagiz Nizipli) [#53032](https://github.com/nodejs/node/pull/53032) +- \[[`34f20983fd`](https://github.com/nodejs/node/commit/34f20983fd)] - **crypto**: fix propagation of "memory limit exceeded" (Tobias Nießen) [#53300](https://github.com/nodejs/node/pull/53300) +- \[[`fef067f4f4`](https://github.com/nodejs/node/commit/fef067f4f4)] - **deps**: update nghttp2 to 1.62.1 (Node.js GitHub Bot) [#52966](https://github.com/nodejs/node/pull/52966) +- \[[`fc949928ac`](https://github.com/nodejs/node/commit/fc949928ac)] - **deps**: update nghttp2 to 1.62.0 (Node.js GitHub Bot) [#52966](https://github.com/nodejs/node/pull/52966) +- \[[`4a17dda8dc`](https://github.com/nodejs/node/commit/4a17dda8dc)] - **deps**: update undici to 6.18.2 (Node.js GitHub Bot) [#53255](https://github.com/nodejs/node/pull/53255) +- \[[`e45cc2a551`](https://github.com/nodejs/node/commit/e45cc2a551)] - **deps**: update ada to 2.8.0 (Node.js GitHub Bot) [#53254](https://github.com/nodejs/node/pull/53254) +- \[[`77907a2619`](https://github.com/nodejs/node/commit/77907a2619)] - **deps**: update corepack to 0.28.2 (Node.js GitHub Bot) [#53253](https://github.com/nodejs/node/pull/53253) +- \[[`b688050778`](https://github.com/nodejs/node/commit/b688050778)] - **deps**: update simdjson to 3.9.3 (Node.js GitHub Bot) [#53252](https://github.com/nodejs/node/pull/53252) +- \[[`6303f19cbe`](https://github.com/nodejs/node/commit/6303f19cbe)] - **deps**: patch V8 to 12.4.254.20 (Node.js GitHub Bot) [#53159](https://github.com/nodejs/node/pull/53159) +- \[[`257004c68f`](https://github.com/nodejs/node/commit/257004c68f)] - **deps**: update c-ares to 1.29.0 (Node.js GitHub Bot) [#53155](https://github.com/nodejs/node/pull/53155) +- \[[`0b375a3e36`](https://github.com/nodejs/node/commit/0b375a3e36)] - **deps**: upgrade npm to 10.8.1 (npm team) [#53207](https://github.com/nodejs/node/pull/53207) +- \[[`728c861b1c`](https://github.com/nodejs/node/commit/728c861b1c)] - **deps**: fix FP16 bitcasts.h (Stefan Stojanovic) [#53134](https://github.com/nodejs/node/pull/53134) +- \[[`52a78737b1`](https://github.com/nodejs/node/commit/52a78737b1)] - **deps**: patch V8 to 12.4.254.19 (Node.js GitHub Bot) [#53094](https://github.com/nodejs/node/pull/53094) +- \[[`4d27b32e58`](https://github.com/nodejs/node/commit/4d27b32e58)] - **deps**: update undici to 6.18.1 (Node.js GitHub Bot) [#53073](https://github.com/nodejs/node/pull/53073) +- \[[`b94199240b`](https://github.com/nodejs/node/commit/b94199240b)] - **deps**: update undici to 6.18.0 (Node.js GitHub Bot) [#53073](https://github.com/nodejs/node/pull/53073) +- \[[`793af1b3e7`](https://github.com/nodejs/node/commit/793af1b3e7)] - **deps**: update undici to 6.17.0 (Node.js GitHub Bot) [#53034](https://github.com/nodejs/node/pull/53034) +- \[[`fe00becc03`](https://github.com/nodejs/node/commit/fe00becc03)] - **deps**: update undici to 6.16.1 (Node.js GitHub Bot) [#52948](https://github.com/nodejs/node/pull/52948) +- \[[`96f72ae54f`](https://github.com/nodejs/node/commit/96f72ae54f)] - **deps**: update undici to 6.15.0 (Matthew Aitken) [#52763](https://github.com/nodejs/node/pull/52763) +- \[[`af60fbb12b`](https://github.com/nodejs/node/commit/af60fbb12b)] - **deps**: update googletest to 33af80a (Node.js GitHub Bot) [#53053](https://github.com/nodejs/node/pull/53053) +- \[[`7b929df489`](https://github.com/nodejs/node/commit/7b929df489)] - **deps**: patch V8 to 12.4.254.18 (Node.js GitHub Bot) [#53054](https://github.com/nodejs/node/pull/53054) +- \[[`626037c0fc`](https://github.com/nodejs/node/commit/626037c0fc)] - **deps**: update zlib to 1.3.0.1-motley-4f653ff (Node.js GitHub Bot) [#53052](https://github.com/nodejs/node/pull/53052) +- \[[`6d8589e558`](https://github.com/nodejs/node/commit/6d8589e558)] - **deps**: patch V8 to 12.4.254.17 (Node.js GitHub Bot) [#52980](https://github.com/nodejs/node/pull/52980) +- \[[`fd91eaab34`](https://github.com/nodejs/node/commit/fd91eaab34)] - **deps**: upgrade npm to 10.8.0 (npm team) [#53014](https://github.com/nodejs/node/pull/53014) +- \[[`133cae0732`](https://github.com/nodejs/node/commit/133cae0732)] - **doc**: fix broken link in `static-analysis.md` (Richard Lau) [#53345](https://github.com/nodejs/node/pull/53345) +- \[[`7bc5f964fd`](https://github.com/nodejs/node/commit/7bc5f964fd)] - **doc**: indicate requirement on VS 17.6 or newer (Chengzhong Wu) [#53301](https://github.com/nodejs/node/pull/53301) +- \[[`8c71522ced`](https://github.com/nodejs/node/commit/8c71522ced)] - **doc**: remove cases for keys not containing "\*" in PATTERN_KEY_COMPARE (Maarten Zuidhoorn) [#53215](https://github.com/nodejs/node/pull/53215) +- \[[`718a3ab1ab`](https://github.com/nodejs/node/commit/718a3ab1ab)] - **doc**: add err param to fs.cp callback (Feng Yu) [#53234](https://github.com/nodejs/node/pull/53234) +- \[[`d89bde26ff`](https://github.com/nodejs/node/commit/d89bde26ff)] - **doc**: add `err` param to fs.copyFile callback (Feng Yu) [#53234](https://github.com/nodejs/node/pull/53234) +- \[[`91971ee344`](https://github.com/nodejs/node/commit/91971ee344)] - **doc**: reserve 128 for Electron 32 (Keeley Hammond) [#53203](https://github.com/nodejs/node/pull/53203) +- \[[`812f0e9e14`](https://github.com/nodejs/node/commit/812f0e9e14)] - **doc**: add note to ninjia build for macOS using -jn flag (jakecastelli) [#53187](https://github.com/nodejs/node/pull/53187) +- \[[`048478d351`](https://github.com/nodejs/node/commit/048478d351)] - **(SEMVER-MINOR)** **doc**: add context.assert docs (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`c391923445`](https://github.com/nodejs/node/commit/c391923445)] - **doc**: include ESM import for HTTP (Aviv Keller) [#53165](https://github.com/nodejs/node/pull/53165) +- \[[`1eb55f3550`](https://github.com/nodejs/node/commit/1eb55f3550)] - **(SEMVER-MINOR)** **doc**: improve explanation about built-in modules (Joyee Cheung) [#52762](https://github.com/nodejs/node/pull/52762) +- \[[`67a766f7d4`](https://github.com/nodejs/node/commit/67a766f7d4)] - **doc**: fix minor grammar and style issues in SECURITY.md (Rich Trott) [#53168](https://github.com/nodejs/node/pull/53168) +- \[[`afbfe8922a`](https://github.com/nodejs/node/commit/afbfe8922a)] - **doc**: mention pm is not enforced when using fd (Rafael Gonzaga) [#53125](https://github.com/nodejs/node/pull/53125) +- \[[`1702d2632e`](https://github.com/nodejs/node/commit/1702d2632e)] - **doc**: fix format in `esm.md` (Pop Moore) [#53170](https://github.com/nodejs/node/pull/53170) +- \[[`070577e7d7`](https://github.com/nodejs/node/commit/070577e7d7)] - **doc**: fix wrong variable name in example of `timers.tick()` (Deokjin Kim) [#53147](https://github.com/nodejs/node/pull/53147) +- \[[`7147c1df1f`](https://github.com/nodejs/node/commit/7147c1df1f)] - **doc**: fix wrong function name in example of `context.plan()` (Deokjin Kim) [#53140](https://github.com/nodejs/node/pull/53140) +- \[[`cf47384148`](https://github.com/nodejs/node/commit/cf47384148)] - **doc**: add note for windows users and symlinks (Aviv Keller) [#53117](https://github.com/nodejs/node/pull/53117) +- \[[`088dff1074`](https://github.com/nodejs/node/commit/088dff1074)] - **doc**: move all TLS-PSK documentation to its section (Alba Mendez) [#35717](https://github.com/nodejs/node/pull/35717) +- \[[`db5dd0c6df`](https://github.com/nodejs/node/commit/db5dd0c6df)] - **doc**: add StefanStojanovic to collaborators (StefanStojanovic) [#53118](https://github.com/nodejs/node/pull/53118) +- \[[`0f0bc98ad7`](https://github.com/nodejs/node/commit/0f0bc98ad7)] - **doc**: improve ninja build for --built-in-modules-path (jakecastelli) [#53007](https://github.com/nodejs/node/pull/53007) +- \[[`4c65c52d30`](https://github.com/nodejs/node/commit/4c65c52d30)] - **doc**: avoid hiding by navigation bar in anchor jumping (Cloyd Lau) [#45131](https://github.com/nodejs/node/pull/45131) +- \[[`63fcbcfd62`](https://github.com/nodejs/node/commit/63fcbcfd62)] - **doc**: remove unavailable youtube link in pull requests (Deokjin Kim) [#52982](https://github.com/nodejs/node/pull/52982) +- \[[`77fd504636`](https://github.com/nodejs/node/commit/77fd504636)] - **doc**: add missing supported timer values in `timers.enable()` (Deokjin Kim) [#52969](https://github.com/nodejs/node/pull/52969) +- \[[`6708536b03`](https://github.com/nodejs/node/commit/6708536b03)] - **fs**: fix cp dir/non-dir mismatch error messages (Mathis Wiehl) [#53150](https://github.com/nodejs/node/pull/53150) +- \[[`6165894774`](https://github.com/nodejs/node/commit/6165894774)] - **fs**: mark recursive cp methods as stable (Théo LUDWIG) [#53127](https://github.com/nodejs/node/pull/53127) +- \[[`7940db7be1`](https://github.com/nodejs/node/commit/7940db7be1)] - **fs**: remove basename in favor of std::filesystem (Yagiz Nizipli) [#53062](https://github.com/nodejs/node/pull/53062) +- \[[`505e9a425b`](https://github.com/nodejs/node/commit/505e9a425b)] - **lib**: fix misleading argument of validateUint32 (Tobias Nießen) [#53307](https://github.com/nodejs/node/pull/53307) +- \[[`98ae1ebdd6`](https://github.com/nodejs/node/commit/98ae1ebdd6)] - **lib**: fix the name of the fetch global function (Gabriel Bota) [#53227](https://github.com/nodejs/node/pull/53227) +- \[[`fe007cd1b4`](https://github.com/nodejs/node/commit/fe007cd1b4)] - **lib**: allow CJS source map cache to be reclaimed (Chengzhong Wu) [#51711](https://github.com/nodejs/node/pull/51711) +- \[[`040be4a7b4`](https://github.com/nodejs/node/commit/040be4a7b4)] - **lib**: do not call callback if socket is closed (theanarkh) [#52829](https://github.com/nodejs/node/pull/52829) +- \[[`ee56aecced`](https://github.com/nodejs/node/commit/ee56aecced)] - **(SEMVER-MINOR)** **lib**: add EventSource Client (Aras Abbasi) [#51575](https://github.com/nodejs/node/pull/51575) +- \[[`6413769bc7`](https://github.com/nodejs/node/commit/6413769bc7)] - **(SEMVER-MINOR)** **lib**: replace MessageEvent with undici's (Matthew Aitken) [#52370](https://github.com/nodejs/node/pull/52370) +- \[[`879679e5a3`](https://github.com/nodejs/node/commit/879679e5a3)] - **lib,doc**: replace references to import assertions (Michaël Zasso) [#52998](https://github.com/nodejs/node/pull/52998) +- \[[`062a0c6f67`](https://github.com/nodejs/node/commit/062a0c6f67)] - **meta**: bump ossf/scorecard-action from 2.3.1 to 2.3.3 (dependabot\[bot]) [#53248](https://github.com/nodejs/node/pull/53248) +- \[[`e59b744b30`](https://github.com/nodejs/node/commit/e59b744b30)] - **meta**: bump actions/checkout from 4.1.4 to 4.1.6 (dependabot\[bot]) [#53247](https://github.com/nodejs/node/pull/53247) +- \[[`96924f48a0`](https://github.com/nodejs/node/commit/96924f48a0)] - **meta**: bump github/codeql-action from 3.25.3 to 3.25.7 (dependabot\[bot]) [#53246](https://github.com/nodejs/node/pull/53246) +- \[[`b7f5662dee`](https://github.com/nodejs/node/commit/b7f5662dee)] - **meta**: bump codecov/codecov-action from 4.3.1 to 4.4.1 (dependabot\[bot]) [#53244](https://github.com/nodejs/node/pull/53244) +- \[[`e079967eb4`](https://github.com/nodejs/node/commit/e079967eb4)] - **meta**: remove `initializeCommand` from devcontainer (Aviv Keller) [#53137](https://github.com/nodejs/node/pull/53137) +- \[[`3afeced572`](https://github.com/nodejs/node/commit/3afeced572)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#53065](https://github.com/nodejs/node/pull/53065) +- \[[`4b9cdea8a6`](https://github.com/nodejs/node/commit/4b9cdea8a6)] - _**Revert**_ "**module**: have a single hooks thread for all workers" (Matteo Collina) [#53183](https://github.com/nodejs/node/pull/53183) +- \[[`b5c30e2f5e`](https://github.com/nodejs/node/commit/b5c30e2f5e)] - **(SEMVER-MINOR)** **module**: print amount of load time of a cjs module (Vinicius Lourenço) [#52213](https://github.com/nodejs/node/pull/52213) +- \[[`4cdb05a7a2`](https://github.com/nodejs/node/commit/4cdb05a7a2)] - **module**: do not set CJS variables for Worker eval (Antoine du Hamel) [#53050](https://github.com/nodejs/node/pull/53050) +- \[[`a0766bdf0e`](https://github.com/nodejs/node/commit/a0766bdf0e)] - **(SEMVER-MINOR)** **net**: add new net.server.listen tracing channel (Paolo Insogna) [#53136](https://github.com/nodejs/node/pull/53136) +- \[[`374743cd4e`](https://github.com/nodejs/node/commit/374743cd4e)] - **(SEMVER-MINOR)** **process**: add process.getBuiltinModule(id) (Joyee Cheung) [#52762](https://github.com/nodejs/node/pull/52762) +- \[[`e66eb376a0`](https://github.com/nodejs/node/commit/e66eb376a0)] - **repl**: fix await object patterns without values (Luke Haas) [#53331](https://github.com/nodejs/node/pull/53331) +- \[[`cb1329a8cf`](https://github.com/nodejs/node/commit/cb1329a8cf)] - **src**: use v8::(Des|S)erializeInternalFieldsCallback (Joyee Cheung) [#53217](https://github.com/nodejs/node/pull/53217) +- \[[`1886fe99af`](https://github.com/nodejs/node/commit/1886fe99af)] - **src**: use \_\_FUNCSIG\_\_ on Windows in backtrace (Joyee Cheung) [#53135](https://github.com/nodejs/node/pull/53135) +- \[[`3bfce6c816`](https://github.com/nodejs/node/commit/3bfce6c816)] - **src**: use new V8 API to define stream accessor (Igor Sheludko) [#53084](https://github.com/nodejs/node/pull/53084) +- \[[`11f790d911`](https://github.com/nodejs/node/commit/11f790d911)] - **src**: do not use deprecated V8 API (ishell) [#53084](https://github.com/nodejs/node/pull/53084) +- \[[`6b1731cbcc`](https://github.com/nodejs/node/commit/6b1731cbcc)] - **src**: convert all endian checks to constexpr (Tobias Nießen) [#52974](https://github.com/nodejs/node/pull/52974) +- \[[`7aa9519ad4`](https://github.com/nodejs/node/commit/7aa9519ad4)] - **src**: fix external module env and kDisableNodeOptionsEnv (Rafael Gonzaga) [#52905](https://github.com/nodejs/node/pull/52905) +- \[[`838fe59787`](https://github.com/nodejs/node/commit/838fe59787)] - **src**: fix execArgv in worker (theanarkh) [#53029](https://github.com/nodejs/node/pull/53029) +- \[[`4a2c6ff05d`](https://github.com/nodejs/node/commit/4a2c6ff05d)] - **src**: reduce unnecessary `GetCwd` calls (Yagiz Nizipli) [#53064](https://github.com/nodejs/node/pull/53064) +- \[[`ec44965b49`](https://github.com/nodejs/node/commit/ec44965b49)] - **src**: simplify node modules traverse path (Yagiz Nizipli) [#53061](https://github.com/nodejs/node/pull/53061) +- \[[`190129b48e`](https://github.com/nodejs/node/commit/190129b48e)] - **src**: remove unused `base64_table_url` (Yagiz Nizipli) [#53040](https://github.com/nodejs/node/pull/53040) +- \[[`d750a3c5c4`](https://github.com/nodejs/node/commit/d750a3c5c4)] - **src**: remove calls to recently deprecated V8 APIs (Adam Klein) [#52996](https://github.com/nodejs/node/pull/52996) +- \[[`f1890abb18`](https://github.com/nodejs/node/commit/f1890abb18)] - **src**: replace deprecated GetImportAssertions V8 API (Michaël Zasso) [#52997](https://github.com/nodejs/node/pull/52997) +- \[[`4347bd2acb`](https://github.com/nodejs/node/commit/4347bd2acb)] - **src**: improve node::Dotenv declarations (Tobias Nießen) [#52973](https://github.com/nodejs/node/pull/52973) +- \[[`e26166f30b`](https://github.com/nodejs/node/commit/e26166f30b)] - **src,permission**: handle process.chdir on pm (Rafael Gonzaga) [#53175](https://github.com/nodejs/node/pull/53175) +- \[[`75e5612fae`](https://github.com/nodejs/node/commit/75e5612fae)] - **(SEMVER-MINOR)** **src,permission**: --allow-wasi & prevent WASI exec (Rafael Gonzaga) [#53124](https://github.com/nodejs/node/pull/53124) +- \[[`7c66b27407`](https://github.com/nodejs/node/commit/7c66b27407)] - **stream**: micro-optimize writable condition (Orgad Shaneh) [#53189](https://github.com/nodejs/node/pull/53189) +- \[[`a656cf6bc8`](https://github.com/nodejs/node/commit/a656cf6bc8)] - **stream**: fix memory usage regression in writable (Orgad Shaneh) [#53188](https://github.com/nodejs/node/pull/53188) +- \[[`0e85a84fdc`](https://github.com/nodejs/node/commit/0e85a84fdc)] - **test**: fix test when compiled without engine support (Richard Lau) [#53232](https://github.com/nodejs/node/pull/53232) +- \[[`cebbd83e47`](https://github.com/nodejs/node/commit/cebbd83e47)] - **test**: update TLS trace tests for OpenSSL >= 3.2 (Richard Lau) [#53229](https://github.com/nodejs/node/pull/53229) +- \[[`45c1eb19f1`](https://github.com/nodejs/node/commit/45c1eb19f1)] - _**Revert**_ "**test**: skip v8-updates/test-linux-perf-logger" (Luke Albao) [#52869](https://github.com/nodejs/node/pull/52869) +- \[[`c1138db3c1`](https://github.com/nodejs/node/commit/c1138db3c1)] - **test**: unskip v8-updates/test-linux-perf-logger (Luke Albao) [#52869](https://github.com/nodejs/node/pull/52869) +- \[[`65b64cf0f1`](https://github.com/nodejs/node/commit/65b64cf0f1)] - **test**: fix Windows native test suites (Stefan Stojanovic) [#53173](https://github.com/nodejs/node/pull/53173) +- \[[`9a47792cd1`](https://github.com/nodejs/node/commit/9a47792cd1)] - **test**: skip `test-setproctitle` when `ps` is not available (Antoine du Hamel) [#53104](https://github.com/nodejs/node/pull/53104) +- \[[`a371dea699`](https://github.com/nodejs/node/commit/a371dea699)] - **test**: increase allocation so it fails for the test (Adam Majer) [#53099](https://github.com/nodejs/node/pull/53099) +- \[[`3ce7a9a1b5`](https://github.com/nodejs/node/commit/3ce7a9a1b5)] - **test**: remove timers from test-tls-socket-close (Luigi Pinca) [#53019](https://github.com/nodejs/node/pull/53019) +- \[[`494fa542af`](https://github.com/nodejs/node/commit/494fa542af)] - **test**: replace `.substr` with `.slice` (Antoine du Hamel) [#53070](https://github.com/nodejs/node/pull/53070) +- \[[`3f7d55b7db`](https://github.com/nodejs/node/commit/3f7d55b7db)] - **test**: add AbortController to knownGlobals (Luigi Pinca) [#53020](https://github.com/nodejs/node/pull/53020) +- \[[`c61f909ab6`](https://github.com/nodejs/node/commit/c61f909ab6)] - **test,doc**: enable running embedtest for Windows (Vladimir Morozov) [#52646](https://github.com/nodejs/node/pull/52646) +- \[[`2d1ecbf827`](https://github.com/nodejs/node/commit/2d1ecbf827)] - **test_runner**: calculate executed lines using source map (Moshe Atlow) [#53315](https://github.com/nodejs/node/pull/53315) +- \[[`d4f5f80f6c`](https://github.com/nodejs/node/commit/d4f5f80f6c)] - **test_runner**: handle file rename and deletion under watch mode (jakecastelli) [#53114](https://github.com/nodejs/node/pull/53114) +- \[[`07c601e32f`](https://github.com/nodejs/node/commit/07c601e32f)] - **test_runner**: refactor to use min/max of `validateInteger` (Deokjin Kim) [#53148](https://github.com/nodejs/node/pull/53148) +- \[[`8c6dffc269`](https://github.com/nodejs/node/commit/8c6dffc269)] - **(SEMVER-MINOR)** **test_runner**: add snapshot testing (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`f6d2af8ee7`](https://github.com/nodejs/node/commit/f6d2af8ee7)] - **(SEMVER-MINOR)** **test_runner**: add context.fullName (Colin Ihrig) [#53169](https://github.com/nodejs/node/pull/53169) +- \[[`7a67ecf161`](https://github.com/nodejs/node/commit/7a67ecf161)] - **(SEMVER-MINOR)** **test_runner**: support module mocking (Colin Ihrig) [#52848](https://github.com/nodejs/node/pull/52848) +- \[[`3ff174f2bf`](https://github.com/nodejs/node/commit/3ff174f2bf)] - **test_runner**: fix t.assert methods (Colin Ihrig) [#53049](https://github.com/nodejs/node/pull/53049) +- \[[`e2211a07c2`](https://github.com/nodejs/node/commit/e2211a07c2)] - **test_runner**: avoid error when coverage line not found (Moshe Atlow) [#53000](https://github.com/nodejs/node/pull/53000) +- \[[`c249289121`](https://github.com/nodejs/node/commit/c249289121)] - **test_runner,doc**: align documentation with actual stdout/stderr behavior (Moshe Atlow) [#53131](https://github.com/nodejs/node/pull/53131) +- \[[`5110b19a07`](https://github.com/nodejs/node/commit/5110b19a07)] - **tls**: fix negative sessionTimeout handling (Tobias Nießen) [#53002](https://github.com/nodejs/node/pull/53002) +- \[[`0ecb770331`](https://github.com/nodejs/node/commit/0ecb770331)] - **tools**: remove no-goma arg from make-v8 script (Michaël Zasso) [#53336](https://github.com/nodejs/node/pull/53336) +- \[[`e7f3a3c296`](https://github.com/nodejs/node/commit/e7f3a3c296)] - **tools**: use sccache Github action (Moshe Atlow) [#53316](https://github.com/nodejs/node/pull/53316) +- \[[`98cc094bc5`](https://github.com/nodejs/node/commit/98cc094bc5)] - **tools**: update eslint to 9.4.0 (Node.js GitHub Bot) [#53298](https://github.com/nodejs/node/pull/53298) +- \[[`6409b1fe65`](https://github.com/nodejs/node/commit/6409b1fe65)] - **tools**: update gyp-next to 0.18.1 (Node.js GitHub Bot) [#53251](https://github.com/nodejs/node/pull/53251) +- \[[`86e80dcb9b`](https://github.com/nodejs/node/commit/86e80dcb9b)] - **tools**: move webcrypto into no-restricted-properties (Zihong Qu) [#53023](https://github.com/nodejs/node/pull/53023) +- \[[`6022346f0e`](https://github.com/nodejs/node/commit/6022346f0e)] - **tools**: update error message for Type Error (Aviv Keller) [#53047](https://github.com/nodejs/node/pull/53047) +- \[[`c1b3e0ed6f`](https://github.com/nodejs/node/commit/c1b3e0ed6f)] - _**Revert**_ "**tools**: add --certify-safe to nci-ci" (Antoine du Hamel) [#53098](https://github.com/nodejs/node/pull/53098) +- \[[`9f764a873c`](https://github.com/nodejs/node/commit/9f764a873c)] - **tools**: update ESLint to v9 and use flat config (Michaël Zasso) [#52780](https://github.com/nodejs/node/pull/52780) +- \[[`2859f4c027`](https://github.com/nodejs/node/commit/2859f4c027)] - **watch**: fix variable naming (jakecastelli) [#53101](https://github.com/nodejs/node/pull/53101) + +Windows 32-bit Installer: https://nodejs.org/dist/v22.3.0/node-v22.3.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v22.3.0/node-v22.3.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v22.3.0/node-v22.3.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v22.3.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v22.3.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v22.3.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v22.3.0/node-v22.3.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v22.3.0/node-v22.3.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v22.3.0/node-v22.3.0.tar.gz \ +Other release files: https://nodejs.org/dist/v22.3.0/ \ +Documentation: https://nodejs.org/docs/v22.3.0/api/ + +### SHASUMS + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +8c349a9164f25d8a1de886a47db045b50ae11aba4c4c1e1a4d1ac34a1e5d20e3 node-v22.3.0-aix-ppc64.tar.gz +69ee53b3262ae727453d97f8e0fb3ba51363065351fcf2a389d0bdab688c021c node-v22.3.0-arm64.msi +b6723f1e4972af1ca8a7ef9ec63305ee8cd4380fce3071e0e1630dfe055d77e3 node-v22.3.0-darwin-arm64.tar.gz +b63eac38d610ffcd9ae35340f3a28d16f566d44441845d1f73dd3e5294d0dcae node-v22.3.0-darwin-arm64.tar.xz +7fe139f9d769d65c27212f8be8f858e1ee522edf3a66eed1d08d42ba102995f8 node-v22.3.0-darwin-x64.tar.gz +a633700fae61e3f078be40561df241ead763d30cfdc463b623e8b895c36bb481 node-v22.3.0-darwin-x64.tar.xz +d2460c13bb1b723d0773b3c18162ec8d3bc15c18c25643520c1f03d80e014999 node-v22.3.0-headers.tar.gz +6f62ffb3f189a4797471f0334888e2471ee7352e1c5d3bbfc6feaf2175a990fc node-v22.3.0-headers.tar.xz +0e25b9a4bc78080de826a90dff82743bec6d9c5085186e75521dc195c8be9ce3 node-v22.3.0-linux-arm64.tar.gz +c0324bbcfd5627bdcdc18830e563af1742c2173e86297a502a86db54c15bba70 node-v22.3.0-linux-arm64.tar.xz +46b640d23708f899689059cc2a8431842c2e3ad50a9144828ddabea5e1a7c3ae node-v22.3.0-linux-armv7l.tar.gz +973731137ea1ab9415115b9ec447d34628c5aa45c33115df1a2dfb20e7f79b5f node-v22.3.0-linux-armv7l.tar.xz +a01c2263a01efa7c6efa3607d202487127e268d73b68b6cce9c44a481412ece0 node-v22.3.0-linux-ppc64le.tar.gz +50c91e0b1ba7472e3ff609ecd503810308c990a1fd1ea1a721f9029c01c9d2a7 node-v22.3.0-linux-ppc64le.tar.xz +3aa6a22f525a6f8ddb0fd2ce3646414c316a41cab6bdaac812276196607bc187 node-v22.3.0-linux-s390x.tar.gz +decbeb778aa4e490ba4b60a7d13ef92f6db4647ccd2d452d7e52067b5503d4a9 node-v22.3.0-linux-s390x.tar.xz +a6d4fbf4306a883b8e1d235a8a890be84b9d95d2d39b929520bed64da41ce540 node-v22.3.0-linux-x64.tar.gz +33429139d4c4416439bf023b2eb2dc257da188fd793b64f21c8c03a0f04a5840 node-v22.3.0-linux-x64.tar.xz +a76b8e529e5dc162f9739aa25d380b416e1bacc29cf36f2b178db24764ba359d node-v22.3.0.pkg +6326484853093ab6b8f361a267445f4a5bff469042cda11a3585497b13136b55 node-v22.3.0.tar.gz +bfb85bd1dca517761f9046d61600f830d19935d6d6c36eded01578a19326104c node-v22.3.0.tar.xz +57a44a7c956581e2939c8c040cb49f72dfa148c4e97178e54be67e78cc45ca69 node-v22.3.0-win-arm64.7z +727426f9a97238d2dc269fb00bbe50c77629f76adb99a19d68abc41e8cdb4bc5 node-v22.3.0-win-arm64.zip +5eead5f9946b5381ffb36430970a2e3d0bcf90383a9432ea76e93d0efdc70691 node-v22.3.0-win-x64.7z +3dadc19ba6b36c6fb93aeda08247107fdb2ed55c24831304566d32de6b6080d7 node-v22.3.0-win-x64.zip +e8e34fbef56216f8d58499215d3c5220ce429c455ee2bfa97b29bb0e9ba57e1b node-v22.3.0-win-x86.7z +a56e1446e45adbfc716023c8e903eef829e84e5ac8aae3a65b455213bef9cdb1 node-v22.3.0-win-x86.zip +da5b1cbc773371fd11415a893ce229f51052e9aa9b656ddcbd79730ce4b93a7b node-v22.3.0-x64.msi +ae86fec0828744ac9c9a9b0186cd984e64d45602b267deac6fc140eb1c13262f node-v22.3.0-x86.msi +17608e0e2c587fca141bfc43ce9299db192b8506def389b8e30a9935e6fc6f83 win-arm64/node.exe +30e63a6726cda6539eeb37c311adf915bccd5c1462723b97a6c07ac91e8ae728 win-arm64/node.lib +8e71a3f8a27a14f0c0f5198aa0e34d9c58d0bf39cd3b0e5e89c3079884c427b3 win-arm64/node_pdb.7z +483e6e8e418fac0c311b2ca6ca5414dbbf61c8da1c1ced7a7736fc9c8a44ca94 win-arm64/node_pdb.zip +b3e0d6bf8224d43d5c6e756c8ebaffe1daef0d5ed0eeba40eef0ca62f1c4232a win-x64/node.exe +c4d08d45267da3625a30730bf5c8e41518f25d9809179feb267f1b393f5c5f05 win-x64/node.lib +fdc88d7ef4ee2bee3bb94947786ea425a30c2d5fb26b0ad25cb33cad165c8a5c win-x64/node_pdb.7z +689c6831018340256aa33e2cd0a5da8168c835e5d3070dd0688803c0cd1157cd win-x64/node_pdb.zip +195a4cc5eb1d9235043a34f423a732d54f73d9b2b7404c86ef10ff1c17dff6d6 win-x86/node.exe +fc3bf3c1e561da1e1c152be9aa5ed1bce8d263a5124841a4ba41ebc37c727f3e win-x86/node.lib +b471579503255732d862c8eaa9a3dff77cf2ef8e7c80ccb484b5e46f83cd6438 win-x86/node_pdb.7z +fadd1b6e3071a8d095913aa959be1f1a701621cc9cc7f6a685bcf3c74b884c84 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmZoniAACgkQi+q0389V +XvRTLAwAmIfWRtJ7u9cG1Bgk+2J2ybnCQeGjpwOWy8WH4AWPhS3BVvDXy1WVu/2d +Yo0rgAnV+DQz8Bvf0MSiTKvqzq3QJRcN5f8eavYW5dUFUnieegXKrYbED5UPHUyK +ou7XkzJ960VrbuUz9a8jmVTI6y1Kpyaft4Zq4fXURDb3TD9XaWHMofNSLCCf1My9 +0gJoCJWKqRS2uFm/yHjAGSFGprZQGFavkax0aIrTAOFsTkWj6nacNWCFSJEbMWhK ++zAYoK7/hXtZn1jUzLDDeamlWPydLLn4kdTpYEdml6E5oXIGWqm5tbe9o7Qmv0wp +dssn7ZPWBr1cmA+obtC639xPv0ubRJfR4D9zm1bzQktaxZFMOUf0sthXlrHaJ8+q +bztXvPHtQ75JxGOV7QGMcrmgj4ikt7af8b2GNgGRgRvp5ySA81MaRwYajkqELKoU +eoO5gPx9FOwwmRW1yMMerv6GylnPei+4XJaDmAxO4yNnIdqSISt4BG+IpOoUKVNY +SMeq61tC +=ZPUe +-----END PGP SIGNATURE----- +``` diff --git a/pages/en/blog/vulnerability/april-2024-security-releases-2.md b/pages/en/blog/vulnerability/april-2024-security-releases-2.md new file mode 100644 index 0000000000000..2205c72215753 --- /dev/null +++ b/pages/en/blog/vulnerability/april-2024-security-releases-2.md @@ -0,0 +1,54 @@ +--- +date: 2024-04-10T00:00:00.000Z +category: vulnerability +title: Wednesday, April 10, 2024 Security Releases +slug: april-2024-security-releases-2 +layout: blog-post +author: Rafael Gonzaga +--- + +## Security releases available + +Updates are now available for the 18.x, 20.x, 21.x Node.js release lines for the +following issues. + +## Command injection via args parameter of child_process.spawn without shell option enabled on Windows (CVE-2024-27980) - (HIGH) + +Due to the improper handling of batch files in child_process.spawn / child_process.spawnSync, a malicious command line argument can inject arbitrary commands and achieve code execution even if the shell option is not enabled. + +It is important to note that there has been a breaking change for Windows users who utilize `child_process.spawn` and `child_process.spawnSync`. +Node.js will now error with `EINVAL` if a `.bat` or `.cmd` file is passed to `child_process.spawn` and `child_process.spawnSync` without the `shell` option set. +If the input to `spawn`/`spawnSync` is sanitized, users can now pass `{ shell: true }` as an option to prevent the occurrence of EINVALs errors. + +While it is possible to also pass `--security-revert=CVE-2024-27980` to revert the security patch, we strongly advise against doing so. +Impact: + +- This vulnerability affects all Windows users in active release lines: 18.x, 20.x, 21.x + +Thank you, to ryotak for reporting this vulnerability and thank you Ben Noordhuis for fixing it. + +--- + +# Summary + +The Node.js project will release new versions of the 18.x, 20.x, 21.x +releases lines on or shortly after, Tuesday, April 9, 2024 in order to address: + +- 1 high severity issues. + +## Impact + +The 18.x release line of Node.js is vulnerable to 1 high severity issue. +The 20.x release line of Node.js is vulnerable to 1 high severity issue. +The 21.x release line of Node.js is vulnerable to 1 high severity issue. + +## Release timing + +Releases will be available on, or shortly after, Tuesday, April 9, 2024. + +## Contact and future updates + +The current Node.js security policy can be found at https://nodejs.org/en/security/. +Please follow the process outlined in https://github.com/nodejs/node/blob/master/SECURITY.md if you wish to report a vulnerability in Node.js. + +Subscribe to the low-volume announcement-only nodejs-sec mailing list at https://groups.google.com/forum/#!forum/nodejs-sec to stay up to date on security vulnerabilities and security-related releases of Node.js and the projects maintained in the nodejs GitHub organization. diff --git a/pages/en/blog/vulnerability/april-2024-security-releases.md b/pages/en/blog/vulnerability/april-2024-security-releases.md new file mode 100644 index 0000000000000..78dcc7d526008 --- /dev/null +++ b/pages/en/blog/vulnerability/april-2024-security-releases.md @@ -0,0 +1,65 @@ +--- +date: 2024-04-03T03:00:00.000Z +category: vulnerability +title: Wednesday, April 3, 2024 Security Releases +slug: april-2024-security-releases +layout: blog-post +author: The Node.js Project +--- + +## Security releases available + +Updates are now available for the v18.x, v20.x and 21.x Node.js release lines for the +following issues. + +This security release includes the following dependency updates to address public vulnerabilities: + +- llhttp version 9.2.1 on 21.x, 20.x, and 18.x +- undici version 6.11.1 on 21.x +- undici version 5.28.4 on 18.x and 20.x + +## Assertion failed in node::http2::Http2Session::\~Http2Session() leads to HTTP/2 server crash (CVE-2024-27983) - (High) + +An attacker can make the Node.js HTTP/2 server completely unavailable by sending a small amount of HTTP/2 frames packets with a few HTTP/2 frames inside. It is possible to leave some data in nghttp2 memory after reset when headers with HTTP/2 CONTINUATION frame are sent to the server and then a TCP connection is abruptly closed by the client triggering the Http2Session destructor while header frames are still being processed (and stored in memory) causing a race condition. + +Impacts: + +- This vulnerability affects all users in all active release lines: 18.x, 20.x and, 21.x. + +Thank you, to bart for reporting this vulnerability and [Anna Henningsen](https://github.com/addaleax) for fixing it. + +## HTTP Request Smuggling via Content Length Obfuscation - (CVE-2024-27982) - (Medium) + +The team has identified a vulnerability in the http server of the most recent version of Node, where malformed headers can lead to HTTP request smuggling. Specifically, if a space is placed before a content-length header, it is not interpreted correctly, enabling attackers to smuggle in a second request within the body of the first. + +Impacts: + +- This vulnerability affects all users in all active release lines: 18.x, 20.x and, 21.x. + +Thank you, to bpingel for reporting this vulnerability and [Paolo Insogna](https://github.com/ShogunPanda) for fixing it. + +--- + +# Summary + +The Node.js project will release new versions of the 18.x, 20.x, 21.x +releases lines on or shortly after, Wednesday, April 3, 2024 in order to address: + +- 1 medium severity issue. +- 1 high severity issue. + +## Impact + +The 18.x release line of Node.js is vulnerable to 1 medium severity issue, 1 high severity issue. +The 20.x release line of Node.js is vulnerable to 1 medium severity issue, 1 high severity issue. +The 21.x release line of Node.js is vulnerable to 1 medium severity issue, 1 high severity issue. + +## Release timing + +Releases will be available on, or shortly after, Wednesday, April 3, 2024. + +## Contact and future updates + +The current Node.js security policy can be found at [https://nodejs.org/en/security/](https://nodejs.org/en/security/). Please follow the process outlined in [https://github.com/nodejs/node/blob/master/SECURITY.md](https://github.com/nodejs/node/blob/master/SECURITY.md) if you wish to report a vulnerability in Node.js. + +Subscribe to the low-volume announcement-only nodejs-sec mailing list at [https://groups.google.com/forum/#!forum/nodejs-sec](https://groups.google.com/forum/#!forum/nodejs-sec) to stay up to date on security vulnerabilities and security-related releases of Node.js and the projects maintained in the nodejs GitHub organization. diff --git a/pages/en/download/package-manager/all.md b/pages/en/download/package-manager/all.md index 9a890b7762404..3feb29f9c26ad 100644 --- a/pages/en/download/package-manager/all.md +++ b/pages/en/download/package-manager/all.md @@ -1,5 +1,5 @@ --- -layout: docs +layout: download title: Installing Node.js via package manager --- @@ -14,6 +14,7 @@ title: Installing Node.js via package manager - [Arch Linux](#arch-linux) - [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) - [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) +- [Exherbo Linux](#exherbo-linux) - [fnm](#fnm) - [FreeBSD](#freebsd) - [Gentoo](#gentoo) @@ -29,6 +30,7 @@ title: Installing Node.js via package manager - [SmartOS and illumos](#smartos-and-illumos) - [Snap](#snap) - [Solus](#solus) +- [vfox](#vfox) - [Void Linux](#void-linux) - [Windows](#windows-1) - [z/OS](#zos) @@ -105,6 +107,14 @@ These resources provide packages compatible with CentOS, Fedora, and RHEL. Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). +## Exherbo Linux + +Node.js and npm packages are available in the [arbor repository](https://gitlab.exherbo.org/exherbo/arbor/-/tree/master/packages/dev-lang/node). + +```bash +cave resolve -x node +``` + ## fnm Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. @@ -360,6 +370,16 @@ Solus provides Node.js in its main repository. sudo eopkg install nodejs ``` +## vfox + +A cross-platform(Windows, macOS, Linux) and **extendable** version manager. + +It allows you to **different versions for different projects**, **different versions for different shells**, and switch Node versions automatically based on the current directory, etc. + +It support all popular shells (Bash, Zsh, Fish, PowerShell, Clink, Cmder). + +See the [Quick Start](https://vfox.lhan.me/guides/quick-start.html) for quickly using vfox, and all the usage details. + ## Void Linux Void Linux ships Node.js stable in the main repository. diff --git a/pages/en/download/package-manager/current.mdx b/pages/en/download/package-manager/current.mdx index fd0ec3bc54bd4..31915b0993e5a 100644 --- a/pages/en/download/package-manager/current.mdx +++ b/pages/en/download/package-manager/current.mdx @@ -5,13 +5,15 @@ subtitle: Download Node.js the way you want. ---
-Install Node.js on using +Install Node.js on using
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/download/package-manager/index.mdx b/pages/en/download/package-manager/index.mdx index ce11b873eb3d4..31915b0993e5a 100644 --- a/pages/en/download/package-manager/index.mdx +++ b/pages/en/download/package-manager/index.mdx @@ -5,13 +5,15 @@ subtitle: Download Node.js the way you want. ---
-Install Node.js on using +Install Node.js on using
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/download/prebuilt-binaries/current.mdx b/pages/en/download/prebuilt-binaries/current.mdx index f5be2f82bcc35..c101cf05ac441 100644 --- a/pages/en/download/prebuilt-binaries/current.mdx +++ b/pages/en/download/prebuilt-binaries/current.mdx @@ -11,7 +11,9 @@ I want the version of Node.js for
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/download/prebuilt-binaries/index.mdx b/pages/en/download/prebuilt-binaries/index.mdx index f5be2f82bcc35..c101cf05ac441 100644 --- a/pages/en/download/prebuilt-binaries/index.mdx +++ b/pages/en/download/prebuilt-binaries/index.mdx @@ -11,7 +11,9 @@ I want the version of Node.js for
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/download/current.mdx b/pages/en/download/prebuilt-installer/current.mdx similarity index 63% rename from pages/en/download/current.mdx rename to pages/en/download/prebuilt-installer/current.mdx index d6cec68d01148..702f1b7558fe8 100644 --- a/pages/en/download/current.mdx +++ b/pages/en/download/prebuilt-installer/current.mdx @@ -5,13 +5,15 @@ subtitle: Download Node.js the way you want. ---
-I want the version of Node.js for running +I want the version of Node.js for running
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version @@ -19,4 +21,6 @@ Learn how to verify signed SHASUMSdownload options +Learn about Node.js Releases +
diff --git a/pages/en/download/index.mdx b/pages/en/download/prebuilt-installer/index.mdx similarity index 63% rename from pages/en/download/index.mdx rename to pages/en/download/prebuilt-installer/index.mdx index d6cec68d01148..702f1b7558fe8 100644 --- a/pages/en/download/index.mdx +++ b/pages/en/download/prebuilt-installer/index.mdx @@ -5,13 +5,15 @@ subtitle: Download Node.js the way you want. ---
-I want the version of Node.js for running +I want the version of Node.js for running
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version @@ -19,4 +21,6 @@ Learn how to verify signed SHASUMSdownload options +Learn about Node.js Releases +
diff --git a/pages/en/download/source-code/current.mdx b/pages/en/download/source-code/current.mdx index c484f63369122..0732ee94ce4fb 100644 --- a/pages/en/download/source-code/current.mdx +++ b/pages/en/download/source-code/current.mdx @@ -11,7 +11,9 @@ I want the version of the Node.js source code.
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/download/source-code/index.mdx b/pages/en/download/source-code/index.mdx index c484f63369122..0732ee94ce4fb 100644 --- a/pages/en/download/source-code/index.mdx +++ b/pages/en/download/source-code/index.mdx @@ -11,7 +11,9 @@ I want the version of the Node.js source code.
-Node.js includes npm () and corepack. +Node.js includes . + +Read the changelog for this version Read the blog post for this version diff --git a/pages/en/index.mdx b/pages/en/index.mdx index 36d2ca7d6d195..ada1f5fa052d7 100644 --- a/pages/en/index.mdx +++ b/pages/en/index.mdx @@ -16,7 +16,7 @@ layout: home
- + {({ release }) => ( <> Download Node.js (LTS) @@ -28,7 +28,7 @@ layout: home )} - + {({ release }) => ( Want new features sooner? @@ -43,6 +43,7 @@ layout: home
```js displayName="Create an HTTP Server" + // server.mjs import { createServer } from 'node:http'; const server = createServer((req, res) => { @@ -54,9 +55,12 @@ layout: home server.listen(3000, '127.0.0.1', () => { console.log('Listening on 127.0.0.1:3000'); }); + + // run with `node server.mjs` ``` ```js displayName="Write Tests" + // tests.mjs import assert from 'node:assert'; import test from 'node:test'; @@ -68,37 +72,46 @@ layout: home // throws an exception because 1 != 2 assert.strictEqual(1, 2); }); + + // run with `node tests.mjs` ``` ```js displayName="Read and Hash a File" + // crypto.mjs import { createHash } from 'node:crypto'; import { readFile } from 'node:fs/promises'; const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); hasher.setEncoding('hex'); - hasher.write(fileContent); + // ensure you have a `package.json` file for this test! + hasher.write(await readFile('package.json')); hasher.end(); const fileHash = hasher.read(); + + // run with `node crypto.mjs` ``` - ```js displayName="Read Streams" + ```js displayName="Streams Pipeline" + // streams.mjs + import { pipeline } from 'node:stream/promises'; import { createReadStream, createWriteStream } from 'node:fs'; + import { createGzip } from 'node:zlib'; - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object + // ensure you have a `package.json` file for this test! + await pipeline + ( + createReadStream('package.json'), + createGzip(), + createWriteStream('package.json.gz') + ); - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); + // run with `node streams.mjs` ``` ```js displayName="Work with Threads" + // threads.mjs import { Worker, isMainThread, workerData, parentPort } from 'node:worker_threads'; @@ -110,6 +123,8 @@ layout: home const source = workerData; parentPort.postMessage(btoa(source.toUpperCase())); } + + // run with `node threads.mjs` ```
diff --git a/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md b/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md index a3734e45ba16b..db8b7c88a9477 100644 --- a/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md +++ b/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md @@ -221,7 +221,8 @@ There are some tools to check your regexps for safety, like - [safe-regex](https://github.com/davisjam/safe-regex) - [rxxr2](https://github.com/superhuman/rxxr2). - However, neither of these will catch all vulnerable regexps. + +However, neither of these will catch all vulnerable regexps. Another approach is to use a different regexp engine. You could use the [node-re2](https://github.com/uhop/node-re2) module, which uses Google's blazing-fast [RE2](https://github.com/google/re2) regexp engine. diff --git a/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md b/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md index 7bcf622e696a1..0b57e86337c2e 100644 --- a/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md +++ b/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md @@ -14,12 +14,18 @@ This module, in particular, offers the `EventEmitter` class, which we'll use to You initialize that using -```js +```cjs const EventEmitter = require('node:events'); const eventEmitter = new EventEmitter(); ``` +```mjs +import EventEmitter from 'node:events'; + +const eventEmitter = new EventEmitter(); +``` + This object exposes, among many others, the `on` and `emit` methods. - `emit` is used to trigger an event diff --git a/pages/en/learn/asynchronous-work/understanding-processnexttick.md b/pages/en/learn/asynchronous-work/understanding-processnexttick.md index a07b24e13a10c..5ae90951d507b 100644 --- a/pages/en/learn/asynchronous-work/understanding-processnexttick.md +++ b/pages/en/learn/asynchronous-work/understanding-processnexttick.md @@ -42,11 +42,13 @@ process.nextTick(() => { }); ``` -#### Output: +#### Example output: ```bash Hello => number 1 Running at next tick => number 2 -The timeout running last => number 4 Running before the timeout => number 3 +The timeout running last => number 4 ``` + +The exact output may differ from run to run. diff --git a/pages/en/learn/asynchronous-work/understanding-setimmediate.md b/pages/en/learn/asynchronous-work/understanding-setimmediate.md index b756666b91712..276f1d1b9cf6c 100644 --- a/pages/en/learn/asynchronous-work/understanding-setimmediate.md +++ b/pages/en/learn/asynchronous-work/understanding-setimmediate.md @@ -51,3 +51,11 @@ start(); ``` This code will first call `start()`, then call `foo()` in `process.nextTick queue`. After that, it will handle `promises microtask queue`, which prints `bar` and adds `zoo()` in `process.nextTick queue` at the same time. Then it will call `zoo()` which has just been added. In the end, the `baz()` in `macrotask queue` is called. + +The principle aforementioned holds true in CommonJS cases, but keep in mind in ES Modules, e.g. `mjs` files, the execution order will be different: + +```js +// start bar foo zoo baz +``` + +This is because the ES Module being loaded is wrapped as an asynchronous operation, and thus the entire script is actually already in the `promises microtask queue`. So when the promise is immediately resolved, its callback is appended to the `microtask` queue. Node.js will attempt to clear the queue until moving to any other queue, and hence you will see it outputs `bar` first. diff --git a/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md b/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md index 65b324b3627ad..99a040434ca79 100644 --- a/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md +++ b/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md @@ -10,15 +10,31 @@ How to make a Node.js CLI program interactive? Node.js since version 7 provides the [`readline` module](https://nodejs.org/api/readline.html) to perform exactly this: get input from a readable stream such as the `process.stdin` stream, which during the execution of a Node.js program is the terminal input, one line at a time. -```js -const readline = require('node:readline').createInterface({ +```cjs +const readline = require('node:readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +rl.question(`What's your name?`, name => { + console.log(`Hi ${name}!`); + rl.close(); +}); +``` + +```mjs +import readline from 'node:readline'; + +const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); -readline.question(`What's your name?`, name => { +rl.question(`What's your name?`, name => { console.log(`Hi ${name}!`); - readline.close(); + rl.close(); }); ``` @@ -38,7 +54,7 @@ A more complete and abstract solution is provided by the [Inquirer.js package](h You can install it using `npm install inquirer`, and then you can replicate the above code like this: -```js +```cjs const inquirer = require('inquirer'); const questions = [ @@ -54,6 +70,22 @@ inquirer.prompt(questions).then(answers => { }); ``` +```mjs +import inquirer from 'inquirer'; + +const questions = [ + { + type: 'input', + name: 'name', + message: "What's your name?", + }, +]; + +inquirer.prompt(questions).then(answers => { + console.log(`Hi ${answers.name}!`); +}); +``` + Inquirer.js lets you do many things like asking multiple choices, having radio buttons, confirmations, and more. It's worth knowing all the alternatives, especially the built-in ones provided by Node.js, but if you plan to take CLI input to the next level, Inquirer.js is an optimal choice. diff --git a/pages/en/learn/diagnostics/memory/using-gc-traces.md b/pages/en/learn/diagnostics/memory/using-gc-traces.md index 470c74a4c5007..465562d5db03e 100644 --- a/pages/en/learn/diagnostics/memory/using-gc-traces.md +++ b/pages/en/learn/diagnostics/memory/using-gc-traces.md @@ -23,10 +23,10 @@ and what is the outcome. For the proposal of this guide, we'll use this script: -```js +```mjs // script.mjs -import os from 'os'; +import os from 'node:os'; let len = 1_000_000; const entries = new Set(); @@ -246,10 +246,10 @@ our entries, we could use a file. Let's modify our script a bit: -```js +```mjs // script-fix.mjs -import os from 'os'; -import fs from 'fs/promises'; +import os from 'node:os'; +import fs from 'node:fs/promises'; let len = 1_000_000; const fileName = `entries-${Date.now()}`; @@ -332,8 +332,8 @@ v8.setFlagsFromString('--notrace-gc'); In Node.js, you can use [performance hooks][] to trace garbage collection. -```js -const { PerformanceObserver } = require('perf_hooks'); +```cjs +const { PerformanceObserver } = require('node:perf_hooks'); // Create a performance observer const obs = new PerformanceObserver(list => { diff --git a/pages/en/learn/getting-started/debugging.md b/pages/en/learn/getting-started/debugging.md index 211c5acf71bfd..39dd0ed30b516 100644 --- a/pages/en/learn/getting-started/debugging.md +++ b/pages/en/learn/getting-started/debugging.md @@ -69,7 +69,7 @@ either the IP address or by using ssh tunnels as described below. A minimal CLI debugger is available with `node inspect myscript.js`. Several commercial and open source tools can also connect to the Node.js Inspector. -### [Chrome DevTools](https://github.com/ChromeDevTools/devtools-frontend) 55+, [Microsoft Edge](https://www.microsoftedgeinsider.com) +### Chrome DevTools 55+, Microsoft Edge - **Option 1**: Open `chrome://inspect` in a Chromium-based browser or `edge://inspect` in Edge. Click the Configure button and ensure your target host and port @@ -77,38 +77,48 @@ Several commercial and open source tools can also connect to the Node.js Inspect - **Option 2**: Copy the `devtoolsFrontendUrl` from the output of `/json/list` (see above) or the --inspect hint text and paste into Chrome. +See https://github.com/ChromeDevTools/devtools-frontend, https://www.microsoftedgeinsider.com for more information. + > Note that the Node.js and the Chrome need to be run on the same platform. -### [Visual Studio Code](https://github.com/microsoft/vscode) 1.10+ +### Visual Studio Code 1.10+ - In the Debug panel, click the settings icon to open `.vscode/launch.json`. Select "Node.js" for initial setup. -### [Visual Studio](https://github.com/Microsoft/nodejstools) 2017+ +See https://github.com/microsoft/vscode for more information. + +### Visual Studio 2017+ - Choose "Debug > Start Debugging" from the menu or hit F5. - [Detailed instructions](https://github.com/Microsoft/nodejstools/wiki/Debugging). -### [JetBrains WebStorm](https://www.jetbrains.com/webstorm/) and other JetBrains IDEs +### JetBrains WebStorm and other JetBrains IDEs - Create a new Node.js debug configuration and hit Debug. `--inspect` will be used by default for Node.js 7+. To disable uncheck `js.debugger.node.use.inspect` in the IDE Registry. To learn more about running and debugging Node.js in WebStorm and other JetBrains IDEs, check out [WebStorm online help](https://www.jetbrains.com/help/webstorm/running-and-debugging-node-js.html). -### [chrome-remote-interface](https://github.com/cyrus-and/chrome-remote-interface) +### chrome-remote-interface - Library to ease connections to [Inspector Protocol][] endpoints. -### [Gitpod](https://www.gitpod.io) +See https://github.com/cyrus-and/chrome-remote-interface for more information. + +### Gitpod - Start a Node.js debug configuration from the `Debug` view or hit `F5`. [Detailed instructions](https://medium.com/gitpod/debugging-node-js-applications-in-theia-76c94c76f0a1) -### [Eclipse IDE](https://eclipse.org/eclipseide) with Eclipse Wild Web Developer extension +See https://www.gitpod.io for more information. + +### Eclipse IDE with Eclipse Wild Web Developer extension - From a .js file, choose "Debug As... > Node program", or - Create a Debug Configuration to attach debugger to running Node.js application (already started with `--inspect`). +See https://eclipse.org/eclipseide for more information. + ## Command-line options The following table lists the impact of various runtime flags on debugging: @@ -163,18 +173,18 @@ couple popular ones are listed below. The V8 Debugging Protocol is no longer maintained or documented. -### [Built-in Debugger](https://nodejs.org/dist/latest/docs/api/debugger.html) +### Built-in Debugger Start `node debug script_name.js` to start your script under the builtin command-line debugger. Your script starts in another Node.js process started with the `--debug-brk` option, and the initial Node.js process runs the `_debugger.js` -script and connects to your target. +script and connects to your target. See [docs](https://nodejs.org/dist/latest/docs/api/debugger.html) for more information. -### [node-inspector](https://github.com/node-inspector/node-inspector) +### node-inspector Debug your Node.js app with Chrome DevTools by using an intermediary process which translates the [Inspector Protocol][] used in Chromium to the V8 Debugger -protocol used in Node.js. +protocol used in Node.js. See https://github.com/node-inspector/node-inspector for more information. [Inspector Protocol]: https://chromedevtools.github.io/debugger-protocol-viewer/v8/ [UUID]: https://tools.ietf.org/html/rfc4122 diff --git a/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md b/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md index 445bc401fc1b9..45a6598ef8bc3 100644 --- a/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md +++ b/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md @@ -6,7 +6,7 @@ authors: flaviocopes, ollelauribostrom, MylesBorins, fhemberger, LaRuaNa, ahmada # Differences between Node.js and the Browser -Both the browser and Node.js use JavaScript as their programming language. Building apps that run in the browser is a completely different thing than building a Node.js application. Despite the fact that it's always JavaScript, there are some key differences that make the experience radically different. +Both the browser and Node.js use JavaScript as their programming language. Building apps that run in the browser is completely different from building a Node.js application. Despite the fact that it's always JavaScript, there are some key differences that make the experience radically different. From the perspective of a frontend developer who extensively uses JavaScript, Node.js apps bring with them a huge advantage: the comfort of programming everything - the frontend and the backend - in a single language. @@ -22,6 +22,6 @@ Another big difference is that in Node.js you control the environment. Unless yo This means that you can write all the modern ES2015+ JavaScript that your Node.js version supports. Since JavaScript moves so fast, but browsers can be a bit slow to upgrade, sometimes on the web you are stuck with using older JavaScript / ECMAScript releases. You can use Babel to transform your code to be ES5-compatible before shipping it to the browser, but in Node.js, you won't need that. -Another difference is that Node.js supports both the CommonJS and ES module systems (since Node.js v12), while in the browser we are starting to see the ES Modules standard being implemented. +Another difference is that Node.js supports both the CommonJS and ES module systems (since Node.js v12), while in the browser, we are starting to see the ES Modules standard being implemented. In practice, this means that you can use both `require()` and `import` in Node.js, while you are limited to `import` in the browser. diff --git a/pages/en/learn/getting-started/how-to-install-nodejs.md b/pages/en/learn/getting-started/how-to-install-nodejs.md index b93028b89da2d..9e12a36cd94f0 100644 --- a/pages/en/learn/getting-started/how-to-install-nodejs.md +++ b/pages/en/learn/getting-started/how-to-install-nodejs.md @@ -8,7 +8,7 @@ authors: flaviocopes, ZYSzys, ollelauribostrom, MylesBorins, fhemberger, LaRuaNa Node.js can be installed in different ways. This post highlights the most common and convenient ones. Official packages for all the major platforms are available at [https://nodejs.org/download/](/download). -One very convenient way to install Node.js is through a package manager. In this case, every operating system has its own. Other package managers for MacOS, Linux, and Windows are listed in [https://nodejs.org/download/package-manager/](/download/package-manager/) +One very convenient way to install Node.js is through a package manager. In this case, every operating system has its own. Other package managers for macOS, Linux, and Windows are listed in [https://nodejs.org/download/package-manager/](/download/package-manager/). `nvm` is a popular way to run Node.js. It allows you to easily switch the Node.js version, and install new versions to try and easily rollback if something breaks. It is also very useful to test your code with old Node.js versions. diff --git a/pages/en/learn/getting-started/introduction-to-nodejs.md b/pages/en/learn/getting-started/introduction-to-nodejs.md index 4ceca125b223e..d7c5d2af96a65 100644 --- a/pages/en/learn/getting-started/introduction-to-nodejs.md +++ b/pages/en/learn/getting-started/introduction-to-nodejs.md @@ -24,16 +24,33 @@ In Node.js the new ECMAScript standards can be used without problems, as you don The most common example Hello World of Node.js is a web server: -```js -const http = require('node:http'); +```cjs +const { createServer } = require('node:http'); + +const hostname = '127.0.0.1'; +const port = 3000; + +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +```mjs +import { createServer } from 'node:http'; const hostname = '127.0.0.1'; const port = 3000; -const server = http.createServer((req, res) => { +const server = createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World\n'); + res.end('Hello World'); }); server.listen(port, hostname, () => { diff --git a/pages/en/learn/getting-started/nodejs-with-typescript.md b/pages/en/learn/getting-started/nodejs-with-typescript.md index 647db4d5acda5..a254dca669067 100644 --- a/pages/en/learn/getting-started/nodejs-with-typescript.md +++ b/pages/en/learn/getting-started/nodejs-with-typescript.md @@ -1,14 +1,14 @@ --- title: Node.js with TypeScript layout: learn -authors: sbielenica, ovflowd, vaishnav-mk +authors: sbielenica, ovflowd, vaishnav-mk, AugustinMauroy --- # Node.js with TypeScript ## What is TypeScript -**[TypeScript](https://www.typescriptlang.org)** is a trendy open-source language maintained and developed by Microsoft. It's loved and used by a lot of software developers around the world. +**[TypeScript](https://www.typescriptlang.org)** is an open-source language maintained and developed by Microsoft. It's loved and used by a lot of software developers around the world. Basically, it's a superset of JavaScript that adds new capabilities to the language. The most notable addition is static type definitions, something that is not present in plain JavaScript. Thanks to types, it's possible, for example, to declare what kind of arguments we are expecting and what is returned exactly in our functions or what's the exact shape of the object that we are creating. TypeScript is a really powerful tool and opens a new world of possibilities in JavaScript projects. It makes our code more secure and robust by preventing many bugs before the code is even shipped - it catches problems during code development and integrates wonderfully with code editors like Visual Studio Code. @@ -85,14 +85,14 @@ const isJustineAnAdult: string = isAdult(justine, "I shouldn't be here!"); **And this is what TypeScript has to say about this:** ```console -example.ts:12:3 - error TS2322: Type 'string' is not assignable to type 'number'. +example.ts:12:5 - error TS2322: Type 'string' is not assignable to type 'number'. -12 age: "Secret!", - ~~~ +12 age: 'Secret!', + ~~~ - example.ts:3:3 - 3 age: number; - ~~~ + example.ts:3:5 + 3 age: number; + ~~~ The expected type comes from property 'age' which is declared here on type 'User' example.ts:15:7 - error TS2322: Type 'boolean' is not assignable to type 'string'. @@ -106,7 +106,7 @@ example.ts:15:51 - error TS2554: Expected 1 arguments, but got 2. ~~~~~~~~~~~~~~~~~~~~~~ -Found 3 errors. +Found 3 errors in the same file, starting at: example.ts:12 ``` As you can see TypeScript successfully prevents us from shipping code that could work unexpectedly. That's wonderful! @@ -117,6 +117,59 @@ TypeScript offers a whole lot of other great mechanisms like interfaces, classes Some of the other benefits of TypeScript that are worth mentioning are that it can be adopted progressively, it helps making code more readable and understandable and it allows developers to use modern language features while shipping code for older Node.js versions. +## Running TypeScript Code in Node.js + +Node.js cannot run TypeScript natively. You cannot call `node example.ts` from the command line directly. But there are three solutions to this problem: + +### Compiling TypeScript to JavaScript + +If you want to run TypeScript code in Node.js, you need to compile it to JavaScript first. You can do this using the TypeScript compiler `tsc` as shown earlier. + +Here's a small example: + +```bash +npx tsc example.ts +node example.js +``` + +### Running TypeScript Code with `ts-node` + +You can use [ts-node](https://typestrong.org/ts-node/) to run TypeScript code directly in Node.js without the need to compile it first. But it's not typechecking your code. So we recommend to type check your code first with `tsc` and then run it with `ts-node` before shipping it. + +To use `ts-node`, you need to install it first: + +```bash +npm i -D ts-node +``` + +Then you can run your TypeScript code like this: + +```bash +npx ts-node example.ts +``` + +### Running TypeScript Code with `tsx` + +You can use [tsx](https://tsx.is/) to run TypeScript code directly in Node.js without the need to compile it first. But it's not typechecking your code. So we recommend to type check your code first with `tsc` and then run it with `tsx` before shipping it. + +To use `tsx`, you need to install it first: + +```bash +npm i -D tsx +``` + +Then you can run your TypeScript code like this: + +```bash +npx tsx example.ts +``` + +If you want to use `tsx` via `node`, you can register `tsx` via `--import`: + +```bash +node --import=tsx example.ts +``` + ## TypeScript in the Node.js world TypeScript is well-established in the Node.js world and used by many companies, open-source projects, tools and frameworks. diff --git a/pages/en/learn/getting-started/security-best-practices.md b/pages/en/learn/getting-started/security-best-practices.md index 992f3339d5dc3..cfa1de4f557b5 100644 --- a/pages/en/learn/getting-started/security-best-practices.md +++ b/pages/en/learn/getting-started/security-best-practices.md @@ -43,7 +43,7 @@ it correctly. Ensure that the WebServer handles socket errors properly, for instance, when a server is created without an error handler, it will be vulnerable to DoS -```js +```cjs const net = require('node:net'); const server = net.createServer(function (socket) { @@ -55,6 +55,18 @@ const server = net.createServer(function (socket) { server.listen(5000, '0.0.0.0'); ``` +```mjs +import net from 'node:net'; + +const server = net.createServer(function (socket) { + // socket.on('error', console.error) // this prevents the server to crash + socket.write('Echo server\r\n'); + socket.pipe(socket); +}); + +server.listen(5000, '0.0.0.0'); +``` + If a _bad request_ is performed the server could crash. An example of a DoS attack that is not caused by the request's contents is diff --git a/pages/en/learn/manipulating-files/nodejs-file-paths.md b/pages/en/learn/manipulating-files/nodejs-file-paths.md index a84a77662e593..518b5192abce7 100644 --- a/pages/en/learn/manipulating-files/nodejs-file-paths.md +++ b/pages/en/learn/manipulating-files/nodejs-file-paths.md @@ -22,7 +22,7 @@ Given a path, you can extract information out of it using those methods: ### Example -```js +```cjs const path = require('node:path'); const notes = '/users/joe/notes.txt'; @@ -32,6 +32,16 @@ path.basename(notes); // notes.txt path.extname(notes); // .txt ``` +```mjs +import path from 'node:path'; + +const notes = '/users/joe/notes.txt'; + +path.dirname(notes); // /users/joe +path.basename(notes); // notes.txt +path.extname(notes); // .txt +``` + You can get the file name without the extension by specifying a second argument to `basename`: ```js diff --git a/pages/en/learn/manipulating-files/nodejs-file-stats.md b/pages/en/learn/manipulating-files/nodejs-file-stats.md index 24e2c472fcccf..fb748a8a46424 100644 --- a/pages/en/learn/manipulating-files/nodejs-file-stats.md +++ b/pages/en/learn/manipulating-files/nodejs-file-stats.md @@ -10,7 +10,7 @@ Every file comes with a set of details that we can inspect using Node.js. In par You call it passing a file path, and once Node.js gets the file details it will call the callback function you pass, with 2 parameters: an error message, and the file stats: -```js +```cjs const fs = require('node:fs'); fs.stat('/Users/joe/test.txt', (err, stats) => { @@ -21,9 +21,20 @@ fs.stat('/Users/joe/test.txt', (err, stats) => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.stat('/Users/joe/test.txt', (err, stats) => { + if (err) { + console.error(err); + } + // we have access to the file stats in `stats` +}); +``` + Node.js also provides a sync method, which blocks the thread until the file stats are ready: -```js +```cjs const fs = require('node:fs'); try { @@ -33,6 +44,16 @@ try { } ``` +```mjs +import fs from 'node:fs'; + +try { + const stats = fs.statSync('/Users/joe/test.txt'); +} catch (err) { + console.error(err); +} +``` + The file information is included in the stats variable. What kind of information can we extract using the stats? **A lot, including:** @@ -43,7 +64,7 @@ The file information is included in the stats variable. What kind of information There are other advanced methods, but the bulk of what you'll use in your day-to-day programming is this. -```js +```cjs const fs = require('node:fs'); fs.stat('/Users/joe/test.txt', (err, stats) => { @@ -59,9 +80,25 @@ fs.stat('/Users/joe/test.txt', (err, stats) => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.stat('/Users/joe/test.txt', (err, stats) => { + if (err) { + console.error(err); + return; + } + + stats.isFile(); // true + stats.isDirectory(); // false + stats.isSymbolicLink(); // false + stats.size; // 1024000 //= 1MB +}); +``` + You can also use promise-based `fsPromises.stat()` method offered by the `fs/promises` module if you like: -```js +```cjs const fs = require('node:fs/promises'); async function example() { @@ -78,4 +115,18 @@ async function example() { example(); ``` +```mjs +import fs from 'node:fs/promises'; + +try { + const stats = await fs.stat('/Users/joe/test.txt'); + stats.isFile(); // true + stats.isDirectory(); // false + stats.isSymbolicLink(); // false + stats.size; // 1024000 //= 1MB +} catch (err) { + console.log(err); +} +``` + You can read more about the `fs` module in the [official documentation](https://nodejs.org/api/fs.html). diff --git a/pages/en/learn/manipulating-files/reading-files-with-nodejs.md b/pages/en/learn/manipulating-files/reading-files-with-nodejs.md index aeb7df01aad2b..b3593bd6a6753 100644 --- a/pages/en/learn/manipulating-files/reading-files-with-nodejs.md +++ b/pages/en/learn/manipulating-files/reading-files-with-nodejs.md @@ -8,7 +8,7 @@ authors: flaviocopes, MylesBorins, fhemberger, LaRuaNa, ahmadawais, clean99 The simplest way to read a file in Node.js is to use the `fs.readFile()` method, passing it the file path, encoding and a callback function that will be called with the file data (and the error): -```js +```cjs const fs = require('node:fs'); fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => { @@ -20,9 +20,21 @@ fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => { + if (err) { + console.error(err); + return; + } + console.log(data); +}); +``` + Alternatively, you can use the synchronous version `fs.readFileSync()`: -```js +```cjs const fs = require('node:fs'); try { @@ -33,9 +45,20 @@ try { } ``` +```mjs +import fs from 'node:fs'; + +try { + const data = fs.readFileSync('/Users/joe/test.txt', 'utf8'); + console.log(data); +} catch (err) { + console.error(err); +} +``` + You can also use the promise-based `fsPromises.readFile()` method offered by the `fs/promises` module: -```js +```cjs const fs = require('node:fs/promises'); async function example() { @@ -49,6 +72,17 @@ async function example() { example(); ``` +```mjs +import fs from 'node:fs/promises'; + +try { + const data = await fs.readFile('/Users/joe/test.txt', { encoding: 'utf8' }); + console.log(data); +} catch (err) { + console.log(err); +} +``` + All three of `fs.readFile()`, `fs.readFileSync()` and `fsPromises.readFile()` read the full content of the file in memory before returning the data. This means that big files are going to have a major impact on your memory consumption and speed of execution of the program. diff --git a/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md b/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md index ff5e2ad370e52..6692046947251 100644 --- a/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md +++ b/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md @@ -10,7 +10,7 @@ Before you're able to interact with a file that sits in your filesystem, you mus A file descriptor is a reference to an open file, a number (fd) returned by opening the file using the `open()` method offered by the `fs` module. This number (`fd`) uniquely identifies an open file in operating system: -```js +```cjs const fs = require('node:fs'); fs.open('/Users/joe/test.txt', 'r', (err, fd) => { @@ -18,6 +18,14 @@ fs.open('/Users/joe/test.txt', 'r', (err, fd) => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.open('/Users/joe/test.txt', 'r', (err, fd) => { + // fd is our file descriptor +}); +``` + Notice the `r` we used as the second parameter to the `fs.open()` call. That flag means we open the file for reading. @@ -33,7 +41,7 @@ That flag means we open the file for reading. You can also open the file by using the `fs.openSync` method, which returns the file descriptor, instead of providing it in a callback: -```js +```cjs const fs = require('node:fs'); try { @@ -43,13 +51,23 @@ try { } ``` +```mjs +import fs from 'node:fs'; + +try { + const fd = fs.openSync('/Users/joe/test.txt', 'r'); +} catch (err) { + console.error(err); +} +``` + Once you get the file descriptor, in whatever way you choose, you can perform all the operations that require it, like calling `fs.close()` and many other operations that interact with the filesystem. You can also open the file by using the promise-based `fsPromises.open` method offered by the `fs/promises` module. The `fs/promises` module is available starting only from Node.js v14. Before v14, after v10, you can use `require('fs').promises` instead. Before v10, after v8, you can use `util.promisify` to convert `fs` methods into promise-based methods. -```js +```cjs const fs = require('node:fs/promises'); // Or const fs = require('fs').promises before v14. async function example() { @@ -65,9 +83,22 @@ async function example() { example(); ``` +```mjs +import fs from 'node:fs/promises'; +// Or const fs = require('fs').promises before v14. +let filehandle; +try { + filehandle = await fs.open('/Users/joe/test.txt', 'r'); + console.log(filehandle.fd); + console.log(await filehandle.readFile({ encoding: 'utf8' })); +} finally { + if (filehandle) await filehandle.close(); +} +``` + Here is an example of `util.promisify`: -```js +```cjs const fs = require('node:fs'); const util = require('node:util'); @@ -78,4 +109,15 @@ async function example() { example(); ``` +```mjs +import fs from 'node:fs'; +import util from 'node:util'; + +async function example() { + const open = util.promisify(fs.open); + const fd = await open('/Users/joe/test.txt', 'r'); +} +example(); +``` + To see more details about the `fs/promises` module, please check [fs/promises API](https://nodejs.org/api/fs.html#promise-example). diff --git a/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md b/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md index 4a738c56582b7..e5e1a2584d8a7 100644 --- a/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md +++ b/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md @@ -16,7 +16,7 @@ Use `fs.access()` (and its promise-based `fsPromises.access()` counterpart) to c Use `fs.mkdir()` or `fs.mkdirSync()` or `fsPromises.mkdir()` to create a new folder. -```js +```cjs const fs = require('node:fs'); const folderName = '/Users/joe/test'; @@ -30,13 +30,27 @@ try { } ``` +```mjs +import fs from 'node:fs'; + +const folderName = '/Users/joe/test'; + +try { + if (!fs.existsSync(folderName)) { + fs.mkdirSync(folderName); + } +} catch (err) { + console.error(err); +} +``` + ## Read the content of a directory Use `fs.readdir()` or `fs.readdirSync()` or `fsPromises.readdir()` to read the contents of a directory. This piece of code reads the content of a folder, both files and subfolders, and returns their relative path: -```js +```cjs const fs = require('node:fs'); const folderPath = '/Users/joe'; @@ -44,6 +58,14 @@ const folderPath = '/Users/joe'; fs.readdirSync(folderPath); ``` +```mjs +import fs from 'node:fs'; + +const folderPath = '/Users/joe'; + +fs.readdirSync(folderPath); +``` + You can get the full path: ```js @@ -54,7 +76,7 @@ fs.readdirSync(folderPath).map(fileName => { You can also filter the results to only return the files, and exclude the folders: -```js +```cjs const fs = require('node:fs'); const isFile = fileName => { @@ -68,11 +90,25 @@ fs.readdirSync(folderPath) .filter(isFile); ``` +```mjs +import fs from 'node:fs'; + +const isFile = fileName => { + return fs.lstatSync(fileName).isFile(); +}; + +fs.readdirSync(folderPath) + .map(fileName => { + return path.join(folderPath, fileName); + }) + .filter(isFile); +``` + ## Rename a folder Use `fs.rename()` or `fs.renameSync()` or `fsPromises.rename()` to rename folder. The first parameter is the current path, the second the new path: -```js +```cjs const fs = require('node:fs'); fs.rename('/Users/joe', '/Users/roger', err => { @@ -83,9 +119,20 @@ fs.rename('/Users/joe', '/Users/roger', err => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.rename('/Users/joe', '/Users/roger', err => { + if (err) { + console.error(err); + } + // done +}); +``` + `fs.renameSync()` is the synchronous version: -```js +```cjs const fs = require('node:fs'); try { @@ -95,9 +142,19 @@ try { } ``` +```mjs +import fs from 'node:fs'; + +try { + fs.renameSync('/Users/joe', '/Users/roger'); +} catch (err) { + console.error(err); +} +``` + `fsPromises.rename()` is the promise-based version: -```js +```cjs const fs = require('node:fs/promises'); async function example() { @@ -110,11 +167,21 @@ async function example() { example(); ``` +```mjs +import fs from 'node:fs/promises'; + +try { + await fs.rename('/Users/joe', '/Users/roger'); +} catch (err) { + console.log(err); +} +``` + ## Remove a folder Use `fs.rmdir()` or `fs.rmdirSync()` or `fsPromises.rmdir()` to remove a folder. -```js +```cjs const fs = require('node:fs'); fs.rmdir(dir, err => { @@ -126,11 +193,23 @@ fs.rmdir(dir, err => { }); ``` +```mjs +import fs from 'node:fs'; + +fs.rmdir(dir, err => { + if (err) { + throw err; + } + + console.log(`${dir} is deleted!`); +}); +``` + To remove a folder that has contents use `fs.rm()` with the option `{ recursive: true }` to recursively remove the contents. `{ recursive: true, force: true }` makes it so that exceptions will be ignored if the folder does not exist. -```js +```cjs const fs = require('node:fs'); fs.rm(dir, { recursive: true, force: true }, err => { @@ -141,3 +220,15 @@ fs.rm(dir, { recursive: true, force: true }, err => { console.log(`${dir} is deleted!`); }); ``` + +```mjs +import fs from 'node:fs'; + +fs.rm(dir, { recursive: true, force: true }, err => { + if (err) { + throw err; + } + + console.log(`${dir} is deleted!`); +}); +``` diff --git a/pages/en/learn/modules/anatomy-of-an-http-transaction.md b/pages/en/learn/modules/anatomy-of-an-http-transaction.md index f9cb5898675ef..614557282f403 100644 --- a/pages/en/learn/modules/anatomy-of-an-http-transaction.md +++ b/pages/en/learn/modules/anatomy-of-an-http-transaction.md @@ -17,7 +17,7 @@ the API docs for each of those. Any node web server application will at some point have to create a web server object. This is done by using [`createServer`][]. -```js +```cjs const http = require('node:http'); const server = http.createServer((request, response) => { @@ -25,6 +25,14 @@ const server = http.createServer((request, response) => { }); ``` +```mjs +import http from 'node:http'; + +const server = http.createServer((request, response) => { + // magic happens here! +}); +``` + The function that's passed in to [`createServer`][] is called once for every HTTP request that's made against that server, so it's called the request handler. In fact, the [`Server`][] object returned by [`createServer`][] is an @@ -138,7 +146,7 @@ At this point, we've covered creating a server, and grabbing the method, URL, headers and body out of requests. When we put that all together, it might look something like this: -```js +```cjs const http = require('node:http'); http @@ -161,6 +169,29 @@ http .listen(8080); // Activates this server, listening on port 8080. ``` +```mjs +import http from 'node:http'; + +http + .createServer((request, response) => { + const { headers, method, url } = request; + let body = []; + request + .on('error', err => { + console.error(err); + }) + .on('data', chunk => { + body.push(chunk); + }) + .on('end', () => { + body = Buffer.concat(body).toString(); + // At this point, we have the headers, method, url and body, and can now + // do whatever we need to in order to respond to this request. + }); + }) + .listen(8080); // Activates this server, listening on port 8080. +``` + If we run this example, we'll be able to _receive_ requests, but not _respond_ to them. In fact, if you hit this example in a web browser, your request would time out, as nothing is being sent back to the client. @@ -254,7 +285,7 @@ Building on the earlier example, we're going to make a server that sends back all of the data that was sent to us by the user. We'll format that data as JSON using `JSON.stringify`. -```js +```cjs const http = require('node:http'); http @@ -294,6 +325,46 @@ http .listen(8080); ``` +```mjs +import http from 'node:http'; + +http + .createServer((request, response) => { + const { headers, method, url } = request; + let body = []; + request + .on('error', err => { + console.error(err); + }) + .on('data', chunk => { + body.push(chunk); + }) + .on('end', () => { + body = Buffer.concat(body).toString(); + // BEGINNING OF NEW STUFF + + response.on('error', err => { + console.error(err); + }); + + response.statusCode = 200; + response.setHeader('Content-Type', 'application/json'); + // Note: the 2 lines above could be replaced with this next one: + // response.writeHead(200, {'Content-Type': 'application/json'}) + + const responseBody = { headers, method, url, body }; + + response.write(JSON.stringify(responseBody)); + response.end(); + // Note: the 2 lines above could be replaced with this next one: + // response.end(JSON.stringify(responseBody)) + + // END OF NEW STUFF + }); + }) + .listen(8080); +``` + ## Echo Server Example Let's simplify the previous example to make a simple echo server, which just @@ -301,7 +372,7 @@ sends whatever data is received in the request right back in the response. All we need to do is grab the data from the request stream and write that data to the response stream, similar to what we did previously. -```js +```cjs const http = require('node:http'); http @@ -319,6 +390,24 @@ http .listen(8080); ``` +```mjs +import http from 'node:http'; + +http + .createServer((request, response) => { + let body = []; + request + .on('data', chunk => { + body.push(chunk); + }) + .on('end', () => { + body = Buffer.concat(body).toString(); + response.end(body); + }); + }) + .listen(8080); +``` + Now let's tweak this. We want to only send an echo under the following conditions: @@ -327,7 +416,7 @@ conditions: In any other case, we want to simply respond with a 404. -```js +```cjs const http = require('node:http'); http @@ -350,6 +439,29 @@ http .listen(8080); ``` +```mjs +import http from 'node:http'; + +http + .createServer((request, response) => { + if (request.method === 'POST' && request.url === '/echo') { + let body = []; + request + .on('data', chunk => { + body.push(chunk); + }) + .on('end', () => { + body = Buffer.concat(body).toString(); + response.end(body); + }); + } else { + response.statusCode = 404; + response.end(); + } + }) + .listen(8080); +``` + > By checking the URL in this way, we're doing a form of "routing". > Other forms of routing can be as simple as `switch` statements or as complex as > whole frameworks like [`express`][]. If you're looking for something that does @@ -360,7 +472,7 @@ is a [`ReadableStream`][] and the `response` object is a [`WritableStream`][]. That means we can use [`pipe`][] to direct data from one to the other. That's exactly what we want for an echo server! -```js +```cjs const http = require('node:http'); http @@ -375,6 +487,21 @@ http .listen(8080); ``` +```mjs +import http from 'node:http'; + +http + .createServer((request, response) => { + if (request.method === 'POST' && request.url === '/echo') { + request.pipe(response); + } else { + response.statusCode = 404; + response.end(); + } + }) + .listen(8080); +``` + Yay streams! We're not quite done yet though. As mentioned multiple times in this guide, @@ -411,6 +538,29 @@ http .listen(8080); ``` +```js +import http from 'node:http'; + +http + .createServer((request, response) => { + request.on('error', err => { + console.error(err); + response.statusCode = 400; + response.end(); + }); + response.on('error', err => { + console.error(err); + }); + if (request.method === 'POST' && request.url === '/echo') { + request.pipe(response); + } else { + response.statusCode = 404; + response.end(); + } + }) + .listen(8080); +``` + We've now covered most of the basics of handling HTTP requests. At this point, you should be able to: diff --git a/pages/en/learn/modules/backpressuring-in-streams.md b/pages/en/learn/modules/backpressuring-in-streams.md index d149276e66b04..f181982d9d1e7 100644 --- a/pages/en/learn/modules/backpressuring-in-streams.md +++ b/pages/en/learn/modules/backpressuring-in-streams.md @@ -36,7 +36,7 @@ pipes, sockets, and signals. In Node.js, we find a similar mechanism called part of the internal codebase utilizes that module. As a developer, you are more than encouraged to use them too! -```js +```cjs const readline = require('node:readline'); // process.stdin and process.stdout are both instances of Streams. @@ -52,6 +52,22 @@ rl.question('Why should you use streams? ', answer => { }); ``` +```mjs +import readline from 'node:readline'; + +// process.stdin and process.stdout are both instances of Streams. +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +rl.question('Why should you use streams? ', answer => { + console.log(`Maybe it's ${answer}, maybe it's because they are awesome! :)`); + + rl.close(); +}); +``` + A good example of why the backpressure mechanism implemented through streams is a great optimization can be demonstrated by comparing the internal system tools from Node.js' [`Stream`][] implementation. @@ -67,7 +83,7 @@ While that will take a few minutes to complete, in another shell we may run a script that takes Node.js' module [`zlib`][], that wraps around another compression tool, [`gzip(1)`][]. -```js +```cjs const gzip = require('node:zlib').createGzip(); const fs = require('node:fs'); @@ -77,6 +93,18 @@ const out = fs.createWriteStream('The.Matrix.1080p.mkv.gz'); inp.pipe(gzip).pipe(out); ``` +```mjs +import { createGzip } from 'node:zlib'; +import { createReadStream, createWriteStream } from 'node:fs'; + +const gzip = createGzip(); + +const inp = createReadStream('The.Matrix.1080p.mkv'); +const out = createWriteStream('The.Matrix.1080p.mkv.gz'); + +inp.pipe(gzip).pipe(out); +``` + To test the results, try opening each compressed file. The file compressed by the [`zip(1)`][] tool will notify you the file is corrupt, whereas the compression finished by [`Stream`][] will decompress without error. @@ -95,7 +123,7 @@ cleaning up and providing a callback when the pipeline is complete. Here is an example of using pipeline: -```js +```cjs const { pipeline } = require('node:stream/promises'); const fs = require('node:fs'); const zlib = require('node:zlib'); @@ -118,9 +146,32 @@ pipeline( ); ``` +```mjs +import { pipeline } from 'node:stream/promises'; +import fs from 'node:fs'; +import zlib from 'node:zlib'; + +// Use the pipeline API to easily pipe a series of streams +// together and get notified when the pipeline is fully done. +// A pipeline to gzip a potentially huge video file efficiently: + +pipeline( + fs.createReadStream('The.Matrix.1080p.mkv'), + zlib.createGzip(), + fs.createWriteStream('The.Matrix.1080p.mkv.gz'), + err => { + if (err) { + console.error('Pipeline failed', err); + } else { + console.log('Pipeline succeeded'); + } + } +); +``` + You can also call [`promisify`][] on pipeline to use it with `async` / `await`: -```js +```cjs const stream = require('node:stream'); const fs = require('node:fs'); const zlib = require('node:zlib'); @@ -142,6 +193,28 @@ async function run() { } ``` +```mjs +import stream from 'node:stream'; +import fs from 'node:fs'; +import zlib from 'node:zlib'; +import util from 'node:util'; + +const pipeline = util.promisify(stream.pipeline); + +async function run() { + try { + await pipeline( + fs.createReadStream('The.Matrix.1080p.mkv'), + zlib.createGzip(), + fs.createWriteStream('The.Matrix.1080p.mkv.gz') + ); + console.log('Pipeline succeeded'); + } catch (err) { + console.error('Pipeline failed', err); + } +} +``` + ## Too Much Data, Too Quickly There are instances where a [`Readable`][] stream might give data to the @@ -504,7 +577,7 @@ readable.on('data', data => writable.write(data)); Here's an example of using [`.push()`][] with a Readable stream. -```js +```cjs const { Readable } = require('node:stream'); // Create a custom Readable stream @@ -526,6 +599,28 @@ myReadableStream.on('data', chunk => { // { message: 'Hello, world!' } ``` +```mjs +import { Readable } from 'node:stream'; + +// Create a custom Readable stream +const myReadableStream = new Readable({ + objectMode: true, + read(size) { + // Push some data onto the stream + this.push({ message: 'Hello, world!' }); + this.push(null); // Mark the end of the stream + }, +}); + +// Consume the stream +myReadableStream.on('data', chunk => { + console.log(chunk); +}); + +// Output: +// { message: 'Hello, world!' } +``` + In this example, we create a custom Readable stream that pushes a single object onto the stream using [`.push()`][]. The [`._read()`][] method is called when the stream is ready to consume data, and in this case, we immediately push some data onto the stream and diff --git a/pages/en/learn/test-runner/introduction.md b/pages/en/learn/test-runner/introduction.md new file mode 100644 index 0000000000000..9bfffbdae1a22 --- /dev/null +++ b/pages/en/learn/test-runner/introduction.md @@ -0,0 +1,23 @@ +--- +title: Discovering Node.js's test runner +layout: learn +authors: AugustinMauroy +--- + +# Discovering Node.js's test runner + +In this series of resources, we will discover how to use Node.js's test runner to test our code. + +## What is a test runner? + +A test runner is a tool that allows you to run tests on your code. It will execute your tests and give you feedback on whether they pass or fail. It can also provide you with additional information such as code coverage. + +There are many test runners available for Node.js, but we will focus on the built-in test runner that comes with Node.js. It's cool because you don't need to install any additional dependencies to use it. + +## Why test your code? + +Testing your code is important because it allows you to verify that your code works as expected. It helps you catch bugs early in the development process and ensures that your code is reliable and maintainable. + +## Running tests with Node.js + +To run tests with Node.js, we recommend you to read the [test runner documentation](https://nodejs.org/docs/latest/api/test.html#test-runner). diff --git a/pages/en/learn/test-runner/using-test-runner.md b/pages/en/learn/test-runner/using-test-runner.md new file mode 100644 index 0000000000000..84e2657d7b953 --- /dev/null +++ b/pages/en/learn/test-runner/using-test-runner.md @@ -0,0 +1,312 @@ +--- +title: Using Node.js's test runner +layout: learn +authors: JakobJingleheimer +--- + +# Using Node.js's test runner + +Node.js has a flexible and robust built-in test runner. This guide will show you how to set up and use it. + +```text displayName="Architecture overview" +example/ + ├ … + ├ src/ + ├ app/… + └ sw/… + └ test/ + ├ globals/ + ├ … + ├ IndexedDb.js + └ ServiceWorkerGlobalScope.js + ├ setup.mjs + ├ setup.units.mjs + └ setup.ui.mjs +``` + +```bash displayName="Install dependencies" +npm init -y +npm install --save-dev concurrently +``` + +```json displayName="package.json" +{ + "name": "example", + "scripts": { + "test": "concurrently --kill-others-on-fail --prefix none npm:test:*", + "test:sw": "node --import ./test/setup.sw.mjs --test './src/sw/**/*.spec.*'", + "test:units": "node --import ./test/setup.units.mjs --test './src/app/**/*.spec.*'", + "test:ui": "node --import ./test/setup.ui.mjs --test './src/app/**/*.test.*'" + } +} +``` + +> **Note**: globs require node v21+, and the globs must themselves be wrapped in quotes (without, you'll get different behaviour than expected, wherein it may first appear to be working but isn't). + +There are some things you always want, so put them in a base setup file like the following. This file will get imported by other, more bespoke setups. + +## General setup + +
+`test/setup.mjs` + +```js +import { register } from 'node:module'; + +register('some-typescript-loader'); +// TypeScript is supported hereafter +// BUT other test/setup.*.mjs files still must be plain JavaScript! +``` + +
+ +Then for each setup, create a dedicated `setup` file (ensuring the base `setup.mjs` file is imported within each). There are a number of reasons to isolate the setups, but the most obvious reason is [YAGNI](https://en.wikipedia.org/wiki/You_aren't_gonna_need_it) + performance: much of what you may be setting up are environment-specific mocks/stubs, which can be quite expensive and will slow down test runs. You want to avoid those costs (literal money you pay to CI, time waiting for tests to finish, etc) when you don't need them. + +Each example below was taken from real-world projects; they may not be appropriate/applicable to yours, but each demonstrate general concepts that are broadly applicable. + +## ServiceWorker tests + +[`ServiceWorkerGlobalScope`](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) contains very specific APIs that don't exist in other environments, and some of its APIs are seemingly similar to others (ex `fetch`) but have augmented behaviour. You do not want these to spill into unrelated tests. + +
+`test/setup.sw.mjs` + +```js +import { beforeEach } from 'node:test'; + +import { ServiceWorkerGlobalScope } from './globals/ServiceWorkerGlobalScope.js'; + +import './setup.mjs'; // 💡 + +beforeEach(globalSWBeforeEach); +function globalSWBeforeEach() { + globalThis.self = new ServiceWorkerGlobalScope(); +} +``` + +
+ +```js +import assert from 'node:assert/strict'; +import { describe, mock, it } from 'node:test'; + +import { onActivate } from './onActivate.js'; + +describe('ServiceWorker::onActivate()', () => { + const globalSelf = globalThis.self; + const claim = mock.fn(async function mock__claim() {}); + const matchAll = mock.fn(async function mock__matchAll() {}); + + class ActivateEvent extends Event { + constructor(...args) { + super('activate', ...args); + } + } + + before(() => { + globalThis.self = { + clients: { claim, matchAll }, + }; + }); + after(() => { + global.self = globalSelf; + }); + + it('should claim all clients', async () => { + await onActivate(new ActivateEvent()); + + assert.equal(claim.mock.callCount(), 1); + assert.equal(matchAll.mock.callCount(), 1); + }); +}); +``` + +## Snapshot tests + +These were popularised by Jest; now, many libraries implement such functionality, including Node.js as of v22.3.0. There are several use-cases such as verifying component rendering output and [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) config. The concept is the same regardless of use-case. + +There is no specific configuration _required_ except enabling the feature via [`--experimental-test-snapshots`](). But to demonstrate the optional configuration, you would probably add something like the following to one of your existing test config files. + +
+`test/setup.ui.mjs` + +By default, node generates a filename that is incompatible with syntax highlighting detection: `.js.snapshot`. The generated file is actually a CJS file, so a more appropriate file name would end with `.snapshot.cjs` (or more succinctly `.snap.cjs` as below); this will also handle better in ESM projects. + +```js +import { basename, dirname, extname, join } from 'node:path'; +import { snapshot } from 'node:test'; + +snapshot.setResolveSnapshotPath(generateSnapshotPath); +/** + * @param {string} testFilePath '/tmp/foo.test.js' + * @returns {string} '/tmp/foo.test.snap.cjs' + */ +function generateSnapshotPath(testFilePath) { + const ext = extname(testFilePath); + const filename = basename(testFilePath, ext); + const base = dirname(testFilePath); + + return join(base, `${filename}.snap.cjs`); +} +``` + +
+ +The example below demonstrates snapshot testing with [testing library](https://testing-library.com/) for UI components; note the two different ways of accessing `assert.snapshot`): + +```ts +import { describe, it } from 'node:test'; + +import { prettyDOM } from '@testing-library/dom'; +import { render } from '@testing-library/react'; // Any framework (ex svelte) + +import { SomeComponent } from './SomeComponent.jsx'; + + +describe('', () => { + // For people preferring "fat-arrow" syntax, the following is probably better for consistency + it('should render defaults when no props are provided', (t) => { + const component = render().container.firstChild; + + t.assert.snapshot(prettyDOM(component)); + }); + + it('should consume `foo` when provided', function() { + const component = render().container.firstChild; + + this.assert.snapshot(prettyDOM(component)); + // `this` works only when `function` is used (not "fat arrow"). + }); +}); +``` + +> ⚠️ `assert.snapshot` comes from the test's context (`t` or `this`), **not** `node:assert`. This is necessary because the test context has access to scope that is impossible for `node:assert` (you would have to manually provide it every time `assert.snapshot` is used, like `snapshot(this, value)`, which would be rather tedious). + +## Unit tests + +Unit tests are the simplest tests and generally require relatively nothing special. The vast majority of your tests will likely be unit tests, so it is important to keep this setup minimal because a small decrease to setup performance will magnify and cascade. + +
+`test/setup.units.mjs` + +```js +import { register } from 'node:module'; + +import './setup.mjs'; // 💡 + +register('some-plaintext-loader'); +// plain-text files like graphql can now be imported: +// import GET_ME from 'get-me.gql'; GET_ME = ' +``` + +
+ +```js +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; + +import { Cat } from './Cat.js'; +import { Fish } from './Fish.js'; +import { Plastic } from './Plastic.js'; + +describe('Cat', () => { + it('should eat fish', () => { + const cat = new Cat(); + const fish = new Fish(); + + assert.doesNotThrow(() => cat.eat(fish)); + }); + + it('should NOT eat plastic', () => { + const cat = new Cat(); + const plastic = new Plastic(); + + assert.throws(() => cat.eat(plastic)); + }); +}); +``` + +## User Interface tests + +UI tests generally require a DOM, and possibly other browser-specific APIs (such as [`IndexedDb`](https://developer.mozilla.org/docs/Web/API/IndexedDB_API) used below). These tend to be very complicated and expensive to setup. + +
+`test/setup.ui.mjs` + +If you use an API like `IndexedDb` but it's very isolated, a global mock like below is perhaps not the way to go. Instead, perhaps move this `beforeEach` into the specific test where `IndexedDb` will be accessed. Note that if the module accessing `IndexedDb` (or whatever) is itself widely accessed, either mock that module (probably the better option), or _do_ keep this here. + +```js +import { register } from 'node:module'; + +// ⚠️ Ensure only 1 instance of JSDom is instantiated; multiples will lead to many 🤬 +import jsdom from 'global-jsdom'; + +import './setup.units.mjs'; // 💡 + +import { IndexedDb } from './globals/IndexedDb.js'; + +register('some-css-modules-loader'); + +jsdom(undefined, { + url: 'https://test.example.com', // ⚠️ Failing to specify this will likely lead to many 🤬 +}); + +// Example of how to decorate a global. +// JSDOM's `history` does not handle navigation; the following handles most cases. +const pushState = globalThis.history.pushState.bind(globalThis.history); +globalThis.history.pushState = function mock_pushState(data, unused, url) { + pushState(data, unused, url); + globalThis.location.assign(url); +}; + +beforeEach(globalUIBeforeEach); +function globalUIBeforeEach() { + globalThis.indexedDb = new IndexedDb(); +} +``` + +
+ +You can have 2 different levels of UI tests: a unit-like (wherein externals & dependencies are mocked) and a more end-to-end (where only externals like IndexedDb are mocked but the rest of the chain is real). The former is generally the purer option, and the latter is generally deferred to a fully end-to-end automated usability test via something like [Playwright](https://playwright.dev/) or [Puppeteer](https://pptr.dev/). Below is an example of the former. + +```ts +import { before, describe, mock, it } from 'node:test'; + +import { screen } from '@testing-library/dom'; +import { render } from '@testing-library/react'; // Any framework (ex svelte) + +// ⚠️ Note that SomeOtherComponent is NOT a static import; +// this is necessary in order to facilitate mocking its own imports. + + +describe('', () => { + let SomeOtherComponent; + let calcSomeValue; + + before(async () => { + // ⚠️ Sequence matters: the mock must be set up BEFORE its consumer is imported. + + // Requires the `--experimental-test-module-mocks` be set. + calcSomeValue = mock.module('./calcSomeValue.js', { calcSomeValue: mock.fn() }); + + ({ SomeOtherComponent } = await import('./SomeOtherComponent.jsx')); + }); + + describe('when calcSomeValue fails', () => { + // This you would not want to handle with a snapshot because that would be brittle: + // When inconsequential updates are made to the error message, + // the snapshot test would erroneously fail + // (and the snapshot would need to be updated for no real value). + + it('should fail gracefully by displaying a pretty error', () => { + calcSomeValue.mockImplementation(function mock__calcSomeValue() { return null }); + + render(); + + const errorMessage = screen.queryByText('unable'); + + assert.ok(errorMessage); + }); + }); +}); +``` diff --git a/pages/es/about/get-involved/collab-summit.md b/pages/es/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/es/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/es/about/get-involved/contribute.md b/pages/es/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/es/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/es/about/get-involved/events.mdx b/pages/es/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/es/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/es/about/get-involved/index.md b/pages/es/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/es/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/es/about/governance.md b/pages/es/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/es/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/es/about/index.mdx b/pages/es/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/es/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/es/about/previous-releases.mdx b/pages/es/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/es/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/es/about/security-reporting.mdx b/pages/es/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/es/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/es/download/current.mdx b/pages/es/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/es/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/es/download/index.mdx b/pages/es/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/es/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/es/download/package-manager/all.md b/pages/es/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/es/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/es/download/package-manager/current.mdx b/pages/es/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/es/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/es/download/package-manager/index.mdx b/pages/es/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/es/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/es/download/prebuilt-binaries/current.mdx b/pages/es/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/es/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/es/download/prebuilt-binaries/index.mdx b/pages/es/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/es/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/es/download/source-code/current.mdx b/pages/es/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/es/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/es/download/source-code/index.mdx b/pages/es/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/es/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/es/index.mdx b/pages/es/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/es/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/es/search.mdx b/pages/es/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/es/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/fa/about/branding.mdx b/pages/fa/about/branding.mdx new file mode 100644 index 0000000000000..f32e9d8e175f0 --- /dev/null +++ b/pages/fa/about/branding.mdx @@ -0,0 +1,72 @@ +--- +title: برندسازی Node.js +layout: about +--- + +برندسازی Node.js + +لطفاً [سیاست علامت تجاری](https://trademark-policy.openjsf.org/) را بررسی کنید برای اطلاعات درباره استفاده مجاز از لوگوها و نشان‌های Node.js®‎. + +## Node.js® Mascot + +Node.js mascot + +## لوگو Node.js®‎ + +### لوگوی افقی Node.js®‎ + + + + + + + +
+ Node.js Dark Horizontal Logo + + Node.js Light Horizontal Logo +
+ +### لوگو تراکم‌یافته Node.js®‎ + + + + + + + + + + + + + +
+ لوگو تراکم‌یافته تاریک Node.js + + لوگو تراکم‌یافته روشن Node.js +
+ لوگو تراکم‌یافته تاریک Node.js + + لوگو تراکم‌یافته سفید Node.js +
+ +### نمادهای JS + + + + + + + +
+ نمادهای JS سبز + + آیکون‌های JS سفید +
diff --git a/pages/fa/about/get-involved/collab-summit.md b/pages/fa/about/get-involved/collab-summit.md index d8b152d0a2723..9e9613c9814a9 100644 --- a/pages/fa/about/get-involved/collab-summit.md +++ b/pages/fa/about/get-involved/collab-summit.md @@ -1,30 +1,16 @@ --- -title: Collab Summit +title: نشست مشارکت کنندگان (Collab Summit) layout: about --- -# Collaborator Summit +# نشست مشارکت کنندگان (Collab Summit) -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. +نشست مشارکت کنندگان Node.js یک کنفرانس غیررسمی برای گردهم آوردن مشارکت کنندگان فعلی و جدید برای بحث در مورد Node.js همراه با همکاری بصورت زنده، آموزش و اشتراک دانش است. تیم‌ها، گروه‌های کاری و مشارکت‌کنندگان از جامعه دو بار در سال برای بحث‌هایی که در تصمیم‌گیری کمک می‌کنند گرد هم می‌آیند و در عین حال بر روی تلاش‌های هیجان‌انگیزی که می‌خواهند به صورت حضوری پیش ببرند، کار می‌کنند. -## Who attends? +## چه کسانی شرکت می‌کنند؟ -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. +در کنفرانس همکاری عمدتاً مشارکت‌کنندگان و اعضای جامعه فعلی حضور دارند، اما همچنین از کسانی که هنوز مشارکت‌کننده نیستند و می‌خواهند به تیم بپیوندند نیز استقبال می‌شود. اگر در مشارکت در Node.js تازه وارد هستید، کنفرانس همکاری می‌تواند فرصت خوبی باشد تا به شما کمک کند که بتوانید بفهمید چه اتفاقی در جامعه رخ می‌دهد و با مهارت‌هایی که دارید و دوست دارید بهبود بخشید، مشارکت کنید. -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. +قبل از برگزاری این نشست، همکاران و اعضای جامعه پیشنهادها جلسه را برای ایجاد یک برنامه زمانی ارسال می کنند. شرکت کنندگان می‌توانند قبل از رسیدن به محل برگزاری، با جلسه آشنا شوند و پس از بحث‌های کلی همکاران، وارد جلسات شوند. همچنین فرصت‌های زیادی برای دنباله‌های محیطی و ایده‌پردازی‌ها وجود خواهد داشت. -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. +برای اطلاعات درباره نشست‌های آینده و گذشته همکاری، به [Summit repo](https://github.com/openjs-foundation/summit) مراجعه کنید. به [issue های ثبت شده](https://github.com/nodejs/summit/issues) که نشان می‌دهد چه موضوعاتی توسط همکاران و اعضای جامعه برای بحث حضوری پیشنهاد شده‌اند، نگاهی بیندازید. diff --git a/pages/fa/about/get-involved/contribute.md b/pages/fa/about/get-involved/contribute.md index 6392c5fe32cb5..74caf97e3fa43 100644 --- a/pages/fa/about/get-involved/contribute.md +++ b/pages/fa/about/get-involved/contribute.md @@ -1,47 +1,47 @@ --- -title: Contributing +title: مشارکت layout: about --- -# Contributing +# مشارکت -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. +از علاقه شما برای مشارکت در Node.js متشکریم! راه ها و مکان های مختلفی برای مشارکت وجود دارد و ما اینجا هستیم تا در این زمینه کمک کنیم. -## Asking for General Help +## درخواست کمک عمومی -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). +به دلیل سطح بالای فعالیت در مخزن `nodejs/node`، سوالات یا درخواست های کمک عمومی برای استفاده از Node.js باید به [مخزن راهنمای Node.js](https://github.com/nodejs/help/issues) ارسال شود. -## Reporting an Issue +## گزارش مشکل -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. +اگر فکر می کنید مشکلی در Node.js وجود دارد، لطفاً از ایجاد یک issue در GitHub خودداری نکنید. هنگام ثبت مشکل، مطمئن شوید که می توانید آن را با یک مورد آزمایش قابل تکرار بیان کنید و این مورد آزمایش نباید شامل هیچ وابستگی خارجی باشد. یعنی مورد آزمایش باید بدون هیچ چیز بیشتر از خود Node.js قابل اجرا باشد. -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: +هنگام گزارش مشکل، ما همچنین به اطلاعات بیشتری در مورد محیط شما نیاز داریم. ما هرگز نمی‌دانیم چه اطلاعاتی برای محدود کردن مشکل نیاز خواهد بود. برای همین لطفاً حداقل اطلاعات زیر را ارائه دهید: -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) +- نسخه Node.js +- پلتفرمی که روی آن اجرا می‌شود (macOS ، SmartOS ، Linux ، Windows) +- معماری که روی آن اجرا می‌شود (32 بیتی یا 64 بیتی و x86 یا ARM) -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. +پروژه Node.js در حال حاضر در چندین مخزن جداگانه GitHub مدیریت می شود که هر کدام دارای پایگاه داده مسائل جداگانه خود هستند. در صورت امکان، لطفاً هر مشکلی را که گزارش می‌دهید به مخزن مناسب هدایت کنید، اما نگران نباشید اگر موارد در جای اشتباه قرار گرفتند، جامعه مشارکت‌کنندگان از کمک به شما برای راهنمایی در جهت درست خوشحال خواهند شد. -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) +- برای گزارش مشکلات مربوط به Node.js، لطفاً از [nodejs/node](https://github.com/nodejs/node) استفاده کنید +- برای گزارش مشکلات مربوط به این وب سایت، لطفاً از [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) استفاده کنید -## Code contributions +## مشارکت در کد -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. +اگر می خواهید اشکالات را برطرف کنید یا ویژگی جدیدی به Node.js اضافه کنید، لطفاً مطمئن شوید که [راهنمای مشارکت Node.js](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests) را مطالعه کرده اید. روند بازبینی برای تمام مشارکت ها به پروژه توسط همکاران موجود در آنجا توضیح داده شده است. -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. +اگر می خواهید بدانید چگونه شروع کنید، می توانید [Node Todo](https://www.nodetodo.org/) را بررسی کنید که ممکن است شما را به سمت اولین مشارکت خود راهنمایی کند. -## Becoming a collaborator +## تبدیل شدن به یک همکار (مشارکت کننده) -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: +با تبدیل شدن به همکار، مشارکت کنندگان می توانند تأثیر بیشتری بر روی پروژه داشته باشند. آنها می توانند با بازبینی مشارکت های دیگران، رده بندی مشکلات و ایفای نقش بزرگتری در شکل دادن به آینده پروژه، به سایر مشارکت کنندگان کمک کنند. افرادی که توسط TSC به عنوان ارائه دهندگان مشارکت های قابل توجه و ارزشمند در هر مخزن Node.js شناسایی می شوند، ممکن است به عنوان همکار انتخاب شده و دسترسی commit به پروژه به آنها داده شود. فعالیت هایی که در نظر گرفته می شوند شامل (اما نه محدود به) کیفیت موارد زیر است: -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community +- commits بر روی code و ارسال pull request +- commit بر روی مستندات و ارسال pull request ها +- کامنت بر روی issue ها و pull request ها +- مشارکت در وب سایت Node.js +- کمک ارائه شده به کاربران نهایی و مشارکت کنندگان تازه‌کار +- مشارکت در گروه های کاری +- سایر مشارکت‌ها در جامعه گسترده‌تر Node.js -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. +اگر افرادی که مشارکت های ارزشمندی دارند، احساس می کنند برای دسترسی commit در نظر گرفته نشده اند، می توانند [یک issue ایجاد کنند](https://github.com/nodejs/TSC/issues) یا مستقیماً با [یک عضو TSC تماس بگیرند](https://github.com/nodejs/node#tsc-technical-steering-committee). diff --git a/pages/fa/about/get-involved/events.mdx b/pages/fa/about/get-involved/events.mdx index 2fb8672daed2d..3271e2078b335 100644 --- a/pages/fa/about/get-involved/events.mdx +++ b/pages/fa/about/get-involved/events.mdx @@ -1,16 +1,16 @@ --- -title: Upcoming Events +title: رویدادهای آینده layout: about --- -## Upcoming Events +## رویدادهای آینده -Node.js events are open and available to the public. Anyone is welcome to join and participate. +رویدادهای Node.js برای عموم باز و در دسترس هستند. هر کسی می‌تواند در آنها شرکت کند و مشارکت داشته باشد. -### Upcoming Node.js® Meetings +### جلسات آینده Node.js®‎ -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. +پروژه Node.js طی سال جلسات متعددی را برای بحث و برنامه‌ریزی جنبه‌های مختلف پروژه برگزار می‌کند. -The following meetings are upcoming in the next 7 days. +جلسات زیر در 7 روز آینده برگزار می‌شوند. diff --git a/pages/fa/about/get-involved/index.md b/pages/fa/about/get-involved/index.md index 858bfc61901b2..c7d1ef3eb8a72 100644 --- a/pages/fa/about/get-involved/index.md +++ b/pages/fa/about/get-involved/index.md @@ -1,26 +1,26 @@ --- -title: Get involved +title: مشارکت کنید layout: about --- -# Get Involved +# مشارکت کنید -## Community Discussion +## گفتگوی جامعه -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. +- [لیست issue ها در گیت‌هاب](https://github.com/nodejs/node/issues) محل بحث در مورد ویژگی‌های اصلی Node.js است. +- برای گفتگوی لحظه‌ای در مورد توسعه Node.js از یکی از پلتفرم‌های زیر استفاده کنید + - برای IRC، به `irc.libera.chat` در کانال `‎#node.js` با یک [کلاینت IRC](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) بروید یا در مرورگر وب خود به کانال با استفاده از یک [کلاینت تحت وب](https://kiwiirc.com/nextclient/) متصل شوید. + - برای Slack، دو راه وجود دارد: + - [OpenJSF Slack](https://slack-invite.openjsf.org/) یک Slack است که توسط بنیاد اجرا می‌شود با چندین کانال Node.js (کانال‌های با پیشوند `‎#nodejs-‎` مربوط به پروژه هستند). + - [Node Slackers](https://www.nodeslackers.com/) یک جامعه Slack متمرکز بر Node.js است. +- حساب رسمی Node.js در توییتر [nodejs](https://twitter.com/nodejs) است. +- [تقویم پروژه Node.js](https://nodejs.org/calendar) با تمام جلسات عمومی تیم. -## Learning +## یادگیری -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. +- [بخش یادگیری رسمی](https://nodejs.org/en/learn/) وبسایت Node.js. +- [مستندات رسمی API reference](https://nodejs.org/api/). +- [NodeSchool.io](https://nodeschool.io/) مفاهیم Node.js را از طریق بازی‌های تعاملی خط فرمان به شما می‌آموزد. +- [تگ Node.js در Stack Overflow](https://stackoverflow.com/questions/tagged/node.js) هر روز اطلاعات جدیدی را جمع می‌کند. +- [تگ Node.js در جامعه DEV](https://dev.to/t/node) محلی برای اشتراک‌گذاری پروژه‌ها، مقالات و آموزش‌های Node.js و نیز شروع بحث‌ها و درخواست بازخورد در مورد موضوعات مرتبط با Node.js است. توسعه‌دهندگان در تمام سطوح مهارت می‌توانند شرکت کنند. +- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) یک جامعه دوستانه از توسعه‌دهندگان بک‌اند Node.js است که در Discord از یکدیگر پشتیبانی می‌کنند. diff --git a/pages/fa/about/governance.md b/pages/fa/about/governance.md index af512bbe769d3..8b0a5e42793e7 100644 --- a/pages/fa/about/governance.md +++ b/pages/fa/about/governance.md @@ -1,31 +1,27 @@ --- -title: Project Governance +title: حاکمیت پروژه layout: about --- -# Project Governance +# حاکمیت پروژه -## Consensus Seeking Process +## توافق جمعی (Consensus Seeking Process) -The Node.js project follows a [Consensus Seeking][] decision making model. +پروژه Node.js از مدل تصمیم‌گیری [Consensus Seeking][] پیروی می‌کند. -## Collaborators +## همکاران -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. +مخزن اصلی گیت‌هاب [nodejs/node][] توسط همکارانی که به صورت مداوم توسط دیگر همکاران موجود نامزد می‌شوند، نگهداری می‌شود. -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. +افرادی که مشارکت های مهم و ارزشمندی دارند، به عنوان همکار انتخاب می شوند و به آنها دسترسی ارسال (commit) به پروژه داده می شود. این افراد توسط سایر همکاران شناسایی می شوند و پیشنهاد نامزدی آنها با همکاران فعلی در میان گذاشته و مورد بحث قرار می گیرد. -For the current list of Collaborators, see the project's [README.md][]. +برای لیست فعلی همکاران، به [README.md][] پروژه مراجعه کنید. -A guide for Collaborators is maintained at [collaborator-guide.md][]. +راهنمای همکاران در [collaborator-guide.md][] نگهداری می شود. -## Technical Steering Committee +## کمیته هدایت فنی -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. +پروژه توسط کمیته هدایت فنی یا همان [Technical Steering Committee (TSC)][] اداره می شود که مسئول هدایت کلان پروژه است. TSC یک زیرمجموعه از همکاران فعال است که توسط سایر اعضای TSC موجود نامزد می‌شوند. [consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members diff --git a/pages/fa/about/index.mdx b/pages/fa/about/index.mdx index 13459154c71d4..1bc8bbe99714b 100644 --- a/pages/fa/about/index.mdx +++ b/pages/fa/about/index.mdx @@ -1,32 +1,36 @@ --- -title: About Node.js® +title: Node.js درباره layout: about --- -
- Node.js mascot -
+درباره ®Node.js ---- +به عنوان یک رانتایم جاوااسکریپتِ غیرهمگام و رویداد محور، Node.js برای ساخت برنامه‌های تحت شبکه مقیاس‌پذیر طراحی شده است. در مثال "سلام دنیا" زیر، کانکشن متعددی می‌توانند به صورت همزمان پردازش شوند. با هر کانکشن، callback فراخوانی می‌شود، اما اگر کاری برای انجام وجود نداشته باشد، Node.js به حالت خواب می‌رود. -# About Node.js® +```cjs +const { createServer } = require('node:http'); -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. +const hostname = '127.0.0.1'; +const port = 3000; -```js -const http = require('node:http'); +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +```mjs +import { createServer } from 'node:http'; const hostname = '127.0.0.1'; const port = 3000; -const server = http.createServer((req, res) => { +const server = createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); @@ -37,42 +41,21 @@ server.listen(port, hostname, () => { }); ``` -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. +این برخلاف مدل رایج‌تر همزمانی امروزی است، که در آن از Theradهای سیستم‌عامل استفاده می‌شود. شبکه مبتنی بر Therad نسبتاً ناکارآمد و بسیار دشوار برای استفاده است. علاوه بر این، کاربران Node.js نگران قفل شدن فرایند نیستند، زیرا قفلی وجود ندارد. تقریباً هیچ فانکشنی در Node.js مستقیماً I/O را انجام نمی‌دهد، بنابراین فرایند هرگز بلوکه نمی‌شود مگر زمانی که I/O با استفاده از روش‌های همگام از کتابخانه استاندارد Node.js انجام شود. از آنجایی که چیزی بلوکه نمی‌شود، پیاده سازی سیستم‌های مقیاس‌پذیر در Node.js بسیار منطقی است. -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. +اگر برخی از این اصطلاحات برایتان جدید است، می‌توانید مقاله کاملی را در مورد [Blocking vs. Non-Blocking][] مطالعه کنید. --- -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. +Node.js در طراحی خود شبیه به سیستم‌هایی مانند [Event Machine][] در Ruby و [Twisted][] در Python است و از آنها الهام گرفته است. Node.js مدل رویداد را یک گام جلوتر می‌برد. حلقه رویداد را به عنوان یک ساختار زمان اجرا و نه یک کتابخانه ارائه می‌دهد. در سایر سیستم‌ها، همیشه یک blocking call برای شروع حلقه رویداد وجود دارد. +معمولاً رفتار از طریق callback‌ها در ابتدای اسکریپت تعریف می‌شود، و در انتها یک سرور از طریق یک blocking call مانند `EventMachine::run()‎` راه‌اندازی می‌شود. در Node.js چنین تماسی برای شروع حلقه رویداد وجود ندارد. Node.js پس از اجرای اسکریپت ورودی، به طور ساده وارد حلقه رویداد می‌شود. Node.js زمانی از حلقه رویداد خارج می‌شود که دیگر callback‌یی برای اجرا وجود نداشته باشد. این رفتار شبیه جاوااسکریپت مرورگر است - حلقه رویداد از کاربر پنهان است. + +HTTP در Node.js از جایگاه ویژه‌ای برخوردار است و با در نظر گرفتن استریمینگ و کاهش تاخیر طراحی شده است. این ویژگی باعث می‌شود Node.js برای پایه‌گذاری یک کتابخانه یا فریمورک وب مناسب باشد. + +اگرچه Node.js بدون استفاده از threadها طراحی شده است، اما این به این معنی نیست که نمی‌توانید از چندهسته‌ای بودن محیط خود بهره ببرید. می‌توانید فرایندهای فرزند را با استفاده از API مربوط به خود یعنی [`child_process.fork()‎`][] ایجاد کنید و به گونه ای طراحی شده اند که برقراری ارتباط با آنها آسان باشد. بر پایه همان رابط، ماژول [`cluster`][] نیز بنا شده که به شما امکان می‌دهد سوکت‌ها را بین فرایندها به اشتراک بگذارید تا بتوانید بار را بر روی هسته‌های خود متعادل کنید. [blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html +[`child_process.fork()‎`]: https://nodejs.org/api/child_process.html [`cluster`]: https://nodejs.org/api/cluster.html [event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ +[twisted]: https://twisted.org/ diff --git a/pages/fa/about/previous-releases.mdx b/pages/fa/about/previous-releases.mdx index 3b292e56350c5..90e1f48e38c8a 100644 --- a/pages/fa/about/previous-releases.mdx +++ b/pages/fa/about/previous-releases.mdx @@ -1,21 +1,21 @@ --- -title: Previous Releases +title: انتشارهای Node.js layout: about --- -# Previous Releases +انتشارهای Node.js -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. +نسخه‌های اصلی Node.js برای شش ماه وضعیت انتشار _Current_ را پیدا می‌کنند که به نویسندگان کتابخانه ها زمان می‌دهد تا پشتیبانی از آنها را اضافه کنند. +پس از شش ماه، انتشارهای با شماره فرد (11، 9 و غیره) پشتیبانی نمی‌شوند و انتشارهای با شماره زوج (12، 10 و غیره) به وضعیت _Active LTS_ منتقل می‌شوند و برای استفاده عمومی آماده هستند. +وضعیت انتشار LTS به معنای "پشتیبانی طولانی مدت" است که معمولاً تضمین می‌کند باگ‌های بحرانی در مجموع برای 30 ماه برطرف خواهند شد. +برنامه‌های پروداکشن تنها باید از انتشارهای _Active LTS_ یا _Maintenance LTS_ استفاده کنند. -### Release Schedule +## برنامه زمانبندی انتشار ![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). +جزئیات کامل در مورد زمانبندی انتشار Node.js در [گیت‌هاب](https://github.com/nodejs/release#release-schedule) موجود است. -### Looking for latest release of a version branch? +## به دنبال آخرین انتشار از یک برنچ نسخه هستید؟ diff --git a/pages/fa/about/security-reporting.mdx b/pages/fa/about/security-reporting.mdx index 3ba8e266ed528..ab8dafdc590ec 100644 --- a/pages/fa/about/security-reporting.mdx +++ b/pages/fa/about/security-reporting.mdx @@ -1,89 +1,64 @@ --- -title: Security Reporting +title: گزارش امنیتی layout: about --- -# Security Reporting +گزارش امنیتی -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). +برای جزئیات بیشتر در مورد سیاست‌های امنیتی فعال، [این صفحه](https://github.com/nodejs/node/security/policy) را بررسی کنید. -## Reporting a bug in Node.js +## گزارش باگ در Node.js -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). +برای گزارش باگ‌های امنیتی در Node.js از [HackerOne](https://hackerone.com/nodejs) استفاده کنید. -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. +گزارش شما طی ۵ روز تایید خواهد شد و شما ظرف ۱۰ روز پاسخی با جزئیات بیشتر حاوی مراحل بعدی در بررسی گزارش‌تان را دریافت خواهید کرد. -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. +پس از پاسخ اولیه به گزارش شما، تیم امنیتی تلاش خواهد کرد تا شما را از پیشرفت‌های صورت گرفته در جهت رفع مشکل و اعلام نهایی آگاه کند، و ممکن است درخواست اطلاعات یا راهنمایی بیشتری در مورد مشکل گزارش شده داشته باشد. -### Node.js bug bounty program +### برنامه پاداشِ کشف باگ در Node.js -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. +پروژه Node.js در یک برنامه رسمی پاداش کشف باگ برای محققان امنیتی و افشای مسئولانه در فضای عمومی مشارکت دارد. این برنامه از طریق پلتفرم HackerOne مدیریت می‌شود. برای اطلاعات بیشتر به [https://hackerone.com/nodejs](https://hackerone.com/nodejs) مراجعه کنید. -## Reporting a bug in a third party module +## گزارش باگ در ماژول شخص‌ثالث -Security bugs in third party modules should be reported to their respective -maintainers. +باگ‌های امنیتی در ماژول‌های شخص ثالث باید به نگهدارندگان مربوطه گزارش شوند. -## Disclosure policy +## سیاست افشاگری -Here is the security disclosure policy for Node.js +سیاست افشاگری امنیتی برای Node.js : -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. +گزارش امنیتی دریافت و یک کنترل کننده اصلی به آن اختصاص داده می‌شود. این شخص فرایند رفع مشکل و انتشار را هماهنگ می‌کند. مشکل تایید و لیستی از تمام نسخه‌های تاثیرپذیر تعیین می‌شود. کد برای یافتن هرگونه مشکل مشابه بالقوه دیگر بررسی می‌شود. رفع‌ها برای تمام نسخه‌هایی که هنوز تحت پشتیبانی هستند آماده می‌شوند. این رفع‌ها به مخزن عمومی ارسال نمی‌شوند بلکه به صورت محلی نگهداری می‌شوند تا زمان اعلام فرا برسد. -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. +یک تاریخ محرمانگی پیشنهادی برای این آسیب‌پذیری انتخاب می‌شود و یک CVE (آسیب‌پذیری‌ها و مواجهه‌های رایج مشترک) برای آسیب‌پذیری درخواست می‌شود. -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. +در تاریخ محرمانگی، کپی اطلاعیه به لیست ایمیل امنیتی Node.js ارسال می‌شود. تغییرات به مخزن عمومی ارسال و نسخه‌های جدید در nodejs.org منتشر می‌شوند. در عرض 6 ساعت از اطلاع‌رسانی به لیست ایمیل، کپی‌ای از اطلاعیه در بلاگ Node.js منتشر خواهد شد. -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. +معمولاً تاریخ محرمانگی 72 ساعت پس از صدور CVE تنظیم می‌شود. با این حال، ممکن است بر اساس شدت باگ یا دشواری در اعمال رفع تغییر کند. -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. +این فرایند ممکن است زمانبر باشد، به ویژه زمانی که هماهنگی با نگهدارندگان پروژه‌های دیگر نیز مورد نیاز باشد. تلاش خواهد شد تا باگ در سریع‌ترین زمان ممکن برطرف شود؛ با این حال، مهم است که ما از فرایند انتشار بالا پیروی کنیم تا اطمینان حاصل شود که افشاگری به شیوه‌ای یکپارچه انجام می‌شود. -## Receiving security updates +## دریافت به‌روزرسانی‌های امنیتی -Security notifications will be distributed via the following methods. +اطلاعیه‌های امنیتی از طریق روش‌های زیر توزیع خواهند شد: -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) +[گروه گوگل](https://groups.google.com/group/nodejs-sec) +[بلاگ Node.js](/blog) -## Comments on this policy +## نظرات درباره این سیاست -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. +اگر پیشنهادی برای بهبود این فرایند دارید، لطفاً یک [pull request](https://github.com/nodejs/nodejs.org) ارسال کنید یا یک [issue جدید](https://github.com/nodejs/security-wg/issues/new) ایجاد نمایید تا آن را بررسی کنیم. -## OpenSSF Best Practices +## رویه‌های بهینه OpenSSF OpenSSF Badge -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. +[نشان بهترین شیوه ها](https://github.com/coreinfrastructure/best-practices-badge) بنیاد امنیت متن باز (OpenSSF) راهی است برای پروژه‌های نرم‌افزار آزاد/رایگان و متن باز (FLOSS) تا نشان دهند که از رویه‌های بهینه پیروی می‌کنند. پروژه‌ها می‌توانند به صورت داوطلبانه خود تأیید کنند که چگونه از هر رویه بهینه پیروی می‌کنند. مصرف‌کنندگان این نشان می‌توانند به سرعت ارزیابی کنند که کدام پروژه‌های FLOSS از رویه‌های بهینه پیروی می‌کنند و در نتیجه احتمال بیشتری دارد که نرم‌افزارهای امن با کیفیت بالاتر تولید کنند. diff --git a/pages/fa/download/current.mdx b/pages/fa/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/fa/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/fa/download/index.mdx b/pages/fa/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/fa/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/fa/download/package-manager/all.md b/pages/fa/download/package-manager/all.md index 2e87e99e21fb0..5192b8847d665 100644 --- a/pages/fa/download/package-manager/all.md +++ b/pages/fa/download/package-manager/all.md @@ -1,11 +1,11 @@ --- -layout: docs -title: Installing Node.js via package manager +layout: download +title: از طریق پکیج منیجر Node.js نصب --- -# Installing Node.js via Package Managers +# نصب Node.js از طریق پکیج منیجر -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. +> پکیج‌های این صفحه توسط پکیج منیجر های مربوطه نگهداری و پشتیبانی می‌شوند، **نه** توسط تیم هسته Node.js. لطفاً اگر به هرگونه مشکلی برخوردید آن را به نگه دارنده پکیج گزارش دهید. اگر مشکل شما یک باگ در خود Node.js باشد، نگه دارنده آن را به مرجع اصلی گزارش خواهد داد. --- @@ -14,6 +14,7 @@ title: Installing Node.js via package manager - [Arch Linux](#arch-linux) - [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) - [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) +- [Exherbo Linux](#exherbo-linux) - [fnm](#fnm) - [FreeBSD](#freebsd) - [Gentoo](#gentoo) @@ -29,6 +30,7 @@ title: Installing Node.js via package manager - [SmartOS and illumos](#smartos-and-illumos) - [Snap](#snap) - [Solus](#solus) +- [vfox](#vfox) - [Void Linux](#void-linux) - [Windows](#windows-1) - [z/OS](#zos) @@ -37,13 +39,13 @@ title: Installing Node.js via package manager ## Alpine Linux -Node.js LTS and npm packages are available in the Main Repository. +بسته‌های Node.js LTS و npm در مخزن اصلی موجود هستند. ```bash apk add nodejs npm ``` -Node.js Current can be installed from the Community Repository. +Node.js Current نیز می‌تواند از مخزن کامیونیتی نصب شود. ```bash apk add nodejs-current @@ -51,79 +53,87 @@ apk add nodejs-current ## Android -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. +پشتیبانی از اندروید در Node.js هنوز در مرحله آزمایشی است، بنابراین باینری‌های از پیش کامپایل شده هنوز توسط توسعه دهندگان Node.js ارائه نشده‌اند. -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: +با این حال، برخی راه حل‌های شخص ثالث وجود دارند. به عنوان مثال، کامیونیتی [Termux](https://termux.com/) یک شبیه‌ساز ترمینال و محیط لینوکس برای اندروید، به همراه پکیج منیجر مخصوص و [مجموعه گسترده‌ای](https://github.com/termux/termux-packages) از بسیاری از برنامه‌های از پیش کامپایل شده را ارائه می‌دهد. این دستور در برنامه Termux، آخرین نسخه موجود از Node.js را نصب خواهد کرد: ```bash pkg install nodejs ``` -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). +در حال حاضر، باینری‌های Node.js در Termux به `system-icu` لینک شده‌اند (وابسته به بسته `libicu`). ## Arch Linux -Node.js and npm packages are available in the Community Repository. +بسته‌های Node.js و npm در مخزن کامیونیتی موجود هستند. ```bash pacman -S nodejs npm ``` -## CentOS, Fedora and Red Hat Enterprise Linux +## CentOS - Fedora - Red Hat Enterprise Linux -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. +Node.js در CentOS/RHEL 8 و Fedora به عنوان یک ماژول با نام `nodejs` موجود است. ```bash dnf module install nodejs: ``` -where `` corresponds to the major version of Node.js. -To see a list of available streams: +که در آن `` مربوط به نسخه اصلی Node.js است. +برای مشاهده لیست استریم‌های موجود: ```bash dnf module list nodejs ``` -For example, to install Node.js 18: +به عنوان مثال، برای نصب Node.js 18: ```bash dnf module install nodejs:18/common ``` -### Alternatives +### جایگزین -These resources provide packages compatible with CentOS, Fedora, and RHEL. +این منابع بسته‌هایی را ارائه می‌کنند که با CentOS ، Fedora و RHEL سازگار هستند. -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) +- [Node.js snaps](#snap) که در https://github.com/nodejs/snap نگهداری و پشتیبانی می‌شوند. +- [توزیع‌های باینری Node.js](#debian-and-ubuntu-based-linux-distributions) که توسط [NodeSource](https://github.com/nodesource/distributions) نگهداری و پشتیبانی می‌شوند. -## Debian and Ubuntu based Linux distributions +## توزیع‌های لینوکس مبتنی بر Debian و Ubuntu -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. +[توزیع‌های باینری Node.js](https://github.com/nodesource/distributions) از NodeSource در دسترس هستند. -### Alternatives +### جایگزین -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). +بسته‌هایی که با توزیع‌های لینوکس مبتنی بر دبیان و اوبونتو سازگار هستند، از طریق [Node.js snaps](#snap) در دسترس می‌باشند. + +## Exherbo Linux + +بسته های Node.js و npm در [مخزن arbor](https://gitlab.exherbo.org/exherbo/arbor/-/tree/master/packages/dev-lang/node) در دسترس است. + +```bash +cave resolve -x node +``` ## fnm -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). +مدیر نسخه سریع و ساده Node.js که با Rust ساخته شده است و برای مدیریت نسخه‌های مختلف منتشر شده Node.js استفاده می‌شود. به شما امکان می‌دهد عملیاتی مانند نصب، حذف، تغییر نسخه‌های Node را براساس پوشه فعلی به صورت خودکار انجام دهید و غیره. +برای نصب fnm از این [اسکریپت نصب](https://github.com/Schniz/fnm#using-a-script-macoslinux) استفاده کنید. -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. +fnm پشتیبانی از پلتفرم‌های متعدد (macOS ، Windows ، Linux) و تمام شل‌های محبوب (Bash ، Zsh ، Fish ، PowerShell ، Windows Command Line Prompt) را دارد. +fnm با تمرکز بر سرعت و پشتیبانی از سازگاری برای فایل‌های `‎.node-version` و `‎.nvmrc` ساخته شده است. ## FreeBSD -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. +آخرین نسخه منتشر شده Node.js از طریق [پورت www/node](https://www.freshports.org/www/node) در دسترس است. -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): +بسته باینری را از طریق [pkg](https://www.freebsd.org/cgi/man.cgi?pkg) نصب کنید: ```bash pkg install node ``` -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): +یا آن را با استفاده از [ports](https://www.freebsd.org/cgi/man.cgi?ports) کامپایل کنید: ```bash cd /usr/ports/www/node && make install @@ -131,7 +141,7 @@ cd /usr/ports/www/node && make install ## Gentoo -Node.js is available in the portage tree. +Node.js در portage tree موجود است. ```bash emerge nodejs @@ -139,35 +149,35 @@ emerge nodejs ## IBM i -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) +نسخه‌های LTS از Node.js در دسترس هستند و از طریق [پکیج منیجر 'yum'](https://ibm.biz/ibmi-rpms) قابل دسترسی می‌باشند. نام بسته `nodejs` به دنبال شماره نسخه اصلی است (به عنوان مثال: `nodejs18` ، `nodejs20` و غیره) -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: +برای نصب Node.js 20.x از خط فرمان، دستور زیر را به عنوان کاربر با مجوز ویژه ‎\*ALLOBJ اجرا کنید: ```bash yum install nodejs20 ``` -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details +Node.js همچنین می‌تواند با محصول IBM i Access Client Solutions نصب شود. برای جزئیات بیشتر به [این سند پشتیبانی](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) مراجعه کنید. ## macOS -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. +دانلود مستقیم [نصب‌کننده macOS](/#home-downloadhead) از وب‌سایت [nodejs.org](https://nodejs.org/) -_If you want to download the package with bash:_ +_اگر می‌خواهید بسته را با bash دانلود کنید:_ ```bash curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" ``` -### Alternatives +### جایگزین -Using **[Homebrew](https://brew.sh/)**: +با استفاده از **[Homebrew](https://brew.sh/)**: ```bash brew install node ``` -Using **[MacPorts](https://www.macports.org/)**: +با استفاده از **[MacPorts](https://www.macports.org/)**: ```bash port install nodejs @@ -176,15 +186,15 @@ port install nodejs port install nodejs7 ``` -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: +با استفاده از **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: -Install the binary package: +نصب بسته باینری: ```bash pkgin -y install nodejs ``` -Or build manually from pkgsrc: +یا ساخت دستی از pkgsrc: ```bash cd pkgsrc/lang/nodejs && bmake install @@ -192,13 +202,11 @@ cd pkgsrc/lang/nodejs && bmake install ## n -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. +`n` یک مدیر نسخه ساده برای استفاده Node.js برای Mac و Linux است. نسخه مورد نظر برای نصب را مشخص کنید، یا از میان منوی نسخه‌های قبلاً دانلود شده انتخاب نمایید. نسخه‌ها در سطح سیستم یا در سطح کاربر نصب می‌شوند و برای استفاده هدفمندتر می‌توانید نسخه‌ای را مستقیماً از دانلودهای ذخیره شده اجرا کنید. -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. +برای روش‌های نصب (bootstrap, npm, Homebrew, third-party) و تمام جزئیات استفاده، به [صفحه اصلی](https://github.com/tj/n) مراجعه کنید. -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: +اگر قبلاً `npm` را داشته باشید، نصب `n` و سپس نسخه LTS جدیدترین `node` به این سادگی است: ``` npm install -g n @@ -207,13 +215,13 @@ n lts ## NetBSD -Node.js is available in the pkgsrc tree: +Node.js در pkgsrc tree موجود است: ```bash cd /usr/pkgsrc/lang/nodejs && make install ``` -Or install a binary package (if available for your platform) using pkgin: +یا یک بسته باینری را نصب کنید (در صورت موجود بودن برای پلتفرم شما) با استفاده از pkgin: ```bash pkgin -y install nodejs @@ -221,33 +229,29 @@ pkgin -y install nodejs ## Nodenv -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. +`nodenv` یک مدیر نسخه سبک Node، مشابه `nvm` است. ساده و قابل پیش‌بینی است. یک اکوسیستم پلاگین غنی به شما امکان می‌دهد آن را برای تطابق با نیازهایتان سفارشی کنید. از `nodenv` برای انتخاب نسخه Node برای برنامه خود استفاده کنید و اطمینان حاصل کنید که محیط توسعه شما با محیط تولید مطابقت دارد. -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. +دستورالعمل‌های نصب Nodenv در [صفحه گیت‌هاب آن](https://github.com/nodenv/nodenv#installation) نگهداری می‌شوند. لطفاً به آن صفحه مراجعه کنید تا از آخرین نسخه مراحل نصب پیروی کنید. ## nvm -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). +Node Version Manager یک اسکریپت bash است که برای مدیریت نسخه‌های مختلف منتشر شده Node.js استفاده می‌شود. به شما امکان می‌دهد عملیاتی مانند نصب، حذف، تغییر نسخه و غیره را انجام دهید. +برای نصب nvm، از این [اسکریپت نصب](https://github.com/nvm-sh/nvm#install--update-script) استفاده کنید. -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: +در سیستم‌های Unix / OS X، می‌توانیم Node.js ساخته شده از سورس کد را با استفاده از [nvm](https://github.com/creationix/nvm) در مکانی که nvm انتظار دارد، نصب کنیم: ```bash env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" ``` -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: +پس از این می‌توانید از `nvm` برای سوئیچ بین نسخه‌های منتشر شده و نسخه‌های ساخته شده از سورس کد استفاده کنید. +به عنوان مثال، اگر نسخه Node.js برابر با v8.0.0-pre باشد: ```bash nvm use 8 ``` -Once the official release is out you will want to uninstall the version built -from source: +هنگامی که نسخه رسمی منتشر شد، باید نسخه ساخته شده از سوررس کد را حذف کنید: ```bash nvm uninstall 8 @@ -257,37 +261,37 @@ nvm uninstall 8 #### Windows -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems +مدیر نسخه `nvs` چندسکویی است و می‌تواند در ویندوز، macOS و سیستم‌های شبیه یونیکس استفاده شود. -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. +برای نصب `nvs` در ویندوز به [صفحه انتشار](https://github.com/jasongin/nvs/releases) بروید و فایل نصب‌کننده MSI از آخرین نسخه را دانلود کنید. -You can also use `chocolatey` to install it: +همچنین می‌توانید از `chocolatey` برای نصب آن استفاده کنید: ```bash choco install nvs ``` -#### macOS,UnixLike +#### macOS، UnixLike -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) +می‌توانید مستندات مربوط به مراحل نصب `nvs` در سیستم‌های macOS/Unix-like را [اینجا](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) پیدا کنید. -#### Usage +#### استفاده -After this you can use `nvs` to switch between different versions of node. +پس از این می‌توانید از `nvs` برای تغییر بین نسخه‌های مختلف node استفاده کنید. -To add the latest version of node: +برای اضافه کردن آخرین نسخه از node: ```bash nvs add latest ``` -Or to add the latest LTS version of node: +یا برای اضافه کردن آخرین نسخه LTS از node: ```bash nvs add lts ``` -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: +سپس دستور `nvs use` را اجرا کنید تا یک نسخه از node را به `PATH` برای شل فعلی اضافه کنید: ```bash $ nvs use lts @@ -295,7 +299,7 @@ PATH -= %LOCALAPPDATA%\nvs\default PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 ``` -To add it to `PATH` permanently, use `nvs link`: +برای اضافه کردن آن به `PATH` به صورت دائمی، از `nvs link` استفاده کنید: ```bash nvs link lts @@ -303,46 +307,46 @@ nvs link lts ## OpenBSD -Node.js is available through the ports system. +Node.js از طریق سیستم پورت‌ها در دسترس است. ```bash /usr/ports/lang/node ``` -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: +با استفاده از [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) در OpenBSD: ```bash pkg_add node ``` -## openSUSE and SLE +## openSUSE و SLE -Node.js is available in the main repositories under the following packages: +Node.js در مخازن اصلی تحت بسته‌های زیر موجود است: -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` +- `nodejs10` ، `nodejs12` ، `nodejs14` :**openSUSE Leap 15.2** +- - `nodejs20` :**openSUSE Tumbleweed** - **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) + (باید [ماژول "Web and Scripting"](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated) فعال شود.) +- `nodejs10`، `nodejs12` ، `nodejs14` :**SUSE Linux Enterprise Server (SLES) 15 SP2** + (باید [ماژول "Web and Scripting"](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module) فعال شود.) -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: +به عنوان مثال، برای نصب Node.js 14.x در openSUSE Leap 15.2، با دسترسی root دستور زیر را اجرا کنید: ```bash zypper install nodejs14 ``` -Different major versions of Node can be installed and used concurrently. +نسخه‌های مختلف اصلی Node می‌توانند همزمان نصب و استفاده شوند. -## SmartOS and illumos +## SmartOS و illumos -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: +image های SmartOS با pkgsrc از پیش نصب شده ارائه می‌شوند. در توزیع‌های دیگر illumos، ابتدا **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)** را نصب کنید، سپس می‌توانید بسته باینری را به صورت عادی نصب کنید: ```bash pkgin -y install nodejs ``` -Or build manually from pkgsrc: +یا به صورت دستی از pkgsrc بسازید: ```bash cd pkgsrc/lang/nodejs && bmake install @@ -350,19 +354,29 @@ cd pkgsrc/lang/nodejs && bmake install ## Snap -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. +[اسنپ ​​های Node.js](https://github.com/nodejs/snap) تحت عنوان [`node`](https://snapcraft.io/node) در فروشگاه Snap در دسترس هستند. ## Solus -Solus provides Node.js in its main repository. +Solus، بسته Node.js را در مخزن اصلی خود ارائه می‌دهد. ```bash sudo eopkg install nodejs ``` +## vfox + +یک مدیر نسخه چندسکویی (ویندوز، macOS، لینوکس) و قابل **گسترش**. + +به شما اجازه می‌دهد که **نسخه‌های مختلف برای پروژه‌های مختلف**، **نسخه‌های مختلف برای شل‌های مختلف**، و تغییر خودکار نسخه Node بر اساس دایرکتوری فعلی، و غیره را انجام دهید. + +این نرم‌افزار تمام پوسته‌های محبوب را پشتیبانی می‌کند (Bash, Zsh, Fish, PowerShell, Clink, Cmder). + +به [شروع سریع](https://vfox.lhan.me/guides/quick-start.html) برای استفاده سریع از vfox و تمام جزئیات استفاده مراجعه کنید. + ## Void Linux -Void Linux ships Node.js stable in the main repository. +Void Linux نسخه پایدار Node.js را در مخزن اصلی خود ارائه می‌کند. ```bash xbps-install -Sy nodejs @@ -370,11 +384,11 @@ xbps-install -Sy nodejs ## Windows -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. +مستقیماً [نصب‌کننده ویندوز](/#home-downloadhead) را از وب‌سایت [nodejs.org](https://nodejs.org/) دانلود کنید. -### Alternatives +### جایگزین -Using **[Winget](https://aka.ms/winget-cli)**: +با استفاده از **[Winget](https://aka.ms/winget-cli)**: ```bash winget install OpenJS.NodeJS @@ -382,10 +396,9 @@ winget install OpenJS.NodeJS winget install OpenJS.NodeJS.LTS ``` -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. +پس از اجرای یکی از دو دستور بالا، ممکن است لازم باشد ترمینال را دوباره راه‌اندازی کنید تا دستور `node` در CLI در دسترس قرار بگیرد. -Using **[Chocolatey](https://chocolatey.org/)**: +با استفاده از **[Chocolatey](https://chocolatey.org/)**: ```bash cinst nodejs @@ -393,7 +406,7 @@ cinst nodejs cinst nodejs.install ``` -Using **[Scoop](https://scoop.sh/)**: +با استفاده از **[Scoop](https://scoop.sh/)**: ```bash scoop install nodejs @@ -403,8 +416,7 @@ scoop install nodejs-lts ## z/OS -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: +IBM® SDK برای Node.js - z/OS® در دو قالب نصب، SMP/E و PAX در دسترس است. قالب نصب مربوط به خود را انتخاب کنید: -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) +- [نصب و پیکربندی نسخه SMP/E از Node.js در z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) +- [نصب و پیکربندی نسخه PAX از Node.js در z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/fa/download/package-manager/current.mdx b/pages/fa/download/package-manager/current.mdx index e9a55eed2a924..2fac9d78fe9a3 100644 --- a/pages/fa/download/package-manager/current.mdx +++ b/pages/fa/download/package-manager/current.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- Install Node.js on using +نصب Node.js روی با استفاده از - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +گزارش تغییرات این نسخه را بخوانید -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out other community supported package managers +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید + +دیگر پکیج منیجر ها که توسط جامعه پشتیبانی می‌شوند را ببینید
diff --git a/pages/fa/download/package-manager/index.mdx b/pages/fa/download/package-manager/index.mdx index 89984b745c29e..8ad4424230a8d 100644 --- a/pages/fa/download/package-manager/index.mdx +++ b/pages/fa/download/package-manager/index.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- Install Node.js on using +نصب Node.js روی با استفاده از - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +پست بلاگ مربوط به این نسخه را بخوانید. -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out other community supported package managers +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید + +دیگر پکیج منیجر ها که توسط جامعه پشتیبانی می‌شوند را ببینید
diff --git a/pages/fa/download/prebuilt-binaries/current.mdx b/pages/fa/download/prebuilt-binaries/current.mdx index e38141bb4befc..85514a07dd72c 100644 --- a/pages/fa/download/prebuilt-binaries/current.mdx +++ b/pages/fa/download/prebuilt-binaries/current.mdx @@ -1,22 +1,23 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- I want the version of Node.js for running +من نسخه از Node.js را برای در حال اجرا می‌خواهم - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +گزارش تغییرات این نسخه را بخوانید -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید +نسخه‌های پیش‌ساخته شبانه یا ساخت‌های غیررسمی را برای دیگر پلتفرم‌ها بررسی کنید
diff --git a/pages/fa/download/prebuilt-binaries/index.mdx b/pages/fa/download/prebuilt-binaries/index.mdx index e38141bb4befc..85514a07dd72c 100644 --- a/pages/fa/download/prebuilt-binaries/index.mdx +++ b/pages/fa/download/prebuilt-binaries/index.mdx @@ -1,22 +1,23 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- I want the version of Node.js for running +من نسخه از Node.js را برای در حال اجرا می‌خواهم - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +گزارش تغییرات این نسخه را بخوانید -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید +نسخه‌های پیش‌ساخته شبانه یا ساخت‌های غیررسمی را برای دیگر پلتفرم‌ها بررسی کنید
diff --git a/pages/fa/download/prebuilt-installer/current.mdx b/pages/fa/download/prebuilt-installer/current.mdx new file mode 100644 index 0000000000000..5fb580d31fa6f --- /dev/null +++ b/pages/fa/download/prebuilt-installer/current.mdx @@ -0,0 +1,26 @@ +--- +layout: download +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. +--- + +
+من نسخه از Node.js را برای در حال اجرا می‌خواهم + + +
+ +
+Node.js شامل است. + +گزارش تغییرات این نسخه را بخوانید + +پست بلاگ مربوط به این نسخه را بخوانید + +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید + +تمام آپشن‌های دانلود Node.js را ببینید + +درباره Node.js مطالعه کنید + +
diff --git a/pages/fa/download/prebuilt-installer/index.mdx b/pages/fa/download/prebuilt-installer/index.mdx new file mode 100644 index 0000000000000..a74e2634d9e89 --- /dev/null +++ b/pages/fa/download/prebuilt-installer/index.mdx @@ -0,0 +1,26 @@ +--- +layout: download +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. +--- + +
+من نسخه از Node.js را برای در حال اجرا می‌خواهم + + +
+ +
+Node.js شامل است. + +گزارش تغییرات این نسخه را بخوانید + +پست بلاگ مربوط به این نسخه را بخوانید + +یاد بگیرید که چگونه امضاهای SHASUMS را تأیید کنید + +تمام آپشن‌های دانلود Node.js را ببینید + +درباره Node.js مطالعه کنید + +
diff --git a/pages/fa/download/source-code/current.mdx b/pages/fa/download/source-code/current.mdx index 17383ba65eb3e..25599aa1b2b0e 100644 --- a/pages/fa/download/source-code/current.mdx +++ b/pages/fa/download/source-code/current.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- I want the version of the Node.js source code. +من نسخه از سورس کد Node.js را می‌خواهم. - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +گزارش تغییرات این نسخه را بخوانید -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out how to build Node.js from source. +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید + +نحوه ساخت Node.js از سورس کد را ببینید.
diff --git a/pages/fa/download/source-code/index.mdx b/pages/fa/download/source-code/index.mdx index 17383ba65eb3e..25599aa1b2b0e 100644 --- a/pages/fa/download/source-code/index.mdx +++ b/pages/fa/download/source-code/index.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: دانلود Node.js +subtitle: Node.js را به شیوه‌ای که می‌خواهید دانلود کنید. ---
- I want the version of the Node.js source code. +من نسخه از سورس کد Node.js را می‌خواهم. - +
- Node.js includes npm () and corepack. +Node.js شامل است. -Read the blog post for this version +گزارش تغییرات این نسخه را بخوانید -Learn how to verify signed SHASUMS +پست بلاگ مربوط به این نسخه را بخوانید -Check out how to build Node.js from source. +یاد بگیرید که چگونه امضاهای SHASUMS را تایید کنید + +نحوه ساخت Node.js از سورس کد را ببینید.
diff --git a/pages/fa/index.mdx b/pages/fa/index.mdx index deb5105a79505..57634d9833d1b 100644 --- a/pages/fa/index.mdx +++ b/pages/fa/index.mdx @@ -1,121 +1,139 @@ --- -title: Run JavaScript Everywhere +title: اجرا جاوااسکریپت در همه جا layout: home ---
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; + - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); +
+

اجرا جاوااسکریپت در همه جا

- hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); +Node.js یک محیط اجرای جاوااسکریپت متن‌باز، رایگان و چندسکویی است +که به توسعه دهندگان اجازه می‌دهد تا سرورها، وب اپلیکیشن‌ها +ابزارهای خط فرمان و اسکریپت‌ها را ایجاد کنند. - const fileHash = hasher.read(); - ``` +
- ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
+
+ + {({ release }) => ( + <> + دانلود Node.js (نسخه پایدار) + + دانلود Node.js {release.versionWithPrefix} + 1 با پشتیبانی بلندمدت. + Node.js همچنین از طریق package managers نیز قابل نصب است. + + + )} + + + + {({ release }) => ( + + می‌خواهید زودتر از ویژگی‌های جدید برخوردار شوید؟ + به‌جای آن Node.js {release.versionWithPrefix} + 1 را دریافت کنید. + + )} + +
+
-Learn more what Node.js is able to offer with our [Learning materials](/learn). +
+
+ ```js displayName="Create an HTTP Server" + // server.mjs + import { createServer } from 'node:http'; + +const server = createServer((req, res) => { +res.writeHead(200, { 'Content-Type': 'text/plain' }); +res.end('Hello World!\n'); +}); + +// starts a simple http server locally on port 3000 +server.listen(3000, '127.0.0.1', () => { +console.log('Listening on 127.0.0.1:3000'); +}); + +// run with `node server.mjs` + +```` + +```js displayName="Write Tests" +// tests.mjs +import assert from 'node:assert'; +import test from 'node:test'; + +test('that 1 is equal 1', () => { + assert.strictEqual(1, 1); +}); + +test('that throws as 1 is not equal 2', () => { + // throws an exception because 1 != 2 + assert.strictEqual(1, 2); +}); + +// run with `node tests.mjs` +```` + +```js displayName="Read and Hash a File" +// crypto.mjs +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; + +const hasher = createHash('sha1'); + +hasher.setEncoding('hex'); +// ensure you have a `package.json` file for this test! +hasher.write(await readFile('package.json')); +hasher.end(); + +const fileHash = hasher.read(); + +// run with `node crypto.mjs` +``` + +```js displayName="Streams Pipeline" +// streams.mjs +import { pipeline } from 'node:stream/promises'; +import { createReadStream, createWriteStream } from 'node:fs'; +import { createGzip } from 'node:zlib'; + +// ensure you have a `package.json` file for this test! +await pipeline( + createReadStream('package.json'), + createGzip(), + createWriteStream('package.json.gz') +); + +// run with `node streams.mjs` +``` + +```js displayName="Work with Threads" +// threads.mjs +import { + Worker, + isMainThread, + workerData, + parentPort, +} from 'node:worker_threads'; + +if (isMainThread) { + const data = 'some data'; + const worker = new Worker(import.meta.filename, { workerData: data }); + worker.on('message', msg => console.log('Reply from Thread:', msg)); +} else { + const source = workerData; + parentPort.postMessage(btoa(source.toUpperCase())); +} + +// run with `node threads.mjs` +``` + +
+ +با [مطالب آموزشی](/learn) ما، بیشتر در مورد اینکه Node.js چه امکاناتی را ارائه می دهد بیاموزید.
diff --git a/pages/fa/search.mdx b/pages/fa/search.mdx index ac57c0e414803..789c12514cdfa 100644 --- a/pages/fa/search.mdx +++ b/pages/fa/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: نتایج جستجو --- diff --git a/pages/fr/about/branding.mdx b/pages/fr/about/branding.mdx new file mode 100644 index 0000000000000..8f96b99a5e5ca --- /dev/null +++ b/pages/fr/about/branding.mdx @@ -0,0 +1,72 @@ +--- +title: L'image de marque de Node.js +layout: about +--- + +L'image de marque de Node.js + +Veuillez consulter la [politique en matière de marques](https://trademark-policy.openjsf.org/) pour obtenir des informations sur l'utilisation autorisée des logos et marques de Node.js®. + +## Mascotte de Node.js® + +Mascotte de Node.js + +## Logo Node.js® + +### Node.js® Logo horizontal + + + + + + + +
+ Node.js Logo horizontal + + Node.js Light Horizontal Logo +
+ +### Logo Node.js® empilé + + + + + + + + + + + + + +
+ Node.js Dark Stacked Logo + + Node.js Light Stacked Logo +
+ Node.js Black Stacked Logo + + Node.js White Stacked Logo +
+ +### Icons JS + + + + + + + +
+ Icons JS Vert + + Icons JS Blanc +
diff --git a/pages/fr/about/get-involved/collab-summit.md b/pages/fr/about/get-involved/collab-summit.md index 4e45f64ead50c..4bbe40fb05fc0 100644 --- a/pages/fr/about/get-involved/collab-summit.md +++ b/pages/fr/about/get-involved/collab-summit.md @@ -5,26 +5,12 @@ layout: about # Sommet des Collaborateurs -Le Collaborator Summit de Node.js est une non-conférence qui rassemble les contributeurs actuels et potentiels pour discuter de Node.js avec une collaboration animée. -contributeurs actuels et potentiels pour discuter de Node.js avec une collaboration animée, -l'éducation et le partage des connaissances. Les comités et les groupes de travail se réunissent -deux fois par an pour prendre des décisions importantes tout en étant en mesure de travailler sur des -efforts passionnants qu'ils veulent faire avancer en personne. +Le Collaboration Summit de Node.js est une non-conférence qui rassemble les contributeurs actuels et potentiels pour discuter de Node.js dans un esprit de collaboration, d'éducation et de partage des connaissances. Les équipes, les groupes de travail et les contributeurs de la communauté se réunissent deux fois par an pour avoir des discussions qui aident à la prise de décision tout en travaillant sur des efforts passionnants qu'ils veulent faire avancer en personne. ## Qui y assiste ? -Tout le monde peut participer au Collab Summit. Pendant le -sommet, les leaders aideront les nouveaux contributeurs à intégrer les groupes qu'ils aimeraient aider, avant de les intégrer dans les sessions de travail. -avant de les intégrer aux sessions de travail. +Le Collaboration Summit de Node.js est une non-conférence qui rassemble les contributeurs actuels et potentiels pour discuter de Node.js dans un esprit de collaboration, d'éducation et de partage des connaissances. Les équipes, les groupes de travail et les contributeurs de la communauté se réunissent deux fois par an pour avoir des discussions qui aident à la prise de décision tout en travaillant sur des efforts passionnants qu'ils veulent faire avancer en personne. -C'est l'occasion d'apprendre ce qui se passe au sein de la communauté, de s'impliquer et de contribuer avec les compétences que vous avez et que vous aimeriez perfectionner. -et de contribuer avec les compétences que vous avez et que vous aimeriez perfectionner. +Avant le sommet, les contributeurs et les membres de la communauté envoient des propositions de sessions afin de créer un programme. Les participants peuvent se familiariser avec la session avant de se rendre sur place, de participer aux discussions générales des collaborateurs, puis de se plonger dans les sessions. Il y aura également de nombreuses occasions de suivre des pistes dans les couloirs et de participer à des séances de réflexion. -Les groupes de travail établiront un calendrier afin que les gens puissent -se familiariser avant d'arriver sur place, en ayant des discussions générales sur les collaborateurs -avant de se plonger dans les sessions en petits groupes. - -Nous serions ravis de vous voir au Collab Summit ! Consultez le [Summit repo] (https\://github.com/nodejs/summit) pour les sommets à venir et passés et jetez un coup d'œil au [Summit repo]. -pour les prochains et anciens Collab Summits et jetez un coup d'œil aux -[issues filed](https://github.com/nodejs/summit/issues) qui partagent ce que les -groupes de travail individuels et les comités cherchent à discuter en personne. +Pour obtenir des informations sur les sommets de la collaboration à venir et passés, consultez le [Summit repo](https://github.com/openjs-foundation/summit). Jetez un coup d'œil aux [issues filed](https://github.com/nodejs/summit/issues) qui présentent ce que les contributeurs et les membres de la communauté proposent de discuter en personne. diff --git a/pages/fr/about/get-involved/contribute.md b/pages/fr/about/get-involved/contribute.md index 6392c5fe32cb5..ebe77d2973041 100644 --- a/pages/fr/about/get-involved/contribute.md +++ b/pages/fr/about/get-involved/contribute.md @@ -1,47 +1,47 @@ --- -title: Contributing +title: Contribuer layout: about --- -# Contributing +# Contribuer -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. +Merci de votre intérêt à contribuer à Node.js ! Vous pouvez contribuer de plusieurs façons et à plusieurs endroits, nous sommes là pour vous aider à faciliter cela. -## Asking for General Help +## Demander de l'aide générale -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). +Le niveau d'activité du dépôt `nodejs/node` étant très élevé, les questions ou les demandes d'aide générale concernant l'utilisation de Node.js doivent être adressées au [Node.js help repository] (https://github.com/nodejs/help/issues).Node.js -## Reporting an Issue +## Signaler un problème -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. +Si vous avez trouvé ce que vous pensez être un problème avec Node.js, n'hésitez pas à déposer un problème sur le projet GitHub. Lorsque vous déposez votre problème, assurez-vous que vous pouvez exprimer le problème avec un cas de test reproductible, et ce cas de test ne doit pas inclure de dépendances externes. En d'autres termes, le cas de test peut être exécuté sans rien d'autre que Node.js lui-même. -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: +Lorsque vous signalez un problème, nous avons également besoin d'un maximum d'informations sur votre environnement. Nous ne savons jamais quelles informations seront pertinentes pour tenter de circonscrire le problème. Veuillez inclure au moins les informations suivantes : -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) +- Version de Node.js +- Plateforme sur laquelle vous l'utilisez (macOS, SmartOS, Linux, Windows) +- Architecture sur laquelle vous l'utilisez (32bit ou 64bit et x86 ou ARM) -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. +Le projet Node.js est actuellement géré par un certain nombre de dépôts GitHub distincts, chacun ayant sa propre base de données de problèmes. Dans la mesure du possible, veuillez diriger les problèmes que vous signalez vers le dépôt approprié, mais ne vous inquiétez pas si les choses se retrouvent au mauvais endroit, la communauté des contributeurs sera plus qu'heureuse de vous aider à vous orienter dans la bonne direction. -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) +- Pour signaler des problèmes spécifiques à Node.js, veuillez utiliser [nodejs/node](https://github.com/nodejs/node) +- Pour signaler des problèmes spécifiques à ce site web, veuillez utiliser [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) -## Code contributions +## Contributions au code -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. +Si vous souhaitez corriger des bogues ou ajouter une nouvelle fonctionnalité à Node.js, veuillez consulter les [Directives de contribution à Node.js] (https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). Le processus de révision par les collaborateurs existants pour toutes les contributions au projet y est également expliqué. -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. +Si vous vous demandez comment commencer, vous pouvez consulter [Node Todo](https://www.nodetodo.org/) qui vous guidera peut-être vers votre première contribution. -## Becoming a collaborator +## Devenir un collaborateur -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: +En devenant collaborateur, les contributeurs peuvent avoir encore plus d'impact sur le projet. Ils peuvent aider d'autres contributeurs en examinant leurs contributions, trier les problèmes et prendre une part encore plus importante dans l'élaboration de l'avenir du projet. Les personnes identifiées par le TSC comme apportant des contributions significatives et précieuses dans n'importe quel dépôt Node.js peuvent être nommées collaborateurs et se voir accorder un accès au projet. Les activités prises en compte incluent (mais ne sont pas limitées à) la qualité de : -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community +- les modifications de code et les demandes d'autorisation d'accès (pull requests) +- la documentation des commits et des pull requests +- commentaires sur les issues et pull requests +- contributions au site Node.js +- l'assistance fournie aux utilisateurs finaux et aux contributeurs novices +- participation à des groupes de travail +- autre participation à la communauté Node.js plus large -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. +Si des personnes apportant des contributions précieuses estiment qu'elles n'ont pas été prises en compte pour l'accès à l'engagement, elles peuvent [enregistrer un problème] (https://github.com/nodejs/TSC/issues) ou [contacter un membre du TSC] (https://github.com/nodejs/node#tsc-technical-steering-committee) directement. diff --git a/pages/fr/about/get-involved/index.md b/pages/fr/about/get-involved/index.md index 858bfc61901b2..eaf1911daa61a 100644 --- a/pages/fr/about/get-involved/index.md +++ b/pages/fr/about/get-involved/index.md @@ -1,26 +1,26 @@ --- -title: Get involved +title: Impliquez-vous layout: about --- -# Get Involved +# Impliquez-vous -## Community Discussion +## Discussions de la communauté -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. +- La [GitHub issues list](https://github.com/nodejs/node/issues) est le lieu de discussion des fonctionnalités de base de Node.js. +- Pour discuter en temps réel du développement de Node.js, utilisez l'une des plateformes suivantes + - Pour IRC, allez sur `irc.libera.chat` dans le canal `#node.js` avec un [client IRC](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) ou connectez-vous dans votre navigateur web au canal en utilisant [un client web] (https://kiwiirc.com/nextclient/). + - Pour Slack, il y a deux options : + - Le [OpenJSF Slack](https://slack-invite.openjsf.org/) est un Slack géré par la Fondation avec plusieurs canaux Node.js (les canaux préfixés par `#nodejs-` sont liés au projet). + - [Node Slackers](https://www.nodeslackers.com/) est une communauté Slack axée sur Node.js. +- Le compte Twitter officiel de Node.js est [nodejs](https://twitter.com/nodejs). +- Le [calendrier du projet Node.js](https://nodejs.org/calendar) avec toutes les réunions publiques de l'équipe. -## Learning +## Apprentissage -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. +- [Section officielle d'apprentissage](https://nodejs.org/en/learn/) du site web de Node.js. - [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. +- [NodeSchool.io](https://nodeschool.io/) vous enseignera les concepts de Node.js par le biais de jeux interactifs en ligne de commande. +- Le site [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) recueille de nouvelles informations chaque jour. +- [Le tag Node.js de la communauté DEV](https://dev.to/t/node) est un endroit pour partager des projets, des articles et des tutoriels Node.js, ainsi que pour lancer des discussions et demander des commentaires sur des sujets liés à Node.js. Les développeurs de tous niveaux sont les bienvenus. +- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) est une communauté amicale de développeurs backend Node.js qui s'entraident sur Discord. diff --git a/pages/fr/about/governance.md b/pages/fr/about/governance.md index c035ac6c9e9c3..9cf0b1c050669 100644 --- a/pages/fr/about/governance.md +++ b/pages/fr/about/governance.md @@ -12,11 +12,11 @@ Le projet Node.js suit un modèle de prise de décision [Consensus Seeking][]. ## Collaborateurs Le dépôt GitHub [nodejs/node][] core est maintenu par les Collaborateurs -qui sont ajoutés par le Comité de pilotage technique ([TSC][]) sur une base continue. +qui sont nommés par d'autres collaborateurs existants sur une base continue. Les personnes qui apportent des contributions significatives et précieuses sont nommées collaborateurs -et se voient attribuer un accès au projet. Ces personnes sont identifiées par le -TSC et leur nomination est discutée avec les collaborateurs existants. +et se voient attribuer un accès au projet. Ces personnes sont identifiées par d'autres. +Ces personnes sont identifiées par d'autres collaborateurs et leur nomination est discutée avec les collaborateurs existants. Pour la liste actuelle des collaborateurs, voir le [README.md][] du projet. @@ -24,8 +24,9 @@ Un guide pour les collaborateurs est disponible à l'adresse suivante : [collabo ## Comité de pilotage technique -Le projet est régi par le \[Comité de pilotage technique (CTP)]\[] -qui est responsable de l'orientation à haut niveau du projet. +Le projet est régi par le \[Comité de pilotage technique (TSC)]\[] +qui est responsable de l'orientation de haut niveau du projet. Le TSC est un +un sous-ensemble de collaborateurs actifs qui sont nommés par d'autres membres existants du TSC. [consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members diff --git a/pages/fr/about/index.mdx b/pages/fr/about/index.mdx index eff95fd3cad15..c08e7bff80aa4 100644 --- a/pages/fr/about/index.mdx +++ b/pages/fr/about/index.mdx @@ -3,30 +3,37 @@ title: À propos de Node.js® layout: about --- -
- Mascotte de Node.js -
- ---- - -# À propos de Node.js® +À propos de Node.js® En tant que moteur d'exécution JavaScript asynchrone piloté par les événements, Node.js est conçu pour construire des applications réseau évolutives. des applications réseau évolutives. Dans l'exemple suivant, "hello world", de nombreuses peuvent être gérées simultanément. À chaque connexion, le rappel est mais s'il n'y a pas de travail à faire, Node.js se met en veille. -```js -const http = require('node:http'); +```cjs +const { createServer } = require('node:http'); + +const hostname = '127.0.0.1'; +const port = 3000; + +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +```mjs +import { createServer } from 'node:http'; const hostname = '127.0.0.1'; const port = 3000; -const server = http.createServer((req, res) => { +const server = createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); @@ -46,16 +53,16 @@ méthodes synchrones de la bibliothèque standard de Node.js. Comme rien ne se b raisonnables à développer en Node.js. Si ce langage ne vous est pas familier, vous trouverez un article complet sur le site suivant -\[Blocage et non-blocage]\[]. +[Blocage et non-blocage][]. --- -La conception de Node.js est similaire et influencée par des systèmes tels que Ruby \[Event Machine]\[] et Python \[Twisted]\[]. -\[Event Machine]\[] de Ruby et \[Twisted]\[] de Python. Node.js pousse le modèle d'événement un peu plus loin. +La conception de Node.js est similaire et influencée par des systèmes tels que Ruby [Event Machine][] et Python [Twisted][]. +[Event Machine][] de Ruby et [Twisted][] de Python. Node.js pousse le modèle d'événement un peu plus loin. un peu plus loin. Il présente une boucle d'événements comme une construction d'exécution plutôt que comme une bibliothèque. Dans d'autres systèmes, il y a toujours un appel bloquant pour démarrer la boucle d'événements. Généralement, le comportement est défini par des rappels au début d'un script et, à la fin, un serveur est démarré par le biais d'un appel bloquant. -à la fin, un serveur est démarré par un appel bloquant comme `EventMachine::run()`. +la fin, un serveur est démarré par un appel bloquant comme `EventMachine::run()`. Dans Node.js, il n'y a pas de tel appel start-the-event-loop. Node.js entre simplement dans la boucle d'événements après avoir exécuté le script d'entrée. Node.js quitte la boucle d'événements lorsqu'il n'y a plus de rappels à effectuer. Ce comportement est similaire à celui d'un navigateur JavaScript - la boucle d'événements est cachée à l'utilisateur. @@ -65,9 +72,9 @@ latence. Node.js est donc bien adapté à la création d'une bibliothèque ou d' web ou d'un framework. Le fait que Node.js soit conçu sans threads ne signifie pas que vous ne pouvez pas tirer -profiter de plusieurs cœurs dans votre environnement. Les processus enfants peuvent être créés en utilisant notre API \[`child_process.fork()`]\[]. -en utilisant notre API \[`child_process.fork()`]\[], et sont conçus pour être faciles à communiquer. -communiquer avec. Le module \[`cluster`]\[] est construit sur cette même interface, +profiter de plusieurs cœurs dans votre environnement. Les processus enfants peuvent être créés en utilisant notre API [`child_process.fork()`][]. +en utilisant notre API [`child_process.fork()`][], et sont conçus pour être faciles à communiquer. +communiquer avec. Le module [`cluster`][] est construit sur cette même interface, qui vous permet de partager des sockets entre les processus afin d'équilibrer la charge sur vos cœurs. @@ -75,4 +82,4 @@ sur vos cœurs. [`child_process.fork()`]: https://nodejs.org/api/child_process.html [`cluster`]: https://nodejs.org/api/cluster.html [événements machine]: https://github.com/eventmachine/eventmachine -[tordu]: https://twistedmatrix.com/trac/ +[tordu]: https://twisted.org/ diff --git a/pages/fr/about/previous-releases.mdx b/pages/fr/about/previous-releases.mdx index 5c847bb0d10b2..617c6b9088f29 100644 --- a/pages/fr/about/previous-releases.mdx +++ b/pages/fr/about/previous-releases.mdx @@ -1,21 +1,21 @@ --- -title: Versions antérieures +title: Versions de Node.js layout: about --- -# Versions antérieures +Versions de Node.js Les versions majeures de Node.js passent au statut de version _Current_ pendant six mois, ce qui donne aux auteurs de bibliothèques le temps de les prendre en charge. Après six mois, les versions impaires (9, 11, etc.) ne sont plus supportées, et les versions paires (10, 12, etc.) passent au statut _Active LTS_ et sont prêtes pour une utilisation générale. Le statut de la version _LTS_ correspond à un "support à long terme", qui garantit généralement que les bogues critiques seront corrigés pendant une durée totale de 30 mois. Les applications de production ne doivent utiliser que les versions _Active LTS_ ou _Maintenance LTS_. -### Calendrier de sortie +## Calendrier de sortie ![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) -Tous les détails concernant le calendrier des versions de Node.js sont disponibles \[sur GitHub] (https://github.com/nodejs/release#release-schedule). +Tous les détails concernant le calendrier des versions de Node.js sont disponibles [sur GitHub] (https://github.com/nodejs/release#release-schedule). -### Vous recherchez la dernière version d'une branche de version ? +## Vous recherchez la dernière version d'une branche de version ? diff --git a/pages/fr/about/security-reporting.mdx b/pages/fr/about/security-reporting.mdx index 2461b5934389a..4209d3c628ecf 100644 --- a/pages/fr/about/security-reporting.mdx +++ b/pages/fr/about/security-reporting.mdx @@ -3,13 +3,13 @@ title: Rapport de sécurité layout: about --- -# Rapport de sécurité +Rapport de sécurité -Pour plus de détails sur les politiques de sécurité active, consultez \[cette page] (https://github.com/nodejs/node/security/policy). +Pour plus de détails sur les politiques de sécurité active, consultez [cette page] (https://github.com/nodejs/node/security/policy). ## Signaler une faille dans Node.js -Signalez les bogues de sécurité dans Node.js via \[HackerOne] (https://hackerone.com/nodejs). +Signalez les bogues de sécurité dans Node.js via [HackerOne] (https://hackerone.com/nodejs). Vous recevrez un accusé de réception de votre rapport dans les 5 jours, et vous recevrez une réponse plus détaillée dans les 10 jours, indiquant les prochaines étapes. une réponse plus détaillée à votre rapport dans les 10 jours, indiquant les prochaines étapes du traitement de votre demande. @@ -34,37 +34,37 @@ Les bogues de sécurité dans les modules tiers doivent être signalés à leurs Voici la politique de divulgation de la sécurité pour Node.js -- Le rapport de sécurité est reçu et un gestionnaire principal lui est attribué. Cette personne - Cette personne coordonnera le processus de correction et de libération. Le problème est confirmé - et une liste de toutes les versions affectées est établie. Le code est audité pour trouver - tout problème similaire potentiel. Des correctifs sont préparés pour toutes les versions qui sont - toujours en cours de maintenance. Ces correctifs ne sont pas déposés dans le - mais sont plutôt conservés localement dans l'attente de l'annonce. +Le rapport de sécurité est reçu et un gestionnaire principal lui est attribué. Cette personne +Cette personne coordonnera le processus de correction et de libération. Le problème est confirmé +et une liste de toutes les versions affectées est établie. Le code est audité pour trouver +tout problème similaire potentiel. Des correctifs sont préparés pour toutes les versions qui sont +toujours en cours de maintenance. Ces correctifs ne sont pas déposés dans le +mais sont plutôt conservés localement dans l'attente de l'annonce. -- Une date d'embargo est proposée pour cette vulnérabilité et un CVE (Common Vulnerabilities and Exposures (CVE®)) est demandé pour cette vulnérabilité. - Vulnérabilités et expositions communes (CVE®) est demandé pour la vulnérabilité. +Une date d'embargo est proposée pour cette vulnérabilité et un CVE (Common Vulnerabilities and Exposures (CVE®)) est demandé pour cette vulnérabilité. +Vulnérabilités et expositions communes (CVE®) est demandé pour la vulnérabilité. -- À la date d'embargo, la liste de diffusion sur la sécurité de Node.js reçoit une copie de l'annonce. - annonce. Les changements sont poussés vers le dépôt public et de nouvelles versions - sont déployées sur nodejs.org. Dans les 6 heures suivant la notification de la liste de diffusion - une copie de l'avis sera publiée sur le blog de Node.js. +À la date d'embargo, la liste de diffusion sur la sécurité de Node.js reçoit une copie de l'annonce. +annonce. Les changements sont poussés vers le dépôt public et de nouvelles versions +sont déployées sur nodejs.org. Dans les 6 heures suivant la notification de la liste de diffusion +une copie de l'avis sera publiée sur le blog de Node.js. -- En règle générale, la date d'embargo est fixée à 72 heures à compter de l'émission du CVE. - est publié. Toutefois, cela peut varier en fonction de la gravité du bogue ou de la - de la difficulté à appliquer un correctif. +En règle générale, la date d'embargo est fixée à 72 heures à compter de l'émission du CVE. +est publié. Toutefois, cela peut varier en fonction de la gravité du bogue ou de la +de la difficulté à appliquer un correctif. -- Ce processus peut prendre un certain temps, en particulier lorsqu'une coordination est nécessaire avec les responsables d'autres projets. - avec les responsables d'autres projets. Tous les efforts seront faits pour traiter le - bogue le plus rapidement possible ; cependant, il est important que nous suivions la - processus de publication ci-dessus pour s'assurer que la divulgation est traitée de manière - de manière cohérente. +Ce processus peut prendre un certain temps, en particulier lorsqu'une coordination est nécessaire avec les responsables d'autres projets. +avec les responsables d'autres projets. Tous les efforts seront faits pour traiter le +bogue le plus rapidement possible ; cependant, il est important que nous suivions la +processus de publication ci-dessus pour s'assurer que la divulgation est traitée de manière +de manière cohérente. ## Recevoir les alertes de sécurité Les notifications de sécurité seront diffusées par les méthodes suivantes. -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) +[Google Group](https://groups.google.com/group/nodejs-sec) +[Node.js Blog](/blog) ## Commentaires sur cette politique @@ -85,4 +85,4 @@ Si vous avez des suggestions sur la façon dont ce processus pourrait être amé /> -Le \[badge des meilleures pratiques] de l'Open Source Security Foundation (OpenSSF) (https://github.com/coreinfrastructure/best-practices-badge) est un moyen pour les projets de logiciels libres et open source (FLOSS) de montrer qu'ils suivent les meilleures pratiques. Les projets peuvent volontairement auto-certifier la manière dont ils suivent chaque meilleure pratique. Les utilisateurs du badge peuvent rapidement déterminer quels sont les projets FLOSS qui suivent les meilleures pratiques et qui sont donc plus susceptibles de produire des logiciels sécurisés de meilleure qualité. +Le [badge des meilleures pratiques] de l'Open Source Security Foundation (OpenSSF) (https://github.com/coreinfrastructure/best-practices-badge) est un moyen pour les projets de logiciels libres et open source (FLOSS) de montrer qu'ils suivent les meilleures pratiques. Les projets peuvent volontairement auto-certifier la manière dont ils suivent chaque meilleure pratique. Les utilisateurs du badge peuvent rapidement déterminer quels sont les projets FLOSS qui suivent les meilleures pratiques et qui sont donc plus susceptibles de produire des logiciels sécurisés de meilleure qualité. diff --git a/pages/fr/download/index.mdx b/pages/fr/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/fr/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/fr/download/package-manager/all.md b/pages/fr/download/package-manager/all.md index 2e87e99e21fb0..838d5a30b6f6a 100644 --- a/pages/fr/download/package-manager/all.md +++ b/pages/fr/download/package-manager/all.md @@ -1,19 +1,20 @@ --- -layout: docs -title: Installing Node.js via package manager +layout: download +title: Installer Node.js via le gestionnaire de paquets --- -# Installing Node.js via Package Managers +# Installer Node.js via le gestionnaire de paquets -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. +> Les paquets sur cette page sont maintenus et supportés par leurs auteurs respectifs, **pas** par l'équipe de base de Node.js. Veuillez rapporter tout problème que vous rencontrez au mainteneur du paquet. S'il s'avère que votre problème est un bogue dans Node.js lui-même, le mainteneur rapportera le problème en amont. --- - [Alpine Linux](#alpine-linux) - [Android](#android) - [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) +- [CentOS, Fedora et Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) +- [Debian et Distributions Linux basées sur Ubuntu](#debian-and-ubuntu-based-linux-distributions) +- [Exherbo Linux](#exherbo-linux) - [fnm](#fnm) - [FreeBSD](#freebsd) - [Gentoo](#gentoo) @@ -25,10 +26,11 @@ title: Installing Node.js via package manager - [nvm](#nvm) - [nvs](#nvs) - [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) +- [openSUSE et SLE](#opensuse-and-sle) +- [SmartOS et illumos](#smartos-and-illumos) - [Snap](#snap) - [Solus](#solus) +- [vfox](#vfox) - [Void Linux](#void-linux) - [Windows](#windows-1) - [z/OS](#zos) @@ -37,13 +39,13 @@ title: Installing Node.js via package manager ## Alpine Linux -Node.js LTS and npm packages are available in the Main Repository. +Les paquets Node.js LTS et npm sont disponibles dans le dépôt principal. ```bash apk add nodejs npm ``` -Node.js Current can be installed from the Community Repository. +Node.js actuel peut être installé à partir du Repository de la Communauté. ```bash apk add nodejs-current @@ -51,40 +53,40 @@ apk add nodejs-current ## Android -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. +Le support d'Android est encore expérimental dans Node.js, donc les binaires précompilés ne sont pas encore fournis par les développeurs de Node.js. -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: +Toutefois, il existe des solutions tierces. Par exemple, la communauté [Termux](https://termux.com/) fournit un émulateur de terminal et un environnement Linux pour Android, ainsi que son propre gestionnaire de paquets et une [vaste collection](https://github.com/termux/termux-packages) de nombreuses applications précompilées. Cette commande dans l'application Termux installera la dernière version disponible de Node.js : ```bash pkg install nodejs ``` -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). +Actuellement, les binaires de Termux Node.js sont liés à `system-icu` (dépendant du paquet `libicu`). ## Arch Linux -Node.js and npm packages are available in the Community Repository. +Les paquets Node.js et npm sont disponibles dans le Dépôt de la communauté. ```bash pacman -S nodejs npm ``` -## CentOS, Fedora and Red Hat Enterprise Linux +## CentOS, Fedora et Red Hat Enterprise Linux -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. +Node.js est disponible en tant que module appelé `nodejs` dans CentOS/RHEL 8 et Fedora. ```bash dnf module install nodejs: ``` -where `` corresponds to the major version of Node.js. -To see a list of available streams: +où `` correspond à la version majeure de Node.js. +Pour voir la liste des flux disponibles : ```bash dnf module list nodejs ``` -For example, to install Node.js 18: +Par exemple, pour installer Node.js 18 : ```bash dnf module install nodejs:18/common @@ -92,38 +94,46 @@ dnf module install nodejs:18/common ### Alternatives -These resources provide packages compatible with CentOS, Fedora, and RHEL. +Ces ressources fournissent des paquets compatibles avec CentOS, Fedora et RHEL. -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) +- [Node.js snaps](#snap) maintenu et supporté à https://github.com/nodejs/snap +- [Distributions binaires Node.js](#debian-and-ubuntu-based-linux-distributions) maintenues et supportées par [NodeSource](https://github.com/nodesource/distributions) -## Debian and Ubuntu based Linux distributions +## Distributions basées sur Debian et Ubuntu -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. +Des [distributions binaires de Node.js](https://github.com/nodesource/distributions) sont disponibles auprès de NodeSource. ### Alternatives -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). +Les paquets compatibles avec les distributions Linux basées sur Debian et Ubuntu sont disponibles via [Node.js snaps](#snap). + +## Exherbo Linux + +Les paquets Node.js et npm sont disponibles dans le [dépôt d'arborescence](https://gitlab.exherbo.org/exherbo/arbor/-/tree/master/packages/dev-lang/node). + +```bash +cave resolve -x node +``` ## fnm -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). +Gestionnaire de versions Node.js simple et rapide, construit en Rust, utilisé pour gérer plusieurs versions de Node.js. Il vous permet d'effectuer des opérations telles que l'installation, la désinstallation, le changement automatique de version de Node en fonction du répertoire courant, etc. +Pour installer fnm, utilisez ce [script d'installation](https://github.com/Schniz/fnm#using-a-script-macoslinux). -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. +fnm est multiplateforme (macOS, Windows, Linux) et supporte tous les shells populaires (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). +fnm est construit avec la vitesse à l'esprit et le support de compatibilité pour les fichiers `.node-version` et `.nvmrc`. ## FreeBSD -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. +La version la plus récente de Node.js est disponible via le port [www/node](https://www.freshports.org/www/node). -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): +Installer un paquetage binaire via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg) : ```bash pkg install node ``` -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): +Vous pouvez également le compiler vous-même en utilisant [ports](https://www.freebsd.org/cgi/man.cgi?ports) : ```bash cd /usr/ports/www/node && make install @@ -131,7 +141,7 @@ cd /usr/ports/www/node && make install ## Gentoo -Node.js is available in the portage tree. +Node.js est disponible dans l'arbre de portage. ```bash emerge nodejs @@ -139,21 +149,21 @@ emerge nodejs ## IBM i -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) +Les versions LTS de Node.js sont disponibles auprès d'IBM, et sont disponibles via [le gestionnaire de paquets 'yum'](https://ibm.biz/ibmi-rpms). Le nom du paquet est `nodejs` suivi du numéro de la version majeure (par exemple, `nodejs18`, `nodejs20`, etc) -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: +Pour installer Node.js 14.x à partir de la ligne de commande, exécutez la commande suivante en tant qu'utilisateur disposant de l'autorisation spéciale \*ALLOBJ : ```bash yum install nodejs20 ``` -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details +Node.js peut également être installé avec le produit IBM i Access Client Solutions. Voir [ce document d'assistance](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) pour plus de détails ## macOS -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. +Téléchargez l'[installateur macOS](/#home-downloadhead) directement depuis le site web [nodejs.org](https://nodejs.org/). -_If you want to download the package with bash:_ +Si vous voulez télécharger le paquet avec bash ```bash curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" @@ -161,13 +171,13 @@ curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | ### Alternatives -Using **[Homebrew](https://brew.sh/)**: +Utilisation de **[Homebrew](https://brew.sh/)** : ```bash brew install node ``` -Using **[MacPorts](https://www.macports.org/)**: +Utilisation de **[MacPorts](https://www.macports.org/)** : ```bash port install nodejs @@ -176,15 +186,15 @@ port install nodejs port install nodejs7 ``` -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: +Utilisation de **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)** : -Install the binary package: +Installer le paquet binaire : ```bash pkgin -y install nodejs ``` -Or build manually from pkgsrc: +Ou compiler manuellement à partir de pkgsrc : ```bash cd pkgsrc/lang/nodejs && bmake install @@ -192,13 +202,13 @@ cd pkgsrc/lang/nodejs && bmake install ## n -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. +`n` est un gestionnaire de version Node.js simple à utiliser pour Mac et Linux. Spécifiez la version cible à installer en utilisant une syntaxe riche, +ou choisissez parmi un menu de versions précédemment téléchargées. Les versions sont installées à l'échelle du système ou de l'utilisateur, et pour une utilisation plus ciblée, vous pouvez exécuter une version directement à partir de votre ordinateur. +Pour une utilisation plus ciblée, vous pouvez exécuter une version directement à partir des téléchargements mis en cache. -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. +Voir la [page d'accueil](https://github.com/tj/n) pour les méthodes d'installation (bootstrap, npm, Homebrew, tierce partie), et tous les détails d'utilisation. -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: +Si vous avez déjà `npm`, l'installation de `n` et de la dernière version LTS de `node` est aussi simple que cela : ``` npm install -g n @@ -207,13 +217,13 @@ n lts ## NetBSD -Node.js is available in the pkgsrc tree: +Node.js est disponible dans l'arborescence pkgsrc : ```bash cd /usr/pkgsrc/lang/nodejs && make install ``` -Or install a binary package (if available for your platform) using pkgin: +Ou installez un paquetage binaire (si disponible pour votre plateforme) en utilisant pkgin : ```bash pkgin -y install nodejs @@ -221,33 +231,33 @@ pkgin -y install nodejs ## Nodenv -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. +`nodenv` est un gestionnaire de version léger pour les nœuds, similaire à `nvm`. Il est simple et prévisible. Un riche écosystème de plugins vous permet de l'adapter à vos besoins. Utilisez `nodenv` pour choisir une version de Node pour votre application et garantissez que votre environnement de développement correspond à la production. -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. +Les instructions d'installation de Nodenv sont maintenues [sur sa page Github](https://github.com/nodenv/nodenv#installation). Veuillez consulter cette page pour vous assurer que vous suivez la dernière version des étapes d'installation. ## nvm -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). +Node Version Manager est un script bash utilisé pour gérer plusieurs versions de Node.js. Il permet +d'effectuer des opérations telles que l'installation, la désinstallation, le changement de version, etc. +Pour installer nvm, utilisez ce [script d'installation](https://github.com/nvm-sh/nvm#install--update-script). -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: +Sur les systèmes Unix / OS X, Node.js construit à partir des sources peut être installé à l'aide de +[nvm](https://github.com/creationix/nvm) en l'installant à l'emplacement attendu par nvm : ```bash env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" ``` -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: +Après cela, vous pouvez utiliser `nvm` pour basculer entre les versions publiées et les versions +compilées à partir des sources. +Par exemple, si la version de Node.js est v8.0.0-pre : ```bash nvm use 8 ``` -Once the official release is out you will want to uninstall the version built -from source: +Une fois que la version officielle sera disponible, vous voudrez désinstaller la version construite +à partir des sources : ```bash nvm uninstall 8 @@ -257,37 +267,37 @@ nvm uninstall 8 #### Windows -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems +Le gestionnaire de versions `nvs` est multiplateforme et peut être utilisé sur Windows, macOS et les systèmes de type Unix -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. +Pour installer `nvs` sur Windows, allez sur la [page de publication](https://github.com/jasongin/nvs/releases) ici et téléchargez le fichier d'installation MSI de la dernière version. -You can also use `chocolatey` to install it: +Vous pouvez également utiliser `chocolatey` pour l'installer : ```bash choco install nvs ``` -#### macOS,UnixLike +#### macOS et tous les systèmes de type Unix -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) +Vous pouvez trouver la documentation concernant les étapes d'installation de `nvs` dans les systèmes macOS/Unix-like [ici](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) #### Usage -After this you can use `nvs` to switch between different versions of node. +Après cela, vous pouvez utiliser `nvs` pour passer d'une version à l'autre de node. -To add the latest version of node: +Pour ajouter la dernière version du node : ```bash nvs add latest ``` -Or to add the latest LTS version of node: +Ou d'ajouter la dernière version LTS de node : ```bash nvs add lts ``` -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: +Ensuite, lancez la commande `nvs use` pour ajouter une version de node à votre `PATH` pour l'interpréteur de commandes actuel : ```bash $ nvs use lts @@ -295,7 +305,7 @@ PATH -= %LOCALAPPDATA%\nvs\default PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 ``` -To add it to `PATH` permanently, use `nvs link`: +Pour l'ajouter à `PATH` de façon permanente, utilisez `nvs link` : ```bash nvs link lts @@ -303,46 +313,46 @@ nvs link lts ## OpenBSD -Node.js is available through the ports system. +Node.js est disponible via le système des ports. ```bash /usr/ports/lang/node ``` -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: +Utilisation de [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) sur OpenBSD : ```bash pkg_add node ``` -## openSUSE and SLE +## openSUSE et SLE -Node.js is available in the main repositories under the following packages: +Node.js est disponible dans les dépôts principaux sous les paquets suivants : - **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` - **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) +- **SUSE Linux Enterprise Server (SLES) 12** : `nodejs10`, `nodejs12`, et `nodejs14` + (Le "Web et Scripting Module" doit être [activé](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) +- **SUSE Linux Enterprise Server (SLES) 15 SP2** : `nodejs10`, `nodejs12`, et `nodejs14` + (Le "Web etScripting Module" doit être [activés](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: +Par exemple, pour installer Node.js 14.x sur openSUSE Leap 15.2, exécutez ce qui suit en tant que root : ```bash zypper install nodejs14 ``` -Different major versions of Node can be installed and used concurrently. +Différentes versions majeures de Node peuvent être installées et utilisées simultanément. -## SmartOS and illumos +## SmartOS et illumos -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: +Les images de SmartOS sont livrées avec pkgsrc pré-installé. Sur les autres distributions illumos, installez d'abord **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, puis vous pouvez installer le paquetage binaire normalement : ```bash pkgin -y install nodejs ``` -Or build manually from pkgsrc: +Ou compiler manuellement à partir de pkgsrc : ```bash cd pkgsrc/lang/nodejs && bmake install @@ -350,19 +360,29 @@ cd pkgsrc/lang/nodejs && bmake install ## Snap -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. +Les [snaps Node.js](https://github.com/nodejs/snap) sont disponibles en tant que [`node`](https://snapcraft.io/node) sur le magasin Snap. ## Solus -Solus provides Node.js in its main repository. +Solus fournit Node.js dans son dépôt principal. ```bash sudo eopkg install nodejs ``` +## vfox + +Un gestionnaire de versions multiplateforme (Windows, macOS, Linux) et **extensible**. + +Il vous permet de **différentes versions pour différents projets**, **différentes versions pour différents shells**, et de changer de version de Node automatiquement en fonction du répertoire courant, etc. + +Il supporte tous les shells populaires (Bash, Zsh, Fish, PowerShell, Clink, Cmder). + +Voir le [Démarrage rapide](https://vfox.lhan.me/guides/quick-start.html) pour une utilisation rapide de vfox, et tous les détails d'utilisation. + ## Void Linux -Void Linux ships Node.js stable in the main repository. +Void Linux fournit Node.js stable dans le dépôt principal. ```bash xbps-install -Sy nodejs @@ -370,11 +390,11 @@ xbps-install -Sy nodejs ## Windows -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. +Téléchargez l'[Installateur Windowsr](/#home-downloadhead) directement depuis le site web [nodejs.org](https://nodejs.org/). ### Alternatives -Using **[Winget](https://aka.ms/winget-cli)**: +Utilisation **[Winget](https://aka.ms/winget-cli)**: ```bash winget install OpenJS.NodeJS @@ -382,10 +402,10 @@ winget install OpenJS.NodeJS winget install OpenJS.NodeJS.LTS ``` -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. +Après avoir exécuté l'une des deux commandes ci-dessus, il peut être nécessaire de redémarrer l'émulateur de terminal avant que la commande CLI `node` ne soit disponible. +l'émulateur de terminal avant que la commande CLI `node` ne soit disponible. -Using **[Chocolatey](https://chocolatey.org/)**: +Utilisation **[Chocolatey](https://chocolatey.org/)**: ```bash cinst nodejs @@ -393,7 +413,7 @@ cinst nodejs cinst nodejs.install ``` -Using **[Scoop](https://scoop.sh/)**: +Utilisation **[Scoop](https://scoop.sh/)**: ```bash scoop install nodejs @@ -403,8 +423,8 @@ scoop install nodejs-lts ## z/OS -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: +IBM® SDK pour Node.js - z/OS® est disponible en deux formats d'installation, +SMP/E et PAX. Sélectionnez le format d'installation qui vous convient : -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) +- [Installation et configuration de l'édition SMP/E de Node.js sur z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) +- [Installation et configuration de l'édition PAX de Node.js sur z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/fr/download/package-manager/current.mdx b/pages/fr/download/package-manager/current.mdx index ab8b9260b8c76..69f1c75348f95 100644 --- a/pages/fr/download/package-manager/current.mdx +++ b/pages/fr/download/package-manager/current.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Installer Node.js sur en utilisant +Installer Node.js sur en utilisant - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/download/package-manager/index.mdx b/pages/fr/download/package-manager/index.mdx index ab8b9260b8c76..69f1c75348f95 100644 --- a/pages/fr/download/package-manager/index.mdx +++ b/pages/fr/download/package-manager/index.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Installer Node.js sur en utilisant +Installer Node.js sur en utilisant - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/download/prebuilt-binaries/current.mdx b/pages/fr/download/prebuilt-binaries/current.mdx index 6e2f46225723d..8bb21316ba7a3 100644 --- a/pages/fr/download/prebuilt-binaries/current.mdx +++ b/pages/fr/download/prebuilt-binaries/current.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Je veux la version de Node.js pour exécutant +Je veux la version de Node.js pour exécutant - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/download/prebuilt-binaries/index.mdx b/pages/fr/download/prebuilt-binaries/index.mdx index 6e2f46225723d..8bb21316ba7a3 100644 --- a/pages/fr/download/prebuilt-binaries/index.mdx +++ b/pages/fr/download/prebuilt-binaries/index.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Je veux la version de Node.js pour exécutant +Je veux la version de Node.js pour exécutant - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/download/current.mdx b/pages/fr/download/prebuilt-installer/current.mdx similarity index 51% rename from pages/fr/download/current.mdx rename to pages/fr/download/prebuilt-installer/current.mdx index 03b51725b5883..451440f6adc96 100644 --- a/pages/fr/download/current.mdx +++ b/pages/fr/download/prebuilt-installer/current.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Je veux la version de Node.js pour exécutant +Je veux la version de Node.js pour fonctionner - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version @@ -19,4 +21,6 @@ Apprenez à vérifier les SHASUMSoptions de téléchargement de Node.js. +En savoir plus sur les Versions Node.js +
diff --git a/pages/fr/download/prebuilt-installer/index.mdx b/pages/fr/download/prebuilt-installer/index.mdx new file mode 100644 index 0000000000000..451440f6adc96 --- /dev/null +++ b/pages/fr/download/prebuilt-installer/index.mdx @@ -0,0 +1,26 @@ +--- +layout: download +title: Télécharger Node.js® +subtitle: Téléchargez Node.js comme vous le souhaitez. +--- + +
+Je veux la version de Node.js pour fonctionner + + +
+ +
+Node.js inclut . + +Lire le journal des modifications pour cette version + +Lire l'article de blog pour cette version + +Apprenez à vérifier les SHASUMS signés + +Consultez toutes les options de téléchargement de Node.js. + +En savoir plus sur les Versions Node.js + +
diff --git a/pages/fr/download/source-code/current.mdx b/pages/fr/download/source-code/current.mdx index 8a3e805a143af..f7a2f1af75833 100644 --- a/pages/fr/download/source-code/current.mdx +++ b/pages/fr/download/source-code/current.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Je veux la version du code source de Node.js. +Je veux la version du code source de Node.js. - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/download/source-code/index.mdx b/pages/fr/download/source-code/index.mdx index 8a3e805a143af..f7a2f1af75833 100644 --- a/pages/fr/download/source-code/index.mdx +++ b/pages/fr/download/source-code/index.mdx @@ -5,13 +5,15 @@ subtitle: Téléchargez Node.js comme vous le souhaitez. ---
- Je veux la version du code source de Node.js. +Je veux la version du code source de Node.js. - +
- Node.js comprend npm () et corepack. +Node.js inclut . + +Lire le journal des modifications pour cette version Lire l'article de blog pour cette version diff --git a/pages/fr/index.mdx b/pages/fr/index.mdx index 9e6f1fadd360f..54262c84798a6 100644 --- a/pages/fr/index.mdx +++ b/pages/fr/index.mdx @@ -4,116 +4,134 @@ layout: home ---
- - -
-

Exécuter du JavaScript partout

- - Node.js® est un environnement d'exécution JavaScript gratuit, open-source et multiplateforme qui permet aux développeurs de créer des serveurs, des applications web et des applications de gestion de contenu. - qui permet aux développeurs de créer des serveurs, des applications web, des outils en ligne de commande et des scripts. - -
- -
- - {({ release }) => ( - <> - Télécharger Node.js (LTS) - - Télécharger Node.js {release.versionWithPrefix} - 1 avec un support à long terme. - Node.js peut également être installé via gestionnaires de paquets. - - - )} - - - - {({ release }) => ( + + +
+

Exécuter du JavaScript partout

+ +Node.js® est un environnement d'exécution JavaScript gratuit, open-source et multiplateforme qui permet aux développeurs de créer des serveurs, des applications web et des applications de gestion de contenu. +qui permet aux développeurs de créer des serveurs, des applications web, des outils en ligne de commande et des scripts. + +
+ +
+ + {({ release }) => ( + <> + Télécharger Node.js (LTS) - Vous voulez de nouvelles fonctionnalités plus tôt ? - Obtenez Node.js {release.versionWithPrefix} - 1 à la place. + Télécharger Node.js {release.versionWithPrefix} + 1 avec un support à long terme. + Node.js peut également être installé via gestionnaires de paquets. - )} - - -
+ + )} +
+ + + {({ release }) => ( + + Vous voulez de nouvelles fonctionnalités plus tôt ? + Obtenez Node.js {release.versionWithPrefix} + 1 à la place. + + )} + +
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
+
+ ```js displayName="Create an HTTP Server" + // server.mjs + import { createServer } from 'node:http'; + +const server = createServer((req, res) => { +res.writeHead(200, { 'Content-Type': 'text/plain' }); +res.end('Hello World!\n'); +}); + +// starts a simple http server locally on port 3000 +server.listen(3000, '127.0.0.1', () => { +console.log('Listening on 127.0.0.1:3000'); +}); + +// run with `node server.mjs` + +```` + +```js displayName="Write Tests" +// tests.mjs +import assert from 'node:assert'; +import test from 'node:test'; + +test('that 1 is equal 1', () => { + assert.strictEqual(1, 1); +}); + +test('that throws as 1 is not equal 2', () => { + // throws an exception because 1 != 2 + assert.strictEqual(1, 2); +}); + +// run with `node tests.mjs` +```` + +```js displayName="Read and Hash a File" +// crypto.mjs +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; + +const hasher = createHash('sha1'); + +hasher.setEncoding('hex'); +// ensure you have a `package.json` file for this test! +hasher.write(await readFile('package.json')); +hasher.end(); + +const fileHash = hasher.read(); + +// run with `node crypto.mjs` +``` + +```js displayName="Streams Pipeline" +// streams.mjs +import { pipeline } from 'node:stream/promises'; +import { createReadStream, createWriteStream } from 'node:fs'; +import { createGzip } from 'node:zlib'; + +// ensure you have a `package.json` file for this test! +await pipeline( + createReadStream('package.json'), + createGzip(), + createWriteStream('package.json.gz') +); + +// run with `node streams.mjs` +``` + +```js displayName="Work with Threads" +// threads.mjs +import { + Worker, + isMainThread, + workerData, + parentPort, +} from 'node:worker_threads'; + +if (isMainThread) { + const data = 'some data'; + const worker = new Worker(import.meta.filename, { workerData: data }); + worker.on('message', msg => console.log('Reply from Thread:', msg)); +} else { + const source = workerData; + parentPort.postMessage(btoa(source.toUpperCase())); +} + +// run with `node threads.mjs` +``` + +
Apprenez-en plus sur ce que Node.js est capable d'offrir avec notre [Matériel d'apprentissage](/learn). diff --git a/pages/id/about/get-involved/collab-summit.md b/pages/id/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/id/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/id/about/get-involved/contribute.md b/pages/id/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/id/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/id/about/get-involved/events.mdx b/pages/id/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/id/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/id/about/get-involved/index.md b/pages/id/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/id/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/id/about/governance.md b/pages/id/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/id/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/id/about/index.mdx b/pages/id/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/id/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/id/about/previous-releases.mdx b/pages/id/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/id/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/id/about/security-reporting.mdx b/pages/id/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/id/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/id/download/current.mdx b/pages/id/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/id/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/id/download/index.mdx b/pages/id/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/id/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/id/download/package-manager/all.md b/pages/id/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/id/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/id/download/package-manager/current.mdx b/pages/id/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/id/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/id/download/package-manager/index.mdx b/pages/id/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/id/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/id/download/prebuilt-binaries/current.mdx b/pages/id/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/id/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/id/download/prebuilt-binaries/index.mdx b/pages/id/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/id/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/id/download/source-code/current.mdx b/pages/id/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/id/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/id/download/source-code/index.mdx b/pages/id/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/id/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/id/index.mdx b/pages/id/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/id/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/id/search.mdx b/pages/id/search.mdx index ac57c0e414803..7b4a2ae44d4c4 100644 --- a/pages/id/search.mdx +++ b/pages/id/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: Hasil Pencarian --- diff --git a/pages/it/about/get-involved/collab-summit.md b/pages/it/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/it/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/it/about/get-involved/contribute.md b/pages/it/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/it/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/it/about/get-involved/events.mdx b/pages/it/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/it/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/it/about/get-involved/index.md b/pages/it/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/it/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/it/about/governance.md b/pages/it/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/it/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/it/about/index.mdx b/pages/it/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/it/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/it/about/previous-releases.mdx b/pages/it/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/it/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/it/about/security-reporting.mdx b/pages/it/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/it/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/it/download/current.mdx b/pages/it/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/it/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/it/download/index.mdx b/pages/it/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/it/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/it/download/package-manager/all.md b/pages/it/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/it/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/it/download/package-manager/current.mdx b/pages/it/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/it/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/it/download/package-manager/index.mdx b/pages/it/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/it/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/it/download/prebuilt-binaries/current.mdx b/pages/it/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/it/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/it/download/prebuilt-binaries/index.mdx b/pages/it/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/it/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/it/download/source-code/current.mdx b/pages/it/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/it/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/it/download/source-code/index.mdx b/pages/it/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/it/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/it/index.mdx b/pages/it/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/it/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/it/search.mdx b/pages/it/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/it/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/ja/about/branding.mdx b/pages/ja/about/branding.mdx new file mode 100644 index 0000000000000..70bfbb817e3a0 --- /dev/null +++ b/pages/ja/about/branding.mdx @@ -0,0 +1,72 @@ +--- +title: Node.jsのブランド +layout: about +--- + +Node.jsのブランド + +Node.jsのロゴやシンボルマークの許可されている利用方法については[トレードマークポリシー](https://trademark-policy.openjsf.org/)を確認してください。 + +## Node.js®マスコット + +Node.jsマスコット + +## Node.js®ロゴ + +### Node.js®横型ロゴ + + + + + + + +
+ Node.jsダーク横型ロゴ + + Node.jsライト横型ロゴ +
+ +### Node.js®スタック型ロゴ + + + + + + + + + + + + + +
+ Node.jsダークスタック型ロゴ + + Node.jsライトスタック型ロゴ +
+ Node.jsブラックスタック型ロゴ + + Node.jsホワイトスタック型ロゴ +
+ +### JSアイコン + + + + + + + +
+ JSアイコングリーン + + JSアイコンホワイト +
diff --git a/pages/ja/about/get-involved/collab-summit.md b/pages/ja/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/ja/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/ja/about/get-involved/contribute.md b/pages/ja/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/ja/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/ja/about/get-involved/events.mdx b/pages/ja/about/get-involved/events.mdx index 2fb8672daed2d..357e93438240c 100644 --- a/pages/ja/about/get-involved/events.mdx +++ b/pages/ja/about/get-involved/events.mdx @@ -1,16 +1,16 @@ --- -title: Upcoming Events +title: 今後のイベント layout: about --- -## Upcoming Events +## 今後のイベント -Node.js events are open and available to the public. Anyone is welcome to join and participate. +Node.jsのイベントは公開されており、どんな方の参加も歓迎されています。 -### Upcoming Node.js® Meetings +### 今後のNode.js®会議 -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. +Node.jsプロジェクトでは年間を通じて多くの会議を開催し、プロジェクトのさまざまな側面について議論し計画を立てています。 -The following meetings are upcoming in the next 7 days. +次の7日間ではこれらの会議が予定されています。 diff --git a/pages/ja/about/get-involved/index.md b/pages/ja/about/get-involved/index.md index 858bfc61901b2..bdb21e9846047 100644 --- a/pages/ja/about/get-involved/index.md +++ b/pages/ja/about/get-involved/index.md @@ -1,26 +1,26 @@ --- -title: Get involved +title: 参加しよう layout: about --- -# Get Involved +# 参加しよう -## Community Discussion +## コミュニティーでの議論 -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. +- [GitHub issues](https://github.com/nodejs/node/issues)がNode.jsのコア機能に関する議論の場となっています。 +- Node.jsの開発に関するリアルタイムのチャットには次のプラットフォームを利用してください。 + - IRCの場合は[IRCクライアント](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients)または[ウェブクライアント](https://kiwiirc.com/nextclient/)を利用して`irc.libera.chat`の`#node.js`チャンネルに参加してください。 + - Slackの場合は2つの選択肢があります: + - [OpenJSFのSlack](https://slack-invite.openjsf.org/)にはいくつかのNode.jsに関するチャンネルがあります(接頭辞として`#nodejs-`がつくチャンネル)。 + - [Node Slackers](https://www.nodeslackers.com/)はNode.jsに特化したSlackコミュニティーです。 +- Node.jsの公式Twitterアカウントは[nodejs](https://twitter.com/nodejs)です。 +- [Node.jsプロジェクトカレンダー](https://nodejs.org/calendar)では公開されている全ての会議を確認できます。 -## Learning +## 学ぶ -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. +- Node.jsのウェブサイトに[公式の学習セクション](https://nodejs.org/en/learn/)があります。 +- [公式のAPIリファレンス](https://nodejs.org/api/) +- [NodeSchool.io](https://nodeschool.io/)ではインタラクティブなコマンドラインゲームを通してNode.jsのコンセプトを学べます。 +- [Stack OverflowのNode.jsタグ](https://stackoverflow.com/questions/tagged/node.js)には毎日新しい情報が集まっています。 +- [DEVコミュニティーのNode.jsタグ](https://dev.to/t/node)はNode.jsのプロジェクト、記事、チュートリアルを共有したり、Node.js関連のトピックについてディスカッションしたり、フィードバックを求めたりする場になっています。どんなスキルレベルの方でも参加できます。 +- [Nodeiflux](https://discordapp.com/invite/vUsrbjd)はNode.jsのバックエンド開発者がDiscord上でお互いをサポートするフレンドリーなコミュニティーです。 diff --git a/pages/ja/about/governance.md b/pages/ja/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/ja/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/ja/about/index.mdx b/pages/ja/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/ja/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/ja/about/previous-releases.mdx b/pages/ja/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/ja/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/ja/about/security-reporting.mdx b/pages/ja/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/ja/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/ja/download/current.mdx b/pages/ja/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ja/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ja/download/index.mdx b/pages/ja/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ja/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ja/download/package-manager/all.md b/pages/ja/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/ja/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/ja/download/package-manager/current.mdx b/pages/ja/download/package-manager/current.mdx index e9a55eed2a924..81bc85396d4f4 100644 --- a/pages/ja/download/package-manager/current.mdx +++ b/pages/ja/download/package-manager/current.mdx @@ -1,22 +1,29 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- Install Node.js on using +を利用してにNode.js をインストールする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +に関する変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out other community supported package managers + + 署名済みSHASUMSの検証方法 + +を確認する。 + +コミュニティーによってサポートされているその他のパッケージマネージャーを確認する。
diff --git a/pages/ja/download/package-manager/index.mdx b/pages/ja/download/package-manager/index.mdx index 89984b745c29e..9235e0c26895a 100644 --- a/pages/ja/download/package-manager/index.mdx +++ b/pages/ja/download/package-manager/index.mdx @@ -1,22 +1,29 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- Install Node.js on using +を利用して用のNode.js をインストールする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +に関する変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out other community supported package managers + + 署名済みSHASUMSの検証方法 + +を確認する。 + +コミュニティーによってサポートされているその他のパッケージマネージャーを確認する。
diff --git a/pages/ja/download/prebuilt-binaries/current.mdx b/pages/ja/download/prebuilt-binaries/current.mdx index e38141bb4befc..5219eba628248 100644 --- a/pages/ja/download/prebuilt-binaries/current.mdx +++ b/pages/ja/download/prebuilt-binaries/current.mdx @@ -1,22 +1,28 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- I want the version of Node.js for running +で動作している用のNode.jsをダウンロードする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +の変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms + + 署名済みSHASUMSの検証方法 + +を確認する。 +ナイトリービルドや他のプラットフォーム用の非公式のビルドがあります。
diff --git a/pages/ja/download/prebuilt-binaries/index.mdx b/pages/ja/download/prebuilt-binaries/index.mdx index e38141bb4befc..5219eba628248 100644 --- a/pages/ja/download/prebuilt-binaries/index.mdx +++ b/pages/ja/download/prebuilt-binaries/index.mdx @@ -1,22 +1,28 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- I want the version of Node.js for running +で動作している用のNode.jsをダウンロードする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +の変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms + + 署名済みSHASUMSの検証方法 + +を確認する。 +ナイトリービルドや他のプラットフォーム用の非公式のビルドがあります。
diff --git a/pages/ja/download/source-code/current.mdx b/pages/ja/download/source-code/current.mdx index 17383ba65eb3e..2d5e3c07bd222 100644 --- a/pages/ja/download/source-code/current.mdx +++ b/pages/ja/download/source-code/current.mdx @@ -1,22 +1,29 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- I want the version of the Node.js source code. +Node.js のソースコードをダウンロードする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +の変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out how to build Node.js from source. + + 署名済みSHASUMSの検証方法 + +を確認する。 + +ソースコードからNode.jsをビルドする方法を確認する。
diff --git a/pages/ja/download/source-code/index.mdx b/pages/ja/download/source-code/index.mdx index 17383ba65eb3e..2d5e3c07bd222 100644 --- a/pages/ja/download/source-code/index.mdx +++ b/pages/ja/download/source-code/index.mdx @@ -1,22 +1,29 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Node.js®をダウンロードする +subtitle: 好きな方法でNode.jsをダウンロードできます。 ---
- I want the version of the Node.js source code. +Node.js のソースコードをダウンロードする。 - +
- Node.js includes npm () and corepack. +Node.jsはを同梱しています。 -Read the blog post for this version +このバージョン +の変更点を確認する。 -Learn how to verify signed SHASUMS +このバージョン +に関するブログ記事を確認する。 -Check out how to build Node.js from source. + + 署名済みSHASUMSの検証方法 + +を確認する。 + +ソースコードからNode.jsをビルドする方法を確認する。
diff --git a/pages/ja/index.mdx b/pages/ja/index.mdx index deb5105a79505..ba34b86b0c6c4 100644 --- a/pages/ja/index.mdx +++ b/pages/ja/index.mdx @@ -4,118 +4,134 @@ layout: home ---
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; + - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); +
+

Run JavaScript Everywhere

- hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); +Node.js®は自由かつオープンソースでクロスプラットフォームに対応したJavaScript実行環境です。開発者にサーバー、ウェブアプリ、コマンドラインツール、スクリプトの開発環境を提供します。 - const fileHash = hasher.read(); - ``` +
- ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
+
+ + {({ release }) => ( + <> + Node.js (LTS)をダウンロードする + + 長期サポート版Node.js {release.versionWithPrefix} + 1をダウンロードする。 + パッケージマネージャーを利用したインストール方法もあります。 + + + )} + + + + {({ release }) => ( + + 最新の機能をすぐに試したい場合は + Node.js {release.versionWithPrefix} + 1をインストールできます。 + + )} + +
+
-Learn more what Node.js is able to offer with our [Learning materials](/learn). +
+
+ ```js displayName="Create an HTTP Server" + // server.mjs + import { createServer } from 'node:http'; + +const server = createServer((req, res) => { +res.writeHead(200, { 'Content-Type': 'text/plain' }); +res.end('Hello World!\n'); +}); + +// starts a simple http server locally on port 3000 +server.listen(3000, '127.0.0.1', () => { +console.log('Listening on 127.0.0.1:3000'); +}); + +// run with `node server.mjs` + +```` + +```js displayName="Write Tests" +// tests.mjs +import assert from 'node:assert'; +import test from 'node:test'; + +test('that 1 is equal 1', () => { + assert.strictEqual(1, 1); +}); + +test('that throws as 1 is not equal 2', () => { + // throws an exception because 1 != 2 + assert.strictEqual(1, 2); +}); + +// run with `node tests.mjs` +```` + +```js displayName="Read and Hash a File" +// crypto.mjs +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; + +const hasher = createHash('sha1'); + +hasher.setEncoding('hex'); +// ensure you have a `package.json` file for this test! +hasher.write(await readFile('package.json')); +hasher.end(); + +const fileHash = hasher.read(); + +// run with `node crypto.mjs` +``` + +```js displayName="Streams Pipeline" +// streams.mjs +import { pipeline } from 'node:stream/promises'; +import { createReadStream, createWriteStream } from 'node:fs'; +import { createGzip } from 'node:zlib'; + +// ensure you have a `package.json` file for this test! +await pipeline( + createReadStream('package.json'), + createGzip(), + createWriteStream('package.json.gz') +); + +// run with `node streams.mjs` +``` + +```js displayName="Work with Threads" +// threads.mjs +import { + Worker, + isMainThread, + workerData, + parentPort, +} from 'node:worker_threads'; + +if (isMainThread) { + const data = 'some data'; + const worker = new Worker(import.meta.filename, { workerData: data }); + worker.on('message', msg => console.log('Reply from Thread:', msg)); +} else { + const source = workerData; + parentPort.postMessage(btoa(source.toUpperCase())); +} + +// run with `node threads.mjs` +``` + +
+ +私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。
diff --git a/pages/ja/search.mdx b/pages/ja/search.mdx index ac57c0e414803..ad7e918069f96 100644 --- a/pages/ja/search.mdx +++ b/pages/ja/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: 検索結果 --- diff --git a/pages/ka/about/get-involved/collab-summit.md b/pages/ka/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/ka/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/ka/about/get-involved/contribute.md b/pages/ka/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/ka/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/ka/about/get-involved/events.mdx b/pages/ka/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/ka/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/ka/about/get-involved/index.md b/pages/ka/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/ka/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/ka/about/governance.md b/pages/ka/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/ka/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/ka/about/index.mdx b/pages/ka/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/ka/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/ka/about/previous-releases.mdx b/pages/ka/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/ka/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/ka/about/security-reporting.mdx b/pages/ka/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/ka/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/ka/download/current.mdx b/pages/ka/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ka/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ka/download/index.mdx b/pages/ka/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ka/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ka/download/package-manager/all.md b/pages/ka/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/ka/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/ka/download/package-manager/current.mdx b/pages/ka/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/ka/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ka/download/package-manager/index.mdx b/pages/ka/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/ka/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ka/download/prebuilt-binaries/current.mdx b/pages/ka/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ka/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ka/download/prebuilt-binaries/index.mdx b/pages/ka/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ka/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ka/download/source-code/current.mdx b/pages/ka/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ka/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ka/download/source-code/index.mdx b/pages/ka/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ka/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ka/index.mdx b/pages/ka/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/ka/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/ka/search.mdx b/pages/ka/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/ka/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/ko/about/get-involved/collab-summit.md b/pages/ko/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/ko/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/ko/about/get-involved/contribute.md b/pages/ko/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/ko/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/ko/about/get-involved/events.mdx b/pages/ko/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/ko/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/ko/about/get-involved/index.md b/pages/ko/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/ko/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/ko/about/governance.md b/pages/ko/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/ko/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/ko/about/index.mdx b/pages/ko/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/ko/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/ko/about/previous-releases.mdx b/pages/ko/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/ko/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/ko/about/security-reporting.mdx b/pages/ko/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/ko/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/ko/download/current.mdx b/pages/ko/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ko/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ko/download/index.mdx b/pages/ko/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ko/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ko/download/package-manager/all.md b/pages/ko/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/ko/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/ko/download/package-manager/current.mdx b/pages/ko/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/ko/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ko/download/package-manager/index.mdx b/pages/ko/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/ko/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ko/download/prebuilt-binaries/current.mdx b/pages/ko/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ko/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ko/download/prebuilt-binaries/index.mdx b/pages/ko/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ko/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ko/download/source-code/current.mdx b/pages/ko/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ko/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ko/download/source-code/index.mdx b/pages/ko/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ko/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ko/index.mdx b/pages/ko/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/ko/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/ko/search.mdx b/pages/ko/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/ko/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/pt-br/about/get-involved/collab-summit.md b/pages/pt-br/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/pt-br/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/pt-br/about/get-involved/contribute.md b/pages/pt-br/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/pt-br/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/pt-br/about/get-involved/events.mdx b/pages/pt-br/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/pt-br/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/pt-br/about/get-involved/index.md b/pages/pt-br/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/pt-br/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/pt-br/about/governance.md b/pages/pt-br/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/pt-br/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/pt-br/about/index.mdx b/pages/pt-br/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/pt-br/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/pt-br/about/previous-releases.mdx b/pages/pt-br/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/pt-br/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/pt-br/about/security-reporting.mdx b/pages/pt-br/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/pt-br/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/pt-br/download/current.mdx b/pages/pt-br/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/pt-br/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/pt-br/download/index.mdx b/pages/pt-br/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/pt-br/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/pt-br/download/package-manager/all.md b/pages/pt-br/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/pt-br/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/pt-br/download/package-manager/current.mdx b/pages/pt-br/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/pt-br/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/pt-br/download/package-manager/index.mdx b/pages/pt-br/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/pt-br/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/pt-br/download/prebuilt-binaries/current.mdx b/pages/pt-br/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/pt-br/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/pt-br/download/prebuilt-binaries/index.mdx b/pages/pt-br/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/pt-br/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/pt-br/download/source-code/current.mdx b/pages/pt-br/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/pt-br/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/pt-br/download/source-code/index.mdx b/pages/pt-br/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/pt-br/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/pt-br/index.mdx b/pages/pt-br/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/pt-br/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/pt-br/search.mdx b/pages/pt-br/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/pt-br/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/pt/about/branding.mdx b/pages/pt/about/branding.mdx new file mode 100644 index 0000000000000..9e20fdf437a4d --- /dev/null +++ b/pages/pt/about/branding.mdx @@ -0,0 +1,72 @@ +--- +title: Marca da Node.js +layout: about +--- + +Marca da Node.js + +Consultar a [política de marcas registadas](https://trademark-policy.openjsf.org/) por informação sobre a utilização permitida dos logótipos e marcas da Node.js®. + +## Mascote da Node.js® + +Mascote da Node.js + +## Logótipo da Node.js® + +### Logótipo Horizontal da Node.js® + + + + + + + +
+ Logótipo Escuro Horizontal da Node.js + + Logótipo Claro Horizontal da Node.js +
+ +### Logótipo Empilhado da Node.js® + + + + + + + + + + + + + +
+ Logótipo Escuro Empilhado da Node.js + + Logótipo Claro Empilhado da Node.js +
+ Logótipo Empilhado Preto da Node.js + + Logótipo Empilhado Branco da Node.js +
+ +### Ícones da JS + + + + + + + +
+ Ícones da JS Verde + + Ícones da JS Branco +
diff --git a/pages/pt/about/get-involved/collab-summit.md b/pages/pt/about/get-involved/collab-summit.md new file mode 100644 index 0000000000000..c862a0c886777 --- /dev/null +++ b/pages/pt/about/get-involved/collab-summit.md @@ -0,0 +1,16 @@ +--- +title: Cimeira de Colaboração +layout: about +--- + +# Cimeira de Colaboração + +A Cimeira da Colaboração do Node.js é uma conferência para reunir atuais e potenciais colaboradores para discutir o Node.js com colaboração ativa, educação e partilha de conhecimento. Equipas, grupos de trabalho e colaboradores da comunidade reúnem-se duas vezes por ano para realizar discussões que ajudam na tomada de decisões, ao mesmo tempo em que trabalham pessoalmente em alguns esforços interessantes que desejam levar adiante. + +## Quem participa? + +A Cimeira de Colaboração conta principalmente com a participação de contribuidores existentes e membros da comunidade, mas também dá as boas-vindas àqueles que ainda não são contribuidores e desejam participar. Se você é novo na contribuição para o Node.js, a Cimeira da Colaboração pode ser uma boa oportunidade para ajudá-lo a aprender o que está a acontecer na comunidade e contribuir com as habilidades que você possui e gostaria de aprimorar. + +Antes da cimeira, colaboradores e membros da comunidade enviam propostas de sessões para criar um cronograma. Os participantes podem se familiarizar com a sessão antes de chegar ao local, ter discussões gerais com os colaboradores e depois assistir às sessões. Haverá também muitas oportunidades para socializar e debater ideias. + +Para mais informações sobre as próximas e anteriores Cimeiras da Colaboração, veja o [repositório das Cimeiras](https://github.com/openjs-foundation/summit). Veja também os [problemas arquivados](https://github.com/nodejs/summit/issues) que partilham o que os colaboradores e membros da comunidade estão a propor discutir pessoalmente. diff --git a/pages/pt/about/get-involved/contribute.md b/pages/pt/about/get-involved/contribute.md new file mode 100644 index 0000000000000..54f66f7b64bde --- /dev/null +++ b/pages/pt/about/get-involved/contribute.md @@ -0,0 +1,47 @@ +--- +title: Contribuir +layout: about +--- + +# Contribuir + +Obrigado pelo teu interesse em contribuir para o Node.js! Existem várias maneiras e lugares onde podes contribuir e estamos aqui para ajudar a facilitar isso. + +## Pedir Ajuda Geral + +Como o nível de atividade no repositório `nodejs/node` é muito alto, perguntas ou solicitações de ajuda gerais usando o Node.js devem ser direcionadas ao [repositório de ajuda do Node.js](https://github.com/nodejs/ajuda/problemas). + +## Reportar um Problema + +Se encontrarmos o que acreditarmos ser um problema com a Node.js, não deveríamos hesitar em registar um problema no projeto da GitHub. Quando registarmos o problema, devemos certificar-nos de incluir um caso de teste reproduzível e que este caso de teste não inclua nenhuma dependência externa. Ou seja, o caso de teste possa ser executado sem nada além do próprio Node.js. + +Quando relatarmos um problema, também precisamos do máximo de informações que pudermos incluir sobre o ambiente de desenvolvimento. Nunca sabemos quais informações serão pertinentes ao tentar restringir o problema. Então, devemos incluir pelo menos as seguintes informações: + +- Versão do Node.js +- Plataforma que está a usar (macOS, SmartOS, Linux, Windows) +- Arquitetura que executamos (32bits ou 64bits e x86 ou ARM) + +O projeto Node.js é atualmente administrado em vários repositórios GitHub separados, cada um com seu próprio banco de dados de problemas separados. Se possível, direcione quaisquer problemas que encontre para o repositório apropriado, mas não se preocupe se colocar no repositório errado, a comunidade de colaboradores ficará mais do que feliz em ajudá-lo a apontar na direção correta. + +- Para relatar problemas específicos do Node.js, usa [nodejs/node](https://github.com/nodejs/node) +- Para relatar problemas específicos deste site, usa [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) + +## Contribuições de código + +Se você quiser corrigir bugs ou adicionar uma nova funcionalidade ao Node.js, consulte as [Diretrizes de contribuição do Node.js](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-solicitações). O processo de revisão por parte dos colaboradores existentes para todas as contribuições para o projeto também é explicado lá. + +Se estivermos em dúvida sobre como começar, podemos consultar a [NodeTodo](https://www.nodetodo.org/) que pode guiar-nos rumo a nossa primeira contribuição. + +## Torne-se um colaborador + +Ao seres um colaborador, os contribuidores podem ter ainda mais impacto no projeto. Eles podem ajudar outros colaboradores revendo as suas contribuições, selecionando problemas e ter um papel ainda maior no rumo do futuro do projeto. Indivíduos identificados pelo TSC como fazendo contribuições significativas e valiosas em qualquer repositório Node.js podem ser nomeados Colaboradores e ter acesso de commit ao projeto. As atividades levadas em consideração incluem (mas não estão limitadas a) a qualidade de: + +- commits de código e pull requests +- documentação de commits e pull requests +- comentários em problemas e pull requests +- contribuições para o site Node.js +- assistência fornecida a utilizadores finais e colaboradores novos +- participação em grupos de trabalhos +- outra participação na grande comunidade do Node.js + +Se indivíduos que fizeram contribuições valiosas não acreditarem que foram considerados para acesso de commit, eles poderão [registrar um problema](https://github.com/nodejs/TSC/issues) ou [entrar em contato com um membro do TSC](https:// github.com/nodejs/node#tsc-technical-steering-committee) diretamente. diff --git a/pages/pt/about/get-involved/events.mdx b/pages/pt/about/get-involved/events.mdx new file mode 100644 index 0000000000000..fbb2b8f05a4e1 --- /dev/null +++ b/pages/pt/about/get-involved/events.mdx @@ -0,0 +1,16 @@ +--- +title: Próximos Eventos +layout: about +--- + +## Próximos Eventos + +Os eventos do Node.js são abertos e disponíveis ao público. Qualquer pessoa é bem-vinda para entrar e participar. + +### Próximas reuniões do Node.js® + +projeto Node.js realiza várias reuniões ao longo do ano para discutir e planear aspetos do projeto. + +As próximas reuniões que vão ocorrer nos próximos 7 dias. + + diff --git a/pages/pt/about/get-involved/index.md b/pages/pt/about/get-involved/index.md new file mode 100644 index 0000000000000..03833b4a02692 --- /dev/null +++ b/pages/pt/about/get-involved/index.md @@ -0,0 +1,26 @@ +--- +title: Participe +layout: about +--- + +# Participe + +## Discussão de Comunidade + +- A [Lista de Problemas no Github](https://github.com/nodejs/node/issues) é o local para discussões sobre as funcionalidades principais do Node.js. +- Para comunicação em tempo real sobre o desenvolvimento do Node.js, use uma das plataformas abaixo + - Para IRC, acesse `irc.libera.chat` no canal `#node.js` utilizando um [cliente IRC](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) ou junte-se ao canal com o seu navegador usando um [cliente web](https://kiwiirc.com/nextclient/) + - Para o Slack, existe duas opções: + - O [OpenJSF Slack](https://slack-invite.openjsf.org/) é um Slack administrado pela Fundação com vários canais Node.js (canais com o prefixo `#nodejs-` estão relacionados ao projeto). + - [Node Slackers](https://www.nodeslackers.com/) é uma comunidade do Slack focada em Node.js. +- A conta oficial do Node.js no Twitter é [nodejs](https://twitter.com/nodejs). +- O [calendário do projeto Node.js](https://nodejs.org/calendar) com todas as reuniões públicas da equipa. + +## Estudos + +- [Secção oficial de aprendizagem](https://nodejs.org/en/learn/) do sítio da Node.js. +- [Documentação oficial de referência da API](https://nodejs.org/api/). +- [NodeSchool.io](https://nodeschool.io/) ensina conceitos de Node.js por jogos interativos da linha de comandos. +- [A tag Stack Overflow Node.js](https://stackoverflow.com/questions/tagged/node.js) coleta novas informações todos os dias. +- [A tag Node.js da comunidade DEV](https://dev.to/t/node) é um lugar para partilhar projetos, artigos e tutoriais do Node.js, bem como iniciar discussões e pedir feedback sobre assuntos relacionados ao Node.js. Desenvolvedores de todos os níveis de habilidade podem participar. +- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) é uma comunidade amigável de desenvolvedores de backend Node.js que se apoiam uns aos outros no Discord. diff --git a/pages/pt/about/governance.md b/pages/pt/about/governance.md new file mode 100644 index 0000000000000..7fed8c9af7bd0 --- /dev/null +++ b/pages/pt/about/governance.md @@ -0,0 +1,31 @@ +--- +title: Gestão do Projeto +layout: about +--- + +# Gestão do Projeto + +## Processo de Procura de Consenso + +O projeto Node.js segue um modelo de tomada de decisão de [Procura de Consenso][Consensus Seeking]. + +## Colaboradores + +O repositório central da GitHub [nodejs/node][] é mantido pelos colaboradores nomeados por outros colaboradores existentes numa base contínua. + +Os indivíduos que fazem contribuições significativas e valiosas são nomeados colaboradores e têm acesso ao projeto. Estes indivíduos são identificados por outros colaboradores e a sua nomeação é discutida com os colaboradores existentes. + +Para a lista atual de colaboradores, consultar o [README.md][] do projeto. + +Um guia para colaboradores é mantido no [collaborator-guide.md][]. + +## Comité de Direção Técnica + +O projeto é gerido pelo [Comité de Direção Técnica][Technical Steering Committee (TSC)] responsável pela orientação de alto nível do projeto. O TSC é um subconjunto de colaboradores ativos nomeados por outros membros existentes do TSC. + +[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making +[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members +[tsc]: https://github.com/nodejs/TSC +[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md +[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md +[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/pt/about/index.mdx b/pages/pt/about/index.mdx new file mode 100644 index 0000000000000..5a9795a95a8a3 --- /dev/null +++ b/pages/pt/about/index.mdx @@ -0,0 +1,60 @@ +--- +title: Sobre a Node.js® +layout: about +--- + +Sobre a Node.js® + +Como uma execução de JavaScript assíncrona orientada a eventos, a Node.js foi desenhada para construir aplicações de rede escaláveis. No seguinte exemplo de "hello world", muitas conexões podem ser manipuladas simultaneamente. Em cada conexão, a função de retorno de chamada é disparada, mas se não existir trabalho a ser feito, a Node.js dormirá. + +```cjs +const { createServer } = require('node:http'); + +const hostname = '127.0.0.1'; +const port = 3000; + +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +```mjs +import { createServer } from 'node:http'; + +const hostname = '127.0.0.1'; +const port = 3000; + +const server = createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World'); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); +``` + +Isto contrasta com o modelo de concorrência mais comum atualmente, em que são utilizadas as linhas de processamento do sistema operativo. A conexão de rede baseada em linhas de processamento é relativamente ineficiente e muito difícil de usar. Além disto, os utilizadores da Node.js estão livres de preocupações com o bloqueio do processo, uma vez que não existem bloqueios. Quase nenhuma função na Node.js executa diretamente E/S, pelo que o processo nunca bloqueia, exceto quando as E/S são executadas usando métodos síncronos da biblioteca padrão da Node.js. Uma vez que nada bloqueia, os sistemas escaláveis são muito razoáveis de desenvolver na Node.js. + +Se alguma desta linguagem não for familiar, existe um artigo completo sobre [Bloqueio vs Não Bloqueio][Blocking vs. Non-Blocking]. + +--- + +Node.js é semelhante em desenho a, e influenciada por, sistemas como a [Máquina de Evento][Event Machine] da Ruby e o [Twisted][Twisted] da Python. A Node.js leva o modelo de evento um pouco mais longe. Esta apresenta um ciclo de eventos como uma construção de execução e não como uma biblioteca. Noutros sistemas, existe sempre uma chamada bloqueante para começar o ciclo de eventos. Tipicamente, o comportamento é definido através das funções de retorno de chamada no início de um programa, e no final um servidor é iniciado através duma chamada bloqueante como `EventMachine::run()`. Na Node.js, não existe essa chama que começa o ciclo de evento. A Node.js simplesmente entra no ciclo de eventos após executar o programa de entrada. A Node.js sai do ciclo de eventos quando não existir mais funções de retorno de chamada para executar. Este comportamento é semelhante a JavaScript do navegador — o ciclo de eventos está oculto para o utilizador. + +protocolo de transferência de hipertexto é um cidadão de primeira classe na Node.js, desenhado com fluxo contínuo e baixa latência em mente. Isto torna a Node.js adequada para a fundação duma biblioteca ou abstração da Web. + +fato da Node.js ter sido desenhada sem linhas de processamento não significa que não possamos tirar partido de vários núcleos no nosso ambiente. Os processos filhos podem ser gerados com o uso da nossa interface de programação de aplicação [`child_process.fork()`][], e estão desenhadas para serem fáceis de se comunicar. Construída sobre esta mesma interface está o módulo [`cluster`][], que permite-nos partilhar tomadas entre processos para permitir o balanceio de carga entre os nossos núcleos. + +[bloqueio vs não bloqueio]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking +[`child_process.fork()`]: https://nodejs.org/api/child_process.html +[`cluster`]: https://nodejs.org/api/cluster.html +[máquina de evento]: https://github.com/eventmachine/eventmachine +[torcido]: https://twisted.org/ diff --git a/pages/pt/about/previous-releases.mdx b/pages/pt/about/previous-releases.mdx new file mode 100644 index 0000000000000..1d98dae5c5f35 --- /dev/null +++ b/pages/pt/about/previous-releases.mdx @@ -0,0 +1,18 @@ +--- +title: Lançamentos da Node.js +layout: about +--- + +Lançamentos da Node.js + +As principais versões da Node.js entram no estado de lançamento _Atual (Current)_ por seis meses, o que dá aos autores de bibliotecas tempo para adicionar suporte a estas. Depois de seis meses, as versões de número ímpares (9, 11, etc.) deixam de ser suportadas e as versões de números pares (10, 12, etc) passam para o estado _SLP Ativo (Active LTS)_ e estão prontas para uso geral. O estado de lançamento _SLP (LTS)_ é “suporte de longo prazo”, o que normalmente garante que os erros de programação críticos serão corrigidos durante um total de 30 meses. As aplicações de produção apenas devem usar os lançamentos _SLP Ativo (Active LTS)_ ou _SLP de Manutenção (Maintenance LTS)_. + +## Calendário de Lançamento + +![Lançamentos](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) + +Todos os detalhes sobre o calendário de lançamento da Node.js estão disponíveis [na GitHub](https://github.com/nodejs/release#release-schedule). + +## Procura o lançamento mais recente de um ramo de versão? + + diff --git a/pages/pt/about/security-reporting.mdx b/pages/pt/about/security-reporting.mdx new file mode 100644 index 0000000000000..184f4b990d644 --- /dev/null +++ b/pages/pt/about/security-reporting.mdx @@ -0,0 +1,64 @@ +--- +title: Relatórios de Segurança +layout: about +--- + +Relatórios de Segurança + +Para obter mais informações sobre as Políticas de Segurança ativas, consultar [esta página](https://github.com/nodejs/node/security/policy). + +## Reportar um erro na Node.js + +Reportar erros de segurança na Node.js através da [HackerOne](https://hackerone.com/nodejs). + +nosso relatório será confirmado dentro de 5 dias e receberemos uma resposta mais detalhada ao nosso relatório dentro de 10 dias, indicando os próximos passos no tratamento da nossa submissão. + +Após a resposta inicial ao nosso relatório, a equipa de segurança esforçar-se-á por manter-nos informados sobre os progressos realizados no sentido duma correção e de um anúncio completo, podendo solicitar informações ou orientações adicionais sobre o problema reportado. + +### Programa de recompensa por erros da Node.js + +projeto Node.js tem um programa oficial de recompensa por erros para investigadores de segurança e divulgações públicas responsáveis. O programa é gerido através da plataforma HackerOne. Consultar [https://hackerone.com/nodejs](https://hackerone.com/nodejs) por mais detalhes. + +## Reportar um erro num módulo de terceiro + +Os erros de segurança em módulos de terceiros devem ser reportados aos seus respetivos responsáveis. + +## Política de Divulgação + +Eis a política de divulgação de segurança da Node.js + +O relatório de segurança é recebido e é-lhe atribuído um responsável principal. Esta pessoa coordenará o processo de correção e lançamento. O problema é confirmado e determinada uma lista de todas as versões afetadas. O código é auditado para detetar quaisquer problemas semelhantes. São preparadas correções para todas as versões que ainda se encontram em manutenção. Estas correções não são colocadas no repositório público, mas sim mantidas localmente enquanto se aguarda o anúncio. + +É selecionada uma data de embargo para esta vulnerabilidade e requisitada um CVE (Common Vulnerabilities and Exposures (CVE®)) para a vulnerabilidade. + +Na data do embargo, a lista de discussão de segurança da Node.js recebe uma cópia do anúncio. As alterações são enviadas ao repositório público e novas compilações são implantadas na nodejs.org. Dentro de 6 horas após a notificação da lista de correio eletrónico, será publicada uma cópia do aviso no blogue da Node.js. + +Normalmente, a data de embargo será definida 72 horas a partir do momento em que o CVE é emitido. No entanto, isto pode variar consoante a gravidade do erro ou a dificuldade em aplicar uma correção. + +Este processo pode demorar algum tempo, especialmente quando é necessária coordenação com os responsáveis de outros projetos. Todos os esforços serão feitos para tratar o erro da maneira mais atempada possível; no entanto, é importante que sigamos o processo de divulgação acima referido para garantir que a divulgação é tratada de maneira consistente. + +## Receber atualizações de segurança + +As notificações de segurança serão distribuídas através dos seguintes métodos. + +[Grupo da Google](https://groups.google.com/group/nodejs-sec) +[Blogue da Node.js](/blog) + +## Comentários sobre esta política + +Se tivermos sugestões sobre como este processo poderia ser melhorado, podemos submeter um [pedido de atualização](https://github.com/nodejs/nodejs.org) ou [registar um problema](https://github.com/nodejs/security-wg/issues/new) a discutir-se. + +## Boas Práticas da OpenSSF + + + Distintivo da OpenSSF + + +distintivo de boas práticas da “Open Source Security Foundation (OpenSSF)” é uma maneira de os projetos de Software Livre e de Código Aberto (FLOSS) mostrarem que seguem as boas práticas. Os projetos podem certificar-se voluntariamente como seguem cada uma das boas práticas. Os consumidores do distintivo podem avaliar rapidamente quais os projetos FLOSS que seguem as boas práticas e, consequentemente, têm maior probabilidade de produzir software seguro de superior qualidade. diff --git a/pages/pt/download/package-manager/all.md b/pages/pt/download/package-manager/all.md new file mode 100644 index 0000000000000..7a9b32cab0f5e --- /dev/null +++ b/pages/pt/download/package-manager/all.md @@ -0,0 +1,417 @@ +--- +layout: download +title: Instalação da Node.js através do Gestor de Pacote +--- + +# Instalação da Node.js através dos Gestores de Pacote + +> Os pacotes nesta página são mantidos e suportados por seus respetivos empacotadores, **não** pela equipa principal da Node.js. Precisamos reportar quaisquer problemas que encontrarmos ao responsável do pacote. Se o nosso problema for um erro de programação na própria Node.js, o responsável reportará o problema. + +--- + +- [Alpine Linux](#alpine-linux) +- [Android](#android) +- [Arch Linux](#arch-linux) +- [CentOS, Fedora e Red Hat Enterprise Linux](#centos-fedora-e-red-hat-enterprise-linux) +- [Distribuições de Linux baseadas em Debian e Ubuntu](#distribuicoes-de-linux-baseadas-em-debian-e-ubuntu) +- [Exherbo Linux](#exherbo-linux) +- [fnm](#fnm) +- [FreeBSD](#freebsd) +- [Gentoo](#gentoo) +- [IBM i](#ibm-i) +- [macOS](#macos) +- [n](#n) +- [NetBSD](#netbsd) +- [Nodenv](#nodenv) +- [nvm](#nvm) +- [nvs](#nvs) +- [OpenBSD](#openbsd) +- [openSUSE e SLE](#opensuse-e-sle) +- [SmartOS e illumos](#smartos-e-illumos) +- [Snap](#snap) +- [Solus](#solus) +- [vfox](#vfox) +- [Void Linux](#void-linux) +- [Windows](#windows-1) +- [z/OS](#zos) + +--- + +## Linux Alpino + +Os pacotes da Node.js com suporte de longo prazo e npm estão disponíveis no repositório principal. + +```bash +apk add nodejs npm +``` + +A versão atual da Node.js pode ser instalada a partir do repositório da comunidade. + +```bash +apk add nodejs-current +``` + +## Android + +O suporte de Android ainda é experimental na Node.js, pelo que os binários pré-compilados ainda não são fornecidos pelos programadores da Node.js. + +No entanto, existem algumas soluções de terceiros. Por exemplo, a comunidade da [Termux](https://termux.com/) fornece um emulador de terminal e um ambiente de Linux para Android, bem como um gestor de pacote e uma [vasta coleção](https://github.com/termux/termux-packages) de muitas aplicações pré-compiladas. Este comando na aplicação Termux instalará a última versão disponível da Node.js: + +```bash +pkg install nodejs +``` + +Atualmente, os binários da Node.js da Termux estão ligados ao `system-icu` (dependendo do pacote `libicu`). + +## Linux Arch + +Os pacotes da Node.js e npm estão disponíveis no repositório da comunidade. + +```bash +pacman -S nodejs npm +``` + +## CentOS, Fedora e Red Hat Enterprise Linux + +A Node.js está disponível como um módulo chamado `nodejs` no CentOS/RHEL 8 e Fedora. + +```bash +dnf module install nodejs: +``` + +onde `` corresponde à versão principal da Node.js. Para ver uma lista de fluxos disponíveis: + +```bash +dnf module list nodejs +``` + +Por exemplo, para instalar a Node.js 18: + +```bash +dnf module install nodejs:18/common +``` + +### Alternativas + +Estes recursos fornecem pacotes compatíveis com CentOS, Fedora, e RHEL. + +- [Os snaps da Node.js](#snap) mantidos e suportados na https://github.com/nodejs/snap +- [Distribuições binárias da Node.js](#distribuicoes-de-linux-baseadas-em-debian-e-ubuntu) mantidas e suportadas pela [NodeSource](https://github.com/nodesource/distributions) + +## Distribuições de Linux baseadas em Debian e Ubuntu + +As [distribuições binárias da Node.js](https://github.com/nodesource/distributions) estão disponíveis a partir da NodeSource. + +### Alternativas + +Os pacotes compatíveis com as distribuições de Linux baseadas em Debian e Ubuntu estão disponíveis através dos [snaps da Node.js](#snap). + +## Exherbo Linux + +Os pacotes da Node.js e npm estão disponíveis no [repositório da arbor](https://gitlab.exherbo.org/exherbo/arbor/-/tree/master/packages/dev-lang/node). + +```bash +cave resolve -x node +``` + +## fnm + +Rápido e simples gestor de versão da Node.js, construído em Rust, usado para gerir várias versões lançadas da Node.js. Permite-nos realizar operações como instalar, desinstalar, mudar automaticamente as versões da Node com base no diretório atual, etc. +Para instalar o `fnm`, usamos este [programa de instalação](https://github.com/Schniz/fnm#using-a-script-macoslinux). + +O `fnm` suporta várias plataformas (macOS, Windows, Linux) & todas as conchas populares (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). +O `fnm` foi construído com a velocidade em mente e suporte de compatibilidade para ficheiros `.node-version` e `.nvmrc`. + +## FreeBSD + +O lançamento mais recente da Node.js está disponível através da porta [www/node](https://www.freshports.org/www/node). + +Instalamos um pacote binário através do [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): + +```bash +pkg install node +``` + +Ou o compilamos nós mesmos usando as [portas](https://www.freebsd.org/cgi/man.cgi?ports): + +```bash +cd /usr/ports/www/node && make install +``` + +## Gentoo + +A Node.js está disponível na árvore de transporte. + +```bash +emerge nodejs +``` + +## IBM i + +As versões de suporte de longo prazo da Node.js estão disponíveis a partir da IBM, e estão disponíveis através do [gestor de pacote `yum`](https://ibm.biz/ibmi-rpms). O nome do pacote é `nodejs` seguido pelo número da versão principal (por exemplo, `nodejs18`, `nodejs20`, etc). + +Para instalar a Node.js 20.x a partir da linha de comando, executamos o seguinte como um utilizador com autorização especial \*ALLOBJ: + +```bash +yum install nodejs20 +``` + +A Node.js também pode ser instalada com o produto de soluções de cliente de acesso IBM i. Consultar [este documento de suporte](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) por mais detalhes. + +## macOS + +Descarregamos o [instalador do macOS](/#home-downloadhead) diretamente a partir do sítio da Web [nodejs.org](https://nodejs.org/). + +_Se quisermos descarregar o pacote com o bash:_ + +```bash +curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" +``` + +### Alternativas + +Com o uso do **[Homebrew](https://brew.sh/)**: + +```bash +brew install node +``` + +Com o uso do **[MacPorts](https://www.macports.org/)**: + +```bash +port install nodejs + +# Example +port install nodejs7 +``` + +Com o uso do **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: + +Instalar o pacote binário: + +```bash +pkgin -y install nodejs +``` + +Ou construir manualmente a partir do `pkgsrc`: + +```bash +cd pkgsrc/lang/nodejs && bmake install +``` + +## n + +`n` é um gestor de versão da Node.js simples de usar para Mac e Linux. Especificamos a versão de destino a instalar usando uma sintaxe rica, ou selecionamos a partir de um menu de versões previamente descarregadas. As versões são instaladas em todo o sistema ou em todo o utilizador, e para um uso mais específico, podemos executar uma versão diretamente a partir das transferências provisionadas. + +Consultar a [página principal](https://github.com/tj/n) por métodos de instalação (inicialização, npm, Homebrew, terceiros) e todos os detalhes de uso. + +Se já tivermos o `npm`, então instalar o `n` e depois a versão mais recente da `node` com suporte de longo prazo é tão simples quanto: + +``` +npm install -g n +n lts +``` + +## NetBSD + +A Node.js está disponível na árvore do `pkgsrc`: + +```bash +cd /usr/pkgsrc/lang/nodejs && make install +``` + +Ou instalamos um pacote binário (se estiver disponível para nossa plataforma) usando `pkgin`: + +```bash +pkgin -y install nodejs +``` + +## Nodenv + +`nodeenv` é um gestor de versão de Node leve, semelhante ao `nvm`. É simples e previsível. Um rico ecossistema de extensão permite-nos adaptá-lo às nossas necessidades. Usamos `nodenv` para escolher uma versão de Node para a nossa aplicação e garantir que o nosso ambiente de desenvolvimento seja igual ao de produção. + +As instruções de instalação da Nodeenv são mantidos [na sua página da GitHub](https://github.com/nodenv/nodenv#installation). Precisamos visitar esta página para assegurar que seguimos versão mais recente dos passos de instalação. + +## nvm + +O gestor de versão da Node é um programa de bash usado para gerir várias versões lançadas da Node.js. Permite-nos realizar operações como instalar, desinstalar, alternar versão, etc. Para instalar a `nvm`, usamos este [programa de instalação](https://github.com/nvm-sh/nvm#install--update-script). + +Nos sistemas Unix ou OS X, a Node.js construída a partir do código-fonte pode ser instalada usando [nvm](https://github.com/creationix/nvm) ao instalar numa localização esperada pelo `nvm`: + +```bash +env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" +``` + +Depois disto, podemos usar o `nvm` para alternar entre versões lançadas e versões construídas a partir do código-fonte. Por exemplo, se a versão da Node.js for v8.0.0-pre: + +```bash +nvm use 8 +``` + +Quando a versão oficial for lançada, desejaremos desinstalar a versão construída a partir do código-fonte: + +```bash +nvm uninstall 8 +``` + +## nvs + +#### Windows + +O gestor de versão `nvs` suporta várias plataformas e pode ser usado no Windows, macOS, e sistemas parecidos com Unix. + +Para instalar `nvs` no Windows seguimos para [página de lançamento](https://github.com/jasongin/nvs/releases) e descarregamos o ficheiro instalador MSI do lançamento mais recente. + +Nós também podemos usar `chocolatey` para instalá-lo: + +```bash +choco install nvs +``` + +#### macOS,UnixLike + +Podemos encontrar documentação sobre os passos de instalação do `nvs` nos sistemas macOS ou parecidos com Unix [nesta hiperligação](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux). + +#### Uso + +Depois disto podemos usar `nvs` para alternar entre diferentes versões da Node. + +Para adicionar a versão mais recente da Node: + +```bash +nvs add latest +``` + +Ou adicionar a versão mais recente com suporte de longo prazo da Node: + +```bash +nvs add lts +``` + +Depois executamos o comando `nvs use` para adicionar uma versão de Node ao `PATH` para concha atual: + +```bash +$ nvs use lts +PATH -= %LOCALAPPDATA%\nvs\default +PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 +``` + +Para adicioná-lo ao `PATH` permanentemente, usamos `nvs link`: + +```bash +nvs link lts +``` + +## OpenBSD + +A Node.js está disponível através do sistema de portas. + +```bash +/usr/ports/lang/node +``` + +Com o uso do [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) no OpenBSD: + +```bash +pkg_add node +``` + +## openSUSE e SLE + +A Node.js está disponível nos repositórios principais sob os seguintes pacotes: + +- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` +- **openSUSE Tumbleweed**: `nodejs20` +- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, e `nodejs14` (O "Web and Scripting Module" deve estar [ativado](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) +- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, e `nodejs14` (O "Web and Scripting Module" deve estar [ativado](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) + +Por exemplo, para instalar a Node.js 14.x no openSUSE Leap 15.2, executamos o seguinte como administrador (root ou raiz): + +```bash +zypper install nodejs14 +``` + +Diferentes versões principais da Node podem ser instaladas e usadas simultaneamente. + +## SmartOS e illumos + +As imagens do SmartOS vêm com `pkgsrc` pré-instalado. Em outras distribuições de illumos, primeiro instalamos **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, depois podemos instalar o pacote binário conforme o habitual: + +```bash +pkgin -y install nodejs +``` + +Ou compilar manualmente a partir do `pkgsrc`: + +```bash +cd pkgsrc/lang/nodejs && bmake install +``` + +## Snap + +Os [snaps da Node.js](https://github.com/nodejs/snap) estão disponíveis como [`node`](https://snapcraft.io/node) na loja da Snap. + +## Solus + +O Solus fornece a Node.js no seu repositório principal. + +```bash +sudo eopkg install nodejs +``` + +## vfox + +Um gestor de versão que suporta várias plataformas (Windows, macOS, Linux) e **extensível**. + +Permite-nos **diferenciar versões para diferentes projetos**, **diferenciar versões para diferentes conchas**, e alternar versões da Node automaticamente com base no diretório atual, etc. + +Suporta todas as conchas populares (Bash, Zsh, Fish, PowerShell, Clink, Cmder). + +Consultar a [Introdução Rápida](https://vfox.lhan.me/guides/quick-start.html) para rapidamente usar o `vfox`, e todos os detalhes de uso. + +## Void Linux + +O Void Linux entrega a Node.js estável no repositório principal. + +```bash +xbps-install -Sy nodejs +``` + +## Windows + +Descarregamos o [instalador da Node.js](/#home-downloadhead) diretamente a partir do sítio da Web [nodejs.org](https://nodejs.org/). + +### Alternativas + +Com o uso do **[Winget](https://aka.ms/winget-cli)**: + +```bash +winget install OpenJS.NodeJS +# or for LTS +winget install OpenJS.NodeJS.LTS +``` + +Após executarmos um dos dois comandos acima, pode ser necessário reiniciar o emulador de terminal antes do comando `node` da interface da linha de comando torne-se disponível. + +Com o uso do **[Chocolatey](https://chocolatey.org/)**: + +```bash +cinst nodejs +# or for full install with npm +cinst nodejs.install +``` + +Com o uso do **[Scoop](https://scoop.sh/)**: + +```bash +scoop install nodejs +# or for LTS +scoop install nodejs-lts +``` + +## z/OS + +IBM® SDK para Node.js — z/OS® está disponível em dois formatos de instalação, SMP/E e PAX. Selecionamos o formato de instalação que se aplica a nós: + +- [Instalar e configurar a edição SMP/E da Node.js no z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) +- [Instalar e configurar a edição PAX da Node.js no z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/pt/download/package-manager/current.mdx b/pages/pt/download/package-manager/current.mdx new file mode 100644 index 0000000000000..5da09b77522cc --- /dev/null +++ b/pages/pt/download/package-manager/current.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Instalar a Node.js no usando o + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar outros gestores de pacote suportados da comunidade + +
diff --git a/pages/pt/download/package-manager/index.mdx b/pages/pt/download/package-manager/index.mdx new file mode 100644 index 0000000000000..6772ace86659f --- /dev/null +++ b/pages/pt/download/package-manager/index.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Instalar a Node.js no usando o + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar outros gestores de pacote suportados da comunidade + +
diff --git a/pages/pt/download/prebuilt-binaries/current.mdx b/pages/pt/download/prebuilt-binaries/current.mdx new file mode 100644 index 0000000000000..7d8805c02a7c2 --- /dev/null +++ b/pages/pt/download/prebuilt-binaries/current.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero a versão da Node.js para executando sobre + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar os binários pré-compilados Noturnos ou Compilações Não Oficiais para outras plataformas + +
diff --git a/pages/pt/download/prebuilt-binaries/index.mdx b/pages/pt/download/prebuilt-binaries/index.mdx new file mode 100644 index 0000000000000..7d8805c02a7c2 --- /dev/null +++ b/pages/pt/download/prebuilt-binaries/index.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero a versão da Node.js para executando sobre + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar os binários pré-compilados Noturnos ou Compilações Não Oficiais para outras plataformas + +
diff --git a/pages/pt/download/prebuilt-installer/current.mdx b/pages/pt/download/prebuilt-installer/current.mdx new file mode 100644 index 0000000000000..4f5ddee39b502 --- /dev/null +++ b/pages/pt/download/prebuilt-installer/current.mdx @@ -0,0 +1,26 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero a versão da Node.js para executando sobre + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar todas as opções de descarga disponíveis da Node.js + +Saber mais sobre os Lançamentos da Node.js + +
diff --git a/pages/pt/download/prebuilt-installer/index.mdx b/pages/pt/download/prebuilt-installer/index.mdx new file mode 100644 index 0000000000000..22ef2c0d72f25 --- /dev/null +++ b/pages/pt/download/prebuilt-installer/index.mdx @@ -0,0 +1,26 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero a versão da Node.js para executando sobre + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar todas as opções de descarga disponíveis da Node.js + +Saber mais sobre os Lançamentos da Node.js + +
diff --git a/pages/pt/download/source-code/current.mdx b/pages/pt/download/source-code/current.mdx new file mode 100644 index 0000000000000..c65b0284f74c1 --- /dev/null +++ b/pages/pt/download/source-code/current.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero o código-fonte da versão da Node.js. + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar como compilar a Node.js a partir do código-fonte. + +
diff --git a/pages/pt/download/source-code/index.mdx b/pages/pt/download/source-code/index.mdx new file mode 100644 index 0000000000000..c65b0284f74c1 --- /dev/null +++ b/pages/pt/download/source-code/index.mdx @@ -0,0 +1,24 @@ +--- +layout: download +title: Descarregar a Node.js® +subtitle: Podemos descarregar a Node.js como quisermos. +--- + +
+Quero o código-fonte da versão da Node.js. + + +
+ +
+A Node.js inclui o . + +Ler o registo de alterações desta versão + +Ler a publicação do blogue desta versão + +Saber como verificar o SHASUMS assinado + +Consultar como compilar a Node.js a partir do código-fonte. + +
diff --git a/pages/pt/index.mdx b/pages/pt/index.mdx new file mode 100644 index 0000000000000..d7c2c5d1dea25 --- /dev/null +++ b/pages/pt/index.mdx @@ -0,0 +1,137 @@ +--- +title: Executar a JavaScript em Toda Parte +layout: home +--- + +
+ + +
+

Executar a JavaScript em Toda Parte

+ +Node.js® é uma ambiente de execução de JavaScript disponível para várias plataformas, de código aberto e gratuita, que permite os programadores criar servidores, aplicações da Web, ferramentas de linha de comando e programas de automação de tarefas. + +
+ +
+ + {({ release }) => ( + <> + Descarregar a Node.js (LTS) + + Descarrega a Node.js {release.versionWithPrefix} + 1 com o suporte de longo prazo. + A Node.js também pode ser instalada através dos gestores de pacotes. + + + )} + + + + {({ release }) => ( + + Queremos novas funcionalidades mais cedo? + Podemos obter a Node.js {release.versionWithPrefix} + 1. + + )} + +
+
+ +
+
+ ```js displayName="Create an HTTP Server" + // server.mjs + import { createServer } from 'node:http'; + +const server = createServer((req, res) => { +res.writeHead(200, { 'Content-Type': 'text/plain' }); +res.end('Hello World!\n'); +}); + +// starts a simple http server locally on port 3000 +server.listen(3000, '127.0.0.1', () => { +console.log('Listening on 127.0.0.1:3000'); +}); + +// run with `node server.mjs` + +```` + +```js displayName="Write Tests" +// tests.mjs +import assert from 'node:assert'; +import test from 'node:test'; + +test('that 1 is equal 1', () => { + assert.strictEqual(1, 1); +}); + +test('that throws as 1 is not equal 2', () => { + // throws an exception because 1 != 2 + assert.strictEqual(1, 2); +}); + +// run with `node tests.mjs` +```` + +```js displayName="Read and Hash a File" +// crypto.mjs +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; + +const hasher = createHash('sha1'); + +hasher.setEncoding('hex'); +// ensure you have a `package.json` file for this test! +hasher.write(await readFile('package.json')); +hasher.end(); + +const fileHash = hasher.read(); + +// run with `node crypto.mjs` +``` + +```js displayName="Streams Pipeline" +// streams.mjs +import { pipeline } from 'node:stream/promises'; +import { createReadStream, createWriteStream } from 'node:fs'; +import { createGzip } from 'node:zlib'; + +// ensure you have a `package.json` file for this test! +await pipeline( + createReadStream('package.json'), + createGzip(), + createWriteStream('package.json.gz') +); + +// run with `node streams.mjs` +``` + +```js displayName="Work with Threads" +// threads.mjs +import { + Worker, + isMainThread, + workerData, + parentPort, +} from 'node:worker_threads'; + +if (isMainThread) { + const data = 'some data'; + const worker = new Worker(import.meta.filename, { workerData: data }); + worker.on('message', msg => console.log('Reply from Thread:', msg)); +} else { + const source = workerData; + parentPort.postMessage(btoa(source.toUpperCase())); +} + +// run with `node threads.mjs` +``` + +
+ +Podemos saber mais do que a Node.js é capaz de oferecer com os nossos [materiais de aprendizado](/learn). + +
diff --git a/pages/ar/search.mdx b/pages/pt/search.mdx similarity index 56% rename from pages/ar/search.mdx rename to pages/pt/search.mdx index ac57c0e414803..8760cc8d396e3 100644 --- a/pages/ar/search.mdx +++ b/pages/pt/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: Resultados da Pesquisa --- diff --git a/pages/ru/about/get-involved/collab-summit.md b/pages/ru/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/ru/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/ru/about/get-involved/contribute.md b/pages/ru/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/ru/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/ru/about/get-involved/events.mdx b/pages/ru/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/ru/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/ru/about/get-involved/index.md b/pages/ru/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/ru/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/ru/about/governance.md b/pages/ru/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/ru/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/ru/about/index.mdx b/pages/ru/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/ru/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/ru/about/previous-releases.mdx b/pages/ru/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/ru/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/ru/about/security-reporting.mdx b/pages/ru/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/ru/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/ru/download/current.mdx b/pages/ru/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ru/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ru/download/index.mdx b/pages/ru/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/ru/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/ru/download/package-manager/all.md b/pages/ru/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/ru/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/ru/download/package-manager/current.mdx b/pages/ru/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/ru/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ru/download/package-manager/index.mdx b/pages/ru/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/ru/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/ru/download/prebuilt-binaries/current.mdx b/pages/ru/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ru/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ru/download/prebuilt-binaries/index.mdx b/pages/ru/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/ru/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/ru/download/source-code/current.mdx b/pages/ru/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ru/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ru/download/source-code/index.mdx b/pages/ru/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/ru/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/ru/index.mdx b/pages/ru/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/ru/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/ru/search.mdx b/pages/ru/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/ru/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/tr/about/get-involved/collab-summit.md b/pages/tr/about/get-involved/collab-summit.md deleted file mode 100644 index ac5f3146404c0..0000000000000 --- a/pages/tr/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: İşbirlikçi Zirvesi -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/tr/about/get-involved/contribute.md b/pages/tr/about/get-involved/contribute.md index 6392c5fe32cb5..0c812116db400 100644 --- a/pages/tr/about/get-involved/contribute.md +++ b/pages/tr/about/get-involved/contribute.md @@ -1,47 +1,47 @@ --- -title: Contributing +title: Katkıda bulunma layout: about --- -# Contributing +# Katkıda bulunma -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. +Node.js'e katkıda bulunmaya ilginiz için teşekkür ederiz! Katkıda bulunabileceğiniz birçok yol ve yer bulunmaktadır ve biz de bunu kolaylaştırmak için buradayız. -## Asking for General Help +## Genel Yardım Talebi -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). +Nodejs/node\\` deposundaki etkinlik düzeyi çok yüksek olduğundan, Node.js kullanımıyla ilgili genel yardım soruları veya talepleri [Node.js yardım deposu] (https\://github.com/nodejs/help/issues) adresine yönlendirilmelidir. -## Reporting an Issue +## Sorun Bildirme -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. +Eğer Node.js ile ilgili bir sorun bulduysanız, lütfen GitHub projesinde bir sorun (issue) bildirmekten çekinmeyin. Sorununuzu bildirirken, sorunun tekrarlanabilir bir test örneği ile ifade edilebildiğinden emin olun, ve bu test örneği dış bağımlılıklar içermemelidir. Yani, test örneği sadece Node.js'in kendisi ile çalıştırılabilir olmalıdır. -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: +Bir sorun bildirirken, mümkün olduğunca çevrenizle ilgili bilgi de dahil etmeniz gerekmektedir. Sorunu daraltmaya çalışırken hangi bilgilerin önemli olacağını bilemeyiz. En azından aşağıdaki bilgileri içermeye çalışın: -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) +- Node.js Sürümü +- Çalıştırdığınız platform (macOS, SmartOS, Linux, Windows) +- Üzerinde çalıştığınız mimari (32bit veya 64bit ve x86 veya ARM) -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. +Node.js projesi şu anda birkaç ayrı GitHub deposu üzerinden yönetilmektedir, her birinin kendi ayrı sorun veritabanı bulunmaktadır. Mümkünse, bildirdiğiniz herhangi bir sorunu uygun deposuna yönlendirin, ancak yanlış yere yerleştirilirse endişelenmeyin, katkıda bulunan topluluk sizi doğru yöne yönlendirmekten memnuniyet duyacaktır. -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) +- Node.js'ye özgü sorunları bildirmek için lütfen [nodejs/node](https://github.com/nodejs/node) adresini kullanın +- Bu web sitesine özgü sorunları bildirmek için lütfen [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) adresini kullanın -## Code contributions +## Kod katkıları -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. +Node.js'ye hata düzeltmek veya yeni bir özellik eklemek istiyorsanız, lütfen [Node.js Katkı Yönergelerine] (https\://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests) başvurduğunuzdan emin olun. Projeye yapılan tüm katkılar için mevcut işbirlikçiler tarafından yapılan inceleme süreci de burada açıklanmaktadır. -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. +Nasıl başlayacağınızı merak ediyorsanız, ilk katkınıza doğru size rehberlik edebilecek [Node Todo] (https\://www\.nodetodo.org/) adresini kontrol edebilirsiniz. -## Becoming a collaborator +## İşbirlikçi olmak -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: +İşbirlikçi olarak kabul edilerek, katkıda bulunanlar projeye daha da büyük bir etki yapabilirler. Diğer katkı sağlayıcıları, katkılarını gözden geçirerek, sorunları sınıflandırarak ve projenin geleceğini şekillendirmede daha büyük bir rol alarak yardımcı olabilirler. Node.js topluluğu tarafından herhangi bir Node.js deposunda önemli ve değerli katkılar yapan bireyler İşbirlikçi olarak belirlenebilir ve projeye commit erişimi verilebilir. Dikkate alınan faaliyetler şunları içerir (ancak bunlarla sınırlı değildir): -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community +- kod taahhütleri ve pull request istekleri +- kod taahhütleri ve pull request istekleri +- sorunlar ve pull request istekleri hakkında yorumlar +- node.js web sitesine katkılar +- son kullanıcılara ve acemi katılımcılara sağlanan yardım +- çalışma gruplarına destek +- daha geniş Node.js topluluklarında katkı sağlamak -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. +Kişiler değerli katkılarının dikkate alınmadığını düşünürlerse, bunu sorun olarak bildirebilir veya bir TSC üyesi ile doğrudan iletişime geçebilir. diff --git a/pages/tr/about/get-involved/events.mdx b/pages/tr/about/get-involved/events.mdx index 2fb8672daed2d..c90991d60f1a8 100644 --- a/pages/tr/about/get-involved/events.mdx +++ b/pages/tr/about/get-involved/events.mdx @@ -1,16 +1,16 @@ --- -title: Upcoming Events +title: Yaklaşan Etkinlikler layout: about --- -## Upcoming Events +## Yaklaşan Etkinlikler -Node.js events are open and available to the public. Anyone is welcome to join and participate. +Node.js etkinlikleri halka açık ve kullanılabilir. Herkes katılabilir ve katkıda bulunabilir. -### Upcoming Node.js® Meetings +### Yaklaşan Node.js® Toplantıları -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. +Node.js projesi, projenin yönlerini tartışmak ve planlamak için yıl boyunca çok sayıda toplantı düzenler. -The following meetings are upcoming in the next 7 days. +Önümüzdeki 7 gün içinde aşağıdaki toplantılar yapılacaktır. diff --git a/pages/tr/about/get-involved/index.md b/pages/tr/about/get-involved/index.md index 858bfc61901b2..e8b872f9cf709 100644 --- a/pages/tr/about/get-involved/index.md +++ b/pages/tr/about/get-involved/index.md @@ -1,26 +1,26 @@ --- -title: Get involved +title: Dahil olun layout: about --- -# Get Involved +# Dahil Olun -## Community Discussion +## Topluluk Tartışması -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. +- [GitHub sorunlar listesi] (https\://github.com/nodejs/node/issues) Node.js temel özelliklerinin tartışıldığı yerdir. +- Node.js geliştirme hakkında gerçek zamanlı sohbet için aşağıdaki platformlardan birini kullanabilirsiniz + - IRC için, bir [IRC istemcisi](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) ile `#node.js` kanalındaki `irc.libera.chat` adresine gidin veya [bir web istemcisi](https://kiwiirc.com/nextclient/) kullanarak web tarayıcınızdan kanala bağlanın + - Slack için iki seçenek vardır: + - OpenJSF Slack] (https\://slack-invite.openjsf.org/), birkaç Node.js kanalına sahip bir Vakıf tarafından işletilen Slack'tir (`#nodejs-` ile ön eklenmiş kanallar projeyle ilgilidir). + - [Node Slackers](https://www.nodeslackers.com/) Node.js odaklı bir Slack topluluğudur. +- Resmi Node.js Twitter hesabı [nodejs](https://twitter.com/nodejs) şeklindedir. +- Tüm genel ekip toplantılarını içeren [Node.js proje takvimi] (https\://nodejs.org/calendar). -## Learning +## Öğrenme -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. +- Node.js web sitesinin [Resmi Öğrenme bölümü] (https\://nodejs.org/en/learn/). +- [Resmi API referans belgeleri](https://nodejs.org/api/). +- [NodeSchool.io](https://nodeschool.io/) size Node.js kavramlarını etkileşimli komut satırı oyunları aracılığıyla öğretecek. +- [Stack Overflow Node.js etiketi] (https://stackoverflow.com/questions/tagged/node.js) her gün yeni bilgiler toplamaktadır. +- [DEV Topluluğu Node.js etiketi] (https://dev.to/t/node) Node.js projelerini, makalelerini ve eğitimlerini paylaşmanın yanı sıra Node.js ile ilgili konularda tartışmalar başlatmak ve geri bildirim istemek için bir yerdir. Tüm beceri seviyelerindeki geliştiriciler katılabilir. +- [Nodeiflux] (https://discordapp.com/invite/vUsrbjd), Discord'da birbirini destekleyen Node.js arka uç geliştiricilerinden oluşan samimi bir topluluktur. diff --git a/pages/tr/about/governance.md b/pages/tr/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/tr/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/tr/about/index.mdx b/pages/tr/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/tr/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/tr/about/previous-releases.mdx b/pages/tr/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/tr/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/tr/about/security-reporting.mdx b/pages/tr/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/tr/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/tr/download/current.mdx b/pages/tr/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/tr/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/tr/download/index.mdx b/pages/tr/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/tr/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/tr/download/package-manager/all.md b/pages/tr/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/tr/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/tr/download/package-manager/current.mdx b/pages/tr/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/tr/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/tr/download/package-manager/index.mdx b/pages/tr/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/tr/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/tr/download/prebuilt-binaries/current.mdx b/pages/tr/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/tr/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/tr/download/prebuilt-binaries/index.mdx b/pages/tr/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/tr/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/tr/download/source-code/current.mdx b/pages/tr/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/tr/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/tr/download/source-code/index.mdx b/pages/tr/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/tr/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/tr/index.mdx b/pages/tr/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/tr/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/tr/search.mdx b/pages/tr/search.mdx index ac57c0e414803..5db97e62c1b65 100644 --- a/pages/tr/search.mdx +++ b/pages/tr/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: Arama Sonuçları --- diff --git a/pages/uk/about/branding.mdx b/pages/uk/about/branding.mdx new file mode 100644 index 0000000000000..28175cd78649d --- /dev/null +++ b/pages/uk/about/branding.mdx @@ -0,0 +1,72 @@ +--- +title: Брендинг Node.js +layout: about +--- + +Брендинг Node.js + +Будь ласка, перегляньте [політику торгових марок](https://trademark-policy.openjsf.org/), щоб дізнатися про дозвіл на використання логотипів та знаків Node.js®. + +## Маскот Node.js® + +Маскот Node.js + +## Логотип Node.js® + +### Горизонтальний логотип Node.js® + + + + + + + +
+ Темний горизонтальний логотип Node.js + + Світлий горизонтальний логотип Node.js +
+ +### Складений логотип Node.js® + + + + + + + + + + + + + +
+ Темний складений логотип Node.js® + + Світлий складений логотип Node.js® +
+ Чорний складений логотип Node.js® + + Білий складений логотип Node.js® +
+ +### Значки JS + + + + + + + +
+ Зелений значок JS + + Білий значок JS +
diff --git a/pages/uk/about/get-involved/collab-summit.md b/pages/uk/about/get-involved/collab-summit.md index d8b152d0a2723..716d001e69b74 100644 --- a/pages/uk/about/get-involved/collab-summit.md +++ b/pages/uk/about/get-involved/collab-summit.md @@ -1,30 +1,18 @@ --- -title: Collab Summit +title: Саміт співавторів layout: about --- -# Collaborator Summit +# Саміт співавторів -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. +Саміт співавторства/Collaboration Summit Node.js ― це "неконференція", на яку збираються поточні та потенційні співавтори, щоб наживо обговорити Node.js та поділитися знаннями. Команди, робочі групи та співавтори зі спільноти збираються двічі на рік для прийняття важливих рішень, водночас маючи змогу попрацювати над ідеями, які вони хочуть просувати особисто. -## Who attends? +## Хто запрошений? -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. +Участь у Саміті співавторства в основному беруть існуючі учасники та члени спільноти, але він також вітає тих, хто також бажає стати співавтором. Якщо ви новачок у внесенні змін до Node.js, Саміт співавторства може бути гарною можливістю допомогти вам дізнатися, що відбувається в межах спільноти, і зробити внесок вже з тими навичками, які ви хочете покращити. -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. +Перед самітом співавтори та учасники спільноти надсилають пропозиції щодо створення розкладу подій. Присутні можуть попередньо ознайомитись з подією та в загальному обговорити її з іншими співавторами, перед тим як відвідати. Також буде багато можливостей для нетворкінгу та брейнштормів. -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. +Ми будемо раді бачити вас на Саміті Співатворів/Collab Summit! Перегляньте [репозиторій саміту](https://github.com/nodejs/summit) +для майбутніх і минулих подій і ознайомтесь із +[відкритими питаннями](https://github.com/nodejs/summit/issues), щоб розуміти, які проблеми співавтори та учасники спільноти хочуть обговорити наживо. diff --git a/pages/uk/about/get-involved/contribute.md b/pages/uk/about/get-involved/contribute.md index 6392c5fe32cb5..781e1119f739a 100644 --- a/pages/uk/about/get-involved/contribute.md +++ b/pages/uk/about/get-involved/contribute.md @@ -1,47 +1,47 @@ --- -title: Contributing +title: Долучитись до проєкту layout: about --- -# Contributing +# Долучитись до проєкту -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. +Ми вдячні за бажання долучитись до Node.js. Існує багато способів та місць де ви можете зробити свій вклад у проєкт, і ми тут, щоб допомогти вам з цим. -## Asking for General Help +## Запит на загальну допомогу -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). +Через високий рівень активності у репозиторії "nodejs/node\\`, питання або запити про допомогу щодо використання Node.js слід створювати в репозиторії [допомога по Node.js](https://github.com/nodejs/help/issues). -## Reporting an Issue +## Повідомити про проблему -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. +Якщо ви виявили те, що, на вашу думку, є проблемою з Node.js, не вагайтесь повідомити про проблему в GitHub. Заповнюючи інформацію про проблему, будь ласка, переконайтеся, що ви можете викласти суть з можливістю відтворити проблему у формі тесту, який не містить жодних зовнішніх залежностей. Тобто тестовий приклад можна виконати без нічого, окрім самого Node.js. -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: +Повідомляючи про проблему нам також потрібно якомога більше інформації, яку ви зможете надати, про середовище в якому вона виникла. Ми не знаємо, яка інформація буде доречною, намагаючись визначити проблему, тому вкажіть, щонайменше, наступне: -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) +- Версія Node.js +- Платформа, на якій ви працюєте (macOS, SmartOS, Linux, Windows) +- Архітектура, на якій ви працюєте (32bit або 64bit та x86 або ARM) -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. +Проєкт Node.js наразі керується через кілька окремих репозиторіїв GitHub, кожен з власним списком проблем/запитів. Якщо це можливо, будь ласка, спрямовуйте будь-які проблеми до відповідного репозиторію, але не хвилюйтеся, якщо вони потраплять не в те місце – спільнота співавторів буде рада скерувати вас у правильному напрямку. -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) +- Щоб повідомити про характерні Node.js проблеми, скористайтесь [nodejs/node](https://github.com/nodejs/node) +- Щоб повідомити про проблеми із цим сайтом, скористайтесь [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) -## Code contributions +## Внести зміни в код -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. +Якщо ви хочете виправити помилки або додати нову функціональність до проєкту, будь ласка, ознайомтесь із [інструкцією як внести зміни до Node.js](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). Там також пояснюється процес перегляду співавторами всіх змін до проєкту. -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. +Якщо вам цікаво, як почати, ви можете переглянути [список завдань Node](https://www.nodetodo.org/), який може зорієнтувати вас яким чином зробити свій перший вклад у проєкт. -## Becoming a collaborator +## Стати співавтором -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: +Стаючи співавтором, користувачі можуть ще більше вплинути на проєкт. Вони можуть допомогти іншим співавторам, перевіряючи їх вклад у проєкт та сортуючи проблеми, а також брати ще більшу участь у формуванні майбутнього Node.js. Особи, яких TSC (Технічний Наглядовий Комітет) визначив такими - що зробили значний і цінний внесок до будь-якого репозиторію Node.js, можуть стати співавторами та отримати доступ до проєкту. Діяльність, яка береться до уваги, включає (та не обмежуюється) якістю: -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community +- змін/commits та pull requests, що стосуються коду +- змін/commits та pull requests, що стосуються документації +- коментарів до проблем і pull requests +- зробленого внеску у сайт Node.js +- допомоги наданої кінцевим користувачам і новим співавторам +- участі у робочих групах +- участі у ширшій Node.js спільноті -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. +Якщо особи, що роблять цінний вклад у проєкт, вважають, що вони не розглядались на надання дозволу для внесення змін, тоді вони можуть [створити запит в репозиторії](https://github.com/nodejs/TSC/issues) або [сконтактувати із членом TSC](https://github.com/nodejs/node#tsc-technical-steering-committee) напряму. diff --git a/pages/uk/about/get-involved/events.mdx b/pages/uk/about/get-involved/events.mdx index 2fb8672daed2d..811ff18768809 100644 --- a/pages/uk/about/get-involved/events.mdx +++ b/pages/uk/about/get-involved/events.mdx @@ -1,16 +1,16 @@ --- -title: Upcoming Events +title: Майбутні події layout: about --- -## Upcoming Events +## Майбутні події -Node.js events are open and available to the public. Anyone is welcome to join and participate. +Події Node.js відкриті та доступні для спільноти. Усі охочі можуть приєднатися та брати в них участь. -### Upcoming Node.js® Meetings +### Майбутні зустрічі Node.js® -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. +Проєкт Node.js проводить численні зустрічі впродовж року для обговорення та планування аспектів проєкту. -The following meetings are upcoming in the next 7 days. +Ці зустрічі відбудуться в наступні 7 днів. diff --git a/pages/uk/about/get-involved/index.md b/pages/uk/about/get-involved/index.md index 858bfc61901b2..71e8c0fc64f0d 100644 --- a/pages/uk/about/get-involved/index.md +++ b/pages/uk/about/get-involved/index.md @@ -1,26 +1,26 @@ --- -title: Get involved +title: Долучитися layout: about --- -# Get Involved +# Долучитися -## Community Discussion +## Обговорення спільноти -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. +- [Список проблем на GitHub](https://github.com/nodejs/node/issues) місце для обговорення основної функціональності Node.js. +- Для спілкування про розробку на Node.js в реальному часі скористайтеся однією з наступних платформ + - Для багатокористувацьких конференцій відвідайте `irc.libera.chat` в `#node.js` каналі через [IRC клієнт](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) або під'єднайтесь до каналу через браузер використовуючи [вебзастосунок](https://kiwiirc.com/nextclient/) + - Для Slack є два варіанти: + - [OpenJSF Slack](https://slack-invite.openjsf.org/) - запущений OpenJS Foundation спільнотою Slack з декількома Node.js каналами(канали з префіксом `#nodejs-` стосуються проєкту). + - [Node Slackers](https://www.nodeslackers.com/) — це спільнота Slack із фокусом на Node.js. +- Офіційний Twitter Node.js: [nodejs](https://twitter.com/nodejs). +- [Календар проєкту Node.js](https://nodejs.org/calendar) з усіма публічними командними зустрічами. -## Learning +## Навчання -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. +- [Офіційний розділ навчання](https://nodejs.org/en/learn/) вебсайту Node.js. +- [Офіційна документація по API](https://nodejs.org/api/). +- [NodeSchool.io](https://nodeschool.io/) навчить вас концепцій Node.js за допомогою інтерактивних ігор у командному рядку. +- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) щодня збирає нову інформацію. +- [Тег Node.js на DEV Community](https://dev.to/t/node) — це місце, де можна ділитися проєктами, статтями та практичними заняттями з Node.js, а також почати обговорення та просити відгуки до тем, пов'язаних із Node.js. До участі запрошуються розробники всіх рівнів. +- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) — це дружня спільнота бекенд-розробників Node.js, які підтримують один одного в Discord. diff --git a/pages/uk/about/governance.md b/pages/uk/about/governance.md index af512bbe769d3..45d23a97adaea 100644 --- a/pages/uk/about/governance.md +++ b/pages/uk/about/governance.md @@ -1,31 +1,27 @@ --- -title: Project Governance +title: Управління проєктом layout: about --- -# Project Governance +# Управління проєктом -## Consensus Seeking Process +## Процес пошуку консенсусу -The Node.js project follows a [Consensus Seeking][] decision making model. +Node.js дотримується [Consensus Seeking][] моделі прийняття рішень. -## Collaborators +## Співавтори -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. +Основний GitHub репозиторій [nodejs/node][] підтримується співавторами, які на постійній основі вибираються іншими, чинними, співавторами. -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. +Особи, які роблять важливий внесок стають співавторами та отримують дозвіл на внесення змін до проєкту. Ці особи визначаються іншими співавторами, а їх номінація на роль співавтора, обговорюється із чинними співавторами. -For the current list of Collaborators, see the project's [README.md][]. +Для ознайомлення із поточним списком співучасників, відвідайте [README.md][]. -A guide for Collaborators is maintained at [collaborator-guide.md][]. +Інструкція для співавторів проєкту, підтримується на [collaborator-guide.md][]. -## Technical Steering Committee +## Технічний керівний комітет -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. +Проєкт керується \[Технічним наглядовим комітетом(TSC)]\[], який відповідальний за високорівневе керування проєктом. TSC - це набір активних співавторів, призначених іншими, чинними членами TSC. [consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members diff --git a/pages/uk/about/index.mdx b/pages/uk/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/uk/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/uk/about/previous-releases.mdx b/pages/uk/about/previous-releases.mdx index 3b292e56350c5..0c4458b601919 100644 --- a/pages/uk/about/previous-releases.mdx +++ b/pages/uk/about/previous-releases.mdx @@ -1,21 +1,21 @@ --- -title: Previous Releases +title: Релізи Node.js layout: about --- -# Previous Releases +Релізи Node.js -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. +Основні версії Node.js мають статус релізу _Current_ протягом шести місяців, що дає розробникам бібліотек час надати їм підтримку. +Через шість місяців непарні релізи (9, 11 тощо) більше не підтримуватимуться, а парні релізи (10, 12 тощо) отримають статус _Active LTS_ та стануть готовими до загального використання. +Статус релізу _LTS_ означає «довгострокова підтримка (ДСП)», тобто критичні помилки будуть виправлятися впродовж 30 місяців. +Застосунки на продакшні повинні використовувати лише релізи _Active LTS_ та _Maintenance LTS_. -### Release Schedule +## Розклад релізів ![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). +Усі деталі, які стосуються розкладу релізів Node.js, доступні [на GitHub](https://github.com/nodejs/release#release-schedule). -### Looking for latest release of a version branch? +## Шукаєте останній реліз гілки версії? diff --git a/pages/uk/about/security-reporting.mdx b/pages/uk/about/security-reporting.mdx index 3ba8e266ed528..3ce5c1b0317de 100644 --- a/pages/uk/about/security-reporting.mdx +++ b/pages/uk/about/security-reporting.mdx @@ -1,79 +1,55 @@ --- -title: Security Reporting +title: Звітність про безпеку layout: about --- -# Security Reporting +Звітність про безпеку -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). +Для детальнішої інформації про чинні норми безпеки, перейдіть [на цю сторінку](https://github.com/nodejs/node/security/policy). -## Reporting a bug in Node.js +## Повідомлення про помилку в Node.js -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). +Повідомляйте про безпекові проблеми в Node.js через [HackerOne](https://hackerone.com/nodejs). -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. +Ваш лист буде розглянуто протягом 5 днів, а протягом 10 днів вам буде надіслано більш деталізовану відповідь з вказівками щодо подальшої обробки вашого запиту. -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. +Після першої відповіді на ваше повідомлення, команда безпеки намагатиметься тримати вас у курсі стосовно прогресу у розв'язанні та оголошенні про проблему. Також, вас можуть попросити надати додаткову інформацію або інструкції стосовно повідомленої помилки. -### Node.js bug bounty program +### Програма винагород за знайдені помилки від Node.js -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. +Node.js бере участь в офіційній програмі винагород за знайдені помилки для дослідників у сфері безпеки та заради відповідального публічного розкриття інформації. Програма керується через платформу HackerOne. Для детальнішої інформації відвідайте [HackerOne/nodejs](https://hackerone.com/nodejs). -## Reporting a bug in a third party module +## Повідомлення про помилку в сторонніх модулях -Security bugs in third party modules should be reported to their respective -maintainers. +Про помилки в безпеці сторонніх модулів слід повідомляти відповідним особам, які підтримують ці модулі. -## Disclosure policy +## Політика розкриття інформації -Here is the security disclosure policy for Node.js +Ось політика розкриття безпекової інформації в Node.js -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. +Повідомлення про проблему отримане і призначене особі, яка його оброблятиме. Ця особа координуватиме процес виправлення та релізу. При підтверджені проблеми буде визначений список всіх версії у яких вона присутня. Код перевірятиметься на наявність потенційно подібних проблем. Виправлення підготують для всіх релізів, що досі підтримуються. Ці виправлення не будуть додані до загального репозиторію, а будуть зберігатись локально, до моменту офіційного оголошення про виправлення проблеми. -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. +Обирається дата закриття цієї вразливості та робиться запит на CVE (Common Vulnerabilities and Exposures (CVE®)) щодо цієї вразливості. -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. +У день закриття, копія анонсу надсилається списку адресатів, що мають відношення до безпеки в Node.js. Зміни додаються до загального репозиторію і нові збірки розгортаються на nodejs.org. Протягом 6 годин після розсилки повідомлень, копію оголошення буде опубліковано у блозі Node.js. -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. +Зазвичай дата закриття встановлюється протягом 72 годин від моменту видання CVE. Однак, це може залежати від серйозності та складності розв'язання проблеми. -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. +Цей процес може зайняти деякий час, особливо коли необхідна координація з командою підтримки інших проєктів. Всі зусилля будуть спрямовані на те, щоб розв'язати проблему якомога швидше, однак, важливо, щоб ми дотримувались вищезгаданого процесу релізу, щоб бути певними, що все відбувається належним чином. -## Receiving security updates +## Отримання безпекових оновлень -Security notifications will be distributed via the following methods. +Сповіщення, що стосуються безпеки, будуть поширюватись наступними методами. -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) +[Google Group](https://groups.google.com/group/nodejs-sec) +[Node.js Блог](/blog) -## Comments on this policy +## Коментарі стосовно цієї політики -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. +Якщо у вас є пропозиції щодо покращення цього процесу, створіть [pull request](https://github.com/nodejs/nodejs.org) або +[додайте запит](https://github.com/nodejs/security-wg/issues/new) на обговорення. -## OpenSSF Best Practices +## Найкращі практики OpenSSF -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. +The Open Source Security Foundation (OpenSSF) [значок за застосування кращих практик](https://github.com/coreinfrastructure/best-practices-badge) це спосіб Free/Libre та Open Source Software (FLOSS) проєктів продемонструвати, що вони застосовують ці кращі практики. Проєкти можуть самостійно засвідчити, як вони дотримуються найкращих практик. Власники значка можуть швидко оцінити, які проєкти FLOSS дотримуються найкращих практик, і, як наслідок, з більшою ймовірністю створюватимуть якісніше і безпечніше програмне забезпечення. diff --git a/pages/uk/download/current.mdx b/pages/uk/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/uk/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/uk/download/index.mdx b/pages/uk/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/uk/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/uk/download/package-manager/all.md b/pages/uk/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/uk/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/uk/download/package-manager/current.mdx b/pages/uk/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/uk/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/uk/download/package-manager/index.mdx b/pages/uk/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/uk/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/uk/download/prebuilt-binaries/current.mdx b/pages/uk/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/uk/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/uk/download/prebuilt-binaries/index.mdx b/pages/uk/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/uk/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/uk/download/source-code/current.mdx b/pages/uk/download/source-code/current.mdx index 17383ba65eb3e..3c49438324323 100644 --- a/pages/uk/download/source-code/current.mdx +++ b/pages/uk/download/source-code/current.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Завантаження Node.js® +subtitle: Завантажте Node.js так, як ви бажаєте. ---
- I want the version of the Node.js source code. +Мені потрібна версія вихідного коду Node.js. - +
- Node.js includes npm () and corepack. +Node.js містить . -Read the blog post for this version +Прочитайте список змін для цієї версії -Learn how to verify signed SHASUMS +Прочитайте блог для цієї версії -Check out how to build Node.js from source. +Дізнайтеся, як перевірити підписані SHASUMS + +Дізнайтеся, як зібрати Node.js із вихідного коду.
diff --git a/pages/uk/download/source-code/index.mdx b/pages/uk/download/source-code/index.mdx index 17383ba65eb3e..3c49438324323 100644 --- a/pages/uk/download/source-code/index.mdx +++ b/pages/uk/download/source-code/index.mdx @@ -1,22 +1,24 @@ --- layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. +title: Завантаження Node.js® +subtitle: Завантажте Node.js так, як ви бажаєте. ---
- I want the version of the Node.js source code. +Мені потрібна версія вихідного коду Node.js. - +
- Node.js includes npm () and corepack. +Node.js містить . -Read the blog post for this version +Прочитайте список змін для цієї версії -Learn how to verify signed SHASUMS +Прочитайте блог для цієї версії -Check out how to build Node.js from source. +Дізнайтеся, як перевірити підписані SHASUMS + +Дізнайтеся, як зібрати Node.js із вихідного коду.
diff --git a/pages/uk/index.mdx b/pages/uk/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/uk/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/uk/search.mdx b/pages/uk/search.mdx index ac57c0e414803..df80d434d9e4c 100644 --- a/pages/uk/search.mdx +++ b/pages/uk/search.mdx @@ -1,6 +1,6 @@ --- layout: search -title: Search Results +title: Результати пошуку --- diff --git a/pages/vi/about/get-involved/collab-summit.md b/pages/vi/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/vi/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/vi/about/get-involved/contribute.md b/pages/vi/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/vi/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/vi/about/get-involved/events.mdx b/pages/vi/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/vi/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/vi/about/get-involved/index.md b/pages/vi/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/vi/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/vi/about/governance.md b/pages/vi/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/vi/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/vi/about/index.mdx b/pages/vi/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/vi/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/vi/about/previous-releases.mdx b/pages/vi/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/vi/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/vi/about/security-reporting.mdx b/pages/vi/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/vi/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/vi/download/current.mdx b/pages/vi/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/vi/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/vi/download/index.mdx b/pages/vi/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/vi/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/vi/download/package-manager/all.md b/pages/vi/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/vi/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/vi/download/package-manager/current.mdx b/pages/vi/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/vi/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/vi/download/package-manager/index.mdx b/pages/vi/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/vi/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/vi/download/prebuilt-binaries/current.mdx b/pages/vi/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/vi/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/vi/download/prebuilt-binaries/index.mdx b/pages/vi/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/vi/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/vi/download/source-code/current.mdx b/pages/vi/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/vi/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/vi/download/source-code/index.mdx b/pages/vi/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/vi/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/vi/index.mdx b/pages/vi/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/vi/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/vi/search.mdx b/pages/vi/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/vi/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/pages/zh-cn/about/get-involved/collab-summit.md b/pages/zh-cn/about/get-involved/collab-summit.md deleted file mode 100644 index d8b152d0a2723..0000000000000 --- a/pages/zh-cn/about/get-involved/collab-summit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Collab Summit -layout: about ---- - -# Collaborator Summit - -Node.js's Collaborator Summit is an un-conference for bringing current and -potential contributors together to discuss Node.js with lively collaboration, -education, and knowledge sharing. Committees and working groups come together -twice per year to make important decisions while also being able to work on some -exciting efforts they want to push forward in-person. - -## Who attends? - -Anyone is welcome to attend Collab Summit. During the -summit, leaders will help onboard new contributors to groups they'd love to help -prior to integrating them into the working sessions. - -This is your opportunity to learn what is happening within the community to jump -in and contribute with the skills you have and would like to hone. - -Working groups will put together a schedule so that people can -familiarize themselves before folks get onsite, having the general collaborator -discussions, and then dive into breakout sessions. - -We'd love to see you at Collab Summit! Check out the [Summit repo](https://github.com/nodejs/summit) -for upcoming and past Collab Summits and have a look at the -[issues filed](https://github.com/nodejs/summit/issues) that share what -individual working groups and committees are looking to discuss in-person. diff --git a/pages/zh-cn/about/get-involved/contribute.md b/pages/zh-cn/about/get-involved/contribute.md deleted file mode 100644 index 6392c5fe32cb5..0000000000000 --- a/pages/zh-cn/about/get-involved/contribute.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Contributing -layout: about ---- - -# Contributing - -Thank you for your interest in contributing to Node.js! There are multiple ways and places you can contribute, and we're here to help facilitate that. - -## Asking for General Help - -Because the level of activity in the `nodejs/node` repository is so high, questions or requests for general help using Node.js should be directed at the [Node.js help repository](https://github.com/nodejs/help/issues). - -## Reporting an Issue - -If you have found what you believe to be an issue with Node.js please do not hesitate to file an issue on the GitHub project. When filing your issue please make sure you can express the issue with a reproducible test case, and that test case should not include any external dependencies. That is to say, the test case can be executed without anything more than Node.js itself. - -When reporting an issue we also need as much information about your environment that you can include. We never know what information will be pertinent when trying to narrow down the issue. Please include at least the following information: - -- Version of Node.js -- Platform you're running on (macOS, SmartOS, Linux, Windows) -- Architecture you're running on (32bit or 64bit and x86 or ARM) - -The Node.js project is currently managed across a number of separate GitHub repositories, each with their own separate issues database. If possible, please direct any issues you are reporting to the appropriate repository but don't worry if things happen to get put in the wrong place, the community of contributors will be more than happy to help get you pointed in the right direction. - -- To report issues specific to Node.js, please use [nodejs/node](https://github.com/nodejs/node) -- To report issues specific to this website, please use [nodejs/nodejs.org](https://github.com/nodejs/nodejs.org/issues) - -## Code contributions - -If you'd like to fix bugs or add a new feature to Node.js, please make sure you consult the [Node.js Contribution Guidelines](https://github.com/nodejs/node/blob/main/CONTRIBUTING.md/#pull-requests). The review process by existing collaborators for all contributions to the project is explained there as well. - -If you are wondering how to start, you can check [Node Todo](https://www.nodetodo.org/) which may guide you towards your first contribution. - -## Becoming a collaborator - -By becoming a collaborator, contributors can have even more impact on the project. They can help other contributors by reviewing their contributions, triage issues and take an even bigger part in shaping the project's future. Individuals identified by the TSC as making significant and valuable contributions across any Node.js repository may be made Collaborators and given commit access to the project. Activities taken into consideration include (but are not limited to) the quality of: - -- code commits and pull requests -- documentation commits and pull requests -- comments on issues and pull requests -- contributions to the Node.js website -- assistance provided to end users and novice contributors -- participation in working groups -- other participation in the wider Node.js community - -If individuals making valuable contributions do not believe they have been considered for commit access, they may [log an issue](https://github.com/nodejs/TSC/issues) or [contact a TSC member](https://github.com/nodejs/node#tsc-technical-steering-committee) directly. diff --git a/pages/zh-cn/about/get-involved/events.mdx b/pages/zh-cn/about/get-involved/events.mdx deleted file mode 100644 index 2fb8672daed2d..0000000000000 --- a/pages/zh-cn/about/get-involved/events.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Upcoming Events -layout: about ---- - -## Upcoming Events - -Node.js events are open and available to the public. Anyone is welcome to join and participate. - -### Upcoming Node.js® Meetings - -The Node.js project holds numerous meetings throughout the year to discuss and plan aspects of the project. - -The following meetings are upcoming in the next 7 days. - - diff --git a/pages/zh-cn/about/get-involved/index.md b/pages/zh-cn/about/get-involved/index.md deleted file mode 100644 index 858bfc61901b2..0000000000000 --- a/pages/zh-cn/about/get-involved/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved -layout: about ---- - -# Get Involved - -## Community Discussion - -- The [GitHub issues list](https://github.com/nodejs/node/issues) is the place for discussion of Node.js core features. -- For real-time chat about Node.js development use one of the platforms below - - For IRC, go to `irc.libera.chat` in the `#node.js` channel with an [IRC client](https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients) or connect in your web browser to the channel using [a web client](https://kiwiirc.com/nextclient/) - - For Slack, there are two options: - - The [OpenJSF Slack](https://slack-invite.openjsf.org/) is a Foundation run Slack with several Node.js channels (channels prefixed by `#nodejs-` are related to the project). - - [Node Slackers](https://www.nodeslackers.com/) is a Node.js-focused Slack community. -- The official Node.js Twitter account is [nodejs](https://twitter.com/nodejs). -- The [Node.js project calendar](https://nodejs.org/calendar) with all public team meetings. - -## Learning - -- [Official Learn section](https://nodejs.org/en/learn/) of the Node.js website. -- [Official API reference documentation](https://nodejs.org/api/). -- [NodeSchool.io](https://nodeschool.io/) will teach you Node.js concepts via interactive command-line games. -- [Stack Overflow Node.js tag](https://stackoverflow.com/questions/tagged/node.js) collects new information every day. -- [The DEV Community Node.js tag](https://dev.to/t/node) is a place to share Node.js projects, articles and tutorials as well as start discussions and ask for feedback on Node.js-related topics. Developers of all skill-levels are welcome to take part. -- [Nodeiflux](https://discordapp.com/invite/vUsrbjd) is a friendly community of Node.js backend developers supporting each other on Discord. diff --git a/pages/zh-cn/about/governance.md b/pages/zh-cn/about/governance.md deleted file mode 100644 index af512bbe769d3..0000000000000 --- a/pages/zh-cn/about/governance.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Project Governance -layout: about ---- - -# Project Governance - -## Consensus Seeking Process - -The Node.js project follows a [Consensus Seeking][] decision making model. - -## Collaborators - -The [nodejs/node][] core GitHub repository is maintained by the Collaborators -who are added by the Technical Steering Committee ([TSC][]) on an ongoing basis. - -Individuals making significant and valuable contributions are made Collaborators -and given commit-access to the project. These individuals are identified by the -TSC and their nomination is discussed with the existing Collaborators. - -For the current list of Collaborators, see the project's [README.md][]. - -A guide for Collaborators is maintained at [collaborator-guide.md][]. - -## Technical Steering Committee - -The project is governed by the [Technical Steering Committee (TSC)][] -which is responsible for high-level guidance of the project. - -[consensus seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making -[readme.md]: https://github.com/nodejs/node/blob/main/README.md#current-project-team-members -[tsc]: https://github.com/nodejs/TSC -[technical steering committee (tsc)]: https://github.com/nodejs/TSC/blob/main/TSC-Charter.md -[collaborator-guide.md]: https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md -[nodejs/node]: https://github.com/nodejs/node diff --git a/pages/zh-cn/about/index.mdx b/pages/zh-cn/about/index.mdx deleted file mode 100644 index 13459154c71d4..0000000000000 --- a/pages/zh-cn/about/index.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: About Node.js® -layout: about ---- - -
- Node.js mascot -
- ---- - -# About Node.js® - -As an asynchronous event-driven JavaScript runtime, Node.js is designed to build -scalable network applications. In the following "hello world" example, many -connections can be handled concurrently. Upon each connection, the callback is -fired, but if there is no work to be done, Node.js will sleep. - -```js -const http = require('node:http'); - -const hostname = '127.0.0.1'; -const port = 3000; - -const server = http.createServer((req, res) => { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/plain'); - res.end('Hello World'); -}); - -server.listen(port, hostname, () => { - console.log(`Server running at http://${hostname}:${port}/`); -}); -``` - -This is in contrast to today's more common concurrency model, in which OS threads -are employed. Thread-based networking is relatively inefficient and very -difficult to use. Furthermore, users of Node.js are free from worries of -dead-locking the process, since there are no locks. Almost no function in -Node.js directly performs I/O, so the process never blocks except when the I/O is performed using -synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very -reasonable to develop in Node.js. - -If some of this language is unfamiliar, there is a full article on -\[Blocking vs. Non-Blocking]\[]. - ---- - -Node.js is similar in design to, and influenced by, systems like Ruby's -\[Event Machine]\[] and Python's \[Twisted]\[]. Node.js takes the event model a bit -further. It presents an event loop as a runtime construct instead of as a library. In other systems, -there is always a blocking call to start the event-loop. -Typically, behavior is defined through callbacks at the beginning of a script, and -at the end a server is started through a blocking call like `EventMachine::run()`. -In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js -exits the event loop when there are no more callbacks to perform. This behavior -is like browser JavaScript — the event loop is hidden from the user. - -HTTP is a first-class citizen in Node.js, designed with streaming and low -latency in mind. This makes Node.js well suited for the foundation of a web -library or framework. - -Node.js being designed without threads doesn't mean you can't take -advantage of multiple cores in your environment. Child processes can be spawned -by using our \[`child_process.fork()`]\[] API, and are designed to be easy to -communicate with. Built upon that same interface is the \[`cluster`]\[] module, -which allows you to share sockets between processes to enable load balancing -over your cores. - -[blocking vs. non-blocking]: /learn/asynchronous-work/overview-of-blocking-vs-non-blocking -[`child_process.fork()`]: https://nodejs.org/api/child_process.html -[`cluster`]: https://nodejs.org/api/cluster.html -[event machine]: https://github.com/eventmachine/eventmachine -[twisted]: https://twistedmatrix.com/trac/ diff --git a/pages/zh-cn/about/previous-releases.mdx b/pages/zh-cn/about/previous-releases.mdx deleted file mode 100644 index 3b292e56350c5..0000000000000 --- a/pages/zh-cn/about/previous-releases.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Previous Releases -layout: about ---- - -# Previous Releases - -Major Node.js versions enter _Current_ release status for six months, which gives library authors time to add support for them. -After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to _Active LTS_ status and are ready for general use. -_LTS_ release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. -Production applications should only use _Active LTS_ or _Maintenance LTS_ releases. - -### Release Schedule - -![Releases](https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true) - -Full details regarding Node.js release schedule are available [on GitHub](https://github.com/nodejs/release#release-schedule). - -### Looking for latest release of a version branch? - - diff --git a/pages/zh-cn/about/security-reporting.mdx b/pages/zh-cn/about/security-reporting.mdx deleted file mode 100644 index 3ba8e266ed528..0000000000000 --- a/pages/zh-cn/about/security-reporting.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Security Reporting -layout: about ---- - -# Security Reporting - -For more details on active Security Policies, checkout [this page](https://github.com/nodejs/node/security/policy). - -## Reporting a bug in Node.js - -Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). - -Your report will be acknowledged within 5 days, and you'll receive a more -detailed response to your report within 10 days indicating the next steps in -handling your submission. - -After the initial reply to your report, the security team will endeavor to keep -you informed of the progress being made towards a fix and full announcement, -and may ask for additional information or guidance surrounding the reported -issue. - -### Node.js bug bounty program - -The Node.js project engages in an official bug bounty program for security -researchers and responsible public disclosures. The program is managed through -the HackerOne platform. See [https://hackerone.com/nodejs](https://hackerone.com/nodejs) for further details. - -## Reporting a bug in a third party module - -Security bugs in third party modules should be reported to their respective -maintainers. - -## Disclosure policy - -Here is the security disclosure policy for Node.js - -- The security report is received and is assigned a primary handler. This - person will coordinate the fix and release process. The problem is confirmed - and a list of all affected versions is determined. Code is audited to find - any potential similar problems. Fixes are prepared for all releases which are - still under maintenance. These fixes are not committed to the public - repository but rather held locally pending the announcement. - -- A suggested embargo date for this vulnerability is chosen and a CVE (Common - Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. - -- On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being - notified, a copy of the advisory will be published on the Node.js blog. - -- Typically the embargo date will be set 72 hours from the time the CVE is - issued. However, this may vary depending on the severity of the bug or - difficulty in applying a fix. - -- This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. - -## Receiving security updates - -Security notifications will be distributed via the following methods. - -- [Google Group](https://groups.google.com/group/nodejs-sec) -- [Node.js Blog](/blog) - -## Comments on this policy - -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. - -## OpenSSF Best Practices - - - OpenSSF Badge - - -The Open Source Security Foundation (OpenSSF) [Best Practices badge](https://github.com/coreinfrastructure/best-practices-badge) is a way for Free/Libre and Open Source Software (FLOSS) projects to show that they follow best practices. Projects can voluntarily self-certify how they follow each best practice. Consumers of the badge can quickly assess which FLOSS projects are following best practices and as a result are more likely to produce higher-quality secure software. diff --git a/pages/zh-cn/download/current.mdx b/pages/zh-cn/download/current.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/zh-cn/download/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/zh-cn/download/index.mdx b/pages/zh-cn/download/index.mdx deleted file mode 100644 index 34e7ef21b4312..0000000000000 --- a/pages/zh-cn/download/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out all available Node.js download options - -
diff --git a/pages/zh-cn/download/package-manager/all.md b/pages/zh-cn/download/package-manager/all.md deleted file mode 100644 index 2e87e99e21fb0..0000000000000 --- a/pages/zh-cn/download/package-manager/all.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -layout: docs -title: Installing Node.js via package manager ---- - -# Installing Node.js via Package Managers - -> The packages on this page are maintained and supported by their respective packagers, **not** the Node.js core team. Please report any issues you encounter to the package maintainer. If it turns out your issue is a bug in Node.js itself, the maintainer will report the issue upstream. - ---- - -- [Alpine Linux](#alpine-linux) -- [Android](#android) -- [Arch Linux](#arch-linux) -- [CentOS, Fedora and Red Hat Enterprise Linux](#centos-fedora-and-red-hat-enterprise-linux) -- [Debian and Ubuntu based Linux distributions](#debian-and-ubuntu-based-linux-distributions) -- [fnm](#fnm) -- [FreeBSD](#freebsd) -- [Gentoo](#gentoo) -- [IBM i](#ibm-i) -- [macOS](#macos) -- [n](#n) -- [NetBSD](#netbsd) -- [Nodenv](#nodenv) -- [nvm](#nvm) -- [nvs](#nvs) -- [OpenBSD](#openbsd) -- [openSUSE and SLE](#opensuse-and-sle) -- [SmartOS and illumos](#smartos-and-illumos) -- [Snap](#snap) -- [Solus](#solus) -- [Void Linux](#void-linux) -- [Windows](#windows-1) -- [z/OS](#zos) - ---- - -## Alpine Linux - -Node.js LTS and npm packages are available in the Main Repository. - -```bash -apk add nodejs npm -``` - -Node.js Current can be installed from the Community Repository. - -```bash -apk add nodejs-current -``` - -## Android - -Android support is still experimental in Node.js, so precompiled binaries are not yet provided by Node.js developers. - -However, there are some third-party solutions. For example, [Termux](https://termux.com/) community provides terminal emulator and Linux environment for Android, as well as own package manager and [extensive collection](https://github.com/termux/termux-packages) of many precompiled applications. This command in Termux app will install the last available Node.js version: - -```bash -pkg install nodejs -``` - -Currently, Termux Node.js binaries are linked against `system-icu` (depending on `libicu` package). - -## Arch Linux - -Node.js and npm packages are available in the Community Repository. - -```bash -pacman -S nodejs npm -``` - -## CentOS, Fedora and Red Hat Enterprise Linux - -Node.js is available as a module called `nodejs` in CentOS/RHEL 8 and Fedora. - -```bash -dnf module install nodejs: -``` - -where `` corresponds to the major version of Node.js. -To see a list of available streams: - -```bash -dnf module list nodejs -``` - -For example, to install Node.js 18: - -```bash -dnf module install nodejs:18/common -``` - -### Alternatives - -These resources provide packages compatible with CentOS, Fedora, and RHEL. - -- [Node.js snaps](#snap) maintained and supported at https\://github.com/nodejs/snap -- [Node.js binary distributions](#debian-and-ubuntu-based-linux-distributions) maintained and supported by [NodeSource](https://github.com/nodesource/distributions) - -## Debian and Ubuntu based Linux distributions - -[Node.js binary distributions](https://github.com/nodesource/distributions) are available from NodeSource. - -### Alternatives - -Packages compatible with Debian and Ubuntu based Linux distributions are available via [Node.js snaps](#snap). - -## fnm - -Fast and simple Node.js version manager built in Rust used to manage multiple released Node.js versions. It allows you to perform operations like install, uninstall, switch Node versions automatically based on the current directory, etc. -To install fnm, use this [install script](https://github.com/Schniz/fnm#using-a-script-macoslinux). - -fnm has cross-platform support (macOS, Windows, Linux) & all popular shells (Bash, Zsh, Fish, PowerShell, Windows Command Line Prompt). -fnm is built with speed in mind and compatibility support for `.node-version` and `.nvmrc` files. - -## FreeBSD - -The most recent release of Node.js is available via the [www/node](https://www.freshports.org/www/node) port. - -Install a binary package via [pkg](https://www.freebsd.org/cgi/man.cgi?pkg): - -```bash -pkg install node -``` - -Or compile it on your own using [ports](https://www.freebsd.org/cgi/man.cgi?ports): - -```bash -cd /usr/ports/www/node && make install -``` - -## Gentoo - -Node.js is available in the portage tree. - -```bash -emerge nodejs -``` - -## IBM i - -LTS versions of Node.js are available from IBM, and are available via [the 'yum' package manager](https://ibm.biz/ibmi-rpms). The package name is `nodejs` followed by the major version number (for instance, `nodejs18`, `nodejs20` etc) - -To install Node.js 20.x from the command line, run the following as a user with \*ALLOBJ special authority: - -```bash -yum install nodejs20 -``` - -Node.js can also be installed with the IBM i Access Client Solutions product. See [this support document](http://www-01.ibm.com/support/docview.wss?uid=nas8N1022619) for more details - -## macOS - -Download the [macOS Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -_If you want to download the package with bash:_ - -```bash -curl "https://nodejs.org/dist/latest/$(curl -s https://nodejs.org/dist/latest/ | grep "pkg" | cut -d'"' -f 2)" -o "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/" -``` - -### Alternatives - -Using **[Homebrew](https://brew.sh/)**: - -```bash -brew install node -``` - -Using **[MacPorts](https://www.macports.org/)**: - -```bash -port install nodejs - -# Example -port install nodejs7 -``` - -Using **[pkgsrc](https://pkgsrc.joyent.com/install-on-macos/)**: - -Install the binary package: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## n - -`n` is a simple to use Node.js version manager for Mac and Linux. Specify the target version to install using a rich syntax, -or select from a menu of previously downloaded versions. The versions are installed system-wide or user-wide, and for more -targeted use you can run a version directly from the cached downloads. - -See the [homepage](https://github.com/tj/n) for install methods (bootstrap, npm, Homebrew, third-party), and all the usage details. - -If you already have `npm` then installing `n` and then the newest LTS `node` version is as simple as: - -``` -npm install -g n -n lts -``` - -## NetBSD - -Node.js is available in the pkgsrc tree: - -```bash -cd /usr/pkgsrc/lang/nodejs && make install -``` - -Or install a binary package (if available for your platform) using pkgin: - -```bash -pkgin -y install nodejs -``` - -## Nodenv - -`nodenv` is a lightweight node version manager, similar to `nvm`. It's simple and predictable. A rich plugin ecosystem lets you tailor it to suit your needs. Use `nodenv` to pick a Node version for your application and guarantee that your development environment matches production. - -Nodenv installation instructions are maintained [on its Github page](https://github.com/nodenv/nodenv#installation). Please visit that page to ensure you're following the latest version of the installation steps. - -## nvm - -Node Version Manager is a bash script used to manage multiple released Node.js versions. It allows -you to perform operations like install, uninstall, switch version, etc. -To install nvm, use this [install script](https://github.com/nvm-sh/nvm#install--update-script). - -On Unix / OS X systems Node.js built from source can be installed using -[nvm](https://github.com/creationix/nvm) by installing into the location that nvm expects: - -```bash -env VERSION=`python tools/getnodeversion.py` make install DESTDIR=`nvm_version_path v$VERSION` PREFIX="" -``` - -After this you can use `nvm` to switch between released versions and versions -built from source. -For example, if the version of Node.js is v8.0.0-pre: - -```bash -nvm use 8 -``` - -Once the official release is out you will want to uninstall the version built -from source: - -```bash -nvm uninstall 8 -``` - -## nvs - -#### Windows - -The `nvs` version manager is cross-platform and can be used on Windows, macOS, and Unix-like systems - -To install `nvs` on Windows go to the [release page](https://github.com/jasongin/nvs/releases) here and download the MSI installer file of the latest release. - -You can also use `chocolatey` to install it: - -```bash -choco install nvs -``` - -#### macOS,UnixLike - -You can find the documentation regarding the installation steps of `nvs` in macOS/Unix-like systems [here](https://github.com/jasongin/nvs/blob/master/doc/SETUP.md#mac-linux) - -#### Usage - -After this you can use `nvs` to switch between different versions of node. - -To add the latest version of node: - -```bash -nvs add latest -``` - -Or to add the latest LTS version of node: - -```bash -nvs add lts -``` - -Then run the `nvs use` command to add a version of node to your `PATH` for the current shell: - -```bash -$ nvs use lts -PATH -= %LOCALAPPDATA%\nvs\default -PATH += %LOCALAPPDATA%\nvs\node\14.17.0\x64 -``` - -To add it to `PATH` permanently, use `nvs link`: - -```bash -nvs link lts -``` - -## OpenBSD - -Node.js is available through the ports system. - -```bash -/usr/ports/lang/node -``` - -Using [pkg_add](https://man.openbsd.org/OpenBSD-current/man1/pkg_add.1) on OpenBSD: - -```bash -pkg_add node -``` - -## openSUSE and SLE - -Node.js is available in the main repositories under the following packages: - -- **openSUSE Leap 15.2**: `nodejs10`, `nodejs12`, `nodejs14` -- **openSUSE Tumbleweed**: `nodejs20` -- **SUSE Linux Enterprise Server (SLES) 12**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/12-SP5/#intro-modulesExtensionsRelated).) -- **SUSE Linux Enterprise Server (SLES) 15 SP2**: `nodejs10`, `nodejs12`, and `nodejs14` - (The "Web and Scripting Module" must be [enabled](https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15/#Intro.Module).) - -For example, to install Node.js 14.x on openSUSE Leap 15.2, run the following as root: - -```bash -zypper install nodejs14 -``` - -Different major versions of Node can be installed and used concurrently. - -## SmartOS and illumos - -SmartOS images come with pkgsrc pre-installed. On other illumos distributions, first install **[pkgsrc](https://pkgsrc.joyent.com/install-on-illumos/)**, then you may install the binary package as normal: - -```bash -pkgin -y install nodejs -``` - -Or build manually from pkgsrc: - -```bash -cd pkgsrc/lang/nodejs && bmake install -``` - -## Snap - -[Node.js snaps](https://github.com/nodejs/snap) are available as [`node`](https://snapcraft.io/node) on the Snap store. - -## Solus - -Solus provides Node.js in its main repository. - -```bash -sudo eopkg install nodejs -``` - -## Void Linux - -Void Linux ships Node.js stable in the main repository. - -```bash -xbps-install -Sy nodejs -``` - -## Windows - -Download the [Windows Installer](/#home-downloadhead) directly from the [nodejs.org](https://nodejs.org/) web site. - -### Alternatives - -Using **[Winget](https://aka.ms/winget-cli)**: - -```bash -winget install OpenJS.NodeJS -# or for LTS -winget install OpenJS.NodeJS.LTS -``` - -After running one of the two commands above, it may be necessary to restart the -terminal emulator before the `node` CLI command becomes available. - -Using **[Chocolatey](https://chocolatey.org/)**: - -```bash -cinst nodejs -# or for full install with npm -cinst nodejs.install -``` - -Using **[Scoop](https://scoop.sh/)**: - -```bash -scoop install nodejs -# or for LTS -scoop install nodejs-lts -``` - -## z/OS - -IBM® SDK for Node.js - z/OS® is available in two installation formats, -SMP/E and PAX. Select the installation format that applies to you: - -- [Installing and configuring SMP/E edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-smpe-edition) -- [Installing and configuring PAX edition of Node.js on z/OS](https://www.ibm.com/docs/en/sdk-nodejs-zos/14.0?topic=configuring-installing-pax-edition) diff --git a/pages/zh-cn/download/package-manager/current.mdx b/pages/zh-cn/download/package-manager/current.mdx deleted file mode 100644 index e9a55eed2a924..0000000000000 --- a/pages/zh-cn/download/package-manager/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/zh-cn/download/package-manager/index.mdx b/pages/zh-cn/download/package-manager/index.mdx deleted file mode 100644 index 89984b745c29e..0000000000000 --- a/pages/zh-cn/download/package-manager/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- Install Node.js on using - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out other community supported package managers - -
diff --git a/pages/zh-cn/download/prebuilt-binaries/current.mdx b/pages/zh-cn/download/prebuilt-binaries/current.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/zh-cn/download/prebuilt-binaries/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/zh-cn/download/prebuilt-binaries/index.mdx b/pages/zh-cn/download/prebuilt-binaries/index.mdx deleted file mode 100644 index e38141bb4befc..0000000000000 --- a/pages/zh-cn/download/prebuilt-binaries/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of Node.js for running - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out Nightly prebuilt binaries or Unofficial Builds for other platforms - -
diff --git a/pages/zh-cn/download/source-code/current.mdx b/pages/zh-cn/download/source-code/current.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/zh-cn/download/source-code/current.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/zh-cn/download/source-code/index.mdx b/pages/zh-cn/download/source-code/index.mdx deleted file mode 100644 index 17383ba65eb3e..0000000000000 --- a/pages/zh-cn/download/source-code/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: download -title: Download Node.js® -subtitle: Download Node.js the way you want. ---- - -
- I want the version of the Node.js source code. - - -
- -
- Node.js includes npm () and corepack. - -Read the blog post for this version - -Learn how to verify signed SHASUMS - -Check out how to build Node.js from source. - -
diff --git a/pages/zh-cn/index.mdx b/pages/zh-cn/index.mdx deleted file mode 100644 index deb5105a79505..0000000000000 --- a/pages/zh-cn/index.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Run JavaScript Everywhere -layout: home ---- - -
- - -
-

Run JavaScript Everywhere

- - Node.js® is a free, open-source, cross-platform JavaScript runtime - environment that lets developers create servers, web apps, - command line tools and scripts. - -
- -
- - {({ release }) => ( - <> - Download Node.js (LTS) - - Downloads Node.js {release.versionWithPrefix} - 1 with long-term support. - Node.js can also be installed via package managers. - - - )} - - - - {({ release }) => ( - - Want new features sooner? - Get Node.js {release.versionWithPrefix} - 1 instead. - - )} - - -
-
- -
-
- ```js displayName="Create an HTTP Server" - import { createServer } from 'node:http'; - - const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('Hello World!\n'); - }); - - // starts a simple http server locally on port 3000 - server.listen(3000, '127.0.0.1', () => { - console.log('Listening on 127.0.0.1:3000'); - }); - ``` - - ```js displayName="Write Tests" - import assert from 'node:assert'; - import test from 'node:test'; - - test('that 1 is equal 1', () => { - assert.strictEqual(1, 1); - }); - - test('that throws as 1 is not equal 2', () => { - // throws an exception because 1 != 2 - assert.strictEqual(1, 2); - }); - ``` - - ```js displayName="Read and Hash a File" - import { createHash } from 'node:crypto'; - import { readFile } from 'node:fs/promises'; - - const hasher = createHash('sha1'); - const fileContent = await readFile('./package.json'); - - hasher.setEncoding('hex'); - hasher.write(fileContent); - hasher.end(); - - const fileHash = hasher.read(); - ``` - - ```js displayName="Read Streams" - import { createReadStream, createWriteStream } from 'node:fs'; - - const res = await fetch('https://nodejs.org/dist/index.json'); - const json = await res.json(); // yields a json object - - const readableStream = createReadStream('./package.json'); - const writableStream = createWriteStream('./package2.json'); - - readableStream.setEncoding('utf8'); - - readableStream.on('data', chunk => writableStream.write(chunk)); - ``` - - ```js displayName="Work with Threads" - import { Worker, isMainThread, - workerData, parentPort } from 'node:worker_threads'; - - if (isMainThread) { - const data = 'some data'; - const worker = new Worker(import.meta.filename, { workerData: data }); - worker.on('message', msg => console.log('Reply from Thread:', msg)); - } else { - const source = workerData; - parentPort.postMessage(btoa(source.toUpperCase())); - } - ``` - -
- -Learn more what Node.js is able to offer with our [Learning materials](/learn). - -
diff --git a/pages/zh-cn/search.mdx b/pages/zh-cn/search.mdx deleted file mode 100644 index ac57c0e414803..0000000000000 --- a/pages/zh-cn/search.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: search -title: Search Results ---- - - diff --git a/providers/__tests__/localeProvider.test.mjs b/providers/__tests__/localeProvider.test.mjs new file mode 100644 index 0000000000000..326417992dc65 --- /dev/null +++ b/providers/__tests__/localeProvider.test.mjs @@ -0,0 +1,24 @@ +import { render } from '@testing-library/react'; + +import { LocaleProvider } from '@/providers/localeProvider'; + +jest.mock('next-intl', () => ({ + useMessages: jest.fn(() => ({ 'en-US': { greeting: 'Hello!' } })), + NextIntlClientProvider: ({ children }) => <>{children}, + useTimeZone: jest.fn(() => 'UTC'), +})); + +describe('LocaleProvider', () => { + it('renders children with messages and timeZone', () => { + const { getByText } = render( + +
Child Component
+
+ ); + + expect(getByText('Child Component')).toBeInTheDocument(); + + expect(require('next-intl').useMessages).toHaveBeenCalled(); + expect(require('next-intl').useTimeZone).toHaveBeenCalled(); + }); +}); diff --git a/providers/__tests__/matterProvider.test.mjs b/providers/__tests__/matterProvider.test.mjs new file mode 100644 index 0000000000000..699f251f46645 --- /dev/null +++ b/providers/__tests__/matterProvider.test.mjs @@ -0,0 +1,26 @@ +import { render } from '@testing-library/react'; + +import { MatterProvider, MatterContext } from '@/providers/matterProvider'; + +const mockContext = { + frontmatter: {}, + pathname: '', + headings: [], + readingTime: { text: '', minutes: 0, time: 0, words: 0 }, + filename: '', +}; + +describe('MatterProvider', () => { + it('renders the provider with the provided context value', () => { + render( + + + {value => { + expect(value).toEqual(mockContext); + return null; + }} + + + ); + }); +}); diff --git a/providers/__tests__/notificationProvider.test.mjs b/providers/__tests__/notificationProvider.test.mjs new file mode 100644 index 0000000000000..db103ac000bb0 --- /dev/null +++ b/providers/__tests__/notificationProvider.test.mjs @@ -0,0 +1,39 @@ +import { render, act, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { + NotificationProvider, + NotificationDispatch, +} from '@/providers/notificationProvider'; + +jest.useFakeTimers(); + +describe('NotificationProvider', () => { + it('renders children and shows notification with the provided message', async () => { + const testMessage = 'Test Notification'; + const testDuration = 3000; + + const { getByText } = render( + + + {dispatch => ( + + )} + + + ); + + act(() => { + userEvent.click(getByText('Show Notification')); + jest.advanceTimersByTime(testDuration); + }); + + await waitFor(() => expect(getByText(testMessage)).toBeInTheDocument()); + }); +}); diff --git a/providers/__tests__/themeProvider.test.mjs b/providers/__tests__/themeProvider.test.mjs new file mode 100644 index 0000000000000..df606275d3c23 --- /dev/null +++ b/providers/__tests__/themeProvider.test.mjs @@ -0,0 +1,30 @@ +import { render } from '@testing-library/react'; +import { ThemeProvider as NextThemeProvider } from 'next-themes'; + +import { ThemeProvider } from '@/providers/themeProvider'; + +jest.mock('next-themes', () => ({ + ThemeProvider: jest.fn(({ children }) => children), +})); + +describe('ThemeProvider', () => { + it('renders NextThemeProvider with the correct props', () => { + const { container } = render( + +
Mock Component
+
+ ); + + expect(NextThemeProvider).toHaveBeenCalledWith( + { + attribute: 'data-theme', + defaultTheme: 'system', + enableSystem: true, + storageKey: 'theme', + children:
Mock Component
, + }, + expect.any(Object) + ); + expect(container.firstChild).toHaveTextContent('Mock Component'); + }); +}); diff --git a/providers/navigationStateProvider.tsx b/providers/navigationStateProvider.tsx new file mode 100644 index 0000000000000..d37c26ecc18da --- /dev/null +++ b/providers/navigationStateProvider.tsx @@ -0,0 +1,22 @@ +'use client'; + +import { createContext, useRef } from 'react'; +import type { FC, PropsWithChildren } from 'react'; + +type NavigationStateContextType = Record; + +export const NavigationStateContext = createContext( + {} +); + +export const NavigationStateProvider: FC = ({ + children, +}) => { + const navigationState = useRef({}); + + return ( + + {children} + + ); +}; diff --git a/providers/releaseProvider.tsx b/providers/releaseProvider.tsx index c17e8748af4cd..10668654937eb 100644 --- a/providers/releaseProvider.tsx +++ b/providers/releaseProvider.tsx @@ -3,6 +3,7 @@ import type { Dispatch, PropsWithChildren, FC } from 'react'; import { createContext, useMemo, useReducer } from 'react'; +import WithChangelogModal from '@/components/withChangelogModal'; import type { NodeRelease } from '@/types'; import type { ReleaseDispatchActions, @@ -18,6 +19,7 @@ const initialState: ReleaseState = { os: 'OTHER', bitness: '', platform: 'NVM', + modalOpen: false, }; const createDispatchActions = ( @@ -27,6 +29,7 @@ const createDispatchActions = ( setOS: payload => dispatch({ type: 'SET_OS', payload }), setBitness: payload => dispatch({ type: 'SET_BITNESS', payload }), setPlatform: payload => dispatch({ type: 'SET_PLATFORM', payload }), + setModalOpen: payload => dispatch({ type: 'SET_MODAL_OPEN', payload }), }); export const ReleaseContext = createContext({ @@ -53,6 +56,8 @@ export const ReleaseProvider: FC> = ({ return { ...state, bitness: action.payload }; case 'SET_PLATFORM': return { ...state, platform: action.payload }; + case 'SET_MODAL_OPEN': + return { ...state, modalOpen: action.payload }; default: return state; } @@ -69,6 +74,12 @@ export const ReleaseProvider: FC> = ({ return ( {children} + + ); }; diff --git a/public/static/images/blog/announcements/2011-nodejs-screenshot.png b/public/static/images/blog/announcements/2011-nodejs-screenshot.png new file mode 100644 index 0000000000000..1824152ebca24 Binary files /dev/null and b/public/static/images/blog/announcements/2011-nodejs-screenshot.png differ diff --git a/public/static/images/blog/announcements/2024-grace-hopper-activity.png b/public/static/images/blog/announcements/2024-grace-hopper-activity.png new file mode 100644 index 0000000000000..17648cbc688dc Binary files /dev/null and b/public/static/images/blog/announcements/2024-grace-hopper-activity.png differ diff --git a/public/static/images/blog/announcements/2024-nodejs-figma.png b/public/static/images/blog/announcements/2024-nodejs-figma.png new file mode 100644 index 0000000000000..710802966ccca Binary files /dev/null and b/public/static/images/blog/announcements/2024-nodejs-figma.png differ diff --git a/public/static/images/blog/announcements/2024-nodejs-redesign-lighthouse.jpg b/public/static/images/blog/announcements/2024-nodejs-redesign-lighthouse.jpg new file mode 100644 index 0000000000000..a3cc9b458c79a Binary files /dev/null and b/public/static/images/blog/announcements/2024-nodejs-redesign-lighthouse.jpg differ diff --git a/public/static/images/blog/announcements/2024-nodejs-screenshot.png b/public/static/images/blog/announcements/2024-nodejs-screenshot.png new file mode 100644 index 0000000000000..9db2964a60f3d Binary files /dev/null and b/public/static/images/blog/announcements/2024-nodejs-screenshot.png differ diff --git a/public/static/images/dark-mode.svg b/public/static/images/dark-mode.svg deleted file mode 100644 index 882e1d5d9afee..0000000000000 --- a/public/static/images/dark-mode.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/public/static/images/language-picker.svg b/public/static/images/language-picker.svg deleted file mode 100644 index d3aa4eb9ef45d..0000000000000 --- a/public/static/images/language-picker.svg +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/public/static/images/light-mode.svg b/public/static/images/light-mode.svg deleted file mode 100644 index f83f069bf08bc..0000000000000 --- a/public/static/images/light-mode.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/public/static/images/logo.png b/public/static/images/logo.png deleted file mode 100644 index 6845ac0ebbfca..0000000000000 Binary files a/public/static/images/logo.png and /dev/null differ diff --git a/public/static/images/logo.svg b/public/static/images/logo.svg deleted file mode 100644 index f4446600ab402..0000000000000 --- a/public/static/images/logo.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/static/images/logos/nodejs-black.eps b/public/static/images/logos/nodejs-black.eps deleted file mode 100644 index e3186994f526e..0000000000000 Binary files a/public/static/images/logos/nodejs-black.eps and /dev/null differ diff --git a/public/static/images/logos/nodejs-dark.eps b/public/static/images/logos/nodejs-dark.eps deleted file mode 100644 index ce9c34b72bc3b..0000000000000 Binary files a/public/static/images/logos/nodejs-dark.eps and /dev/null differ diff --git a/public/static/images/logos/nodejs-green.eps b/public/static/images/logos/nodejs-green.eps deleted file mode 100644 index 6f8a8dcc68ab5..0000000000000 Binary files a/public/static/images/logos/nodejs-green.eps and /dev/null differ diff --git a/public/static/images/logos/nodejs-light.eps b/public/static/images/logos/nodejs-light.eps deleted file mode 100644 index 98124e9d1f245..0000000000000 Binary files a/public/static/images/logos/nodejs-light.eps and /dev/null differ diff --git a/public/static/images/logos/nodejs-new-pantone-black.svg b/public/static/images/logos/nodejs-new-pantone-black.svg deleted file mode 100644 index bef102d04b564..0000000000000 --- a/public/static/images/logos/nodejs-new-pantone-black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/static/images/logos/nodejs-new-pantone-white.svg b/public/static/images/logos/nodejs-new-pantone-white.svg deleted file mode 100644 index 74b772d669841..0000000000000 --- a/public/static/images/logos/nodejs-new-pantone-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/static/images/logos/nodejs.png b/public/static/images/logos/nodejs.png deleted file mode 100644 index 82ae28db16583..0000000000000 Binary files a/public/static/images/logos/nodejs.png and /dev/null differ diff --git a/public/static/images/patterns/hexagon-grid.svg b/public/static/images/patterns/hexagon-grid.svg deleted file mode 100644 index 97900417f813d..0000000000000 --- a/public/static/images/patterns/hexagon-grid.svg +++ /dev/null @@ -1,839 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/static/logos/jsIconGreen.svg b/public/static/logos/jsIconGreen.svg new file mode 100644 index 0000000000000..4d140b28eb7bf --- /dev/null +++ b/public/static/logos/jsIconGreen.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/jsIconWhite.svg b/public/static/logos/jsIconWhite.svg new file mode 100644 index 0000000000000..cc26750b457b8 --- /dev/null +++ b/public/static/logos/jsIconWhite.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsDark.svg b/public/static/logos/nodejsDark.svg new file mode 100644 index 0000000000000..762745f046f60 --- /dev/null +++ b/public/static/logos/nodejsDark.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsDarkPride.svg b/public/static/logos/nodejsDarkPride.svg new file mode 100644 index 0000000000000..023ee1c3e4049 --- /dev/null +++ b/public/static/logos/nodejsDarkPride.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/logos/nodejsLight.svg b/public/static/logos/nodejsLight.svg new file mode 100644 index 0000000000000..9fceb2a7d91e1 --- /dev/null +++ b/public/static/logos/nodejsLight.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsLightPride.svg b/public/static/logos/nodejsLightPride.svg new file mode 100644 index 0000000000000..29c9f9098cb85 --- /dev/null +++ b/public/static/logos/nodejsLightPride.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/logos/nodejsStackedBlack.svg b/public/static/logos/nodejsStackedBlack.svg new file mode 100644 index 0000000000000..c43a76b399f14 --- /dev/null +++ b/public/static/logos/nodejsStackedBlack.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsStackedDark.svg b/public/static/logos/nodejsStackedDark.svg new file mode 100644 index 0000000000000..9aac264b2d234 --- /dev/null +++ b/public/static/logos/nodejsStackedDark.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsStackedLight.svg b/public/static/logos/nodejsStackedLight.svg new file mode 100644 index 0000000000000..d43e142149270 --- /dev/null +++ b/public/static/logos/nodejsStackedLight.svg @@ -0,0 +1 @@ + diff --git a/public/static/logos/nodejsStackedWhite.svg b/public/static/logos/nodejsStackedWhite.svg new file mode 100644 index 0000000000000..dd9dbd25e24c4 --- /dev/null +++ b/public/static/logos/nodejsStackedWhite.svg @@ -0,0 +1 @@ + diff --git a/redirects.json b/redirects.json index 3907eaf608a6d..8889da2b0973b 100644 --- a/redirects.json +++ b/redirects.json @@ -152,6 +152,10 @@ "source": "/(static/|)apple-touch-icon(.*).png", "destination": "/static/images/favicons/favicon.png" }, + { + "source": "/(static/)images/logo.svg", + "destination": "/static/logos/nodejsLight.svg" + }, { "source": "/logos/:path*", "destination": "/static/images/logos/:path*" @@ -172,6 +176,10 @@ "source": "/:locale/docs/guides", "destination": "/:locale/guides" }, + { + "source": "/:locale/docs/guides/domain-postmortem", + "destination": "/:locale/blog/community/domain-postmortem" + }, { "source": "/:locale/docs/es6", "destination": "/:locale/learn/getting-started/ecmascript-2015-es6-and-beyond" @@ -267,6 +275,14 @@ { "source": "/:locale/blog/weekly-updates/:path*", "destination": "/:locale/blog/weekly/:path*" + }, + { + "source": "/:locale/download", + "destination": "/:locale/download/package-manager" + }, + { + "source": "/:locale/download/current", + "destination": "/:locale/download/package-manager/current" } ], "internal": [] diff --git a/scripts/orama-search/sync-orama-cloud.mjs b/scripts/orama-search/sync-orama-cloud.mjs index 91a734cc13877..ba80b38684253 100644 --- a/scripts/orama-search/sync-orama-cloud.mjs +++ b/scripts/orama-search/sync-orama-cloud.mjs @@ -12,6 +12,8 @@ const oramaHeaders = { Authorization: `Bearer ${API_KEY}`, }; +console.log(`Syncing ${siteContent.length} documents to Orama Cloud index`); + // Orama allows to send several documents at once, so we batch them in groups of 50. // This is not strictly necessary, but it makes the process faster. const runUpdate = async () => { @@ -22,38 +24,55 @@ const runUpdate = async () => { batches.push(siteContent.slice(i, i + batchSize)); } + console.log(`Sending ${batches.length} batches of ${batchSize} documents`); + await Promise.all(batches.map(insertBatch)); }; // We call the "notify" API to upsert the documents in the index. // Orama will keep a queue of all the documents we send, and will process them once we call the "deploy" API. // Full docs on the "notify" API: https://docs.oramasearch.com/cloud/data-sources/custom-integrations/webhooks#updating-removing-inserting-elements-in-a-live-index -const insertBatch = async batch => - await fetch(`${ORAMA_API_BASE_URL}/notify`, { +const insertBatch = async batch => { + const { ok, statusText } = await fetch(`${ORAMA_API_BASE_URL}/notify`, { method: 'POST', headers: oramaHeaders, body: JSON.stringify({ upsert: batch }), }); + if (!ok) { + throw new Error(`Request to "/notify" failed with status: ${statusText}`); + } +}; + // We call the "deploy" API to trigger a deployment of the index, which will process all the documents in the queue. // Full docs on the "deploy" API: https://docs.oramasearch.com/cloud/data-sources/custom-integrations/webhooks#deploying-the-index -const triggerDeployment = async () => - await fetch(`${ORAMA_API_BASE_URL}/deploy`, { +const triggerDeployment = async () => { + const { ok, statusText } = await fetch(`${ORAMA_API_BASE_URL}/deploy`, { method: 'POST', headers: oramaHeaders, }); + if (!ok) { + throw new Error(`Request to "/deploy" failed with status: ${statusText}`); + } +}; + // We call the "snapshot" API to empty the index before inserting the new documents. // The "snapshot" API is typically used to replace the entire index with a fresh set of documents, but we use it here to empty the index. // This operation gets queued, so the live index will still be available until we call the "deploy" API and redeploy the index. // Full docs on the "snapshot" API: https://docs.oramasearch.com/cloud/data-sources/custom-integrations/webhooks#inserting-a-snapshot -const emptyOramaIndex = async () => - await fetch(`${ORAMA_API_BASE_URL}/snapshot`, { +const emptyOramaIndex = async () => { + const { ok, statusText } = await fetch(`${ORAMA_API_BASE_URL}/snapshot`, { method: 'POST', headers: oramaHeaders, body: JSON.stringify([]), }); + if (!ok) { + throw new Error(`Request to "/snapshot" failed with status: ${statusText}`); + } +}; + // Now we proceed to call the APIs in order: // 1. Empty the index // 2. Insert the documents @@ -63,3 +82,5 @@ const emptyOramaIndex = async () => await emptyOramaIndex(); await runUpdate(); await triggerDeployment(); + +console.log('Orama Cloud sync completed successfully!'); diff --git a/scripts/release-post/index.mjs b/scripts/release-post/index.mjs index 3ab721604ea7b..35899003256e8 100644 --- a/scripts/release-post/index.mjs +++ b/scripts/release-post/index.mjs @@ -28,7 +28,7 @@ import handlebars from 'handlebars'; import { format } from 'prettier'; import { downloadsTable } from './downloadsTable.mjs'; -import prettierConfig from '../../.prettierrc.json' assert { type: 'json' }; +import prettierConfig from '../../.prettierrc.json' with { type: 'json' }; import { getRelativePath } from '../../next.helpers.mjs'; const URLS = { diff --git a/sentry.client.config.ts b/sentry.client.config.ts index e1b9262810860..f29159d28fc37 100644 --- a/sentry.client.config.ts +++ b/sentry.client.config.ts @@ -1,12 +1,12 @@ import { - Dedupe, - Breadcrumbs, - HttpContext, - LinkedErrors, BrowserClient, - getCurrentHub, defaultStackParser, makeFetchTransport, + setCurrentClient, + breadcrumbsIntegration, + dedupeIntegration, + httpContextIntegration, + linkedErrorsIntegration, } from '@sentry/nextjs'; import { @@ -28,10 +28,10 @@ export const sentryClient = new BrowserClient({ stackParser: defaultStackParser, // All supported Integrations by us integrations: [ - new Dedupe(), - new HttpContext(), - new Breadcrumbs(), - new LinkedErrors(), + dedupeIntegration(), + httpContextIntegration(), + breadcrumbsIntegration(), + linkedErrorsIntegration(), ], // We only want to allow ingestion from these pre-selected allowed URLs // Note that the vercel.app prefix is for our Pull Request Branch Previews @@ -59,10 +59,14 @@ export const sentryClient = new BrowserClient({ }); // Attaches this Browser Client to Sentry -getCurrentHub().bindClient(sentryClient); +setCurrentClient(sentryClient); // Loads this Dynamically to avoid adding this to the main bundle (initial load) -import('@sentry/nextjs').then(({ Replay, BrowserTracing }) => { - sentryClient.addIntegration(new Replay({ maskAllText: false })); - sentryClient.addIntegration(new BrowserTracing()); -}); +const lazyLoadSentryIntegrations = async () => { + const { addIntegration, replayIntegration, browserTracingIntegration } = + await import('@sentry/nextjs'); + addIntegration(replayIntegration({ maskAllText: false })); + addIntegration(browserTracingIntegration()); +}; + +lazyLoadSentryIntegrations(); diff --git a/sentry.edge.config.ts b/sentry.edge.config.ts deleted file mode 100644 index 1c78bf978fdf9..0000000000000 --- a/sentry.edge.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { init } from '@sentry/nextjs'; - -import { - SENTRY_CAPTURE_RATE, - SENTRY_DSN, - SENTRY_ENABLE, -} from '@/sentry.constants.mjs'; - -init({ - // Only run Sentry on Vercel Environment - enabled: SENTRY_ENABLE, - // Provide Sentry's Secret Key - dsn: SENTRY_DSN, - // Percentage of events to send to Sentry (1% of them) (for performance metrics) - tracesSampleRate: SENTRY_CAPTURE_RATE, -}); diff --git a/sentry.server.config.ts b/sentry.server.config.ts deleted file mode 100644 index 1c78bf978fdf9..0000000000000 --- a/sentry.server.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { init } from '@sentry/nextjs'; - -import { - SENTRY_CAPTURE_RATE, - SENTRY_DSN, - SENTRY_ENABLE, -} from '@/sentry.constants.mjs'; - -init({ - // Only run Sentry on Vercel Environment - enabled: SENTRY_ENABLE, - // Provide Sentry's Secret Key - dsn: SENTRY_DSN, - // Percentage of events to send to Sentry (1% of them) (for performance metrics) - tracesSampleRate: SENTRY_CAPTURE_RATE, -}); diff --git a/shiki.config.mjs b/shiki.config.mjs index 3c353ea39fe5a..cdfecd2716981 100644 --- a/shiki.config.mjs +++ b/shiki.config.mjs @@ -4,6 +4,7 @@ import diffLanguage from 'shiki/langs/diff.mjs'; import dockerLanguage from 'shiki/langs/docker.mjs'; import javaScriptLanguage from 'shiki/langs/javascript.mjs'; import jsonLanguage from 'shiki/langs/json.mjs'; +import powershellLanguage from 'shiki/langs/powershell.mjs'; import shellScriptLanguage from 'shiki/langs/shellscript.mjs'; import shellSessionLanguage from 'shiki/langs/shellsession.mjs'; import typeScriptLanguage from 'shiki/langs/typescript.mjs'; @@ -34,6 +35,12 @@ export const LANGUAGES = [ aliases: ['bash', 'sh', 'shell', 'zsh'], displayName: 'Bash', }, + { + ...powershellLanguage[0], + scopeName: 'source.powershell', + aliases: ['ps', 'ps1'], + displayName: 'PowerShell', + }, { ...shellSessionLanguage[0], scopeName: 'text.shell-session', diff --git a/site.json b/site.json index 2565262f6229f..898fcbb05fe11 100644 --- a/site.json +++ b/site.json @@ -3,6 +3,7 @@ "description": "Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.", "favicon": "/static/images/favicons/favicon.png", "accentColor": "#333", + "logoVariant": "pride", "twitter": { "username": "@nodejs", "card": "summary", @@ -28,11 +29,21 @@ ], "websiteBanners": { "index": { - "startDate": "2024-02-14T15:30:00.000Z", - "endDate": "2024-02-21T17:30:00.000Z", - "text": "New security releases available", - "link": "https://nodejs.org/en/blog/vulnerability/february-2024-security-releases/" + "startDate": "2024-04-24T03:00:00.000Z", + "endDate": "2024-05-17T17:30:00.000Z", + "text": "Node.js v22 is now available!", + "link": "https://nodejs.org/en/blog/announcements/v22-release-announce", + "type": "default" } }, - "websiteBadges": {} + "websiteBadges": { + "index": { + "startDate": "2024-04-24T00:00:00.000Z", + "endDate": "2024-05-24T00:00:00.000Z", + "kind": "default", + "title": "Survey", + "text": "Help us shape the next 10 years of Node.js", + "link": "https://linuxfoundation.surveymonkey.com/r/nodenext10survey24" + } + } } diff --git a/styles/base.css b/styles/base.css index 94ba4f6a214d9..419556096a755 100644 --- a/styles/base.css +++ b/styles/base.css @@ -1,17 +1,19 @@ * { - @apply subpixel-antialiased; + @apply subpixel-antialiased + motion-safe:transition-colors; } html, body { - @apply size-full; + @apply size-full + [scrollbar-gutter:auto]; } body { - @apply scroll-smooth - bg-white + @apply bg-white font-open-sans text-neutral-950 + motion-safe:scroll-smooth dark:bg-neutral-950 dark:text-white; } diff --git a/styles/effects.css b/styles/effects.css index c3e28deceb23b..0f1061ba3157d 100644 --- a/styles/effects.css +++ b/styles/effects.css @@ -10,29 +10,3 @@ h1.special { md:leading-[4rem] md:-tracking-[0.06rem]; } - -div.glowingBackdrop { - @apply absolute - left-0 - top-0 - -z-10 - size-full - bg-[url('/static/images/patterns/hexagon-grid.svg')] - bg-center - bg-no-repeat - opacity-50 - md:opacity-100; - - &::after { - @apply absolute - inset-0 - m-auto - aspect-square - w-[300px] - rounded-full - bg-green-300 - blur-[120px] - content-[''] - dark:bg-green-700; - } -} diff --git a/styles/markdown.css b/styles/markdown.css index ba41ed0a200e0..3ef93efb048d9 100644 --- a/styles/markdown.css +++ b/styles/markdown.css @@ -34,6 +34,18 @@ main { @apply text-base; } + h1, + h2, + h3, + h4, + h5, + h6 { + &[id] a { + @apply text-neutral-900 + dark:text-white; + } + } + h1, h2, h3, @@ -63,10 +75,11 @@ main { dark:text-white; } - a { + a, + .anchor { @apply text-green-600 dark:text-green-400 - xs:underline; + max-xs:font-semibold; &:hover { @apply text-green-900 @@ -74,12 +87,12 @@ main { } &[role='button'] { - @apply xs:no-underline; + @apply max-xs:font-regular; } &:has(code) { - @apply xs:decoration-neutral-800 - dark:xs:decoration-neutral-200; + @apply max-xs:decoration-neutral-800 + dark:max-xs:decoration-neutral-200; } } @@ -131,8 +144,8 @@ main { text-neutral-900 dark:border-neutral-800 dark:text-white - xs:block - xs:border-l-0; + max-xs:block + max-xs:border-l-0; > a { @apply pr-2; @@ -147,7 +160,7 @@ main { @apply sm:border-b-0; &:last-child { - @apply xs:border-b-0; + @apply max-xs:border-b-0; } } diff --git a/tailwind.config.ts b/tailwind.config.ts index 54767ff20f8cb..60992522b0ca3 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -118,7 +118,7 @@ export default { 'ibm-plex-mono': ['var(--font-ibm-plex-mono)'], }, extend: { - screens: { xs: { max: '670px', min: '0px' } }, + screens: { xs: '670px' }, backgroundImage: { 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', 'gradient-subtle': diff --git a/turbo.json b/turbo.json index 84c680a424398..08d456e7556a4 100644 --- a/turbo.json +++ b/turbo.json @@ -1,8 +1,8 @@ { "$schema": "https://turbo.build/schema.json", "globalEnv": ["NODE_ENV"], - "pipeline": { - "serve": { + "tasks": { + "dev": { "cache": false, "persistent": true, "env": [ @@ -83,41 +83,33 @@ ] }, "lint:js": { - "cache": false, + "inputs": [ + "{app,components,hooks,i18n,layouts,middlewares,pages,providers,types,util}/**/*.{ts,tsx,mjs}", + "{next-data,scripts,i18n}/**/*.{mjs,json}", + "{.storybook,public}/**/*.{ts,js,json}", + "*.{json,ts,tsx}" + ], "outputs": [".eslintjscache"] }, "lint:md": { - "cache": false, + "inputs": ["{app,pages}/**/*.{md,mdx}", "*.{md,mdx}"], "outputs": [".eslintmdcache"] }, "lint:css": { - "cache": false, + "inputs": ["{app,components,layouts,pages,styles}/**/*.css"], "outputs": [".stylelintcache"] }, - "lint": { - "cache": false, - "outputs": [".eslintjscache", ".eslintmdcache", ".stylelintcache"] - }, "lint:fix": { - "cache": false, - "outputs": [".eslintjscache", ".eslintmdcache", ".stylelintcache"] + "cache": false }, "prettier": { - "cache": false, "outputs": [".prettiercache"] }, "prettier:fix": { - "cache": false, - "outputs": [".prettiercache"] + "cache": false }, "format": { - "cache": false, - "outputs": [ - ".eslintjscache", - ".eslintmdcache", - ".stylelintcache", - ".prettiercache" - ] + "cache": false }, "storybook": { "cache": false, @@ -143,16 +135,6 @@ "*.{md,mdx,json,ts,tsx,mjs,yml}" ], "outputs": ["coverage/**", "junit.xml"] - }, - "test": { - "inputs": [ - "{app,components,hooks,i18n,layouts,middlewares,pages,providers,types,util}/**/*.{ts,tsx,mjs}", - "{app,components,layouts,pages,styles}/**/*.css", - "{next-data,scripts,i18n}/**/*.{mjs,json}", - "{app,pages}/**/*.{mdx,md}", - "*.{md,mdx,json,ts,tsx,mjs,yml}" - ], - "outputs": ["coverage/**", "junit.xml"] } } } diff --git a/types/blog.ts b/types/blog.ts index 113759ec136ad..d59650087c380 100644 --- a/types/blog.ts +++ b/types/blog.ts @@ -3,6 +3,7 @@ export type BlogPreviewType = 'announcements' | 'release' | 'vulnerability'; export interface BlogPost { title: string; author: string; + username: string; date: Date; categories: Array; slug: string; diff --git a/types/config.ts b/types/config.ts index 5af985abd3d3d..2d02e81e5da45 100644 --- a/types/config.ts +++ b/types/config.ts @@ -13,6 +13,8 @@ export interface OGConfig { imgHeight: string; } +export type LogoVariant = 'default' | 'pride'; + export interface SiteConfig { title: string; description: string; @@ -21,8 +23,15 @@ export interface SiteConfig { lightAccentColor: string; darkAccentColor: string; og: OGConfig; + logoVariant: LogoVariant; twitter: TwitterConfig; rssFeeds: Array; websiteBanners: Record; websiteBadges: Record; } + +export interface Author { + id: string; + name: string; + website: string; +} diff --git a/types/frontmatter.ts b/types/frontmatter.ts index 156f225390f16..05723506e6bb0 100644 --- a/types/frontmatter.ts +++ b/types/frontmatter.ts @@ -6,6 +6,7 @@ export interface LegacyFrontMatter extends Record { layout?: Layouts; title?: string; labels?: Record; + authors?: string; } // @TODO: Extra data from Frontmatter should not be a thing in the future diff --git a/types/navigation.ts b/types/navigation.ts index 9dbaefe2aa23b..73ff3aabb562f 100644 --- a/types/navigation.ts +++ b/types/navigation.ts @@ -1,3 +1,5 @@ +import type { HTMLAttributeAnchorTarget } from 'react'; + export interface FooterConfig { text: string; link: string; @@ -22,6 +24,7 @@ export interface NavigationEntry { label?: string; link?: string; items?: Record; + target?: HTMLAttributeAnchorTarget | undefined; } export interface SiteNavigation { diff --git a/types/release.ts b/types/release.ts index 4cbe96bc8fd04..b1e794e940c8c 100644 --- a/types/release.ts +++ b/types/release.ts @@ -3,7 +3,7 @@ import type { ReactNode } from 'react'; import type { NodeRelease } from '@/types/releases'; import type { UserOS } from '@/types/userOS'; -export type PackageManager = 'NVM' | 'BREW' | 'DOCKER' | 'CHOCO'; +export type PackageManager = 'NVM' | 'FNM' | 'BREW' | 'DOCKER' | 'CHOCO'; export interface ReleaseState { os: UserOS; @@ -11,19 +11,22 @@ export interface ReleaseState { releases: Array; bitness: string | number; platform: PackageManager; + modalOpen: boolean; } export type ReleaseAction = | { type: 'SET_OS'; payload: UserOS } | { type: 'SET_VERSION'; payload: string } | { type: 'SET_BITNESS'; payload: string | number } - | { type: 'SET_PLATFORM'; payload: PackageManager }; + | { type: 'SET_PLATFORM'; payload: PackageManager } + | { type: 'SET_MODAL_OPEN'; payload: boolean }; export interface ReleaseDispatchActions { setVersion: (version: string) => void; setOS: (os: UserOS) => void; setBitness: (bitness: string | number) => void; setPlatform: (platform: PackageManager) => void; + setModalOpen: (open: boolean) => void; } export interface ReleaseContextType diff --git a/types/releases.ts b/types/releases.ts index b3ff09379375f..2fc4a4f101d54 100644 --- a/types/releases.ts +++ b/types/releases.ts @@ -1,9 +1,4 @@ -export type NodeReleaseStatus = - | 'Maintenance LTS' - | 'Active LTS' - | 'Current' - | 'End-of-life' - | 'Pending'; +export type NodeReleaseStatus = 'LTS' | 'Current' | 'End-of-life' | 'Pending'; export interface NodeReleaseSource { major: number; diff --git a/types/userOS.ts b/types/userOS.ts index fe5c03131bd66..3c3ea522e213d 100644 --- a/types/userOS.ts +++ b/types/userOS.ts @@ -1 +1 @@ -export type UserOS = 'MAC' | 'WIN' | 'LINUX' | 'OTHER'; +export type UserOS = 'MAC' | 'WIN' | 'LINUX' | 'AIX' | 'OTHER' | 'LOADING'; diff --git a/util/__tests__/assignClientContext.test.mjs b/util/__tests__/assignClientContext.test.mjs new file mode 100644 index 0000000000000..8a5f216f6fb8a --- /dev/null +++ b/util/__tests__/assignClientContext.test.mjs @@ -0,0 +1,43 @@ +import { assignClientContext } from '@/util/assignClientContext'; + +const mockContext = { + frontmatter: { title: 'Sample Title' }, + pathname: '/sample-path', + headings: ['Heading 1', 'Heading 2'], + readingTime: { + text: '2 mins read', + minutes: 2, + time: 120000, + words: 200, + }, + filename: 'sample-file.md', +}; + +describe('assignClientContext', () => { + it('should assign properties to the client context', () => { + const result = assignClientContext(mockContext); + + expect(result.frontmatter).toEqual(mockContext.frontmatter); + expect(result.pathname).toEqual(mockContext.pathname); + expect(result.headings).toEqual(mockContext.headings); + expect(result.readingTime).toEqual(mockContext.readingTime); + expect(result.filename).toEqual(mockContext.filename); + + expect(result).toEqual(mockContext); + }); + + it('should use default values for missing properties', () => { + const result = assignClientContext({}); + + expect(result.frontmatter).toEqual({}); + expect(result.pathname).toEqual(''); + expect(result.headings).toEqual([]); + expect(result.readingTime).toEqual({ + text: '', + minutes: 0, + time: 0, + words: 0, + }); + expect(result.filename).toEqual(''); + }); +}); diff --git a/util/__tests__/blogUtils.test.mjs b/util/__tests__/blogUtils.test.mjs new file mode 100644 index 0000000000000..3d22068e50778 --- /dev/null +++ b/util/__tests__/blogUtils.test.mjs @@ -0,0 +1,82 @@ +import { mapAuthorToCardAuthors } from '../blogUtils'; + +describe('mapAuthorToCardAuthors', () => { + it('maps authors to card authors with default avatar source', () => { + const author = 'John Doe'; + + const result = mapAuthorToCardAuthors(author); + + expect(result).toEqual([ + { + fullName: 'John Doe', + src: 'https://ui-avatars.com/api/?name=John Doe', + }, + ]); + }); + + it('handles multiple authors separated by various delimiters', () => { + const author = 'Alice, Bob, Charlie, David'; + + const result = mapAuthorToCardAuthors(author); + expect(result).toEqual([ + { fullName: 'Alice', src: 'https://ui-avatars.com/api/?name=Alice' }, + { fullName: 'Bob', src: 'https://ui-avatars.com/api/?name=Bob' }, + { fullName: 'Charlie', src: 'https://ui-avatars.com/api/?name=Charlie' }, + { fullName: 'David', src: 'https://ui-avatars.com/api/?name=David' }, + ]); + }); + + describe('when has more than one author', () => { + it.each([ + ['Timothy J Fontaine, John Doe'], + ['Timothy J Fontaine and John Doe'], + ['Timothy J Fontaine;John Doe'], + ['Timothy J Fontaine & John Doe'], + ['Timothy J Fontaine by John Doe'], + ['Timothy J Fontaine prepared by John Doe'], + ])('returns the correct card authors', author => { + const result = mapAuthorToCardAuthors(author); + + expect(result).toStrictEqual([ + { + fullName: 'Timothy J Fontaine', + src: 'https://avatars.githubusercontent.com/tjfontaine', + }, + { + fullName: 'John Doe', + src: 'https://ui-avatars.com/api/?name=John Doe', + }, + ]); + }); + }); + + describe('when the author name does not have GitHub username', () => { + it('returns the correct card authors', () => { + const result = mapAuthorToCardAuthors('John Doe, Jane Doe'); + + expect(result).toStrictEqual([ + { + fullName: 'John Doe', + src: 'https://ui-avatars.com/api/?name=John Doe', + }, + { + fullName: 'Jane Doe', + src: 'https://ui-avatars.com/api/?name=Jane Doe', + }, + ]); + }); + }); + + describe('when the author name has GitHub username', () => { + it('returns the correct card authors', () => { + const result = mapAuthorToCardAuthors('Timothy J Fontaine'); + + expect(result).toStrictEqual([ + { + fullName: 'Timothy J Fontaine', + src: 'https://avatars.githubusercontent.com/tjfontaine', + }, + ]); + }); + }); +}); diff --git a/util/__tests__/dateUtils.test.mjs b/util/__tests__/dateUtils.test.mjs index 5d89da8576384..5fe75341814bb 100644 --- a/util/__tests__/dateUtils.test.mjs +++ b/util/__tests__/dateUtils.test.mjs @@ -1,4 +1,4 @@ -import { dateIsBetween } from '../dateUtils'; +import { dateIsBetween } from '@/util/dateUtils'; describe('dateIsBetween', () => { it('returns true when the current date is between start and end dates', () => { diff --git a/util/__tests__/debounce.test.mjs b/util/__tests__/debounce.test.mjs new file mode 100644 index 0000000000000..401feb699b65c --- /dev/null +++ b/util/__tests__/debounce.test.mjs @@ -0,0 +1,31 @@ +import { debounce } from '@/util/debounce'; + +describe('debounce', () => { + jest.useFakeTimers(); + + it('should call the function only once', () => { + const fn = jest.fn(); + const debouncedFn = debounce(fn, 1000); + + debouncedFn(); + debouncedFn(); + debouncedFn(); + + jest.runAllTimers(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('should call the function with the last arguments', () => { + const fn = jest.fn(); + const debouncedFn = debounce(fn, 1000); + + debouncedFn(1); + debouncedFn(2); + debouncedFn(3); + + jest.runAllTimers(); + + expect(fn).toHaveBeenCalledWith(3); + }); +}); diff --git a/util/__tests__/downloadUtils.test.mjs b/util/__tests__/downloadUtils.test.mjs index fba82ecc2687c..f879487bab25a 100644 --- a/util/__tests__/downloadUtils.test.mjs +++ b/util/__tests__/downloadUtils.test.mjs @@ -103,8 +103,8 @@ describe('mapCategoriesToTabs', () => { page: 'download', categories: [ { - category: 'download', - label: 'Download', + category: 'prebuilt-binaries', + label: 'Prebuilt Binaries', }, { category: 'package-manager', @@ -115,7 +115,11 @@ describe('mapCategoriesToTabs', () => { }); expect(result).toEqual([ - { key: 'download', label: 'Download', link: '/download/current' }, + { + key: 'prebuilt-binaries', + label: 'Prebuilt Binaries', + link: '/download/prebuilt-binaries/current', + }, { key: 'package-manager', label: 'Package Manager', @@ -129,8 +133,8 @@ describe('mapCategoriesToTabs', () => { page: 'download', categories: [ { - category: 'download', - label: 'Download', + category: 'prebuilt-binaries', + label: 'Prebuilt Binaries', }, { category: 'package-manager', @@ -140,7 +144,11 @@ describe('mapCategoriesToTabs', () => { }); expect(result).toEqual([ - { key: 'download', label: 'Download', link: '/download' }, + { + key: 'prebuilt-binaries', + label: 'Prebuilt Binaries', + link: '/download/prebuilt-binaries', + }, { key: 'package-manager', label: 'Package Manager', diff --git a/util/__tests__/getBitness.test.mjs b/util/__tests__/getBitness.test.mjs new file mode 100644 index 0000000000000..9fe4feeba15f5 --- /dev/null +++ b/util/__tests__/getBitness.test.mjs @@ -0,0 +1,53 @@ +import { getBitness } from '@/util/getBitness'; + +describe('getBitness', () => { + it('returns the bitness value when available', async () => { + const mockGetHighEntropyValues = jest + .fn() + .mockResolvedValue({ bitness: 64 }); + + const mockNavigator = { + userAgentData: { getHighEntropyValues: mockGetHighEntropyValues }, + }; + + jest.spyOn(global, 'navigator', 'get').mockReturnValue(mockNavigator); + + const result = await getBitness(); + + expect(result).toBe(64); + expect(mockGetHighEntropyValues).toHaveBeenCalledWith(['bitness']); + + jest.restoreAllMocks(); + }); + + it('returns undefined when navigator.userAgentData or getHighEntropyValues is not available', async () => { + const mockNavigator = {}; + + jest.spyOn(global, 'navigator', 'get').mockReturnValue(mockNavigator); + + const result = await getBitness(); + + expect(result).toBeUndefined(); + + jest.restoreAllMocks(); + }); + + it('returns undefined when getHighEntropyValues fails', async () => { + const mockGetHighEntropyValues = jest + .fn() + .mockRejectedValue(new Error('Some error')); + + const mockNavigator = { + userAgentData: { getHighEntropyValues: mockGetHighEntropyValues }, + }; + + jest.spyOn(global, 'navigator', 'get').mockReturnValue(mockNavigator); + + const result = await getBitness(); + + expect(result).toBeUndefined(); + expect(mockGetHighEntropyValues).toHaveBeenCalledWith(['bitness']); + + jest.restoreAllMocks(); + }); +}); diff --git a/util/__tests__/getNodeApiLink.test.mjs b/util/__tests__/getNodeApiLink.test.mjs index b2ba205775e53..5317855c62aa7 100644 --- a/util/__tests__/getNodeApiLink.test.mjs +++ b/util/__tests__/getNodeApiLink.test.mjs @@ -1,4 +1,4 @@ -import { getNodeApiLink } from '../getNodeApiLink'; +import { getNodeApiLink } from '@/util/getNodeApiLink'; describe('getNodeApiLink', () => { it('returns the correct API link for versions >=0.3.1 and <0.5.1', () => { diff --git a/util/__tests__/getNodeDownloadUrl.mjs b/util/__tests__/getNodeDownloadUrl.test.mjs similarity index 98% rename from util/__tests__/getNodeDownloadUrl.mjs rename to util/__tests__/getNodeDownloadUrl.test.mjs index e1b0450ce2008..c95fa48e66126 100644 --- a/util/__tests__/getNodeDownloadUrl.mjs +++ b/util/__tests__/getNodeDownloadUrl.test.mjs @@ -32,7 +32,7 @@ describe('getNodeDownloadUrl', () => { it('returns the default download URL for other operating systems', () => { const os = 'OTHER'; const bitness = 86; - const expectedUrl = 'https://nodejs.org/dist/v18.16.0/node-v18.16.0.tar.xz'; + const expectedUrl = 'https://nodejs.org/dist/v18.16.0/node-v18.16.0.tar.gz'; expect(getNodeDownloadUrl(version, os, bitness)).toBe(expectedUrl); }); diff --git a/util/__tests__/getNodeJsChangelog.test.mjs b/util/__tests__/getNodeJsChangelog.test.mjs index a5f76e633b140..d225ee21179fe 100644 --- a/util/__tests__/getNodeJsChangelog.test.mjs +++ b/util/__tests__/getNodeJsChangelog.test.mjs @@ -1,12 +1,12 @@ -import { getNodejsChangelog } from '../getNodeJsChangelog'; +import { getNodeJsChangelog } from '@/util/getNodeJsChangelog'; -describe('getNodejsChangelog', () => { +describe('getNodeJsChangelog', () => { it('returns the correct changelog URL for major version >= 4', () => { const version = '14.2.0'; const expectedUrl = 'https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V14.md#14.2.0'; - const result = getNodejsChangelog(version); + const result = getNodeJsChangelog(version); expect(result).toBe(expectedUrl); }); @@ -16,7 +16,7 @@ describe('getNodejsChangelog', () => { const expectedUrl = 'https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_IOJS.md#1.8.3'; - const result = getNodejsChangelog(version); + const result = getNodeJsChangelog(version); expect(result).toBe(expectedUrl); }); @@ -26,7 +26,7 @@ describe('getNodejsChangelog', () => { const expectedUrl1 = 'https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V6.md#6.12.0'; - const result1 = getNodejsChangelog(version1); + const result1 = getNodeJsChangelog(version1); expect(result1).toBe(expectedUrl1); @@ -34,7 +34,7 @@ describe('getNodejsChangelog', () => { const expectedUrl2 = 'https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V8.md#8.10.0'; - const result2 = getNodejsChangelog(version2); + const result2 = getNodeJsChangelog(version2); expect(result2).toBe(expectedUrl2); }); @@ -44,7 +44,7 @@ describe('getNodejsChangelog', () => { const expectedUrl = 'https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V012.md#0.12.7'; - const result = getNodejsChangelog(version); + const result = getNodeJsChangelog(version); expect(result).toBe(expectedUrl); }); diff --git a/util/__tests__/getUserBitnessByArchitecture.test.mjs b/util/__tests__/getUserBitnessByArchitecture.test.mjs new file mode 100644 index 0000000000000..e6243c4cf344f --- /dev/null +++ b/util/__tests__/getUserBitnessByArchitecture.test.mjs @@ -0,0 +1,13 @@ +import { getUserBitnessByArchitecture } from '@/util/getUserBitnessByArchitecture'; + +describe('getUserBitnessByArchitecture', () => { + it('should return "arm64" for arm architecture and 64-bit', () => { + const result = getUserBitnessByArchitecture('arm', 64); + expect(result).toBe('arm64'); + }); + + it('should return the user bitness for other architectures', () => { + const result = getUserBitnessByArchitecture('x86', 32); + expect(result).toBe(32); + }); +}); diff --git a/util/__tests__/gitHubUtils.test.mjs b/util/__tests__/gitHubUtils.test.mjs index 5597118077551..de97c0531fc5e 100644 --- a/util/__tests__/gitHubUtils.test.mjs +++ b/util/__tests__/gitHubUtils.test.mjs @@ -1,9 +1,33 @@ -import { getGitHubAvatarUrl } from '@/util/gitHubUtils'; +import { + getGitHubAvatarUrl, + createGitHubSlugger, + getGitHubBlobUrl, + getGitHubApiDocsUrl, +} from '@/util/gitHubUtils'; -describe('Github utils', () => { +describe('GitHub utils', () => { it('getGitHubAvatarUrl returns the correct URL', () => { expect(getGitHubAvatarUrl('octocat')).toBe( 'https://avatars.githubusercontent.com/octocat' ); }); + + it('createGitHubSlugger returns a slugger', () => { + const slugger = createGitHubSlugger(); + expect(slugger).toBeDefined(); + }); + + it('getGitHubBlobUrl returns the correct URL', () => { + const result = getGitHubBlobUrl('learn/getting-started/introduction.md'); + const expected = + 'https://github.com/nodejs/nodejs.org/blob/main/pages/en/learn/getting-started/introduction.md'; + expect(result).toBe(expected); + }); + + it('getGitHubApiDocsUrl returns the correct URL', () => { + const result = getGitHubApiDocsUrl('assert'); + const expected = + 'https://api.github.com/repos/nodejs/node/contents/doc/api?ref=assert'; + expect(result).toBe(expected); + }); }); diff --git a/util/__tests__/hexToRGBA.test.mjs b/util/__tests__/hexToRGBA.test.mjs new file mode 100644 index 0000000000000..2e7ca9e00b3d2 --- /dev/null +++ b/util/__tests__/hexToRGBA.test.mjs @@ -0,0 +1,17 @@ +import { hexToRGBA } from '@/util/hexToRGBA'; + +describe('hexToRGBA', () => { + it('should convert a hex color to an rgba color', () => { + const hexColor = '#000000'; + const rgbaColor = hexToRGBA(hexColor, 0.5); + + expect(rgbaColor).toBe('rgba(0, 0, 0, 0.5)'); + }); + + it('should convert a hex color to an rgba color', () => { + const hexColor = '#ffffff'; + const rgbaColor = hexToRGBA(hexColor, 0.5); + + expect(rgbaColor).toBe('rgba(255, 255, 255, 0.5)'); + }); +}); diff --git a/util/__tests__/stringUtils.test.mjs b/util/__tests__/stringUtils.test.mjs index 05362d4938f7c..27e65f1b0355e 100644 --- a/util/__tests__/stringUtils.test.mjs +++ b/util/__tests__/stringUtils.test.mjs @@ -1,6 +1,7 @@ import { getAcronymFromString, parseRichTextIntoPlainText, + dashToCamelCase, } from '@/util/stringUtils'; describe('String utils', () => { @@ -16,49 +17,59 @@ describe('String utils', () => { expect(getAcronymFromString('')).toBe(''); }); - it('parseRichTextIntoPlainText returns the correct plain text from an HTML tag', () => { - expect(parseRichTextIntoPlainText('

John Doe

')).toBe('John Doe'); + it('parseRichTextIntoPlainText returns plain text without HTML and JSX tags', () => { + const richText = '

This is bold and italic

'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('This is bold and italic'); }); - it('parseRichTextIntoPlainText returns only the text of a link tag', () => { - expect( - parseRichTextIntoPlainText('[this is a link](https://www.google.com)') - ).toBe('this is a link'); + it('parseRichTextIntoPlainText replaces Markdown links with their text content', () => { + const richText = + 'Check out [Node.js](https://nodejs.org/en/) for more information.'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('Check out Node.js for more information.'); }); - it('parseRichTextIntoPlainText replaces markdown lists with their content', () => { - expect( - parseRichTextIntoPlainText('- this is a list item\n- this is another') - ).toBe('this is a list item\nthis is another'); + it('parseRichTextIntoPlainText replaces Markdown lists with their content', () => { + const richText = '- Item 1\n- Item 2\n- Item 3'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('Item 1\nItem 2\nItem 3'); }); - it('parseRichTextIntoPlainText removes underscore, bold and italic with their content', () => { - expect( - parseRichTextIntoPlainText( - '**bold content**, *italic content*, _underscore content_' - ) - ).toBe('bold content, italic content, underscore content'); + it('parseRichTextIntoPlainText replaces Markdown underscore, bold, and italic with their content', () => { + const richText = 'This is _underscore_, **bold**, and *italic*.'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('This is underscore, bold, and italic.'); }); - it('parseRichTextIntoPlainText removes code blocks with their content', () => { - expect( - parseRichTextIntoPlainText('this is a\n```code block```\nwith content') - ).toBe('this is a\nwith content'); + it('parseRichTextIntoPlainText replaces Markdown multiline code blocks with an empty string', () => { + const richText = + 'Some text\n```\nconst x = 42;\nconsole.log(x);\n```\nMore text'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('Some text\nMore text'); }); - it('parseRichTextIntoPlainText replaces empty lines or lines just with spaces with an empty string', () => { - expect(parseRichTextIntoPlainText('\n \n')).toBe(''); + it('parseRichTextIntoPlainText removes empty lines or lines with just spaces', () => { + const richText = 'Line 1\n \nLine 3'; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('Line 1\nLine 3'); }); - it('parseRichTextIntoPlainText replaces leading and trailing spaces from each line with an empty string', () => { - expect(parseRichTextIntoPlainText(' this is a line ')).toBe( - 'this is a line' - ); + it('parseRichTextIntoPlainText removes leading and trailing spaces from each line', () => { + const richText = ' Line 1 \n Line 2 \n Line 3 '; + const result = parseRichTextIntoPlainText(richText); + expect(result).toBe('Line 1\nLine 2\nLine 3'); }); - it('parseRichTextIntoPlainText replaces leading numbers and dots from each line with an empty string', () => { - expect( - parseRichTextIntoPlainText('1. this is a line\n2. this is a second line') - ).toBe('this is a line\nthis is a second line'); + it('dashToCamelCase returns correct camelCase', () => { + expect(dashToCamelCase('foo-bar-baz')).toBe('fooBarBaz'); + }); + + it('dashToCamelCase returns correct camelCase with capital first letter', () => { + expect(dashToCamelCase('Foo-bar')).toBe('fooBar'); + }); + + it('dashToCamelCase returns correct camelCase with numbers', () => { + expect(dashToCamelCase('foo-123-bar')).toBe('foo123Bar'); }); }); diff --git a/util/blogUtils.ts b/util/blogUtils.ts index 7321e78672693..2cc9a07fc3e14 100644 --- a/util/blogUtils.ts +++ b/util/blogUtils.ts @@ -1,5 +1,8 @@ +import { authors as authorsMap } from '@/next.json.mjs'; import type { BlogPreviewType } from '@/types'; +import { getGitHubAvatarUrl } from './gitHubUtils'; + export const mapBlogCategoryToPreviewType = (type: string): BlogPreviewType => { switch (type) { case 'announcements': @@ -17,10 +20,13 @@ export const mapBlogCategoryToPreviewType = (type: string): BlogPreviewType => { // and mapping them to the respective users // @see https://github.com/nodejs/nodejs.dev/blob/main/src/data/blog/authors.yaml export const mapAuthorToCardAuthors = (author: string) => { - const authors = author.split(/, | and |;| by /i); + const authors = author.split(/, | and |;| & | prepared by | by /i); + + return authors.map(fullName => { + let src = `https://ui-avatars.com/api/?name=${fullName}`; + + if (authorsMap[fullName]) src = getGitHubAvatarUrl(authorsMap[fullName].id); - return authors.map(fullName => ({ - fullName, - src: `https://ui-avatars.com/api/?name=${fullName}`, - })); + return { fullName, src }; + }); }; diff --git a/util/debounce.ts b/util/debounce.ts index 73472b35e07e4..ca569ba359e97 100644 --- a/util/debounce.ts +++ b/util/debounce.ts @@ -1,16 +1,16 @@ type DebounceFunction = (...args: Array) => void; -export const debounce = ( - func: T, - delay: number -): ((...args: Parameters) => void) => { - let timeoutId: NodeJS.Timeout; +let timeoutId: NodeJS.Timeout; - return (...args: Parameters) => { +export const debounce = + ( + func: T, + delay: number + ): ((...args: Parameters) => void) => + (...args: Parameters) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => { func(...args); }, delay); }; -}; diff --git a/util/detectOS.ts b/util/detectOS.ts index c588ab406cf4c..92b8f2277e39e 100644 --- a/util/detectOS.ts +++ b/util/detectOS.ts @@ -9,6 +9,8 @@ export const detectOsInUserAgent = (userAgent: string | undefined): UserOS => { return 'MAC'; case 'Linux': return 'LINUX'; + case 'AIX': + return 'AIX'; default: return 'OTHER'; } diff --git a/util/downloadUtils.ts b/util/downloadUtils.ts index db0ff15628fe6..9a63c751a10e7 100644 --- a/util/downloadUtils.ts +++ b/util/downloadUtils.ts @@ -1,44 +1,60 @@ import type { PackageManager } from '@/types/release'; import type { UserOS } from '@/types/userOS'; -// A utility enum to help convert `userOs` data type to user-readable format -export enum OperatingSystem { +export enum OperatingSystemLabel { WIN = 'Windows', - MAC = 'MacOS', + MAC = 'macOS', LINUX = 'Linux', + AIX = 'AIX', OTHER = 'Other', } +export enum PackageManagerLabel { + NVM = 'nvm', + FNM = 'fnm', + BREW = 'Brew', + CHOCO = 'Chocolatey', + DOCKER = 'Docker', +} + export const operatingSystemItems = [ { - label: OperatingSystem.WIN, + label: OperatingSystemLabel.WIN, value: 'WIN' as UserOS, }, { - label: OperatingSystem.MAC, + label: OperatingSystemLabel.MAC, value: 'MAC' as UserOS, }, { - label: OperatingSystem.LINUX, + label: OperatingSystemLabel.LINUX, value: 'LINUX' as UserOS, }, + { + label: OperatingSystemLabel.AIX, + value: 'AIX' as UserOS, + }, ]; export const platformItems = [ { - label: 'NVM', + label: PackageManagerLabel.NVM, value: 'NVM' as PackageManager, }, { - label: 'Brew', + label: PackageManagerLabel.FNM, + value: 'FNM' as PackageManager, + }, + { + label: PackageManagerLabel.BREW, value: 'BREW' as PackageManager, }, { - label: 'Chocolatey', + label: PackageManagerLabel.CHOCO, value: 'CHOCO' as PackageManager, }, { - label: 'Docker', + label: PackageManagerLabel.DOCKER, value: 'DOCKER' as PackageManager, }, ]; @@ -90,7 +106,14 @@ export const bitnessItems = { value: 's390x', }, ], + AIX: [ + { + label: 'Power', + value: 'ppc64', + }, + ], OTHER: [], + LOADING: [], }; type formatDropdownItemsType = { @@ -144,8 +167,5 @@ export const mapCategoriesToTabs = ({ categories.map(({ category, label }) => ({ key: category, label: label, - link: - category === 'download' - ? `/${[page, subCategory].filter(Boolean).join('/')}` - : `/${[page, category, subCategory].filter(Boolean).join('/')}`, + link: `/${[page, category, subCategory].filter(Boolean).join('/')}`, })); diff --git a/util/fetchNodeJsChangelog.ts b/util/fetchNodeJsChangelog.ts new file mode 100644 index 0000000000000..eea20bb3ab878 --- /dev/null +++ b/util/fetchNodeJsChangelog.ts @@ -0,0 +1,24 @@ +import { getNodeJsChangelog } from './getNodeJsChangelog'; + +const getChangelogSectionRegex = (sectionId: string) => + new RegExp(`\\n([\\s\\S]+?)(?:\\n + +export const getArchitecture = async () => { + // This is necessary to detect Windows 11 on Edge. + // [MDN](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues) + // [MSFT](https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11) + if (typeof navigator?.userAgentData?.getHighEntropyValues === 'function') { + const entropyValues = navigator.userAgentData.getHighEntropyValues([ + 'architecture', + ]); + + // Apparently in some cases this is not a Promise, we can Promisify it. + return Promise.resolve(entropyValues) + .then(({ architecture }) => architecture) + .catch(() => undefined); + } + + return undefined; +}; diff --git a/util/getHighlighter.ts b/util/getHighlighter.ts index 19a5c456a6c68..ac13b83db8993 100644 --- a/util/getHighlighter.ts +++ b/util/getHighlighter.ts @@ -1,6 +1,6 @@ -import { getHighlighterCore } from 'shiki/core'; -import type { HighlighterCore } from 'shiki/core'; -import getWasm from 'shiki/wasm'; +import { getHighlighterCore } from '@shikijs/core'; +import type { HighlighterCore } from '@shikijs/core'; +import { getWasmInstance } from '@shikijs/core/wasm-inlined'; import { LANGUAGES, DEFAULT_THEME } from '@/shiki.config.mjs'; @@ -9,7 +9,7 @@ export const getShiki = () => getHighlighterCore({ themes: [DEFAULT_THEME], langs: LANGUAGES, - loadWasm: getWasm, + loadWasm: getWasmInstance, }); export const highlightToHtml = diff --git a/util/getNodeDownloadSnippet.ts b/util/getNodeDownloadSnippet.ts index 619b3aefa9a20..f2568094e12bc 100644 --- a/util/getNodeDownloadSnippet.ts +++ b/util/getNodeDownloadSnippet.ts @@ -4,20 +4,39 @@ import type { NodeRelease } from '@/types'; import type { PackageManager } from '@/types/release'; import type { UserOS } from '@/types/userOS'; +// @TODO: These snippets should be extracted to i18n (?) export const getNodeDownloadSnippet = (release: NodeRelease, os: UserOS) => { const snippets: Record = { NVM: '', + FNM: '', BREW: '', DOCKER: '', CHOCO: '', }; - if (os === 'LINUX' || os === 'MAC') { + if (os === 'WIN' || os === 'MAC' || os === 'LINUX') { + snippets.DOCKER = dedent` + # NOTE: + # Docker is not a Node.js package manager. Please ensure it is already installed + # on your system. Follow official instructions at https://docs.docker.com/desktop/ + # Docker images are provided officially at https://github.com/nodejs/docker-node/ + + # pulls the Node.js Docker image + docker pull node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} + + # verifies the right Node.js version is in the environment + docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} node -v # should print \`${release.versionWithPrefix}\` + + # verifies the right NPM version is in the environment + docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} npm -v # should print \`${release.npm}\``; + } + + if (os === 'MAC' || os === 'LINUX') { snippets.NVM = dedent` - # installs NVM (Node Version Manager) + # installs nvm (Node Version Manager) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - # download and install Node.js + # download and install Node.js (you may need to restart the terminal) nvm install ${release.major} # verifies the right Node.js version is in the environment @@ -26,47 +45,43 @@ export const getNodeDownloadSnippet = (release: NodeRelease, os: UserOS) => { # verifies the right NPM version is in the environment npm -v # should print \`${release.npm}\``; - snippets.BREW = dedent` - # download and installs Homebrew (macOS/Linux Package Manager) - curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash + snippets.FNM = dedent` + # installs fnm (Fast Node Manager) + curl -fsSL https://fnm.vercel.app/install | bash # download and install Node.js - brew install node@${release.major} + fnm use --install-if-missing ${release.major} # verifies the right Node.js version is in the environment node -v # should print \`${release.versionWithPrefix}\` # verifies the right NPM version is in the environment npm -v # should print \`${release.npm}\``; - } - - if (os === 'MAC') { - snippets.DOCKER = dedent` - # installs Homebrew (macOS/Linux Package Manager) - curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash - # installs Docker Desktop - brew install docker --cask + snippets.BREW = dedent` + # NOTE: + # Homebrew is not a Node.js package manager. Please ensure it is already installed + # on your system. Follow official instructions at https://brew.sh/ + # Homebrew only supports installing major Node.js versions and might not support + # the latest Node.js version from the ${release.major} release line. - # pulls the Node.js Docker image - docker pull node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} + # download and install Node.js + brew install node@${release.major} # verifies the right Node.js version is in the environment - docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} node -v # should print \`${release.versionWithPrefix}\` + node -v # should print \`${release.versionWithPrefix}\` # verifies the right NPM version is in the environment - docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} npm -v # should print \`${release.npm}\``; + npm -v # should print \`${release.npm}\``; } if (os === 'WIN') { - snippets.CHOCO = dedent` - # installs Chocolatey (Windows Package Manager) - Set-ExecutionPolicy Bypass -Scope Process -Force; - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; - iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); + snippets.FNM = dedent` + # installs fnm (Fast Node Manager) + winget install Schniz.fnm # download and install Node.js - choco install nodejs --version="${release.version}" + fnm use --install-if-missing ${release.major} # verifies the right Node.js version is in the environment node -v # should print \`${release.versionWithPrefix}\` @@ -74,23 +89,21 @@ export const getNodeDownloadSnippet = (release: NodeRelease, os: UserOS) => { # verifies the right NPM version is in the environment npm -v # should print \`${release.npm}\``; - snippets.DOCKER = dedent` - # installs Chocolatey (Windows Package Manager) - Set-ExecutionPolicy Bypass -Scope Process -Force; - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; - iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); - - # installs Docker Desktop - choco install docker-desktop + snippets.CHOCO = dedent` + # NOTE: + # Chocolatey is not a Node.js package manager. Please ensure it is already installed + # on your system. Follow official instructions at https://chocolatey.org/ + # Chocolatey is not officially maintained by the Node.js project and might not + # support the ${release.versionWithPrefix} version of Node.js - # pulls the Node.js Docker image - docker pull node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} + # download and install Node.js + choco install nodejs${release.isLts ? '-lts' : ''} --version="${release.version}" # verifies the right Node.js version is in the environment - docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} node -v # should print \`${release.versionWithPrefix}\` + node -v # should print \`${release.major}\` # verifies the right NPM version is in the environment - docker run node:${release.major}-${release.major >= 4 ? 'alpine' : 'slim'} npm -v # should print \`${release.npm}\``; + npm -v # should print \`${release.npm}\``; } return snippets; diff --git a/util/getNodeDownloadUrl.ts b/util/getNodeDownloadUrl.ts index 93f3f46d52496..12ad77e8e02c9 100644 --- a/util/getNodeDownloadUrl.ts +++ b/util/getNodeDownloadUrl.ts @@ -15,37 +15,59 @@ export const getNodeDownloadUrl = ( switch (os) { case 'MAC': + // Prepares a downloadable Node.js installer link for the x64, ARM64 platforms if (kind === 'installer') { return `${baseURL}/node-${versionWithPrefix}.pkg`; } + // Prepares a downloadable Node.js link for the ARM64 platform if (typeof bitness === 'string') { return `${baseURL}/node-${versionWithPrefix}-darwin-${bitness}.tar.gz`; } - return `${baseURL}/node-${versionWithPrefix}-darwin-x${bitness}.tar.gz`; + // Prepares a downloadable Node.js link for the x64 platform. + // Since the x86 platform is not officially supported, returns the x64 + // link as the default value. + return `${baseURL}/node-${versionWithPrefix}-darwin-x64.tar.gz`; case 'WIN': { if (kind === 'installer') { + // Prepares a downloadable Node.js installer link for the ARM platforms if (typeof bitness === 'string') { return `${baseURL}/node-${versionWithPrefix}-${bitness}.msi`; } + // Prepares a downloadable Node.js installer link for the x64 and x86 platforms return `${baseURL}/node-${versionWithPrefix}-x${bitness}.msi`; } + // Prepares a downloadable Node.js link for the ARM64 platform if (typeof bitness === 'string') { return `${baseURL}/node-${versionWithPrefix}-win-${bitness}.zip`; } + // Prepares a downloadable Node.js link for the x64 and x86 platforms return `${baseURL}/node-${versionWithPrefix}-win-x${bitness}.zip`; } case 'LINUX': + // Prepares a downloadable Node.js link for the ARM platforms such as + // ARMv7 and ARMv8 if (typeof bitness === 'string') { return `${baseURL}/node-${versionWithPrefix}-linux-${bitness}.tar.xz`; } - return `${baseURL}/node-${versionWithPrefix}-linux-x${bitness}.tar.xz`; + // Prepares a downloadable Node.js link for the x64 platform. + // Since the x86 platform is not officially supported, returns the x64 + // link as the default value. + return `${baseURL}/node-${versionWithPrefix}-linux-x64.tar.xz`; + case 'AIX': + // Prepares a downloadable Node.js link for AIX + if (typeof bitness === 'string') { + return `${baseURL}/node-${versionWithPrefix}-aix-${bitness}.tar.gz`; + } + + return `${baseURL}/node-${versionWithPrefix}-aix-ppc64.tar.gz`; default: + // Prepares a downloadable Node.js source code link return `${baseURL}/node-${versionWithPrefix}.tar.gz`; } }; diff --git a/util/getNodeJsChangelog.ts b/util/getNodeJsChangelog.ts index 9e2e29cfa3b29..9b3b7d7f1fba4 100644 --- a/util/getNodeJsChangelog.ts +++ b/util/getNodeJsChangelog.ts @@ -6,7 +6,7 @@ import semVer from 'semver'; * @param version The version of Node.js to get the changelog for. * @returns The URL of the Node.js changelog for the specified version. */ -export const getNodejsChangelog = (version: string): string => { +export const getNodeJsChangelog = (version: string): string => { const changelogsUrl = 'https://github.com/nodejs/node/blob/main/doc/changelogs'; @@ -30,3 +30,22 @@ export const getNodejsChangelog = (version: string): string => { return `https://github.com/nodejs/node-v0.x-archive/blob/${version}/ChangeLog`; }; + +export const getNodeJsChangelogAuthor = (changelog: string) => { + // looking for the @author part of the release header, eg: + // ## 2016-03-08, Version 5.8.0 (Stable). @Fishrock123 + // ## 2015-10-13, Version 4.2.1 'Argon' (LTS), @jasnell + // ## 2015-09-08, Version 4.0.0 (Stable), @rvagg + const [, changelogAuthor] = + changelog.match(/^## .*? \([^)]+\)[,.] @(\S+)/m) || []; + + return changelogAuthor || 'The Node.js Project'; +}; + +export const getNodeJsChangelogSlug = (changelog: string) => { + // looking for the release header eg: + // ## 2016-03-08, Version 5.8.0 (Stable) + const [, changelogHeading] = changelog.match(/^## (.*)$/m) || []; + + return changelogHeading || ''; +}; diff --git a/util/getUserBitnessByArchitecture.ts b/util/getUserBitnessByArchitecture.ts new file mode 100644 index 0000000000000..b6c1461ad7a8c --- /dev/null +++ b/util/getUserBitnessByArchitecture.ts @@ -0,0 +1,10 @@ +export const getUserBitnessByArchitecture = ( + userArchitecture: string, + userBitness: number +) => { + if (userArchitecture === 'arm' && userBitness === 64) { + return 'arm64'; + } + + return userBitness; +}; diff --git a/util/searchUtils.ts b/util/searchUtils.ts new file mode 100644 index 0000000000000..6c5e1cb243b2c --- /dev/null +++ b/util/searchUtils.ts @@ -0,0 +1,10 @@ +import type { Result } from '@orama/orama'; + +import { BASE_URL } from '@/next.constants.mjs'; +import type { SearchDoc } from '@/types'; + +export const searchHitToLinkPath = (hit: Result) => { + const isAPIResult = hit.document.siteSection.toLowerCase() === 'docs'; + const basePath = isAPIResult ? BASE_URL : ''; + return `${basePath}/${hit.document.path}`; +}; diff --git a/util/stringUtils.ts b/util/stringUtils.ts index 4dc48a046bf19..d830a6dfc4f2c 100644 --- a/util/stringUtils.ts +++ b/util/stringUtils.ts @@ -21,3 +21,10 @@ export const parseRichTextIntoPlainText = (richText: string) => .replace(/^[ ]+|[ ]+$/gm, '') // replaces leading numbers and dots from each line with an empty string .replace(/^\d+\.\s/gm, ''); + +export const dashToCamelCase = (str: string) => + str + .replace(/-([a-z])/g, (match, chr) => chr.toUpperCase()) + // remove leftover - which don't match the above regex. Like 'es-2015' + .replace(/-/g, '') + .replace(/^[A-Z]/, chr => chr.toLowerCase());