From 271cac6bf776d8dbfd6d094decfaa189780f2489 Mon Sep 17 00:00:00 2001 From: Elie-Soued Date: Thu, 27 Nov 2025 16:42:03 +0100 Subject: [PATCH 1/3] docs: release 1.1.1 Release-As: 1.1.1 --- .docs/vitepress/guide/index.md | 57 + .docs/vitepress/index.md | 30 + .docs/vitepress/legal/license.md | 23 + .docs/vitepress/other/contributing.md | 9 + .esbuild/build.mjs | 2 +- .gitignore | 3 +- .release-please/next-config.json | 12 + .release-please/next-manifest.json | 1 + .vitepress/.vitepress/config.ts | 78 ++ CODE_OF_CONDUCT.md | 128 ++ eslint.config.mjs | 4 +- package.json | 14 +- pnpm-lock.yaml | 1712 ++++++++++++++++++++++++- prepare-typedoc.sh | 6 + src/map/to-object.ts | 16 - src/number/bounds.ts | 19 - src/number/into.ts | 13 - src/object/has-keys.ts | 22 - src/{ => prototypes}/array/join.ts | 11 + src/{ => prototypes}/date/iso-date.ts | 0 src/prototypes/map/to-object.ts | 31 + src/{ => prototypes}/math/round.ts | 12 + src/prototypes/number/bounds.ts | 32 + src/prototypes/number/index.ts | 7 + src/prototypes/number/into.ts | 21 + src/prototypes/object/has-keys.ts | 36 + src/prototypes/string/capitalize.ts | 21 + src/public-api.ts | 16 +- src/string/capitalize.ts | 11 - tsconfig.json | 2 +- typedoc.json | 52 + 31 files changed, 2302 insertions(+), 99 deletions(-) create mode 100644 .docs/vitepress/guide/index.md create mode 100644 .docs/vitepress/index.md create mode 100644 .docs/vitepress/legal/license.md create mode 100644 .docs/vitepress/other/contributing.md create mode 100644 .release-please/next-config.json create mode 100644 .release-please/next-manifest.json create mode 100644 .vitepress/.vitepress/config.ts create mode 100644 CODE_OF_CONDUCT.md create mode 100644 prepare-typedoc.sh delete mode 100644 src/map/to-object.ts delete mode 100644 src/number/bounds.ts delete mode 100644 src/number/into.ts delete mode 100644 src/object/has-keys.ts rename src/{ => prototypes}/array/join.ts (65%) rename src/{ => prototypes}/date/iso-date.ts (100%) create mode 100644 src/prototypes/map/to-object.ts rename src/{ => prototypes}/math/round.ts (51%) create mode 100644 src/prototypes/number/bounds.ts create mode 100644 src/prototypes/number/index.ts create mode 100644 src/prototypes/number/into.ts create mode 100644 src/prototypes/object/has-keys.ts create mode 100644 src/prototypes/string/capitalize.ts delete mode 100644 src/string/capitalize.ts create mode 100644 typedoc.json diff --git a/.docs/vitepress/guide/index.md b/.docs/vitepress/guide/index.md new file mode 100644 index 0000000..6c3f8af --- /dev/null +++ b/.docs/vitepress/guide/index.md @@ -0,0 +1,57 @@ +# Getting started + +## Installation + +Install `@ogs-gmbh/stdx` using your preferred package manager: + +::: code-group +```bash [npm] +npm install @ogs-gmbh/stdx +``` +```bash [yarn] +yarn add @ogs-gmbh/stdx +``` +```bash [pnpm] +pnpm install @ogs-gmbh/stdx +``` +::: + +## Quick Start + + +```typescript +import '@ogs-gmbh/stdx'; + +const mixed = ['apple', null, 'banana', undefined, 'cherry']; +const filtered = mixed.nonNullishJoin(', '); +console.log(filtered); +// => "apple, banana, cherry" + +const name = capitalize('hello world'); +// => 'Hello world' +``` + +## 🧩 What's Inside? + +The library is organized into dedicated extension modules.\ +When imported, they safely patch well‑defined methods onto native +prototypes. + +Current extension categories include: + +### **Array Extensions** + +Useful helpers like: - `nonNullishJoin` --- join elements while skipping +`null`/`undefined` - ...and more coming soon + +### **String Extensions** + +Clean and readable string helpers such as: - `capitalize` --- uppercase +only the first letter of a string + +### **Object Extensions** + +Utilities for merging, flattening, safe access, etc. *(Upcoming)* + + + diff --git a/.docs/vitepress/index.md b/.docs/vitepress/index.md new file mode 100644 index 0000000..9bc2d9a --- /dev/null +++ b/.docs/vitepress/index.md @@ -0,0 +1,30 @@ +--- +layout: home + +hero: + name: stdx + tagline: Typescript Standard library + actions: + - theme: brand + text: Get started + link: /guide + - theme: alt + text: Reference + link: /reference + - theme: alt + text: GitHub + link: https://github.com/OGS-GmbH/stdx + + +features: + - icon: + title: Type-Safe + details: Fully typed with strict TypeScript support for compile-time safety. + - icon: + title: Modular + details: Tree-shakeable design. Import only what you need, nothing more. + - icon: + title: Zero Dependencies + details: Lightweight and self-contained with no external dependencies. +--- + diff --git a/.docs/vitepress/legal/license.md b/.docs/vitepress/legal/license.md new file mode 100644 index 0000000..e2efdce --- /dev/null +++ b/.docs/vitepress/legal/license.md @@ -0,0 +1,23 @@ +# License + +## MIT License + +Copyright (c) 2025 OGS Gesellschaft für Datenverarbeitung und Systemberatung mbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.docs/vitepress/other/contributing.md b/.docs/vitepress/other/contributing.md new file mode 100644 index 0000000..ce86682 --- /dev/null +++ b/.docs/vitepress/other/contributing.md @@ -0,0 +1,9 @@ +# Contributing + +## Guideline + +Contributions are always welcome and greatly appreciated. Whether you want to report a bug, suggest a new feature, or improve the documentation, your input helps make the project better for everyone. + +If you're unsure where to start, check the open issues for guidance. Even small contributions, such as fixing typos or improving code readability, are valuable. + +Feel free to submit a pull request or start a discussion — we're happy to collaborate! \ No newline at end of file diff --git a/.esbuild/build.mjs b/.esbuild/build.mjs index 099413d..8b33c48 100644 --- a/.esbuild/build.mjs +++ b/.esbuild/build.mjs @@ -2,7 +2,7 @@ import * as esbuild from "esbuild"; import { getConfig } from "./config.mjs"; const preparedConfig = { - outdir: "dist" + outdir: "dist/main" }; await esbuild.build({ diff --git a/.gitignore b/.gitignore index 76add87..f67cc76 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -dist \ No newline at end of file +dist +.vitepress/.vitepress/cache \ No newline at end of file diff --git a/.release-please/next-config.json b/.release-please/next-config.json new file mode 100644 index 0000000..d2b4f4f --- /dev/null +++ b/.release-please/next-config.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/refs/heads/main/schemas/config.json", + "packages": { + ".": { + "release-type": "node", + "prerelease": true, + "prerelease-type": "next", + "include-component-in-tag": false, + "always-update": true + } + } +} diff --git a/.release-please/next-manifest.json b/.release-please/next-manifest.json new file mode 100644 index 0000000..8d6e472 --- /dev/null +++ b/.release-please/next-manifest.json @@ -0,0 +1 @@ +{".":"1.1.0"} diff --git a/.vitepress/.vitepress/config.ts b/.vitepress/.vitepress/config.ts new file mode 100644 index 0000000..6566328 --- /dev/null +++ b/.vitepress/.vitepress/config.ts @@ -0,0 +1,78 @@ +import { defineConfig } from 'vitepress'; +import { groupIconMdPlugin, groupIconVitePlugin } from "vitepress-plugin-group-icons"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "stdx", + description: "Typescript Standard library", + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + + logo: "https://raw.githubusercontent.com/OGS-GmbH/.github/refs/heads/main/docs/logo-white.svg", + nav: [ + { text: "Guide", link: "/guide" }, + { text: "Reference", link: "/reference" }, + { text: "GitHub", link: "https://github.com/OGS-GmbH/stdx" } + ], + + socialLinks: [ + { icon: "github", link: "https://github.com/OGS-GmbH" }, + { icon: "facebook", link: "https://www.facebook.com/OGS.GmbH" }, + { icon: { svg: '' }, link: "https://www.linkedin.com/company/41198063/" }, + { icon: "xing", link: "https://www.xing.com/pages/ogsgmbh" }, + { icon: { svg: '' }, link: "https://www.ogs.de/en/" }, + { icon: { svg: '' }, link: "mailto:info@ogs.de" } + ], + + sidebar: [ + { + text: "Guide", + items: [ + { text: "Getting started", link: "/guide/" } + ] + }, + { + text: "Reference", + items: [ + { text: "Overview", link: "/reference/" } + ] + }, + { + text: "Other", + items: [ + { text: "Contributing", link: "/other/contributing" }, + { text: "Code of Conduct", link: "/other/code-of-conduct" } + ] + }, + { + text: "Legal", + items: [ + { text: "MIT License", link: "/legal/license" }, + { text: "Copyright © 2025 — present OGS GmbH", link: "https://www.ogs.de/en/" } + ] + } + ] + + + }, + head: [ + [ "link", { rel: "icon", href: "https://www.ogs.de/favicon.ico" } ] + ], + base: "/stdx/", + srcDir: "../dist/typedoc", + outDir: "../dist/vitepress", + titleTemplate: ":title - OGS stdx", + cleanUrls: true, + appearance: "dark", + markdown: { + // eslint-disable-next-line @tseslint/typedef + config (md) { + md.use(groupIconMdPlugin); + } + }, + vite: { + plugins: [ + groupIconVitePlugin() + ] + } +}); diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..be96f0e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +info@ogs.de. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/transl \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index c07f6a7..10658a7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -35,7 +35,9 @@ export default defineConfig( "node_modules", "dist", "CHANGELOG.md", - "README.md" + "README.md", + ".docs", + "CODE_OF_CONDUCT.md" ] }, { diff --git a/package.json b/package.json index 37013d4..e14c8ba 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,12 @@ "ci:build:main:production": "node .esbuild/build.mjs", "ci:pr:commitlint:main:commitlint": "commitlint", "ci:pr:lint:main:eslint": "eslint .", + "ci:vitepress:main:typedoc": "typedoc && bash ./prepare-typedoc.sh", "commitizen": "cz", - "prepare": "husky" + "prepare": "husky", + "vitepress:build": "vitepress build .vitepress", + "vitepress:dev": "vitepress dev .vitepress", + "vitepress:preview": "vitepress preview .vitepress" }, "devDependencies": { "@commitlint/cli": "^19.8.1", @@ -77,16 +81,20 @@ "eslint": "^9.39.1", "eslint-plugin-unicorn": "^56.0.1", "fast-glob": "^3.3.3", + "typedoc": "^0.28.14", + "typedoc-plugin-markdown": "^4.9.0", "globals": "^15.15.0", "husky": "^9.1.7", "lint-staged": "^15.5.2", "npm-package-json-lint": "^8.0.0", "tslib": "^2.8.1", "typescript": "~5.8.3", - "typescript-eslint": "^8.47.0" + "typescript-eslint": "^8.47.0", + "vitepress": "^1", + "vitepress-plugin-group-icons": "^1.6.5" }, "sideEffects": true, "publishConfig": { "directory": "dist" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc7d42f..7cad177 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,24 +80,131 @@ importers: tslib: specifier: ^2.8.1 version: 2.8.1 + typedoc: + specifier: ^0.28.14 + version: 0.28.14(typescript@5.8.3) + typedoc-plugin-markdown: + specifier: ^4.9.0 + version: 4.9.0(typedoc@0.28.14(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 typescript-eslint: specifier: ^8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + vitepress: + specifier: ^1 + version: 1.6.4(@algolia/client-search@5.45.0)(@types/node@24.10.1)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.3) + vitepress-plugin-group-icons: + specifier: ^1.6.5 + version: 1.6.5(vite@5.4.21(@types/node@24.10.1)) publishDirectory: dist packages: + '@algolia/abtesting@1.11.0': + resolution: {integrity: sha512-a7oQ8dwiyoyVmzLY0FcuBqyqcNSq78qlcOtHmNBumRlHCSnXDcuoYGBGPN1F6n8JoGhviDDsIaF/oQrzTzs6Lg==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.45.0': + resolution: {integrity: sha512-WTW0VZA8xHMbzuQD5b3f41ovKZ0MNTIXkWfm0F2PU+XGcLxmxX15UqODzF2sWab0vSbi3URM1xLhJx+bXbd1eQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.45.0': + resolution: {integrity: sha512-I3g7VtvG/QJOH3tQO7E7zWTwBfK/nIQXShFLR8RvPgWburZ626JNj332M3wHCYcaAMivN9WJG66S2JNXhm6+Xg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.45.0': + resolution: {integrity: sha512-/nTqm1tLiPtbUr+8kHKyFiCOfhRfgC+JxLvOCq471gFZZOlsh6VtFRiKI60/zGmHTojFC6B0mD80PB7KeK94og==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.45.0': + resolution: {integrity: sha512-suQTx/1bRL1g/K2hRtbK3ANmbzaZCi13487sxxmqok+alBDKKw0/TI73ZiHjjFXM2NV52inwwcmW4fUR45206Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.45.0': + resolution: {integrity: sha512-CId/dbjpzI3eoUhPU6rt/z4GrRsDesqFISEMOwrqWNSrf4FJhiUIzN42Ac+Gzg69uC0RnzRYy60K1y4Na5VSMw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.45.0': + resolution: {integrity: sha512-tjbBKfA8fjAiFtvl9g/MpIPiD6pf3fj7rirVfh1eMIUi8ybHP4ovDzIaE216vHuRXoePQVCkMd2CokKvYq1CLw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.45.0': + resolution: {integrity: sha512-nxuCid+Nszs4xqwIMDw11pRJPes2c+Th1yup/+LtpjFH8QWXkr3SirNYSD3OXAeM060HgWWPLA8/Fxk+vwxQOA==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.45.0': + resolution: {integrity: sha512-t+1doBzhkQTeOOjLHMlm4slmXBhvgtEGQhOmNpMPTnIgWOyZyESWdm+XD984qM4Ej1i9FRh8VttOGrdGnAjAng==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.45.0': + resolution: {integrity: sha512-IaX3ZX1A/0wlgWZue+1BNWlq5xtJgsRo7uUk/aSiYD7lPbJ7dFuZ+yTLFLKgbl4O0QcyHTj1/mSBj9ryF1Lizg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.45.0': + resolution: {integrity: sha512-1jeMLoOhkgezCCPsOqkScwYzAAc1Jr5T2hisZl0s32D94ZV7d1OHozBukgOjf8Dw+6Hgi6j52jlAdUWTtkX9Mg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.45.0': + resolution: {integrity: sha512-46FIoUkQ9N7wq4/YkHS5/W9Yjm4Ab+q5kfbahdyMpkBPJ7IBlwuNEGnWUZIQ6JfUZuJVojRujPRHMihX4awUMg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.45.0': + resolution: {integrity: sha512-XFTSAtCwy4HdBhSReN2rhSyH/nZOM3q3qe5ERG2FLbYId62heIlJBGVyAPRbltRwNlotlydbvSJ+SQ0ruWC2cw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.45.0': + resolution: {integrity: sha512-8mTg6lHx5i44raCU52APsu0EqMsdm4+7Hch/e4ZsYZw0hzwkuaMFh826ngnkYf9XOl58nHoou63aZ874m8AbpQ==} + engines: {node: '>= 14.0.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.3.0': + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + '@commitlint/cli@19.8.1': resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} engines: {node: '>=v18'} @@ -187,102 +294,227 @@ packages: resolution: {integrity: sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==} engines: {node: '>=v18'} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -295,6 +527,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -307,6 +545,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -319,24 +563,48 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -409,6 +677,9 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@gerrit0/mini-shiki@3.15.0': + resolution: {integrity: sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -429,10 +700,28 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@iconify-json/logos@1.2.10': + resolution: {integrity: sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA==} + + '@iconify-json/simple-icons@1.2.60': + resolution: {integrity: sha512-KlwLBKCdMCqfySdkAA+jehdUx6VSjnj6lvzQKus7HjkPSQ6QP58d6xiptkIp0jd/Hw3PW2++nRuGvCvSYaF0Mg==} + + '@iconify-json/vscode-icons@1.2.36': + resolution: {integrity: sha512-hs17ocmWK5pGnF5KgFRgHBZVRnMVAIpwPDDvLWSwRiM/uHwIS0Jo0y93DvcHXEsP+d3sqogTGhgkgj3on3eabQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -526,6 +815,152 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + + '@shikijs/engine-oniguruma@3.15.0': + resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + + '@shikijs/langs@3.15.0': + resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + + '@shikijs/themes@3.15.0': + resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + + '@shikijs/types@3.15.0': + resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@stylistic/eslint-plugin-js@2.13.0': resolution: {integrity: sha512-GPPDK4+fcbsQD58a3abbng2Dx+jBoxM5cnYjBM4T24WFZRZdlNSKvR19TxP8CPevzMOodQ9QVzNeqWvMXzfJRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -558,12 +993,24 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -579,6 +1026,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@typescript-eslint/eslint-plugin@8.47.0': resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -638,6 +1088,104 @@ packages: resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.25': + resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} + + '@vue/compiler-dom@3.5.25': + resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} + + '@vue/compiler-sfc@3.5.25': + resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} + + '@vue/compiler-ssr@3.5.25': + resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/reactivity@3.5.25': + resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} + + '@vue/runtime-core@3.5.25': + resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} + + '@vue/runtime-dom@3.5.25': + resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} + + '@vue/server-renderer@3.5.25': + resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} + peerDependencies: + vue: 3.5.25 + + '@vue/shared@3.5.25': + resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -663,6 +1211,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + algoliasearch@5.45.0: + resolution: {integrity: sha512-wrj4FGr14heLOYkBKV3Fbq5ZBGuIFeDJkTilYq/G+hH1CSlQBtYvG2X1j67flwv0fUeQJwnWxxRIunSemAZirA==} + engines: {node: '>= 14.0.0'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -719,6 +1271,9 @@ packages: resolution: {integrity: sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==} hasBin: true + birpc@2.8.0: + resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -778,6 +1333,12 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -836,6 +1397,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -851,6 +1415,12 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + conventional-changelog-angular@7.0.0: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} @@ -867,6 +1437,10 @@ packages: engines: {node: '>=16'} hasBin: true + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + core-js-compat@3.47.0: resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} @@ -900,6 +1474,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cz-conventional-changelog@3.3.0: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} @@ -971,6 +1548,9 @@ packages: electron-to-chromium@1.5.256: resolution: {integrity: sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -980,6 +1560,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1010,6 +1594,11 @@ packages: esbuild-plugin-package-json@2.0.0: resolution: {integrity: sha512-UTwzdxWSgMY0Yu+m0FibTiYkJZeAj6D7gb69avzvuPNniVjnZCeqmcgvK3JDEYZZ7GD1E/7J/no1pLHgYX7xiw==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -1075,6 +1664,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1090,6 +1682,9 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -1157,6 +1752,9 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + focus-trap@7.6.6: + resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1172,6 +1770,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1257,10 +1860,19 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1272,6 +1884,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -1403,6 +2018,10 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -1473,6 +2092,9 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1484,6 +2106,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + lint-staged@15.5.2: resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} engines: {node: '>=18.12.0'} @@ -1493,6 +2118,10 @@ packages: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1560,6 +2189,12 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -1568,6 +2203,13 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -1601,12 +2243,18 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -1753,12 +2401,26 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1816,6 +2478,9 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1859,6 +2524,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1902,6 +2570,12 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1914,6 +2588,12 @@ packages: engines: {node: '>=0.10'} hasBin: true + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + plur@4.0.0: resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} engines: {node: '>=10'} @@ -1922,6 +2602,13 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1942,10 +2629,20 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1969,6 +2666,15 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -2021,6 +2727,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -2037,6 +2748,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -2054,6 +2768,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2073,6 +2790,13 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -2085,6 +2809,10 @@ packages: spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -2108,6 +2836,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2132,6 +2863,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + superjson@2.2.5: + resolution: {integrity: sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==} + engines: {node: '>=16'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2144,6 +2879,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -2163,6 +2901,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -2200,6 +2941,19 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc@0.28.14: + resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typescript-eslint@8.47.0: resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2212,6 +2966,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -2222,6 +2982,9 @@ packages: unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -2254,6 +3017,71 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitepress-plugin-group-icons@1.6.5: + resolution: {integrity: sha512-+pg4+GKDq2fLqKb1Sat5p1p4SuIZ5tEPxu8HjpwoeecZ/VaXKy6Bdf0wyjedjaTAyZQzXbvyavJegqAcQ+B0VA==} + peerDependencies: + vite: '>=3' + peerDependenciesMeta: + vite: + optional: true + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.25: + resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -2327,14 +3155,144 @@ packages: snapshots: + '@algolia/abtesting@1.11.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0) + '@algolia/client-search': 5.45.0 + algoliasearch: 5.45.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)': + dependencies: + '@algolia/client-search': 5.45.0 + algoliasearch: 5.45.0 + + '@algolia/client-abtesting@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/client-analytics@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/client-common@5.45.0': {} + + '@algolia/client-insights@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/client-personalization@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/client-query-suggestions@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/client-search@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/ingestion@1.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/monitoring@1.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/recommend@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + + '@algolia/requester-browser-xhr@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + + '@algolia/requester-fetch@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + + '@algolia/requester-node-http@5.45.0': + dependencies: + '@algolia/client-common': 5.45.0 + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.5.0 + tinyexec: 1.0.2 + + '@antfu/utils@9.3.0': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@commitlint/cli@19.8.1(@types/node@24.10.1)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 @@ -2487,81 +3445,174 @@ snapshots: chalk: 5.6.2 optional: true + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.45.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.45.0)(search-insights@2.17.3) + preact: 10.27.2 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.45.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.45.0)(algoliasearch@5.45.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.45.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -2651,6 +3702,14 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@gerrit0/mini-shiki@3.15.0': + dependencies: + '@shikijs/engine-oniguruma': 3.15.0 + '@shikijs/langs': 3.15.0 + '@shikijs/themes': 3.15.0 + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -2658,11 +3717,38 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/momoa@3.3.10': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify-json/logos@1.2.10': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/simple-icons@1.2.60': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/vscode-icons@1.2.36': + dependencies: + '@iconify/types': 2.0.0 - '@humanwhocodes/momoa@3.3.10': {} + '@iconify/types@2.0.0': {} - '@humanwhocodes/retry@0.4.3': {} + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.3.0 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color '@isaacs/cliui@8.0.2': dependencies: @@ -2673,6 +3759,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec@1.5.5': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2736,6 +3824,130 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/langs@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/themes@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/types@3.15.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@stylistic/eslint-plugin-js@2.13.0(eslint@9.39.1(jiti@2.6.1))': dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -2775,12 +3987,25 @@ snapshots: '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/minimist@1.2.5': {} '@types/ms@2.1.0': {} @@ -2793,6 +4018,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/web-bluetooth@0.0.21': {} + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -2886,6 +4113,112 @@ snapshots: '@typescript-eslint/types': 8.47.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@24.10.1))(vue@3.5.25(typescript@5.8.3))': + dependencies: + vite: 5.4.21(@types/node@24.10.1) + vue: 3.5.25(typescript@5.8.3) + + '@vue/compiler-core@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.25 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.25': + dependencies: + '@vue/compiler-core': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/compiler-sfc@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.25 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.25': + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.8.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.5 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.25': + dependencies: + '@vue/shared': 3.5.25 + + '@vue/runtime-core@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/runtime-dom@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/runtime-core': 3.5.25 + '@vue/shared': 3.5.25 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.8.3) + + '@vue/shared@3.5.25': {} + + '@vueuse/core@12.8.2(typescript@5.8.3)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.25(typescript@5.8.3) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(focus-trap@7.6.6)(typescript@5.8.3)': + dependencies: + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.25(typescript@5.8.3) + optionalDependencies: + focus-trap: 7.6.6 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2(typescript@5.8.3)': + dependencies: + vue: 3.5.25(typescript@5.8.3) + transitivePeerDependencies: + - typescript + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -2915,6 +4248,23 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + algoliasearch@5.45.0: + dependencies: + '@algolia/abtesting': 1.11.0 + '@algolia/client-abtesting': 5.45.0 + '@algolia/client-analytics': 5.45.0 + '@algolia/client-common': 5.45.0 + '@algolia/client-insights': 5.45.0 + '@algolia/client-personalization': 5.45.0 + '@algolia/client-query-suggestions': 5.45.0 + '@algolia/client-search': 5.45.0 + '@algolia/ingestion': 1.45.0 + '@algolia/monitoring': 1.45.0 + '@algolia/recommend': 5.45.0 + '@algolia/requester-browser-xhr': 5.45.0 + '@algolia/requester-fetch': 5.45.0 + '@algolia/requester-node-http': 5.45.0 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -2953,6 +4303,8 @@ snapshots: baseline-browser-mapping@2.8.29: {} + birpc@2.8.0: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -3016,6 +4368,10 @@ snapshots: chalk@5.6.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + character-entities@2.0.2: {} chardet@0.7.0: {} @@ -3065,6 +4421,8 @@ snapshots: colorette@2.0.20: {} + comma-separated-tokens@2.0.3: {} + commander@13.1.0: {} commitizen@4.3.1(@types/node@24.10.1)(typescript@5.8.3): @@ -3094,6 +4452,10 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + + confbox@0.2.2: {} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 @@ -3111,6 +4473,10 @@ snapshots: meow: 12.1.1 split2: 4.2.0 + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + core-js-compat@3.47.0: dependencies: browserslist: 4.28.0 @@ -3146,6 +4512,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + cz-conventional-changelog@3.3.0(@types/node@24.10.1)(typescript@5.8.3): dependencies: chalk: 2.4.2 @@ -3212,12 +4580,16 @@ snapshots: electron-to-chromium@1.5.256: {} + emoji-regex-xs@1.0.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + entities@4.5.0: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -3250,6 +4622,32 @@ snapshots: transitivePeerDependencies: - bluebird + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -3373,6 +4771,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} eventemitter3@5.0.1: {} @@ -3393,6 +4793,8 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + exsolve@1.0.8: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -3472,6 +4874,10 @@ snapshots: flatted@3.3.3: {} + focus-trap@7.6.6: + dependencies: + tabbable: 6.3.0 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -3488,6 +4894,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} get-caller-file@2.0.5: {} @@ -3575,10 +4984,30 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 + hookable@5.5.3: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -3589,6 +5018,8 @@ snapshots: dependencies: lru-cache: 10.4.3 + html-void-elements@3.0.0: {} + human-signals@5.0.0: {} husky@9.1.7: {} @@ -3691,6 +5122,8 @@ snapshots: is-utf8@0.2.1: {} + is-what@5.5.0: {} + is-windows@1.0.2: {} isexe@2.0.0: {} @@ -3743,6 +5176,8 @@ snapshots: kind-of@6.0.3: {} + kolorist@1.8.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -3752,6 +5187,10 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + lint-staged@15.5.2: dependencies: chalk: 5.6.2 @@ -3776,6 +5215,12 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.2 + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -3833,10 +5278,27 @@ snapshots: dependencies: yallist: 4.0.0 + lunr@2.3.9: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + map-obj@1.0.1: {} map-obj@4.3.0: {} + mark.js@8.11.1: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} mdast-util-find-and-replace@3.0.2: @@ -3936,6 +5398,18 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -3952,6 +5426,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdurl@2.0.0: {} + meow@12.1.1: {} meow@9.0.0: @@ -4206,10 +5682,23 @@ snapshots: minipass@7.1.2: {} + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + ms@2.1.3: {} mute-stream@0.0.8: {} + nanoid@3.3.11: {} + natural-compare@1.4.0: {} node-releases@2.0.27: {} @@ -4297,6 +5786,12 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.0.1 + regex-recursion: 6.0.2 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4348,6 +5843,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.5.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -4380,18 +5877,42 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} pidtree@0.6.0: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + plur@4.0.0: dependencies: irregular-plurals: 3.5.0 pluralize@8.0.0: {} + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.27.2: {} + prelude-ls@1.2.1: {} proc-log@4.2.0: {} @@ -4403,8 +5924,14 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + property-information@7.1.0: {} + + punycode.js@2.3.1: {} + punycode@2.3.1: {} + quansync@0.2.11: {} + queue-microtask@1.2.3: {} quick-lru@4.0.1: {} @@ -4433,6 +5960,16 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + regexp-tree@0.1.27: {} regjsparser@0.10.0: @@ -4474,6 +6011,34 @@ snapshots: rfdc@1.4.1: {} + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + run-async@2.4.1: {} run-parallel@1.2.0: @@ -4488,6 +6053,8 @@ snapshots: safer-buffer@2.1.2: {} + search-insights@2.17.3: {} + semver@5.7.2: {} semver@7.7.3: {} @@ -4498,6 +6065,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -4514,6 +6092,10 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -4528,6 +6110,8 @@ snapshots: spdx-license-ids@3.0.22: {} + speakingurl@14.0.1: {} + split2@4.2.0: {} string-argv@0.3.2: {} @@ -4554,6 +6138,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4572,6 +6161,10 @@ snapshots: strip-json-comments@3.1.1: {} + superjson@2.2.5: + dependencies: + copy-anything: 4.0.5 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -4582,6 +6175,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.3.0: {} + text-extensions@2.4.0: {} through@2.3.8: {} @@ -4596,6 +6191,8 @@ snapshots: dependencies: is-number: 7.0.0 + trim-lines@3.0.1: {} + trim-newlines@3.0.1: {} ts-api-utils@2.1.0(typescript@5.8.3): @@ -4618,6 +6215,19 @@ snapshots: type-fest@4.41.0: {} + typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.8.3)): + dependencies: + typedoc: 0.28.14(typescript@5.8.3) + + typedoc@0.28.14(typescript@5.8.3): + dependencies: + '@gerrit0/mini-shiki': 3.15.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.8.3 + yaml: 2.8.1 + typescript-eslint@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3): dependencies: '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) @@ -4631,6 +6241,10 @@ snapshots: typescript@5.8.3: {} + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + undici-types@7.16.0: {} unicorn-magic@0.1.0: {} @@ -4639,6 +6253,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -4675,6 +6293,94 @@ snapshots: validate-npm-package-name@5.0.1: {} + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@5.4.21(@types/node@24.10.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.53.3 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + + vitepress-plugin-group-icons@1.6.5(vite@5.4.21(@types/node@24.10.1)): + dependencies: + '@iconify-json/logos': 1.2.10 + '@iconify-json/vscode-icons': 1.2.36 + '@iconify/utils': 3.0.2 + optionalDependencies: + vite: 5.4.21(@types/node@24.10.1) + transitivePeerDependencies: + - supports-color + + vitepress@1.6.4(@algolia/client-search@5.45.0)(@types/node@24.10.1)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.45.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.60 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@24.10.1))(vue@3.5.25(typescript@5.8.3)) + '@vue/devtools-api': 7.7.9 + '@vue/shared': 3.5.25 + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/integrations': 12.8.2(focus-trap@7.6.6)(typescript@5.8.3) + focus-trap: 7.6.6 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21(@types/node@24.10.1) + vue: 3.5.25(typescript@5.8.3) + optionalDependencies: + postcss: 8.5.6 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vue@3.5.25(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.8.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.8.3 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 diff --git a/prepare-typedoc.sh b/prepare-typedoc.sh new file mode 100644 index 0000000..3762fa3 --- /dev/null +++ b/prepare-typedoc.sh @@ -0,0 +1,6 @@ +mkdir ./dist/typedoc/reference +mv ./dist/typedoc/* ./dist/typedoc/reference +mv ./dist/typedoc/index.md ./dist/typedoc/reference/index.md + +cp -r ./.docs/vitepress/* ./dist/typedoc +cp CODE_OF_CONDUCT.md ./dist/typedoc/other/code-of-conduct.md diff --git a/src/map/to-object.ts b/src/map/to-object.ts deleted file mode 100644 index 424ec9d..0000000 --- a/src/map/to-object.ts +++ /dev/null @@ -1,16 +0,0 @@ -function toObject (this: ReadonlyMap): Record | null { - if (this.size === 0) - return null; - - const obj: Record = Object.fromEntries(this) as Record; - - return Object.keys(obj).length ? obj : null; -} - -/* eslint-disable-next-line no-extend-native */ -Object.defineProperty(Map.prototype, "toObject", { - value: toObject, - writable: false, - configurable: false, - enumerable: false -}); diff --git a/src/number/bounds.ts b/src/number/bounds.ts deleted file mode 100644 index 8f1dfd4..0000000 --- a/src/number/bounds.ts +++ /dev/null @@ -1,19 +0,0 @@ -function ensureBounds (this: number, min: number, max: number): number { - const value: number = Number(this); - - if (value < min) - return min; - - if (value > max) - return max; - - return value; -} - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Number.prototype, "ensureBounds", { - value: ensureBounds, - writable: false, - configurable: false, - enumerable: false -}); diff --git a/src/number/into.ts b/src/number/into.ts deleted file mode 100644 index f09b4ac..0000000 --- a/src/number/into.ts +++ /dev/null @@ -1,13 +0,0 @@ -function into (value: unknown): number | null { - if (value === null || value === undefined) - return null; - - return Number(value); -} - -Object.defineProperty(Number, "into", { - value: into, - writable: true, - configurable: false, - enumerable: false -}); diff --git a/src/object/has-keys.ts b/src/object/has-keys.ts deleted file mode 100644 index c4dcab8..0000000 --- a/src/object/has-keys.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { PickFromKeys } from "../types"; - -function hasKeys (this: object, ...keys: ReadonlyArray): this is PickFromKeys { - let _hasKeys: boolean = true; - - for (const key of keys) { - if (!_hasKeys) - break; - - _hasKeys = key in this; - } - - return _hasKeys; -} - -/* eslint-disable-next-line no-extend-native */ -Object.defineProperty(Object.prototype, "hasKeys", { - value: hasKeys, - writable: false, - configurable: false, - enumerable: false -}); diff --git a/src/array/join.ts b/src/prototypes/array/join.ts similarity index 65% rename from src/array/join.ts rename to src/prototypes/array/join.ts index cd057d2..f237085 100644 --- a/src/array/join.ts +++ b/src/prototypes/array/join.ts @@ -1,3 +1,14 @@ +/** + * @module Array + */ + +/** + * Joins array elements into a string, automatically skipping null and undefined values. + * @param this Array of values + * @param separator The string to insert between array elements + * @returns A string with all non-nullish array elements joined by the separator. + */ + function nonNullishJoin (this: readonly unknown[], separator: string): string { let joined: string = ""; diff --git a/src/date/iso-date.ts b/src/prototypes/date/iso-date.ts similarity index 100% rename from src/date/iso-date.ts rename to src/prototypes/date/iso-date.ts diff --git a/src/prototypes/map/to-object.ts b/src/prototypes/map/to-object.ts new file mode 100644 index 0000000..11b25d6 --- /dev/null +++ b/src/prototypes/map/to-object.ts @@ -0,0 +1,31 @@ +/** + * @module Map + */ + + +/** + *Converts a Map (or ReadonlyMap) into a plain object whose properties correspond to the map’s keys and values. + *If the map is empty, or if it yields no enumerable keys after conversion, null is returned instead of an empty object. + * @param this ReadonlyMap + * @returns A Record with the same key-value pairs as the map, or + * null if: + *the map is empty, or + * the resulting object has no own enumerable keys. + */ + +function toObject (this: ReadonlyMap): Record | null { + if (this.size === 0) + return null; + + const obj: Record = Object.fromEntries(this) as Record; + + return Object.keys(obj).length ? obj : null; +} + +/* eslint-disable-next-line no-extend-native */ +Object.defineProperty(Map.prototype, "toObject", { + value: toObject, + writable: false, + configurable: false, + enumerable: false +}); diff --git a/src/math/round.ts b/src/prototypes/math/round.ts similarity index 51% rename from src/math/round.ts rename to src/prototypes/math/round.ts index 122f9ff..ac6b351 100644 --- a/src/math/round.ts +++ b/src/prototypes/math/round.ts @@ -1,3 +1,15 @@ +/** + * @module Math + */ + + +/** + * Rounds a number to the nearest integer using a custom fractional threshold instead of the standard 0.5. + * @param value The number to round. + * @param threshold The fractional threshold at which rounding switches from floor to ceil.Typically between 0 and 1. + * @returns The rounded integer result according to the provided threshold. + */ + function roundWithThreshold (value: number, threshold: number): number { const integerPart: number = Math.floor(value); const fraction: number = value - integerPart; diff --git a/src/prototypes/number/bounds.ts b/src/prototypes/number/bounds.ts new file mode 100644 index 0000000..967885e --- /dev/null +++ b/src/prototypes/number/bounds.ts @@ -0,0 +1,32 @@ + +/** + *Clamps a number to ensure it stays within the provided [min, max] range`. + *If the value is less than min, it returns min. + *If the value is greater than max, it returns max. + *Otherwise, it returns the value itself. + *Internally it first coerces this into a number using Number(this). + * @param this Number we want to keep in range + * @param min lower bound(inclusive) + * @param max upper bound (inclusive) + * @returns A number that is guaranteed to be between min and max (inclusive), unless this coerces to NaN (see edge cases) + */ + +export function ensureBounds (this: number, min: number, max: number): number { + const value: number = Number(this); + + if (value < min) + return min; + + if (value > max) + return max; + + return value; +} + +// eslint-disable-next-line no-extend-native +Object.defineProperty(Number.prototype, "ensureBounds", { + value: ensureBounds, + writable: false, + configurable: false, + enumerable: false +}); diff --git a/src/prototypes/number/index.ts b/src/prototypes/number/index.ts new file mode 100644 index 0000000..7c9dfa6 --- /dev/null +++ b/src/prototypes/number/index.ts @@ -0,0 +1,7 @@ + +/** + * @module number + */ + +export * from "./bounds"; +export * from "./into"; diff --git a/src/prototypes/number/into.ts b/src/prototypes/number/into.ts new file mode 100644 index 0000000..2a09605 --- /dev/null +++ b/src/prototypes/number/into.ts @@ -0,0 +1,21 @@ + +/** + * Converts an arbitrary value into a number using Number(value), but returns null instead of NaN when the input is null or undefined. + * @param value unknown value that we want to turn into a number + * @returns null if value is null or undefined. Otherwise, the result of Number(value) (which may be NaN). + */ + + +export function into (value: unknown): number | null { + if (value === null || value === undefined) + return null; + + return Number(value); +} + +Object.defineProperty(Number, "into", { + value: into, + writable: true, + configurable: false, + enumerable: false +}); diff --git a/src/prototypes/object/has-keys.ts b/src/prototypes/object/has-keys.ts new file mode 100644 index 0000000..2e7d711 --- /dev/null +++ b/src/prototypes/object/has-keys.ts @@ -0,0 +1,36 @@ +/** + * @module Object + */ + + +/** + * Checks whether an object has all of the specified keys, and acts as a TypeScript type guard that narrows the type of the object to only include those keys. + * @param this object we are checking + * @param keys - A list of keys to check for on the object. + * @returns true if all specified keys are present in the object. + *false otherwise. + * When true, TypeScript narrows the type of this to PickFromKeys (the object with at least those keys) + */ + +import { PickFromKeys } from "../../types"; + +export function hasKeys (this: object, ...keys: ReadonlyArray): this is PickFromKeys { + let _hasKeys: boolean = true; + + for (const key of keys) { + if (!_hasKeys) + break; + + _hasKeys = key in this; + } + + return _hasKeys; +} + +/* eslint-disable-next-line no-extend-native */ +Object.defineProperty(Object.prototype, "hasKeys", { + value: hasKeys, + writable: false, + configurable: false, + enumerable: false +}); diff --git a/src/prototypes/string/capitalize.ts b/src/prototypes/string/capitalize.ts new file mode 100644 index 0000000..2056e5b --- /dev/null +++ b/src/prototypes/string/capitalize.ts @@ -0,0 +1,21 @@ +/** + * @module String + */ + +/** + * Converts the first character of a string to uppercase and returns the resulting string. All remaining characters are left unchanged. + * @param this the string we want to capitalize + * @returns A new string with the first character converted to uppercase. If the string is empty, an empty string is returned. + */ + +function capitalize (this: string): string { + return this.charAt(0).toUpperCase() + this.slice(1); +} + +// eslint-disable-next-line no-extend-native +Object.defineProperty(String.prototype, "capitalize", { + value: capitalize, + writable: false, + configurable: false, + enumerable: false +}); diff --git a/src/public-api.ts b/src/public-api.ts index d621e75..2ee93b0 100644 --- a/src/public-api.ts +++ b/src/public-api.ts @@ -1,11 +1,11 @@ -import "./array/join"; -import "./date/iso-date"; -import "./map/to-object"; -import "./math/round"; -import "./number/bounds"; -import "./number/into"; -import "./object/has-keys"; -import "./string/capitalize"; +import "./prototypes/array/join"; +import "./prototypes/date/iso-date"; +import "./prototypes/map/to-object"; +import "./prototypes/math/round"; +import "./prototypes/number/bounds"; +import "./prototypes/number/into"; +import "./prototypes/object/has-keys"; +import "./prototypes/string/capitalize"; import { PickFromKeys } from "./types"; /* eslint-disable @tseslint/no-unused-vars */ diff --git a/src/string/capitalize.ts b/src/string/capitalize.ts deleted file mode 100644 index 759b358..0000000 --- a/src/string/capitalize.ts +++ /dev/null @@ -1,11 +0,0 @@ -function capitalize (this: string): string { - return this.charAt(0).toUpperCase() + this.slice(1); -} - -// eslint-disable-next-line no-extend-native -Object.defineProperty(String.prototype, "capitalize", { - value: capitalize, - writable: false, - configurable: false, - enumerable: false -}); diff --git a/tsconfig.json b/tsconfig.json index 48fa8e3..6022169 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["./src/**/*.ts"], + "include": ["./src/**/*.ts","./.vitepress/.vitepress/config.ts"], "compilerOptions": { "baseUrl": ".", "module": "esnext", diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..9fef222 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://typedoc-plugin-markdown.org/schema.json", + "out": "dist/typedoc", + "name": "Home", + "includeVersion": true, + "entryPoints": [ + "src/prototypes/array/join.ts", + "src/prototypes/date/iso-date.ts", + "src/prototypes/map/to-object.ts", + "src/prototypes/math/round.ts", + "src/prototypes/number/index.ts", + "src/prototypes/object/has-keys.ts", + "src/prototypes/string/capitalize.ts"], + "entryPointStrategy": "resolve", + "excludePrivate": true, + "excludeProtected": true, + "plugin": [ + "typedoc-plugin-markdown" + ], + "lang": "en", + "entryFileName": "index.md", + "modulesFileName": "modules.md", + "mergeReadme": true, + "hidePageHeader": true, + "hideBreadcrumbs": true, + "hidePageTitle": false, + "pageTitleTemplates": { + "index": "Reference", + "member": "{name}", + "module": "{name}" + }, + "useCustomAnchors": false, + "readme": "none", + "useCodeBlocks": true, + "indexFormat": "list", + "parametersFormat": "table", + "interfacePropertiesFormat": "table", + "classPropertiesFormat": "table", + "enumMembersFormat": "table", + "router": "kind", + "navigation": { + "includeCategories": true, + "includeGroups": true, + "includeFolders": true, + "compactFolders": false, + "excludeReferences": true + }, + "categorizeByGroup": false, + "githubPages": true, + "hideGenerator": true, + "searchInComments": true +} \ No newline at end of file From 63574895c36f6521f598a7b5e498652680168311 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 28 Nov 2025 14:18:25 +0100 Subject: [PATCH 2/3] docs: improve consistency --- .docs/vitepress/guide/index.md | 40 +++++------------------ package.json | 6 ++-- src/{prototypes => }/array/join.ts | 4 ++- src/{prototypes => }/date/iso-date.ts | 13 ++++++++ src/{prototypes => }/map/to-object.ts | 13 +++----- src/{prototypes => }/math/round.ts | 5 +-- src/{prototypes => }/number/bounds.ts | 15 +++++---- src/{prototypes => }/number/index.ts | 3 +- src/{prototypes => }/number/into.ts | 6 ++-- src/{prototypes => }/object/has-keys.ts | 12 +++---- src/public-api.ts | 16 ++++----- src/{prototypes => }/string/capitalize.ts | 4 ++- src/types.ts | 8 +++++ typedoc.json | 18 +++++----- 14 files changed, 81 insertions(+), 82 deletions(-) rename src/{prototypes => }/array/join.ts (95%) rename src/{prototypes => }/date/iso-date.ts (67%) rename src/{prototypes => }/map/to-object.ts (61%) rename src/{prototypes => }/math/round.ts (94%) rename src/{prototypes => }/number/bounds.ts (66%) rename src/{prototypes => }/number/index.ts (75%) rename src/{prototypes => }/number/into.ts (93%) rename src/{prototypes => }/object/has-keys.ts (78%) rename src/{prototypes => }/string/capitalize.ts (93%) diff --git a/.docs/vitepress/guide/index.md b/.docs/vitepress/guide/index.md index 6c3f8af..8ae13b4 100644 --- a/.docs/vitepress/guide/index.md +++ b/.docs/vitepress/guide/index.md @@ -16,22 +16,7 @@ pnpm install @ogs-gmbh/stdx ``` ::: -## Quick Start - - -```typescript -import '@ogs-gmbh/stdx'; - -const mixed = ['apple', null, 'banana', undefined, 'cherry']; -const filtered = mixed.nonNullishJoin(', '); -console.log(filtered); -// => "apple, banana, cherry" - -const name = capitalize('hello world'); -// => 'Hello world' -``` - -## 🧩 What's Inside? +## What's inside? The library is organized into dedicated extension modules.\ When imported, they safely patch well‑defined methods onto native @@ -39,19 +24,10 @@ prototypes. Current extension categories include: -### **Array Extensions** - -Useful helpers like: - `nonNullishJoin` --- join elements while skipping -`null`/`undefined` - ...and more coming soon - -### **String Extensions** - -Clean and readable string helpers such as: - `capitalize` --- uppercase -only the first letter of a string - -### **Object Extensions** - -Utilities for merging, flattening, safe access, etc. *(Upcoming)* - - - +- Array +- Date +- Map +- Math +- Number +- Object +- String diff --git a/package.json b/package.json index e14c8ba..267be98 100644 --- a/package.json +++ b/package.json @@ -52,12 +52,12 @@ "type": "module", "scripts": { "ci:build:main:production": "node .esbuild/build.mjs", + "ci:docs:extract:typedoc": "typedoc && bash ./prepare-typedoc.sh", + "ci:docs:main:vitepress": "vitepress build .vitepress", "ci:pr:commitlint:main:commitlint": "commitlint", "ci:pr:lint:main:eslint": "eslint .", - "ci:vitepress:main:typedoc": "typedoc && bash ./prepare-typedoc.sh", "commitizen": "cz", "prepare": "husky", - "vitepress:build": "vitepress build .vitepress", "vitepress:dev": "vitepress dev .vitepress", "vitepress:preview": "vitepress preview .vitepress" }, @@ -97,4 +97,4 @@ "publishConfig": { "directory": "dist" } -} \ No newline at end of file +} diff --git a/src/prototypes/array/join.ts b/src/array/join.ts similarity index 95% rename from src/prototypes/array/join.ts rename to src/array/join.ts index f237085..42bbba1 100644 --- a/src/prototypes/array/join.ts +++ b/src/array/join.ts @@ -7,8 +7,10 @@ * @param this Array of values * @param separator The string to insert between array elements * @returns A string with all non-nullish array elements joined by the separator. + * + * @since 1.0.0 + * @author Simon Kovtyk */ - function nonNullishJoin (this: readonly unknown[], separator: string): string { let joined: string = ""; diff --git a/src/prototypes/date/iso-date.ts b/src/date/iso-date.ts similarity index 67% rename from src/prototypes/date/iso-date.ts rename to src/date/iso-date.ts index d72cdad..7e96e53 100644 --- a/src/prototypes/date/iso-date.ts +++ b/src/date/iso-date.ts @@ -1,3 +1,16 @@ +/** + * @module Date + */ + +/** + * Converts a Date object to an ISO 8601 date string (YYYY-MM-DD). + * @param this The Date object to convert. + * @param [isLocal=false] If true, uses local time; otherwise, uses UTC time. + * @return The ISO 8601 date string. + * + * @since 1.1.0 + * @author Ian Wenneckers + */ function toISOStringDate (this: Date, isLocal: boolean = false): string { if (isLocal) { return `${ this.getFullYear() }-${ (this.getMonth() + 1).toString().padStart(2, "0") }-${ this.getDate().toString() diff --git a/src/prototypes/map/to-object.ts b/src/map/to-object.ts similarity index 61% rename from src/prototypes/map/to-object.ts rename to src/map/to-object.ts index 11b25d6..814cd11 100644 --- a/src/prototypes/map/to-object.ts +++ b/src/map/to-object.ts @@ -2,17 +2,14 @@ * @module Map */ - /** - *Converts a Map (or ReadonlyMap) into a plain object whose properties correspond to the map’s keys and values. - *If the map is empty, or if it yields no enumerable keys after conversion, null is returned instead of an empty object. + * Converts a Map (or ReadonlyMap) into a plain object whose properties correspond to the map’s keys and values. If the map is empty, or if it yields no enumerable keys after conversion, null is returned instead of an empty object. * @param this ReadonlyMap - * @returns A Record with the same key-value pairs as the map, or - * null if: - *the map is empty, or - * the resulting object has no own enumerable keys. + * @returns A Record with the same key-value pairs as the map, on null if the map is empty, or the resulting object has no own enumerable keys. + * + * @since 1.0.0 + * @author Ian Wenneckers */ - function toObject (this: ReadonlyMap): Record | null { if (this.size === 0) return null; diff --git a/src/prototypes/math/round.ts b/src/math/round.ts similarity index 94% rename from src/prototypes/math/round.ts rename to src/math/round.ts index ac6b351..7babfe7 100644 --- a/src/prototypes/math/round.ts +++ b/src/math/round.ts @@ -2,14 +2,15 @@ * @module Math */ - /** * Rounds a number to the nearest integer using a custom fractional threshold instead of the standard 0.5. * @param value The number to round. * @param threshold The fractional threshold at which rounding switches from floor to ceil.Typically between 0 and 1. * @returns The rounded integer result according to the provided threshold. + * + * @since 1.0.0 + * @author Ian Wenneckers */ - function roundWithThreshold (value: number, threshold: number): number { const integerPart: number = Math.floor(value); const fraction: number = value - integerPart; diff --git a/src/prototypes/number/bounds.ts b/src/number/bounds.ts similarity index 66% rename from src/prototypes/number/bounds.ts rename to src/number/bounds.ts index 967885e..59c6497 100644 --- a/src/prototypes/number/bounds.ts +++ b/src/number/bounds.ts @@ -1,16 +1,17 @@ - /** - *Clamps a number to ensure it stays within the provided [min, max] range`. - *If the value is less than min, it returns min. - *If the value is greater than max, it returns max. - *Otherwise, it returns the value itself. - *Internally it first coerces this into a number using Number(this). + * Clamps a number to ensure it stays within the provided [min, max] range`. + * If the value is less than min, it returns min. + * If the value is greater than max, it returns max. + * Otherwise, it returns the value itself. + * Internally it first coerces this into a number using Number(this). * @param this Number we want to keep in range * @param min lower bound(inclusive) * @param max upper bound (inclusive) * @returns A number that is guaranteed to be between min and max (inclusive), unless this coerces to NaN (see edge cases) + * + * @since 1.0.0 + * @author Simon Kovtyk */ - export function ensureBounds (this: number, min: number, max: number): number { const value: number = Number(this); diff --git a/src/prototypes/number/index.ts b/src/number/index.ts similarity index 75% rename from src/prototypes/number/index.ts rename to src/number/index.ts index 7c9dfa6..033bcf8 100644 --- a/src/prototypes/number/index.ts +++ b/src/number/index.ts @@ -1,6 +1,5 @@ - /** - * @module number + * @module Number */ export * from "./bounds"; diff --git a/src/prototypes/number/into.ts b/src/number/into.ts similarity index 93% rename from src/prototypes/number/into.ts rename to src/number/into.ts index 2a09605..8ea61df 100644 --- a/src/prototypes/number/into.ts +++ b/src/number/into.ts @@ -1,11 +1,11 @@ - /** * Converts an arbitrary value into a number using Number(value), but returns null instead of NaN when the input is null or undefined. * @param value unknown value that we want to turn into a number * @returns null if value is null or undefined. Otherwise, the result of Number(value) (which may be NaN). + * + * @since 1.0.0 + * @author Simon Kovtyk */ - - export function into (value: unknown): number | null { if (value === null || value === undefined) return null; diff --git a/src/prototypes/object/has-keys.ts b/src/object/has-keys.ts similarity index 78% rename from src/prototypes/object/has-keys.ts rename to src/object/has-keys.ts index 2e7d711..e4086ce 100644 --- a/src/prototypes/object/has-keys.ts +++ b/src/object/has-keys.ts @@ -1,19 +1,17 @@ /** * @module Object */ - +import { PickFromKeys } from "../types"; /** * Checks whether an object has all of the specified keys, and acts as a TypeScript type guard that narrows the type of the object to only include those keys. * @param this object we are checking * @param keys - A list of keys to check for on the object. - * @returns true if all specified keys are present in the object. - *false otherwise. - * When true, TypeScript narrows the type of this to PickFromKeys (the object with at least those keys) + * @returns true if all specified keys are present in the object. Otherwise false. When true, TypeScript narrows the type of this to PickFromKeys (the object with at least those keys) + * + * @since 1.0.0 + * @return Simon Kovtyk */ - -import { PickFromKeys } from "../../types"; - export function hasKeys (this: object, ...keys: ReadonlyArray): this is PickFromKeys { let _hasKeys: boolean = true; diff --git a/src/public-api.ts b/src/public-api.ts index 2ee93b0..d621e75 100644 --- a/src/public-api.ts +++ b/src/public-api.ts @@ -1,11 +1,11 @@ -import "./prototypes/array/join"; -import "./prototypes/date/iso-date"; -import "./prototypes/map/to-object"; -import "./prototypes/math/round"; -import "./prototypes/number/bounds"; -import "./prototypes/number/into"; -import "./prototypes/object/has-keys"; -import "./prototypes/string/capitalize"; +import "./array/join"; +import "./date/iso-date"; +import "./map/to-object"; +import "./math/round"; +import "./number/bounds"; +import "./number/into"; +import "./object/has-keys"; +import "./string/capitalize"; import { PickFromKeys } from "./types"; /* eslint-disable @tseslint/no-unused-vars */ diff --git a/src/prototypes/string/capitalize.ts b/src/string/capitalize.ts similarity index 93% rename from src/prototypes/string/capitalize.ts rename to src/string/capitalize.ts index 2056e5b..564e434 100644 --- a/src/prototypes/string/capitalize.ts +++ b/src/string/capitalize.ts @@ -6,8 +6,10 @@ * Converts the first character of a string to uppercase and returns the resulting string. All remaining characters are left unchanged. * @param this the string we want to capitalize * @returns A new string with the first character converted to uppercase. If the string is empty, an empty string is returned. + * + * @since 1.0.0 + * @author Ian Wenneckers */ - function capitalize (this: string): string { return this.charAt(0).toUpperCase() + this.slice(1); } diff --git a/src/types.ts b/src/types.ts index fd21310..4b859d5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,7 @@ +/** + * @module Types + */ + export type UnionToIntersection = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I @@ -33,6 +37,10 @@ export type DeepNormalized = ( ? T | null : T ); +/** + * Pick properties from an object O based on an array of keys K. + * @typeParam O - The object type to pick properties from. + */ export type PickFromKeys> = { [P in K[number]]: O[P]; }; diff --git a/typedoc.json b/typedoc.json index 9fef222..760808b 100644 --- a/typedoc.json +++ b/typedoc.json @@ -4,13 +4,15 @@ "name": "Home", "includeVersion": true, "entryPoints": [ - "src/prototypes/array/join.ts", - "src/prototypes/date/iso-date.ts", - "src/prototypes/map/to-object.ts", - "src/prototypes/math/round.ts", - "src/prototypes/number/index.ts", - "src/prototypes/object/has-keys.ts", - "src/prototypes/string/capitalize.ts"], + "src/array/join.ts", + "src/date/iso-date.ts", + "src/map/to-object.ts", + "src/math/round.ts", + "src/number/index.ts", + "src/object/has-keys.ts", + "src/string/capitalize.ts", + "src/types.ts" + ], "entryPointStrategy": "resolve", "excludePrivate": true, "excludeProtected": true, @@ -49,4 +51,4 @@ "githubPages": true, "hideGenerator": true, "searchInComments": true -} \ No newline at end of file +} From f3668a356b223e4e945e5d846b951580b3521677 Mon Sep 17 00:00:00 2001 From: Elie-Soued Date: Mon, 1 Dec 2025 13:26:25 +0100 Subject: [PATCH 3/3] docs: adding documentation --- src/prototypes/array/join.ts | 6 + src/prototypes/date/iso-date.ts | 31 +++ src/prototypes/map/to-object.ts | 20 ++ src/prototypes/math/round.ts | 5 + src/prototypes/number/bounds.ts | 7 + src/prototypes/number/into.ts | 7 + src/prototypes/object/has-keys.ts | 15 +- src/prototypes/string/capitalize.ts | 4 + src/types.ts | 283 ++++++++++++++++++++++++++++ typedoc.json | 3 +- 10 files changed, 376 insertions(+), 5 deletions(-) diff --git a/src/prototypes/array/join.ts b/src/prototypes/array/join.ts index f237085..87c26c0 100644 --- a/src/prototypes/array/join.ts +++ b/src/prototypes/array/join.ts @@ -7,6 +7,12 @@ * @param this Array of values * @param separator The string to insert between array elements * @returns A string with all non-nullish array elements joined by the separator. + * @example + * ```ts + *const array = [1, "a",undefined, "b", 3, , null]; + *const joined = array.nonNullishJoin("-") + *console.assert(joined === "1-a-b-3-"); + * ``` */ function nonNullishJoin (this: readonly unknown[], separator: string): string { diff --git a/src/prototypes/date/iso-date.ts b/src/prototypes/date/iso-date.ts index d72cdad..71fee16 100644 --- a/src/prototypes/date/iso-date.ts +++ b/src/prototypes/date/iso-date.ts @@ -1,3 +1,34 @@ + +/** + * @module Date + */ + + +/** + * Returns the date portion of a `Date` instance in ISO-8601 format (`YYYY-MM-DD`). + * + * By default, the date is computed in UTC (i.e. based on `Date.prototype.toISOString()`), + * which means the returned value may differ from the local calendar day if your local + * timezone is behind/ahead of UTC. + * + * If `isLocal` is set to `true`, the date is instead computed using local time + * (`getFullYear()`, `getMonth()`, `getDate()`), so the string always reflects the + * local calendar date. + * + * @this Date The `Date` instance the method is called on. + * @param {boolean} [isLocal=false] Whether to format the date in the local timezone + * rather than UTC. + * @returns {string} The ISO-8601 date string (`YYYY-MM-DD`) for this `Date`. + * + * @example + * const d = new Date("2025-03-15T23:30:00Z"); + * + * // UTC-based date (default): + * d.toISOStringDate(); // e.g. "2025-03-15" + * + * // Local-time-based date: + * d.toISOStringDate(true); // e.g. "2025-03-16" in a timezone ahead of UTC + */ function toISOStringDate (this: Date, isLocal: boolean = false): string { if (isLocal) { return `${ this.getFullYear() }-${ (this.getMonth() + 1).toString().padStart(2, "0") }-${ this.getDate().toString() diff --git a/src/prototypes/map/to-object.ts b/src/prototypes/map/to-object.ts index 11b25d6..fd48442 100644 --- a/src/prototypes/map/to-object.ts +++ b/src/prototypes/map/to-object.ts @@ -11,6 +11,26 @@ * null if: *the map is empty, or * the resulting object has no own enumerable keys. + * @example + * ```ts + * const mapTest = new Map(); + * + * const sym = Symbol() + * + * mapTest.set("name", "John"); + * mapTest.set(1, 1); + * mapTest.set(sym, {test: "hello"}); + * + * const object = mapTest.toObject(); + * + * const expectedResult = { + * "name": "John", + * 1: 1, + * [sym]:{test : "hello" } + * } + * + * console.assert(JSON.stringify(expectedResult) === JSON.stringify(object)); + * ``` */ function toObject (this: ReadonlyMap): Record | null { diff --git a/src/prototypes/math/round.ts b/src/prototypes/math/round.ts index ac6b351..c824d0e 100644 --- a/src/prototypes/math/round.ts +++ b/src/prototypes/math/round.ts @@ -8,6 +8,11 @@ * @param value The number to round. * @param threshold The fractional threshold at which rounding switches from floor to ceil.Typically between 0 and 1. * @returns The rounded integer result according to the provided threshold. + * @example + * ```ts + * console.assert(Math.roundWithThreshold(1.5,0.3) === 2) + * console.assert(Math.roundWithThreshold(1.2,0.3) === 1) + * ``` */ function roundWithThreshold (value: number, threshold: number): number { diff --git a/src/prototypes/number/bounds.ts b/src/prototypes/number/bounds.ts index 967885e..fc451d3 100644 --- a/src/prototypes/number/bounds.ts +++ b/src/prototypes/number/bounds.ts @@ -9,6 +9,13 @@ * @param min lower bound(inclusive) * @param max upper bound (inclusive) * @returns A number that is guaranteed to be between min and max (inclusive), unless this coerces to NaN (see edge cases) + * @example + * ```ts + * const boundedNumberMax = (100).ensureBounds(1, 50); + * const boundedNumberMin = (0).ensureBounds(1,50); + * console.assert(boundedNumberMax === 50); + * console.assert(boundedNumberMin === 1); + * ``` */ export function ensureBounds (this: number, min: number, max: number): number { diff --git a/src/prototypes/number/into.ts b/src/prototypes/number/into.ts index 2a09605..9fa6a03 100644 --- a/src/prototypes/number/into.ts +++ b/src/prototypes/number/into.ts @@ -3,6 +3,13 @@ * Converts an arbitrary value into a number using Number(value), but returns null instead of NaN when the input is null or undefined. * @param value unknown value that we want to turn into a number * @returns null if value is null or undefined. Otherwise, the result of Number(value) (which may be NaN). + * @example + * ```ts + * console.assert(Number.isNaN(Number.into("abc")) === true); + * console.assert(Number.into("5") === 5); + * console.assert(Number.into(undefined) === null); + * console.assert(Number.into(5n) === 5); + * ``` */ diff --git a/src/prototypes/object/has-keys.ts b/src/prototypes/object/has-keys.ts index 2e7d711..2fb6dc7 100644 --- a/src/prototypes/object/has-keys.ts +++ b/src/prototypes/object/has-keys.ts @@ -3,25 +3,32 @@ */ +import { PickFromKeys } from "../../types"; + /** * Checks whether an object has all of the specified keys, and acts as a TypeScript type guard that narrows the type of the object to only include those keys. - * @param this object we are checking + * @param objectToCheck object we are checking * @param keys - A list of keys to check for on the object. * @returns true if all specified keys are present in the object. *false otherwise. * When true, TypeScript narrows the type of this to PickFromKeys (the object with at least those keys) + * @example + * ```ts + * const hasKeysObject = {name : "john", age: 39}; + * console.assert(hasKeysObject.hasKeys("name")); + * console.assert(hasKeysObject.hasKeys("age")); + * ``` */ -import { PickFromKeys } from "../../types"; -export function hasKeys (this: object, ...keys: ReadonlyArray): this is PickFromKeys { +export function hasKeys (objectToCheck: T, ...keys: ReadonlyArray): objectToCheck is PickFromKeys { let _hasKeys: boolean = true; for (const key of keys) { if (!_hasKeys) break; - _hasKeys = key in this; + _hasKeys = key in objectToCheck; } return _hasKeys; diff --git a/src/prototypes/string/capitalize.ts b/src/prototypes/string/capitalize.ts index 2056e5b..81dc91f 100644 --- a/src/prototypes/string/capitalize.ts +++ b/src/prototypes/string/capitalize.ts @@ -6,6 +6,10 @@ * Converts the first character of a string to uppercase and returns the resulting string. All remaining characters are left unchanged. * @param this the string we want to capitalize * @returns A new string with the first character converted to uppercase. If the string is empty, an empty string is returned. + * @example + * ```ts + * console.assert("hello".capitalize() === "Hello"); + * */ function capitalize (this: string): string { diff --git a/src/types.ts b/src/types.ts index fd21310..b6fa61e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,25 +1,200 @@ +/* eslint-disable @stylistic/ts/padding-line-between-statements */ +/** + * Converts a union type to an intersection type. + * + * @template U - The union type to convert + * + * @example + * ```ts + * type Union = { a: string } | { b: number }; + * type Result = UnionToIntersection; + * // Result: { a: string } & { b: number } + * ``` + */ + + export type UnionToIntersection = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never; + + +/** + * Extracts the element type from an array type. + * + * @template T - The array type to infer from + * + * @example + * ```ts + * type Result = InferArray<[string, number, boolean]>; + * // Result: string | number | boolean + * ``` + */ export type InferArray = T extends Array ? U : never; + + +/** + * Determines whether a type is a union type (has multiple constituents). + * + * @template T - The type to check + * @template U - Internal parameter for comparison (defaults to T) + * + * @example + * ```ts + * type A = IsUnion; // true + * type B = IsUnion; // false + * ``` + */ export type IsUnion = T extends unknown ? [U] extends [T] ? false : true : never; + + +/** + * Conditional type that returns `True` if `T` extends `ToCheck`, otherwise returns `False`. + * + * @template T - The type to check + * @template ToCheck - The type to check against + * @template True - The type to return if the condition is true (default: `true`) + * @template False - The type to return if the condition is false (default: `false`) + * + * @example + * ```ts + * type A = If; // 'yes' + * type B = If; // 'no' + * ``` + */ export type If = T extends ToCheck ? True : False; + + +/** + * Checks whether type `U` is fully contained within type `T` (i.e., whether `U` is a subtype of `T`). + * + * @template T - The broader type + * @template U - The type to check, constrained to extend T + * + * @example + * ```ts + * type A = ContainsUnion; // true + * type B = ContainsUnion; // false + * ``` + */ export type ContainsUnion = [U] extends [T] ? true : false; + + +/** + * Extracts members from a union type `U` that have a specific key `K`. + * + * @template U - The union type to filter + * @template K - The key that must exist on the extracted types + * + * @example + * ```ts + * type Union = { type: 'a'; value: string } | { type: 'b'; count: number } | { other: boolean }; + * type Result = ExtractUnionByKey; + * // Result: { type: 'a'; value: string } | { type: 'b'; count: number } + * ``` + */ export type ExtractUnionByKey = U extends Record ? U : never; + + +/** + * Extracts all possible keys from a union of object types. + * + * @template U - The union type to extract keys from + * + * @example + * ```ts + * type Union = { a: string; b: number } | { b: number; c: boolean }; + * type Keys = UnionKeys; + * // Keys: 'a' | 'b' | 'c' + * ``` + */ export type UnionKeys = U extends unknown ? keyof U : never; + + +/** + * Recursively applies `DeepNormalized` to all properties of an object type. + * Helper type for `DeepNormalized`. + * + * @template T - The object type to normalize + * @example + * // Before: + * type RawUser = { + * id: string | number | null; + * name?: string | null; + * address: { + * street: string | null; + * city?: string | null; + * } | null; + * }; + * + * // Usage: + * type NormalizedUser = DeepNormalizedObject; + * + * // After (assuming `DeepNormalized` removes null/undefined and recurses): + * // type NormalizedUser = { + * // id: string | number; + * // name: string; + * // address: { + * // street: string; + * // city: string; + * // }; + * // }; + * + * @internal + */ export type DeepNormalizedObject = { [K in keyof T]: DeepNormalized }; + + +/** + * Recursively applies `DeepNormalized` to array element types. + * Helper type for `DeepNormalized`. + * + * @template T - The array type to normalize + * @internal + * * @example + * // Before: + * type RawItem = { + * id: string | number | null; + * tags?: (string | null | undefined)[]; + * }; + * + * type RawItems = RawItem[]; + * + * // Usage: + * type NormalizedItems = DeepNormalizedArray; + * + * // After (assuming `DeepNormalized` removes null/undefined and recurses): + * // type NormalizedItems = Array<{ + * // id: string | number; + * // tags: string[]; + * // }>; + */ export type DeepNormalizedArray = T extends Array ? Array> : T; + + +/** + * Recursively normalizes a type by making all string properties nullable throughout the type tree. + * Non-string primitive types, null, and undefined are preserved as-is. + * + * @template T - The type to normalize + * + * @example + * ```ts + * type Original = { name: string; age: number; address: { street: string } }; + * type Result = DeepNormalized; + * // Result: { name: string | null; age: number; address: { street: string | null } } + * ``` + */ export type DeepNormalized = ( T extends null ? null @@ -33,25 +208,133 @@ export type DeepNormalized = ( ? T | null : T ); + + +/** + * Creates a new type by picking only the properties specified in the keys array. + * Similar to `Pick`, but accepts a readonly array of keys. + * + * @template O - The object type to pick from + * @template K - A readonly array of keys to pick + * + * @example + * ```ts + * type Original = { a: string; b: number; c: boolean }; + * type Result = PickFromKeys; + * // Result: { a: string; c: boolean } + * ``` + */ export type PickFromKeys> = { [P in K[number]]: O[P]; }; + + +/** + * Makes all properties of a type required by excluding `undefined` from each property type. + * + * @template T - The type to make non-partial + * + * @example + * ```ts + * type Original = { a?: string; b: number | undefined }; + * type Result = NonPartial; + * // Result: { a: string; b: number } + * ``` + */ export type NonPartial = { [K in keyof T]: Exclude; }; + + +/** + * Recursively applies `DeepNullable` to all properties of an object type. + * Helper type for `DeepNullable`. + * + * @template T - The object type to make nullable + * @internal + */ export type DeepNullableObject = { [K in keyof T]: DeepNullable; }; + + +/** + * Recursively applies `DeepNullable` to array element types. + * Helper type for `DeepNullable`. + * + * @template T - The array type to make nullable + * @internal + */ export type DeepNullableArray = T extends Array ? Array> : T; + + +/** + * Recursively makes all properties throughout a type tree nullable by adding `| null` to each property. + * + * @template T - The type to make deeply nullable + * + * @example + * ```ts + * type Original = { name: string; address: { street: string; city: string } }; + * type Result = DeepNullable; + * // Result: { name: string | null; address: { street: string | null; city: string | null } | null } + * ``` + */ export type DeepNullable = T extends object ? DeepNullableObject : T extends unknown[] ? DeepNullableArray : T | null; + + +/** + * Makes all properties of an object type nullable (adds `| null` to each property). + * Helper type for `Nullable`. Non-recursive. + * + * @template T - The object type to make nullable + * @example + * ```ts + * type Original = { name: string; age: number }; + * type Result = NullableObject; + * // Result: { name: string | null; age: number | null } + * ``` + * @internal + */ export type NullableObject = { [K in keyof T]: T[K] | null; }; + + +/** + * Makes array element types nullable (adds `| null` to the element type). + * Helper type for `Nullable`. Non-recursive. + * + * @template T - The array type to make nullable + * @example + * ```ts + * type Original = string[]; + * type Result = NullableArray; + * // Result: (string | null)[] + * ``` + * + * @internal + */ export type NullableArray = T extends Array ? Array : T; + + +/** + * Makes all properties at the first level nullable by adding `| null`. + * Unlike `DeepNullable`, this only applies to the immediate properties, not nested ones. + * + * @template T - The type to make nullable + * + * @example + * ```ts + * type Original = { name: string; address: { street: string } }; + * type Result = Nullable; + * // Result: { name: string | null; address: { street: string } | null } + * ``` + */ export type Nullable = T extends object ? NullableObject : T extends unknown[] diff --git a/typedoc.json b/typedoc.json index 9fef222..7b70bae 100644 --- a/typedoc.json +++ b/typedoc.json @@ -10,7 +10,8 @@ "src/prototypes/math/round.ts", "src/prototypes/number/index.ts", "src/prototypes/object/has-keys.ts", - "src/prototypes/string/capitalize.ts"], + "src/prototypes/string/capitalize.ts", + "src/types.ts"], "entryPointStrategy": "resolve", "excludePrivate": true, "excludeProtected": true,