diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 512d77d..826fda7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,11 +5,13 @@ on: - "v*" permissions: contents: read - id-token: write jobs: publish: runs-on: ubuntu-latest timeout-minutes: 10 + permissions: + contents: read + id-token: write steps: - name: Checkout repository uses: actions/checkout@v4 @@ -19,11 +21,48 @@ jobs: node-version: 22 cache: npm registry-url: https://registry.npmjs.org + - name: Update npm + run: npm install -g npm@latest - name: Install dependencies run: npm ci - name: Build package run: npm run build - name: Publish to npm run: npm publish --provenance --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + deploy-docs: + needs: publish + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + pages: write + id-token: write + concurrency: + group: pages + cancel-in-progress: false + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - name: Install dependencies + run: npm ci + - name: Build documentation + run: npm run docs:build + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 106b3b0..17d6ed0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,12 @@ dist/* coverage/* +# Documentation + +docs/.vitepress/dist +docs/.vitepress/cache + + # Text editor directory and files β€’ Visual Studio Code .vscode/* diff --git a/CHANGELOG.md b/CHANGELOG.md index cf034da..9fd9027 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/). +## [1.0.1] - 2026-09-24 + +### Added + +- **Documentation Website** + - Interactive documentation site powered by VitePress deployed to GitHub Pages. + - Dedicated Getting Started and Installation guides with CDN/IIFE, ESM, and CommonJS examples. + - Comprehensive API Reference pages for all 16 utility modules and exported types. + - Complete parameter tables, options breakdowns, return types, and empty/null/undefined edge-case examples. + - Built-in local search and responsive layout with custom brand theme. + +- **CI / CD** + - Automated GitHub Pages deployment job in `.github/workflows/release.yml` that runs upon successful npm publishing. + +- **Package Metadata** + - Added `homepage` URL to `package.json` pointing to the official documentation site. + - Updated `README.md` with links to the live documentation website. + ## [1.0.0] - 2026-09-23 ### Added @@ -46,4 +64,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/). - Husky, lint-staged, and commitlint for Git hooks and commit validation - GitHub Actions workflows for linting and test coverage +[1.0.1]: https://github.com/rcpthongta/string-utils/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/rcpthongta/string-utils/releases/tag/v1.0.0 diff --git a/README.md b/README.md index 1c1fe5e..5f70841 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ A lightweight, type-safe, dependency-free string utility library for TypeScript > > Full API references, interactive examples, and detailed guides are available on our official website: > -> πŸ‘‰ **[Visit Documentation Website](https://github.com/rcpthongta/string-utils#readme)** *(Link to docs site)* +> πŸ‘‰ **[Visit Documentation Website](https://rcpthongta.github.io/string-utils)** --- @@ -75,21 +75,29 @@ import { } from "@rcpthongta/string-utils"; // Case transformation -capitalize("hello world"); // "Hello world" -camelCase("user_profile_id"); // "userProfileId" +capitalize("hello world"); +// => "Hello world" + +camelCase("user_profile_id"); +// => "userProfileId" // Sanitization & URL -slugify("Hello World & Special Characters!"); // "hello-world-and-special-characters" +slugify("Hello World & Special Characters!"); +// => "hello-world-and-special-characters" // Validation & Fallback -defaultIfBlank(" ", "default value"); // "default value" +defaultIfBlank(" ", "default value"); +// => "default value" // Formatting with mask pattern -mask("0812345678", "(###) ###-####"); // "(081) 234-5678" -mask("1234567890123456", "#### #### #### ####"); // "1234 5678 9012 3456" +mask("0812345678", "(###) ###-####"); +// => "(081) 234-5678" +mask("1234567890123456", "#### #### #### ####"); +// => "1234 5678 9012 3456" // Privacy & Censoring -redact("0812345678", { visibleStart: 3, visibleEnd: 2 }); // "081*****78" +redact("0812345678", { visibleStart: 3, visibleEnd: 2 }); +// => "081*****78" ``` CommonJS is also fully supported: @@ -111,9 +119,9 @@ Below is a summary of the utility functions available in this package: | **Formatting & Templating** | `collapseWhitespace`, `format`, `createFormatter`, `slugify` | | **Pattern Masking** | `mask`, `createMask` | | **Validation & Fallback** | `hasLength`, `hasText`, `defaultIfBlank`, `defaultIfEmpty` | -| **Privacy & Redaction** | `redact` | +| **Privacy & Redaction** | `redact` | -*(Refer to the [Documentation Website](https://github.com/rcpthongta/string-utils#readme) for full parameter signatures, options, and live demos).* +*(Refer to the [Documentation Website](https://rcpthongta.github.io/string-utils) for full parameter signatures, options, and live demos).* --- diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..f2c1c0a --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,165 @@ +import { defineConfig } from "vitepress"; + +export default defineConfig({ + base: "/string-utils/", + title: "@rcpthongta/string-utils", + description: + "A lightweight, type-safe, dependency-free string utility library for TypeScript and modern JavaScript applications.", + themeConfig: { + nav: [ + { + text: "Guide", + link: "/guide/getting-started" + }, + { + text: "API Reference", + link: "/api/" + }, + { + text: "Changelog", + link: "https://github.com/rcpthongta/string-utils/blob/main/CHANGELOG.md" + } + ], + sidebar: [ + { + text: "Guide", + items: [ + { + text: "Getting Started", + link: "/guide/getting-started" + }, + { + text: "Installation", + link: "/guide/installation" + } + ] + }, + { + text: "API Reference", + items: [ + { + text: "Overview", + link: "/api/" + } + ] + }, + { + text: "Case Conversion", + collapsed: false, + items: [ + { + text: "camelCase", + link: "/api/camel-case" + }, + { + text: "constantCase", + link: "/api/constant-case" + }, + { + text: "kebabCase", + link: "/api/kebab-case" + }, + { + text: "pascalCase", + link: "/api/pascal-case" + }, + { + text: "snakeCase", + link: "/api/snake-case" + } + ] + }, + { + text: "Casing & Capitalization", + collapsed: false, + items: [ + { + text: "capitalize", + link: "/api/capitalize" + }, + { + text: "uncapitalize", + link: "/api/uncapitalize" + } + ] + }, + { + text: "Formatting & Templating", + collapsed: false, + items: [ + { + text: "collapseWhitespace", + link: "/api/collapse-whitespace" + }, + { + text: "format / createFormatter", + link: "/api/format" + }, + { + text: "slugify", + link: "/api/slugify" + } + ] + }, + { + text: "Pattern Masking", + collapsed: false, + items: [ + { + text: "mask / createMask", + link: "/api/mask" + } + ] + }, + { + text: "Validation & Fallback", + collapsed: false, + items: [ + { + text: "hasLength", + link: "/api/has-length" + }, + { + text: "hasText", + link: "/api/has-text" + }, + { + text: "defaultIfBlank", + link: "/api/default-if-blank" + }, + { + text: "defaultIfEmpty", + link: "/api/default-if-empty" + } + ] + }, + { + text: "Privacy & Redaction", + collapsed: false, + items: [ + { + text: "redact", + link: "/api/redact" + } + ] + } + ], + search: { + provider: "local" + }, + socialLinks: [ + { + icon: "github", + link: "https://github.com/rcpthongta/string-utils" + }, + { + icon: "npm", + link: "https://www.npmjs.com/package/@rcpthongta/string-utils" + } + ], + footer: { + message: "Released under the MIT License.", + copyright: "Copyright Β© 2026 rcpthongta" + } + } +}); diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..c026429 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,7 @@ +import DefaultTheme from "vitepress/theme"; + +import "./style.css"; + +export default { + extends: DefaultTheme +}; diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..0abbafd --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,62 @@ +/** + * Custom VitePress Theme Colors + * Base Brand: rgb(244, 184, 228) / #f4b8e4 + */ + +:root { + --vp-c-brand-1: #c54a9c; + --vp-c-brand-2: #d96bb2; + --vp-c-brand-3: rgb(244, 184, 228); + --vp-c-brand-soft: rgba(244, 184, 228, 0.16); + + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #c54a9c 30%, rgb(244, 184, 228)); + --vp-home-hero-image-background-image: linear-gradient(-45deg, rgb(244, 184, 228) 40%, #c54a9c 60%); + --vp-home-hero-image-filter: blur(48px); +} + +.dark { + --vp-c-brand-1: rgb(244, 184, 228); + --vp-c-brand-2: #f7c9ec; + --vp-c-brand-3: #fae1f5; + --vp-c-brand-soft: rgba(244, 184, 228, 0.16); + + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient(120deg, rgb(244, 184, 228) 30%, #fdeaf6); + --vp-home-hero-image-background-image: linear-gradient(-45deg, rgb(244, 184, 228) 30%, #872e68 70%); + --vp-home-hero-image-filter: blur(48px); +} + +/* Hero Subtitle Font Size */ +.VPHero .text { + font-size: 28px !important; + line-height: 36px !important; +} + +@media (min-width: 640px) { + .VPHero .text { + font-size: 32px !important; + line-height: 40px !important; + } +} + +@media (min-width: 960px) { + .VPHero .text { + font-size: 36px !important; + line-height: 44px !important; + } +} + +/* Table Column Wrapping */ +.vp-doc table th { + white-space: nowrap; +} + +.vp-doc table td:not(:last-child) { + white-space: nowrap; +} + +.vp-doc table td:last-child { + white-space: normal; +} + diff --git a/docs/api/camel-case.md b/docs/api/camel-case.md new file mode 100644 index 0000000..d2fa3bf --- /dev/null +++ b/docs/api/camel-case.md @@ -0,0 +1,52 @@ +# camelCase + +Converts any string to `camelCase`. Supports standard separators, acronyms, numbers, and Unicode characters. + +## Signature + +```typescript +function camelCase(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|------------------------------| +| `value` | `string \| null \| undefined` | The input string to convert. | + +## Returns + +`string` β€” The camelCase formatted string, or an empty string `""` when `value` is empty, `null`, `undefined`, or contains no extractable words. + +## Examples + +```typescript +import { camelCase } from "@rcpthongta/string-utils"; + +camelCase("Foo Bar"); +// => "fooBar" + +camelCase("--foo-bar--"); +// => "fooBar" + +camelCase("FOO_BAR"); +// => "fooBar" + +camelCase("XMLHttpRequest"); +// => "xmlHttpRequest" + +camelCase("version 2.0"); +// => "version20" + +camelCase("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠœΠΈΡ€"); +// => "ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΠœΠΈΡ€" + +camelCase(""); +// => "" + +camelCase(null); +// => "" + +camelCase(undefined); +// => "" +``` diff --git a/docs/api/capitalize.md b/docs/api/capitalize.md new file mode 100644 index 0000000..a8511d7 --- /dev/null +++ b/docs/api/capitalize.md @@ -0,0 +1,44 @@ +# capitalize + +Capitalizes the first character of a string while preserving its literal TypeScript type. + +## Signature + +```typescript +function capitalize(value: T): Capitalize; +function capitalize(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|---------------------------------| +| `value` | `string \| null \| undefined` | The input string to capitalize. | + +## Returns + +`Capitalize | string` β€” The capitalized string, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +## Examples + +```typescript +import { capitalize } from "@rcpthongta/string-utils"; + +capitalize("hello"); +// => "Hello" + +capitalize("helloWorld"); +// => "HelloWorld" + +capitalize("Hello"); +// => "Hello" + +capitalize(""); +// => "" + +capitalize(null); +// => "" + +capitalize(undefined); +// => "" +``` diff --git a/docs/api/collapse-whitespace.md b/docs/api/collapse-whitespace.md new file mode 100644 index 0000000..3f5cfb5 --- /dev/null +++ b/docs/api/collapse-whitespace.md @@ -0,0 +1,44 @@ +# collapseWhitespace + +Collapses consecutive whitespace characters (including tabs, newlines, non-breaking spaces, and ideographic spaces) into a single space and trims leading and trailing whitespace. + +## Signature + +```typescript +function collapseWhitespace(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|--------------------------------| +| `value` | `string \| null \| undefined` | The input string to normalize. | + +## Returns + +`string` β€” The normalized string with single spaces, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +## Examples + +```typescript +import { collapseWhitespace } from "@rcpthongta/string-utils"; + +collapseWhitespace("Hello World"); +// => "Hello World" + +collapseWhitespace(" \t\n Hello World \n "); +// => "Hello World" + +// Non-breaking space (NBSP) support +collapseWhitespace("Hello\u00A0World"); +// => "Hello World" + +collapseWhitespace(""); +// => "" + +collapseWhitespace(null); +// => "" + +collapseWhitespace(undefined); +// => "" +``` diff --git a/docs/api/constant-case.md b/docs/api/constant-case.md new file mode 100644 index 0000000..99b8af6 --- /dev/null +++ b/docs/api/constant-case.md @@ -0,0 +1,49 @@ +# constantCase + +Converts any string to uppercase `CONSTANT_CASE`. Supports standard separators, acronyms, numbers, and Unicode characters. + +## Signature + +```typescript +function constantCase(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|------------------------------| +| `value` | `string \| null \| undefined` | The input string to convert. | + +## Returns + +`string` β€” The CONSTANT_CASE formatted string, or an empty string `""` when `value` is empty, `null`, `undefined`, or contains no extractable words. + +## Examples + +```typescript +import { constantCase } from "@rcpthongta/string-utils"; + +constantCase("foo bar"); +// => "FOO_BAR" + +constantCase("fooBar"); +// => "FOO_BAR" + +constantCase("--foo-bar--"); +// => "FOO_BAR" + +constantCase("XMLHttpRequest"); +// => "XML_HTTP_REQUEST" + +constantCase("version 2.0"); +// => "VERSION_20" + +constantCase(""); +// => "" + +constantCase(null); +// => "" + +constantCase(undefined); +// => "" +``` diff --git a/docs/api/default-if-blank.md b/docs/api/default-if-blank.md new file mode 100644 index 0000000..f1b690d --- /dev/null +++ b/docs/api/default-if-blank.md @@ -0,0 +1,44 @@ +# defaultIfBlank + +Returns a default fallback value when the given input is empty, contains only whitespace, `null`, or `undefined`. + +## Signature + +```typescript +function defaultIfBlank( + value: string | null | undefined, + defaultValue: string +): string; +``` + +## Parameters + +| Parameter | Type | Description | +|----------------|-------------------------------|---------------------------------------------------| +| `value` | `string \| null \| undefined` | The string value to check. | +| `defaultValue` | `string` | The fallback value returned when `value` is blank.| + +## Returns + +`string` β€” The original `value` if it contains non-whitespace text; otherwise `defaultValue`. + +## Examples + +```typescript +import { defaultIfBlank } from "@rcpthongta/string-utils"; + +defaultIfBlank("Hello", "default"); +// => "Hello" + +defaultIfBlank(" ", "default"); +// => "default" (whitespace is treated as blank) + +defaultIfBlank("", "default"); +// => "default" + +defaultIfBlank(null, "default"); +// => "default" + +defaultIfBlank(undefined, "default"); +// => "default" +``` diff --git a/docs/api/default-if-empty.md b/docs/api/default-if-empty.md new file mode 100644 index 0000000..6a05a32 --- /dev/null +++ b/docs/api/default-if-empty.md @@ -0,0 +1,44 @@ +# defaultIfEmpty + +Returns a default fallback value when the given input is empty (`length === 0`), `null`, or `undefined`. Unlike `defaultIfBlank`, whitespace strings are preserved. + +## Signature + +```typescript +function defaultIfEmpty( + value: string | null | undefined, + defaultValue: string +): string; +``` + +## Parameters + +| Parameter | Type | Description | +|----------------|-------------------------------|---------------------------------------------------| +| `value` | `string \| null \| undefined` | The string value to check. | +| `defaultValue` | `string` | The fallback value returned when `value` is empty.| + +## Returns + +`string` β€” The original `value` if it is non-empty; otherwise `defaultValue`. + +## Examples + +```typescript +import { defaultIfEmpty } from "@rcpthongta/string-utils"; + +defaultIfEmpty("Hello", "default"); +// => "Hello" + +defaultIfEmpty(" ", "default"); +// => " " (whitespace string has length > 0, so it is preserved) + +defaultIfEmpty("", "default"); +// => "default" + +defaultIfEmpty(null, "default"); +// => "default" + +defaultIfEmpty(undefined, "default"); +// => "default" +``` diff --git a/docs/api/format.md b/docs/api/format.md new file mode 100644 index 0000000..2faa11c --- /dev/null +++ b/docs/api/format.md @@ -0,0 +1,99 @@ +# format / createFormatter + +Template interpolation utility supporting positional placeholders and nested object/array dot-notation paths. + +## `format` + +Interpolates placeholders in a template with provided arguments. + +### Signature + +```typescript +function format( + template: string | null | undefined, + ...args: unknown[] +): string; +``` + +### Parameters + +| Parameter | Type | Description | +|------------|-------------------------------|-----------------------------------------------------| +| `template` | `string \| null \| undefined` | The template string containing placeholders. | +| `...args` | `unknown[]` | The values used to resolve and replace placeholders.| + +### Returns + +`string` β€” The formatted string, or an empty string `""` when `template` is empty, `null`, or `undefined`. + +### Examples + +```typescript +import { format } from "@rcpthongta/string-utils"; + +// Positional arguments +format("Hello {0} {1}!", "John", "Doe"); +// => "Hello John Doe!" + +// Nested object property paths +format("User: {0.name} ({0.role})", { name: "Alice", role: "Admin" }); +// => "User: Alice (Admin)" + +// Deep nested array and object paths +format("{0.users.0.name}", { users: [{ name: "Bob" }] }); +// => "Bob" + +format("", "World"); +// => "" + +format(null, "World"); +// => "" + +format(undefined, "World"); +// => "" +``` + +--- + +## `createFormatter` + +Compiles a template once into a high-performance reusable formatting function. Ideal for high-frequency or loop formatting. + +### Signature + +```typescript +function createFormatter(template: string | null | undefined): (...args: unknown[]) => string; +``` + +### Parameters + +| Parameter | Type | Description | +|------------|-------------------------------|---------------------------------| +| `template` | `string \| null \| undefined` | The template string to compile. | + +### Returns + +`FormatFunction` β€” A reusable formatting function `(...args: unknown[]) => string`. + +### Examples + +```typescript +import { createFormatter } from "@rcpthongta/string-utils"; + +const greet = createFormatter("Hello {0.name}!"); + +greet({ name: "Alice" }); +// => "Hello Alice!" + +greet({ name: "Bob" }); +// => "Hello Bob!" + +greet(""); +// => "Hello !" + +greet(null); +// => "Hello null!" + +greet(undefined); +// => "Hello undefined!" +``` diff --git a/docs/api/has-length.md b/docs/api/has-length.md new file mode 100644 index 0000000..9dd70c6 --- /dev/null +++ b/docs/api/has-length.md @@ -0,0 +1,51 @@ +# hasLength + +TypeScript type guard that checks whether a value is a non-empty string (`length > 0`). + +## Signature + +```typescript +function hasLength(value: unknown): value is string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-----------|---------------------| +| `value` | `unknown` | The value to check. | + +## Returns + +`boolean` β€” `true` if `value` is a string with `length > 0`; otherwise `false`. Acts as a TypeScript type guard narrowing `unknown` to `string`. + +## Examples + +```typescript +import { hasLength } from "@rcpthongta/string-utils"; + +hasLength("Hello World"); +// => true + +hasLength(" "); +// => true (whitespace counts as length) + +hasLength(""); +// => false + +hasLength(123); +// => false + +hasLength(null); +// => false + +hasLength(undefined); +// => false + +// TypeScript type narrowing example +function processInput(val: unknown) { + if (hasLength(val)) { + // val is automatically narrowed to `string` + console.log(val.toUpperCase()); + } +} +``` diff --git a/docs/api/has-text.md b/docs/api/has-text.md new file mode 100644 index 0000000..3f23c9d --- /dev/null +++ b/docs/api/has-text.md @@ -0,0 +1,43 @@ +# hasText + +TypeScript type guard that checks whether a value is a string containing at least one non-whitespace character. + +## Signature + +```typescript +function hasText(value: unknown): value is string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-----------|---------------------| +| `value` | `unknown` | The value to check. | + +## Returns + +`boolean` β€” `true` if `value` is a string with non-whitespace characters; otherwise `false`. + +## Examples + +```typescript +import { hasText } from "@rcpthongta/string-utils"; + +hasText("Hello World"); +// => true + +hasText(" "); +// => false (whitespace-only is rejected) + +hasText(""); +// => false + +hasText(123); +// => false + +hasText(null); +// => false + +hasText(undefined); +// => false +``` diff --git a/docs/api/index.md b/docs/api/index.md new file mode 100644 index 0000000..ccd302c --- /dev/null +++ b/docs/api/index.md @@ -0,0 +1,63 @@ +# API Reference + +A complete overview of all utility functions provided by `@rcpthongta/string-utils`. + +## Case Conversion + +Convert strings between various identifier casing conventions. + +| Function | Description | +|--------------------------------------|-------------------------------------------------| +| [`camelCase`](/api/camel-case) | Converts a string to `camelCase`. | +| [`constantCase`](/api/constant-case) | Converts a string to uppercase `CONSTANT_CASE`. | +| [`kebabCase`](/api/kebab-case) | Converts a string to `kebab-case`. | +| [`pascalCase`](/api/pascal-case) | Converts a string to `PascalCase`. | +| [`snakeCase`](/api/snake-case) | Converts a string to `snake_case`. | + +## Casing & Capitalization + +Transform the first character casing while preserving literal TypeScript types. + +| Function | Description | +|-------------------------------------|--------------------------------------------------------| +| [`capitalize`](/api/capitalize) | Capitalizes the first character of a string. | +| [`uncapitalize`](/api/uncapitalize) | Converts the first character of a string to lowercase. | + +## Formatting & Templating + +Clean up, interpolate, and transform strings for display or URLs. + +| Function | Description | +|--------------------------------------------------|---------------------------------------------------------------------------------------------| +| [`collapseWhitespace`](/api/collapse-whitespace) | Normalizes consecutive whitespace into single spaces and trims edges. | +| [`format`](/api/format) | Formats a template string with positional or nested property placeholders. | +| [`createFormatter`](/api/format#createformatter) | Precompiles a reusable formatter function for high performance. | +| [`slugify`](/api/slugify) | Converts a string into a URL-friendly slug. | + +## Pattern Masking + +Apply pattern masks to format phone numbers, dates, credit cards, and postal codes. + +| Function | Description | +|--------------------------------------|----------------------------------------------------------------| +| [`mask`](/api/mask) | Formats a string against custom pattern templates. | +| [`createMask`](/api/mask#createmask) | Precompiles a reusable mask function for high performance. | + +## Validation & Fallback + +Type guards and safe fallback utilities for strings. + +| Function | Description | +|-------------------------------------------|---------------------------------------------------------------------------| +| [`hasLength`](/api/has-length) | Type guard checking whether a value is a non-empty string (`length > 0`). | +| [`hasText`](/api/has-text) | Type guard checking whether a string has non-whitespace characters. | +| [`defaultIfBlank`](/api/default-if-blank) | Returns a fallback value when input is blank (empty or whitespace-only). | +| [`defaultIfEmpty`](/api/default-if-empty) | Returns a fallback value when input is empty (`length === 0`). | + +## Privacy & Redaction + +Censor and mask sensitive information for security and privacy. + +| Function | Description | +|-------------------------|--------------------------------------------------------------------------------------------------| +| [`redact`](/api/redact) | Censors sensitive string content with custom visible boundaries and replacement characters. | diff --git a/docs/api/kebab-case.md b/docs/api/kebab-case.md new file mode 100644 index 0000000..74dbdf7 --- /dev/null +++ b/docs/api/kebab-case.md @@ -0,0 +1,49 @@ +# kebabCase + +Converts any string to `kebab-case`. Supports standard separators, acronyms, numbers, and Unicode characters. + +## Signature + +```typescript +function kebabCase(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|------------------------------| +| `value` | `string \| null \| undefined` | The input string to convert. | + +## Returns + +`string` β€” The kebab-case formatted string, or an empty string `""` when `value` is empty, `null`, `undefined`, or contains no extractable words. + +## Examples + +```typescript +import { kebabCase } from "@rcpthongta/string-utils"; + +kebabCase("Foo Bar"); +// => "foo-bar" + +kebabCase("fooBar"); +// => "foo-bar" + +kebabCase("FOO_BAR"); +// => "foo-bar" + +kebabCase("XMLHttpRequest"); +// => "xml-http-request" + +kebabCase("version 2.0"); +// => "version-20" + +kebabCase(""); +// => "" + +kebabCase(null); +// => "" + +kebabCase(undefined); +// => "" +``` diff --git a/docs/api/mask.md b/docs/api/mask.md new file mode 100644 index 0000000..1fa5afc --- /dev/null +++ b/docs/api/mask.md @@ -0,0 +1,146 @@ +# mask / createMask + +Formats raw strings against custom pattern templates such as phone numbers, credit cards, dates, and postal codes. + +## Pattern Tokens + +| Token | Matches | Description | +|------------|-----------------------------------------|--------------------------------------------------------------------------------------| +| `#` | Digits (`0-9`, Unicode digits) | Slot for numeric characters. | +| `A` | Letters (`a-z`, `A-Z`, Unicode letters) | Slot for alphabetic characters. | +| `*` | Any character | Wildcard slot accepting any character. | +| *Literal* | Exact character | Any other character (e.g. `(`, `)`, `-`, `/`, spaces) is kept as a literal delimiter.| + +--- + +## Options + +| Option | Type | Default | Description | +|--------------------|----------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------| +| `fallbackPatterns` | `string[]` | `[]` | Additional mask patterns to evaluate when the input does not match the primary pattern. Evaluated in declaration order.| +| `mode` | `CharacterSegmentMode` | `"utf16"`| Determines how characters are counted and segmented (`"utf16"`, `"codePoint"`, or `"grapheme"`). | + +--- + +## `mask` + +Formats a single value using a pattern. + +### Signature + +```typescript +function mask(value: string | null | undefined, pattern: string): string; +function mask(value: string | null | undefined, pattern: string, options: MaskOptions): string; +``` + +### Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|---------------------------------| +| `value` | `string \| null \| undefined` | The string to mask. | +| `pattern` | `string` | The mask template pattern. | +| `options` | `MaskOptions` | Optional masking configuration. | + +### Returns + +`string` β€” The formatted string, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +### Examples + +```typescript +import { mask } from "@rcpthongta/string-utils"; + +// Phone numbers +mask("0812345678", "(###) ###-####"); +// => "(081) 234-5678" + +// Credit cards +mask("1234567890123456", "#### #### #### ####"); +// => "1234 5678 9012 3456" + +// Dates +mask("20260924", "####-##-##"); +// => "2026-09-24" + +// Mixed tokens +mask("K9V1B2", "A#A #A#"); +// => "K9V 1B2" + +// Fallback patterns (e.g. 9-digit landline vs 10-digit mobile) +mask("021234567", "(###) ###-####", { + fallbackPatterns: ["(##) ###-####"] +}); +// => "(02) 123-4567" + +// Unicode characters with codePoint mode +mask("πŸ˜€πŸ˜€123", "**-###", { mode: "codePoint" }); +// => "πŸ˜€πŸ˜€-123" + +mask("", "(###) ###-####"); +// => "" + +mask(null, "(###) ###-####"); +// => "" + +mask(undefined, "(###) ###-####"); +// => "" +``` + +--- + +## `createMask` + +Precompiles the pattern for high-performance repeated formatting. + +### Signature + +```typescript +function createMask(pattern: string): (value: string | null | undefined) => string; +function createMask(pattern: string, options: MaskOptions): (value: string | null | undefined) => string; +``` + +### Parameters + +| Parameter | Type | Description | +|-----------|---------------|---------------------------------| +| `pattern` | `string` | The primary mask pattern. | +| `options` | `MaskOptions` | Optional masking configuration. | + +### Returns + +`MaskFunction` β€” A reusable masking function `(value: string | null | undefined) => string`. + +### Examples + +```typescript +import { createMask } from "@rcpthongta/string-utils"; + +// Standard compiled mask +const formatPhone = createMask("(###) ###-####"); + +formatPhone("0812345678"); +// => "(081) 234-5678" + +formatPhone("0898765432"); +// => "(089) 987-6543" + +formatPhone(""); +// => "" + +formatPhone(null); +// => "" + +formatPhone(undefined); +// => "" + +// Precompiled mask with fallback patterns +const formatFlexiblePhone = createMask("(###) ###-####", { + fallbackPatterns: ["(##) ###-####"] +}); + +formatFlexiblePhone("021234567"); +// => "(02) 123-4567" + +formatFlexiblePhone("0812345678"); +// => "(081) 234-5678" +``` diff --git a/docs/api/pascal-case.md b/docs/api/pascal-case.md new file mode 100644 index 0000000..791331c --- /dev/null +++ b/docs/api/pascal-case.md @@ -0,0 +1,49 @@ +# pascalCase + +Converts any string to `PascalCase`. Supports standard separators, acronyms, numbers, and Unicode characters. + +## Signature + +```typescript +function pascalCase(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|------------------------------| +| `value` | `string \| null \| undefined` | The input string to convert. | + +## Returns + +`string` β€” The PascalCase formatted string, or an empty string `""` when `value` is empty, `null`, `undefined`, or contains no extractable words. + +## Examples + +```typescript +import { pascalCase } from "@rcpthongta/string-utils"; + +pascalCase("foo bar"); +// => "FooBar" + +pascalCase("--foo-bar--"); +// => "FooBar" + +pascalCase("FOO_BAR"); +// => "FooBar" + +pascalCase("XMLHttpRequest"); +// => "XmlHttpRequest" + +pascalCase("version 2.0"); +// => "Version20" + +pascalCase(""); +// => "" + +pascalCase(null); +// => "" + +pascalCase(undefined); +// => "" +``` diff --git a/docs/api/redact.md b/docs/api/redact.md new file mode 100644 index 0000000..095f7e4 --- /dev/null +++ b/docs/api/redact.md @@ -0,0 +1,63 @@ +# redact + +Censors sensitive string content using a masking character (such as `*`) while optionally preserving visible characters at the start and end. + +## Signature + +```typescript +function redact(value: string | null | undefined): string; +function redact(value: string | null | undefined, replacement: string): string; +function redact(value: string | null | undefined, visibleStart: number): string; +function redact(value: string | null | undefined, options: RedactOptions): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------------|---------------------------------------------------------------------------------------| +| `value` | `string \| null \| undefined` | The string to redact. | +| `options` | `string \| number \| RedactOptions` | Replacement string, visible start character count, or a configuration options object. | + +## Options + +| Option | Type | Default | Description | +|----------------|------------------------|----------|----------------------------------------------------------------------------------------------------| +| `visibleStart` | `number` | `0` | Characters to keep visible at the start. | +| `visibleEnd` | `number` | `0` | Characters to keep visible at the end. | +| `replacement` | `string` | `"*"` | Replacement character or string for masked positions. | +| `mode` | `CharacterSegmentMode` | `"utf16"`| Determines how characters are counted and segmented (`"utf16"`, `"codePoint"`, or `"grapheme"`). | + +## Returns + +`string` β€” The redacted string, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +## Examples + +```typescript +import { redact } from "@rcpthongta/string-utils"; + +// Full redaction (default) +redact("0812345678"); +// => "**********" + +// Keep start characters visible +redact("0812345678", 2); +// => "08********" + +// Keep both start and end characters visible +redact("0812345678", { visibleStart: 3, visibleEnd: 2 }); +// => "081*****78" + +// Custom replacement character +redact("1234567890", { visibleStart: 4, visibleEnd: 4, replacement: "#" }); +// => "1234##7890" + +redact(""); +// => "" + +redact(null); +// => "" + +redact(undefined); +// => "" +``` diff --git a/docs/api/slugify.md b/docs/api/slugify.md new file mode 100644 index 0000000..45ca9c1 --- /dev/null +++ b/docs/api/slugify.md @@ -0,0 +1,57 @@ +# slugify + +Converts a string into a clean, URL-friendly slug. Removes diacritics/accents, replaces non-alphanumeric characters with separators, and normalizes casing. + +## Signature + +```typescript +function slugify(value: string | null | undefined, options?: SlugifyOptions): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|-------------------------------------------| +| `value` | `string \| null \| undefined` | The string to transform into a slug. | +| `options` | `SlugifyOptions` | Optional configuration settings for slug. | + +## Options + +| Option | Type | Default | Description | +|-------------|-----------|---------|---------------------------------------------| +| `separator` | `string` | `"-"` | Character(s) used to separate words. | +| `lower` | `boolean` | `true` | Whether to convert the output to lowercase. | + +## Returns + +`string` β€” The slugified URL-safe string, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +## Examples + +```typescript +import { slugify } from "@rcpthongta/string-utils"; + +slugify("Hello World!"); +// => "hello-world" + +// Accents and diacritics normalization +slugify("DΓ©jΓ  vu & CrΓ¨me brΓ»lΓ©e"); +// => "deja-vu-and-creme-brulee" + +// Custom separator +slugify("Hello World", { separator: "_" }); +// => "hello_world" + +// Preserving uppercase +slugify("Hello World", { lower: false }); +// => "Hello-World" + +slugify(""); +// => "" + +slugify(null); +// => "" + +slugify(undefined); +// => "" +``` diff --git a/docs/api/snake-case.md b/docs/api/snake-case.md new file mode 100644 index 0000000..e3da60f --- /dev/null +++ b/docs/api/snake-case.md @@ -0,0 +1,49 @@ +# snakeCase + +Converts any string to `snake_case`. Supports standard separators, acronyms, numbers, and Unicode characters. + +## Signature + +```typescript +function snakeCase(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|------------------------------| +| `value` | `string \| null \| undefined` | The input string to convert. | + +## Returns + +`string` β€” The snake_case formatted string, or an empty string `""` when `value` is empty, `null`, `undefined`, or contains no extractable words. + +## Examples + +```typescript +import { snakeCase } from "@rcpthongta/string-utils"; + +snakeCase("Foo Bar"); +// => "foo_bar" + +snakeCase("fooBar"); +// => "foo_bar" + +snakeCase("--foo-bar--"); +// => "foo_bar" + +snakeCase("XMLHttpRequest"); +// => "xml_http_request" + +snakeCase("version 2.0"); +// => "version_20" + +snakeCase(""); +// => "" + +snakeCase(null); +// => "" + +snakeCase(undefined); +// => "" +``` diff --git a/docs/api/uncapitalize.md b/docs/api/uncapitalize.md new file mode 100644 index 0000000..e54ac87 --- /dev/null +++ b/docs/api/uncapitalize.md @@ -0,0 +1,44 @@ +# uncapitalize + +Converts the first character of a string to lowercase while preserving its literal TypeScript type. + +## Signature + +```typescript +function uncapitalize(value: T): Uncapitalize; +function uncapitalize(value: string | null | undefined): string; +``` + +## Parameters + +| Parameter | Type | Description | +|-----------|-------------------------------|-----------------------------------| +| `value` | `string \| null \| undefined` | The input string to uncapitalize. | + +## Returns + +`Uncapitalize | string` β€” The uncapitalized string, or an empty string `""` when `value` is empty, `null`, or `undefined`. + +## Examples + +```typescript +import { uncapitalize } from "@rcpthongta/string-utils"; + +uncapitalize("Hello"); +// => "hello" + +uncapitalize("HelloWorld"); +// => "helloWorld" + +uncapitalize("hello"); +// => "hello" + +uncapitalize(""); +// => "" + +uncapitalize(null); +// => "" + +uncapitalize(undefined); +// => "" +``` diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md new file mode 100644 index 0000000..0349bbc --- /dev/null +++ b/docs/guide/getting-started.md @@ -0,0 +1,73 @@ +# Getting Started + +`@rcpthongta/string-utils` provides a collection of type-safe, lightweight, and performant string utilities. + +## Quick Example + +Import the named functions you need directly: + +```typescript +import { + camelCase, + capitalize, + defaultIfBlank, + mask, + redact, + slugify +} from "@rcpthongta/string-utils"; + +// Capitalize first character +capitalize("hello world"); +// => "Hello world" + +// Convert to camelCase +camelCase("user_profile_id"); +// => "userProfileId" + +// Convert to URL-friendly slug +slugify("Hello World & Special Characters!"); +// => "hello-world-and-special-characters" + +// Fallback value for blank or whitespace strings +defaultIfBlank(" ", "default value"); +// => "default value" + +// Pattern-based masking +mask("0812345678", "(###) ###-####"); +// => "(081) 234-5678" + +// Sensitive string redaction +redact("0812345678", { visibleStart: 3, visibleEnd: 2 }); +// => "081*****78" +``` + +## CommonJS Support + +CommonJS environments (such as older Node.js scripts) are fully supported out-of-the-box: + +```javascript +const { capitalize, slugify } = require("@rcpthongta/string-utils"); + +console.log(capitalize("hello")); +// => "Hello" +``` + +## Tree-Shaking + +The package declares `"sideEffects": false` in its `package.json`. Bundlers such as Vite, Rollup, Webpack, and esbuild will automatically eliminate any unused functions from your production build. + +```typescript +// Only `capitalize` will be included in your bundle! +import { capitalize } from "@rcpthongta/string-utils"; +``` + +## Next Steps + +Explore the individual utility functions in the sidebar or dive into specific categories: + +- [Case Conversion](/api/camel-case) +- [Casing & Capitalization](/api/capitalize) +- [Formatting & Templating](/api/format) +- [Pattern Masking](/api/mask) +- [Validation & Fallback](/api/has-length) +- [Privacy & Redaction](/api/redact) diff --git a/docs/guide/installation.md b/docs/guide/installation.md new file mode 100644 index 0000000..8a2e166 --- /dev/null +++ b/docs/guide/installation.md @@ -0,0 +1,56 @@ +# Installation + +You can install `@rcpthongta/string-utils` using your package manager of choice: + +::: code-group + +```bash [npm] +npm install @rcpthongta/string-utils +``` + +```bash [pnpm] +pnpm add @rcpthongta/string-utils +``` + +```bash [yarn] +yarn add @rcpthongta/string-utils +``` + +```bash [bun] +bun add @rcpthongta/string-utils +``` + +::: + +## Requirements + +- **Node.js**: `>= 22` +- **TypeScript**: `>= 5.0` (Optional, recommended for type safety) + +## CDN / Direct Browser Usage + +If you are not using a build tool, you can load the library directly via CDN: + +::: code-group + +```html [jsDelivr] + + +``` + +```html [unpkg] + + +``` + +::: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..a8e1d94 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,32 @@ +--- +layout: home + +hero: + name: "String Utils" + text: "Type-Safe & Dependency-Free" + tagline: "A lightweight, type-safe, dependency-free string utility library for TypeScript and modern JavaScript applications." + actions: + - theme: brand + text: Get Started + link: /guide/getting-started + +features: + - icon: πŸͺΆ + title: Zero Dependencies + details: Pure vanilla TypeScript with zero runtime overhead and zero third-party dependencies. + - icon: 🌲 + title: Tree-Shakeable + details: Side-effect free module exports. Bundlers include only the exact functions your application uses. + - icon: πŸ›‘οΈ + title: 100% Type-Safe + details: Written in strict TypeScript with comprehensive type definitions and declaration maps. + - icon: πŸ“¦ + title: Universal Modules + details: Dual ESM and CommonJS support plus CDN-ready browser global bundles (IIFE). + - icon: ⚑ + title: High Performance + details: Carefully optimized string manipulation algorithms benchmarked and tested with Vitest. + - icon: πŸ”’ + title: Privacy & Masking + details: Pattern-based slot masking and configurable sensitive string redaction built-in. +--- diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..0805de3 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": [".vitepress/**/*.ts"] +} diff --git a/eslint.config.mjs b/eslint.config.mjs index cf3114f..654936e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,7 +18,15 @@ const tsFiles = ["**/*.ts"]; const sourceFiles = [...jsFiles, ...tsFiles]; const configuration = eslint.defineConfig( - eslint.globalIgnores(["**/coverage/*", "**/dist/*", "**/node_modules/*", "**/.npmrc", "**/package-lock.json"]), + eslint.globalIgnores([ + "**/coverage/*", + "**/dist/*", + "**/docs/.vitepress/dist/*", + "**/docs/.vitepress/cache/*", + "**/node_modules/*", + "**/.npmrc", + "**/package-lock.json" + ]), { files: sourceFiles, languageOptions: { diff --git a/package-lock.json b/package-lock.json index a387e10..4ec80c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rcpthongta/string-utils", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rcpthongta/string-utils", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "devDependencies": { "@commitlint/cli": "^21.2.2", @@ -31,6 +31,7 @@ "tsup": "^8.5.1", "typescript": "^5.9.3", "typescript-eslint": "^8.65.0", + "vitepress": "^1.6.4", "vitest": "^5.0.1", "yaml-eslint-parser": "^1.3.2" }, @@ -38,6 +39,264 @@ "node": ">=22" } }, + "node_modules/@algolia/abtesting": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.25.0.tgz", + "integrity": "sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.59.0.tgz", + "integrity": "sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.59.0.tgz", + "integrity": "sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.59.0.tgz", + "integrity": "sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.59.0.tgz", + "integrity": "sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.59.0.tgz", + "integrity": "sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.59.0.tgz", + "integrity": "sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.59.0.tgz", + "integrity": "sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.59.0.tgz", + "integrity": "sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.59.0.tgz", + "integrity": "sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.59.0.tgz", + "integrity": "sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.59.0.tgz", + "integrity": "sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.59.0.tgz", + "integrity": "sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.59.0.tgz", + "integrity": "sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -462,6 +721,57 @@ "node": ">=22" } }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "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 + } + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", @@ -1151,6 +1461,23 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.97", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.97.tgz", + "integrity": "sha512-Z6PmM6jvWVU7rmLzqbxCLJA7SeqCnK6lMHXtjyzHPLZebwuoojBEcHHycppahDzEeN9xujRkrV5J8QpOhMyNrg==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1919,6 +2246,93 @@ "win32" ] }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "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.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, "node_modules/@simple-libs/child-process-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-2.0.0.tgz", @@ -1990,6 +2404,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1997,6 +2421,24 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2007,6 +2449,13 @@ "@types/unist": "*" } }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -2031,6 +2480,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.70.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz", @@ -2313,6 +2769,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@vitest/coverage-v8": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.1.tgz", @@ -2413,46 +2876,335 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "node_modules/@vue/compiler-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz", + "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.43", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", + "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "@vue/compiler-core": "3.5.43", + "@vue/shared": "3.5.43" } }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@vue/compiler-sfc": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", + "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.43", + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-ssr": "3.5.43", + "@vue/shared": "3.5.43", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.28", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", + "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.10" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz", + "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz", + "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz", + "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.43", + "@vue/runtime-core": "3.5.43", + "@vue/shared": "3.5.43", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz", + "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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 + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/algoliasearch": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.59.0.tgz", + "integrity": "sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.25.0", + "@algolia/client-abtesting": "5.59.0", + "@algolia/client-analytics": "5.59.0", + "@algolia/client-common": "5.59.0", + "@algolia/client-insights": "5.59.0", + "@algolia/client-personalization": "5.59.0", + "@algolia/client-query-suggestions": "5.59.0", + "@algolia/client-search": "5.59.0", + "@algolia/ingestion": "1.59.0", + "@algolia/monitoring": "1.59.0", + "@algolia/recommend": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ansi-regex": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", @@ -2538,6 +3290,16 @@ "dev": true, "license": "MIT" }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/brace-expansion": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", @@ -2657,6 +3419,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2726,6 +3510,17 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2803,6 +3598,19 @@ "node": ">=22" } }, + "node_modules/copy-anything": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.1.1.tgz", + "integrity": "sha512-AoT6Imdr98feSpFfmFwTFN73ccdr7uFPf27cBCgYvyyRyn1BzLRxMvrHNmwXO5LJMddRy4Rdhw2b1h7vSMKsEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/cosmiconfig": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", @@ -2863,6 +3671,13 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2954,6 +3769,26 @@ "dev": true, "license": "MIT" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -3610,6 +4445,16 @@ "dev": true, "license": "ISC" }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -3787,6 +4632,62 @@ "node": ">=8" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -4477,6 +5378,13 @@ "source-map-js": "^1.2.1" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -4697,6 +5605,28 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", @@ -5364,10 +6294,24 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", "dependencies": { @@ -5408,7 +6352,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5447,6 +6390,18 @@ "node": ">=12.20.0" } }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5580,6 +6535,13 @@ "dev": true, "license": "MIT" }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5642,7 +6604,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", @@ -5695,6 +6656,25 @@ } } }, + "node_modules/preact": { + "version": "10.29.8", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.8.tgz", + "integrity": "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5735,6 +6715,17 @@ "node": ">=6.0.0" } }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5772,6 +6763,33 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp-ast-analysis": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", @@ -5806,6 +6824,13 @@ "node": ">=4" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", @@ -5922,6 +6947,14 @@ "node": "^14.0.0 || >=16.0.0" } }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -5958,6 +6991,23 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "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" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -5985,6 +7035,27 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -6026,6 +7097,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -6078,6 +7164,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6107,6 +7206,13 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -6184,6 +7290,17 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -6346,6 +7463,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -6401,6 +7532,36 @@ "punycode": "^2.1.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", @@ -6480,107 +7641,675 @@ } } }, - "node_modules/vitest": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.1.tgz", - "integrity": "sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.1", - "chai": "^6.2.2", - "es-module-lexer": "^2.3.2", - "expect-type": "^1.4.0", - "magic-string": "^1.2.3", - "obug": "^2.1.4", - "picomatch": "^4.0.7", - "std-env": "^4.2.0", - "tinybench": "6.1.4", - "tinyexec": "1.3.0", - "tinyglobby": "^0.2.17", - "why-is-node-running": "^2.3.0" + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" }, "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^22.12.0 || ^24.0.0 || >=26.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "vitepress": "bin/vitepress.js" }, "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.1", - "@vitest/browser-preview": "5.0.1", - "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.1", - "@vitest/coverage-v8": "5.0.1", - "@vitest/ui": "5.0.1", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + "markdown-it-mathjax3": "^4", + "postcss": "^8" }, "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { + "markdown-it-mathjax3": { "optional": true }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { + "postcss": { "optional": true - }, - "vite": { - "optional": false } } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", - "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vitest/node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "node_modules/vitepress/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18" + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/vitepress/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "node_modules/vitepress/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/vitest": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.1.tgz", + "integrity": "sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.1", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "6.1.4", + "tinyexec": "1.3.0", + "tinyglobby": "^0.2.17", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.1", + "@vitest/browser-preview": "5.0.1", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.1", + "@vitest/coverage-v8": "5.0.1", + "@vitest/ui": "5.0.1", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/vue": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz", + "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-sfc": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/server-renderer": "3.5.43", + "@vue/shared": "3.5.43" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/which": { diff --git a/package.json b/package.json index af3611c..9cd1078 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { - "version": "1.0.0", + "version": "1.0.1", "name": "@rcpthongta/string-utils", "description": "A lightweight, type-safe, dependency-free string utility library for TypeScript and modern JavaScript applications.", "author": "rcpthongta", "license": "MIT", + "homepage": "https://rcpthongta.github.io/string-utils", "repository": { "type": "git", "url": "git+https://github.com/rcpthongta/string-utils.git" @@ -50,6 +51,9 @@ "test:watch": "vitest", "test:coverage": "vitest run --coverage", "bench": "vitest bench --run", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs", "lint": "eslint **/*.{*rc,cjs,js,json,json5,jsonc,jsonl,md,mjs,ts,yaml,yml}", "lint:fix": "eslint --fix **/*.{*rc,cjs,js,json,json5,jsonc,jsonl,md,mjs,ts,yaml,yml}" }, @@ -76,6 +80,7 @@ "tsup": "^8.5.1", "typescript": "^5.9.3", "typescript-eslint": "^8.65.0", + "vitepress": "^1.6.4", "vitest": "^5.0.1", "yaml-eslint-parser": "^1.3.2" }