diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 764fe4e..0e3a7bb 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -15,110 +15,13 @@ The two documents serve overlapping audiences and should stay consistent: when y - **Language:** TypeScript (targeting ES2022) - **Runtime:** Node.js (^22.22.0 || >=24) - **Package manager:** npm -- **Build:** tsdown (ESM output to `_dist/`) -- **Test:** Vitest (coverage via V8, output to `_coverage/`) -- **Documentation:** TypeDoc (output to `_doc/`) +- **Build:** tsdown (ESM output) +- **Test:** Vitest (coverage via V8) +- **Documentation:** TypeDoc - **Dependencies:** `typebox` (runtime/production dependency) - **Site Generation:** Jekyll - **Hosting & Deployment:** GitHub Pages, npm package registry, and GitHub package registry -## Development and Validation - -Primary development work happens in `src/` and corresponding tests under `test/`. -Shared test fixtures and scenario helpers live under `test/utils`. -Vitest also type-checks test files at run time (in addition to executing them), configured via the `typecheck` block in `vitest.config.ts` against `tsconfig.vitest.json`. - -### Development Status - -The package is currently in an alpha release line and exports grouped utility modules from `src/discriminator`, `src/number`, `src/random`, and `src/string`. - -### Validation Steps - -- Install dependencies with `npm ci`. -- Run lint checks with `npm run lint:all`. -- Build with `npm run build`. -- Run tests with `npm test`. - -### Link Verification During Review - -As part of pull request review, verify that repository and package links (for example in `README.md`, `package.json`, or other project metadata) match the current repository and package coordinates. - -## Pre-Merge and Release Review - -Complete the following steps before merging a branch to a release branch or to `main`. - -### 1. Validation - -Run the full [Validation Steps](#validation-steps) and confirm everything passes cleanly: - -### 2. Portfolio Skills Page (`docs/portfolio-skills.md`) - -Review `docs/portfolio-skills.md` against the current repository state. If anything changed: - -- Update any section where capabilities, tooling, or the skills inventory changed -- Bump `modified_date` to today; do not change the original `date` -- Evidence links must always point to the `main` branch - -Refer to the ["Portfolio Page Generation and Maintenance" section](#portfolio-page-generation-and-maintenance) for the full review checklist. - -### 3. Instruction File Sync - -Verify that `CLAUDE.md` and `.github/copilot-instructions.md` are consistent with each other and reflect the current project state: - -- Guidance shared between the two files is mirrored -- The Development Status section accurately lists all modules exported by the package -- Any new tooling, conventions, or workflows introduced on the branch are documented - -### 4. `package.json` Keywords - -Review the `keywords` array in `package.json`: - -- Keywords should cover all major utility domains and notable features exported by the package -- Add new keywords when a new utility domain or notable feature is introduced -- Remove keywords for capabilities that no longer exist - -### 5. GitHub Repository Topics - -Verify that the topics on the GitHub repository ([blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils)) reflect the current capabilities. -Topics should align with `package.json` keywords where appropriate. -Request the current topics to be updated, if necessary. -Provide any topic change suggestions to the project maintainers and any accepted changes will be updated manually. - -### 6. Branch Changes Code Review - -Review all source changes for convention compliance and code quality. - -#### Convention Compliance - -- New source files follow the static class pattern (private constructor, `@throws` on constructor, public static members only) -- All public/exported members have complete JSDoc per the documentation comment conventions in this file -- Copyright year headers are present and accurate (see "File Headers" section) -- `README.md` and `docs/index.md` are in sync for any shared content changes -- Test coverage is complete and meaningful for all new or changed public API surface - -#### Code Quality - -- **Correctness** — implementations behave exactly as documented; edge cases are handled; patterns (e.g., regex) match precisely what they claim to match -- **API consistency** — new methods and classes follow the naming conventions and structural patterns of existing ones; the public surface is intuitive alongside what is already exported -- **Efficiency** — utility functions avoid unnecessary computation (e.g., no redundant regex compilation, no unnecessary copies or iterations) -- **Backward compatibility** — no unintentional breaking changes to the published API; any intentional breaking changes are reflected in the version bump -- **Reuse and DRY** — new utilities delegate to existing ones where appropriate rather than duplicating logic -- **Runtime safety** — see the "JavaScript Consumer Safety" section for the requirement to retain runtime type guards for JavaScript consumers - -#### Consistency and Pattern Observation - -- **Cross-source consistency** — Compare all changed code, inline comments, and documentation (JSDoc, README, `docs/`) against each other and against implicit patterns visible in the rest of the codebase. Flag any deviation from an established pattern even if that pattern has not been explicitly documented in this file (e.g., consistent phrasing in JSDoc summaries, a structural idiom repeated across utility classes, a naming convention used throughout tests). -- **Implicit pattern detection** — When a consistent pattern is observed in the codebase that is not yet captured in this file, call it out explicitly and ask the maintainer whether it should be documented in the appropriate section of `.github/copilot-instructions.md`. - -### 7. Release Readiness (for merges to `main`) - -When preparing a release merge to `main`: - -- Confirm the version in `package.json` is bumped appropriately -- Ensure release documentation under `docs/releases/` covers the new version -- Verify `typedoc.json` entry points include any new module-level index files -- Confirm the npm publish workflow (`package-publish.yml`) is configured correctly for the release - ## npm Scripts - `npm run lint:js` - lint repository files with `eslint.config.js.mjs` @@ -141,101 +44,67 @@ When preparing a release merge to `main`: | `package-publish.yml` | npm and GitHub Package Publish | Manual (`workflow_dispatch`) | Lints, builds, tests, then publishes to npm and GitHub Packages; requires `release_tag` input and uses `id-token: write` trusted publishing permissions for the npm publish job | | `npm-test.yml` | npm Lint, Build, and Test | Push/PR to `main` and `release/**`, manual | Runs lint, build, and tests across supported Node.js versions | -## Security and Dependency Management +## Directory Structure -- GitHub Actions runs CodeQL analysis for `actions`, `javascript-typescript`, and `ruby`. -- Dependabot is configured for monthly updates to npm dependencies, GitHub Actions workflows, and Bundler dependencies under `docs/`. -- The npm publish workflow uses npm Trusted Publishing with GitHub OIDC (`id-token: write`) instead of a committed registry token. +``` +src/ + discriminator/ # Discriminated type-guard utilities and registry + number/ # Number utilities + random/ # Random number generation utilities + seeded-random/ # Seeded random number generator utilities + weighted-element/ # Weighted element selection utilities + string/ # String utilities + index.ts # Package entry point (re-exports all modules) +test/ # Vitest test suites (mirrors src/ module structure) + discriminator/ # Tests for the discriminator module + number/ # Tests for the number module + random/ # Tests for the random module + seeded-random/ # Tests for the seeded-random module + weighted-element/ # Tests for the weighted-element module + string/ # Tests for the string module + utils/ # Shared test fixtures and scenario helpers for use across test suites + input/ # Shared test input fixtures + test-case/ # Shared test-case helpers + scenarios/ # Reusable test-case scenario definitions +docs/ # GitHub Pages site content and manually maintained release documentation +.github/ + workflows/ # CI, publishing, documentation, and analysis workflows +_dist/ # Build output - generated by tsdown (not committed) +_compiled/ # TypeScript outDir output - generated by tsc (not committed) +_coverage/ # Coverage output - generated by Vitest (not committed) +_doc/ # Documentation output - generated by TypeDoc (not committed) +``` ## Development Guidelines Keep changes scoped to existing files unless a task explicitly requires scaffolding project code. +### Static Classes + +Static classes must: + +- Have a `private constructor()` that throws an `Error` to prevent instantiation +- Include a JSDoc `@throws` on the constructor documenting the instantiation error +- Expose public static getters or methods only + ### TypeScript Conventions - The package is ESM-only (`"type": "module"`), so keep imports/exports compatible with Node.js ESM resolution. -- Public exports flow through module index files. For example, `src/index.ts` re-exports from `src/number/index.ts`, which re-exports from individual utility files. This pattern is intentional to maintain clear module boundaries and organization in both source code and generated documentation. +- Public exports flow through module index files. This pattern is intentional to maintain clear module boundaries and organization in both source code and generated documentation. - API documentation entry points stay module-scoped rather than pointing TypeDoc at the root package entry point. - The project uses strict TypeScript settings (`strict`, `noImplicitAny`, `noUnusedLocals`, etc.) targeting ES2022 with `moduleResolution: bundler`. -#### tsdown Build Output - -This project uses `tsdown` to bundle and emit declaration files. -When the output format is `esm`, tsdown emits format-specific file extensions: `.mjs` for the bundle and `.d.mts` for the declaration file, regardless of whether the source files use the `.ts` or `.mts` extension. -The `types`, `module`, `main`, and `exports` fields in `package.json` should always reference these `.mjs`/`.d.mts` paths (e.g., `./_dist/index.mjs` and `./_dist/index.d.mts`). - -#### JavaScript Consumer Safety +### JavaScript Consumer Safety This package is published as ESM and targets both TypeScript and JavaScript consumers. Retain runtime type guards and input validation even when TypeScript's type system would catch the same issue at compile time. JavaScript callers have no compile-time safety, so runtime checks are necessary for correctness. -#### Static Classes +### tsdown Build Output -Static utility classes must: -- Have a `private constructor()` that throws an `Error` to prevent instantiation -- Include a JSDoc `@throws` on the constructor documenting the instantiation error -- Expose public static getters or methods only - -## Code Style - -#### Code Style Preferences and Conventions - -- Prefer `if`/`else` blocks over ternary operators for conditional logic. -- Prefer `@returns` (not `@return`) in TSDoc comments. -- Module-level private constants (e.g., lookup tables backing a set of public getters) use camelCase naming. -- Variable and constant names do not need to encode their type or role in a suffix (e.g., `Pattern`) unless doing so is necessary to clarify the data they hold; surrounding context is often sufficient (e.g., `regularExpressions.hexColor` versus the public `hexColorPattern` getter that exposes it). - -#### Formatting Rules - -- Keep formatting compatible with the repository ESLint configurations in `eslint.config.js.mjs` and `eslint.config.ts.mjs`. -- Do not introduce formatting-only tooling or workflow changes unless the task explicitly requires them. - -### Documentation Comment Preferences - -When writing or reviewing code, follow these documentation standards for maximum compatibility: - -- **Use `@returns` instead of `@return`**: Always use `@returns` in documentation comments for compatibility with documentation generators. -- **Use `{@link ...}` syntax in `@see` tags**: Always use `{@link ClassName.method}` (or `{@link symbol}`) inside `@see` tags. Do not use bare `{ClassName.method}` without `@link`. -- **Use `@param {type} name` format**: Always specify parameter types with the format `@param {type} name` (e.g., `@param {string} hex`) rather than `@param name {type}`. -- **Always specify return types with `@returns`**: Include a type indicator in every `@returns` annotation (e.g., `@returns {boolean}`). -- **Document void returns with `@returns {void}`**: For methods that do not return a value, explicitly use `@returns {void}`. -- **Use `@returns` for getter methods**: Prefer `@returns` for getter documentation. -- **Document version with `@since`**: Add `@since` to all public/exported members. -- **Annotate abstract members with `@abstract`**: Use `@abstract` for all abstract classes, methods, and properties. -- **Annotate readonly members with `@readonly`**: Use `@readonly` for all readonly members. -- **Annotate private members with `@private`**: Use `@private` for all private members. -- **Annotate protected members with `@protected`**: Use `@protected` for all protected members. -- **Annotate overrides with `@override`**: Use `@override` for all methods that override parent class methods. -- **Enclose boolean values in backticks**: Always use backticks for `true` and `false` in documentation comments. -- **Use consistent tense and voice**: Write documentation in the present tense and active voice for clarity. -- **Document exceptions with `@throws`**: Use `@throws` to document any errors or exceptions a function may throw. -- **Document default parameter values**: Indicate default values for parameters in the `@param` annotation. -- **Document all exported symbols**: Ensure every exported class, function, interface, type, enum, and constant has a documentation comment. -- **Separate annotation groups with blank lines**: Add a blank line between groups of TSDoc annotations, unless consecutive tags do not include additional information, such as `@private`, `@protected`, `@public`, or `@override`. - -**Annotation Order:** -Place annotations in the following order for consistency and readability: - -1. `@remarks` -1. `@see` -1. `@param` -1. `@returns` -1. `@throws` -1. `@default` -1. `@example` -1. `@type` -1. `@readonly` -1. `@private` -1. `@protected` -1. `@public` -1. `@abstract` -1. `@override` -1. `@deprecated` -1. `@since` -1. `@category` - -Include other relevant tags after the above, as appropriate for the context. +This project uses `tsdown` to bundle and emit declaration files. +When the output format is `esm`, tsdown emits format-specific file extensions: `.mjs` for the bundle and `.d.mts` for the declaration file, regardless of whether the source files use the `.ts` or `.mts` extension. +The `types`, `module`, `main`, and `exports` fields in `package.json` should always reference these `.mjs`/`.d.mts` paths (e.g., `./_dist/index.mjs` and `./_dist/index.d.mts`). ### File Headers @@ -265,36 +134,38 @@ All source files must include the MIT License copyright header at the top. */ ``` -## Directory Structure +### Code Style -``` -src/ - discriminator/ # Discriminated type-guard utilities and registry - number/ # Number utilities - random/ # Random number generation utilities - seeded-random/ # Seeded random number generator utilities - weighted-element/ # Weighted element selection utilities - string/ # String utilities - index.ts # Package entry point (re-exports all modules) -test/ # Vitest test suites (mirrors src/ module structure) - discriminator/ # Tests for the discriminator module - number/ # Tests for the number module - random/ # Tests for the random module - seeded-random/ # Tests for the seeded-random module - weighted-element/ # Tests for the weighted-element module - string/ # Tests for the string module - utils/ # Shared test fixtures and scenario helpers for use across test suites - input/ # Shared test input fixtures - test-case/ # Shared test-case helpers - scenarios/ # Reusable test-case scenario definitions -docs/ # GitHub Pages site content and manually maintained release documentation -.github/ - workflows/ # CI, publishing, documentation, and analysis workflows -_dist/ # Build output - generated by tsdown (not committed) -_compiled/ # TypeScript outDir output - generated by tsc (not committed) -_coverage/ # Coverage output - generated by Vitest (not committed) -_doc/ # Documentation output - generated by TypeDoc (not committed) -``` +#### Code Style Preferences and Conventions + +- Prefer `if`/`else` blocks over ternary operators for conditional logic. +- Prefer `@returns` (not `@return`) in TSDoc comments. +- Module-level private constants (e.g., lookup tables backing a set of public getters) use camelCase naming. +- Variable and constant names do not need to encode their type or role in a suffix (e.g., `Pattern`) unless doing so is necessary to clarify the data they hold; surrounding context is often sufficient (e.g., `regularExpressions.hexColor` versus the public `hexColorPattern` getter that exposes it). + +#### Formatting Rules + +- Keep formatting compatible with the repository ESLint configurations in `eslint.config.js.mjs` and `eslint.config.ts.mjs`. +- Do not introduce formatting-only tooling or workflow changes unless the task explicitly requires them. + +### Documentation Comment Preferences + +Most documentation comment conventions are enforced automatically by `eslint.config.ts.mjs`. + +Do not weaken or remove these ESLint rules to work around a violation; fix the documentation comment instead. +If a legitimate case requires deviating from one of these rules, discuss the specific rule override with the maintainer rather than silently suppressing it. + +#### Manual Review Instructions for Documentation Comment Preferences + +The following preferences require manual review since no ESLint rule can check them automatically: + +- **Use `{@link ...}` syntax in `@see` tags:** Always use `{@link ClassName.method}` (or `{@link symbol}`) inside `@see` tags. Do not use bare `{ClassName.method}` without `@link`. +- **Document version with `@since`:** Add `@since` to all public/exported members. +- **Enclose boolean values in backticks:** Always use backticks for `true` and `false` in documentation comments. +- **Use consistent tense and voice:** Write documentation in the present tense and active voice for clarity. +- **Document default values:** For class fields, object properties, and module-level constants and variables that have a default or initial value (e.g., `Random.#rng` defaulting to `Math.random`), state the default via `@default` (e.g., `@default Math.random`). +- **Document default parameter values:** Indicate default values for parameters in the `@param` annotation. +- **Annotate abstract/readonly/private/protected/override members:** Use `@abstract`, `@readonly`, `@private`, `@protected`, and `@override`, respectively, matching the corresponding TypeScript modifier. `eslint.config.ts.mjs` validates these tags are well-formed where present, but does not require their presence for a given modifier. ## Documentation and GitHub Pages @@ -302,6 +173,12 @@ _doc/ # Documentation output - generated by TypeDoc (not com Expected differences include Jekyll front matter, file-specific introductory or heading sections, footer or copyright text, and internal link differences. Any addition, removal, or update to shared sections must be applied consistently to both files. +### Jekyll Build + +The Jekyll build uses the `jekyll-relative-links` plugin (configured in `docs/_config.yml`), which automatically converts relative `.md` links in `docs/` markdown files to their rendered `.html` paths. +For example, `./portfolio-skills.md` in `docs/index.md` resolves to `portfolio-skills.html` on the published site. +Use `.md` relative links within `docs/` source files; the build process will convert them correctly. + ### TypeDoc Configuration - API docs are generated with TypeDoc (`npm run docs`) using `typedoc.json`. @@ -312,11 +189,104 @@ Any addition, removal, or update to shared sections must be applied consistently - Release documentation organized in `docs/releases/...` is maintained manually and not generated by any automated process. - Release docs follow the directory structure: `docs/releases/v{major}.x/v{major}.{minor}.x/v{version-prefix}.x/{full-version}/doc/`, where `{version-prefix}` includes the major, minor, patch, and any pre-release type identifier (e.g., `v0.1.0-alpha` for versions like `v0.1.0-alpha.0`). -### Jekyll Build +## Security and Dependency Management -The Jekyll build uses the `jekyll-relative-links` plugin (configured in `docs/_config.yml`), which automatically converts relative `.md` links in `docs/` markdown files to their rendered `.html` paths. -For example, `./portfolio-skills.md` in `docs/index.md` resolves to `portfolio-skills.html` on the published site. -Use `.md` relative links within `docs/` source files; the build process will convert them correctly. +- Dependabot is configured for monthly updates to npm dependencies, GitHub Actions workflows, and Bundler dependencies under `docs/`. +- See the [GitHub Actions CI](#github-actions-ci) table for CodeQL analysis scope and npm publish authentication details. + +## Validation + +### Vitest Testing + +This repository uses Vitest for testing, with coverage reporting via V8. +Tests live in the `test/` directory, with a folder structure that mirrors the source code in `src/`. +Shared test fixtures and scenario helpers live under `test/utils`. +Vitest also type-checks test files at run time (in addition to executing them), configured via the `typecheck` block in `vitest.config.ts` against `tsconfig.vitest.json`. + +### Validation Steps + +Run in order: `npm ci`, `npm run lint:all`, `npm run build`, `npm test`. See the ["npm Scripts" section](#npm-scripts) for details on each command. + +### Link Verification + +As part of pull request review, verify that repository and package links (for example in `README.md`, `package.json`, or other project metadata) match the current repository and package coordinates. + +## Pre-Merge and Release Review + +Complete the following steps before merging a branch to a release branch or to `main`. + +### 1. Validation + +Run the full [Validation Steps](#validation-steps) and confirm everything passes cleanly. + +### 2. Portfolio Skills Page (`docs/portfolio-skills.md`) + +Review `docs/portfolio-skills.md` against the current repository state. + +If anything changed, do the following: + +- Update any section where capabilities, tooling, or the skills inventory changed +- Bump `modified_date` to today; do not change the original `date` +- Evidence links must always point to the `main` branch + +Refer to the ["Portfolio Page Generation and Maintenance" section](#portfolio-page-generation-and-maintenance) for the full review checklist. + +### 3. Instruction File Sync + +Verify that `CLAUDE.md` and `.github/copilot-instructions.md` are consistent with each other and reflect the current project state: + +- Guidance shared between the two files is mirrored +- The [Directory Structure section](#directory-structure) accurately reflects the current `src/` module layout +- Any new tooling, conventions, or workflows introduced on the branch are documented + +### 4. `package.json` Keywords + +Review the `keywords` array in `package.json`: + +- Keywords should cover all major utility domains and notable features exported by the package +- Add new keywords when a new utility domain or notable feature is introduced +- Remove keywords for capabilities that no longer exist + +### 5. GitHub Repository Topics + +Verify that the topics on the GitHub repository ([blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils)) reflect the current capabilities. +Topics should align with `package.json` keywords where appropriate. +Request the current topics to be updated, if necessary. +Provide any topic change suggestions to the project maintainers and any accepted changes will be updated manually. + +### 6. Branch Code Review + +Review all branch changes for convention compliance and code quality. + +#### Convention Compliance + +- All source code files should follow the conventions listed in the ["Development Guidelines" section](#development-guidelines) of this file. +- Copyright year headers are present and accurate (see ["File Headers" section](#file-headers)). +- `README.md` and `docs/index.md` are in sync for any shared content changes +- Test coverage is complete and meaningful for all new or changed public API surface + +#### Code Quality + +- **Correctness** — implementations behave exactly as documented; edge cases are handled; patterns (e.g., regex) match precisely what they claim to match +- **API consistency** — new methods and classes follow the naming conventions and structural patterns of existing ones; the public surface is intuitive alongside what is already exported +- **Efficiency** — utility functions avoid unnecessary computation (e.g., no redundant regex compilation, no unnecessary copies or iterations) +- **Backward compatibility** — no unintentional breaking changes to the published API (check `package.json`'s current version — pre-release versions permit more flexibility here); any intentional breaking changes are reflected in the version bump +- **Reuse and DRY** — new utilities delegate to existing ones where appropriate rather than duplicating logic +- **Runtime safety** — see the "JavaScript Consumer Safety" section for the requirement to retain runtime type guards for JavaScript consumers + +#### Consistency and Pattern Observation + +- **Cross-source consistency** — Compare all changed code, inline comments, and documentation (JSDoc, README, `docs/`) against each other and against implicit patterns visible in the rest of the codebase. Flag any deviation from an established pattern even if that pattern has not been explicitly documented in this file (e.g., consistent phrasing in JSDoc summaries, a structural idiom repeated across utility classes, a naming convention used throughout tests). +- **Implicit pattern detection** — When a consistent pattern is observed in the codebase that is not yet captured in this file, call it out explicitly and ask the maintainer whether it should be documented in the appropriate section of `.github/copilot-instructions.md`. + +### 7. Release Readiness (for merges to `main`) + +When preparing a release merge to `main`: + +- Confirm the version in `package.json` is bumped appropriately +- Ensure release documentation under `docs/releases/` covers the new version +- Verify `typedoc.json` entry points include any new module-level index files +- Confirm the npm publish workflow (`package-publish.yml`) is configured correctly for the release ## Portfolio Page Generation and Maintenance @@ -513,11 +483,11 @@ Key Technologies: PyTorch, pre-trained models, Docker, GitHub Actions Then paste the full template prompt with these values filled in. -## Portfolio Skills Page Review Instructions +### Portfolio Skills Page Review Instructions Use the following standards for Copilot code review and any agentic Copilot sessions reviewing changes to `docs/portfolio-skills.md`. -### Reusable Summary for This Portfolio Page Pattern +#### Reusable Summary for This Portfolio Page Pattern These pages follow a strong, repeatable structure: @@ -530,9 +500,9 @@ These pages follow a strong, repeatable structure: The core standard is: **every technical claim should be durable and traceable to source evidence**. -### What to Verify When Reviewing `docs/portfolio-skills.md` +#### What to Verify When Reviewing `docs/portfolio-skills.md` -#### 1) Structure and completeness +##### 1) Structure and completeness Ensure the page includes the required front matter and these sections (or equivalents): @@ -546,7 +516,7 @@ Ensure the page includes the required front matter and these sections (or equiva Why: this keeps pages consistent and easy to compare across projects. -#### 2) Claim quality (accuracy + durability) +##### 2) Claim quality (accuracy + durability) Check that claims are: @@ -560,7 +530,7 @@ Good pattern: Risky pattern: - hardcoding exact versions/cadences unless you plan frequent updates -#### 3) Evidence alignment (most important review item) +##### 3) Evidence alignment (most important review item) For each claim in technical notes, verify linked evidence **directly supports** it. Evidence does not need to enumerate every implementation instance in the repository. A representative selection that successfully demonstrates the claim is sufficient. @@ -571,7 +541,7 @@ Also check whether the linked evidence is **representative of the project's curr This is a common high-impact review issue. -#### 4) Portfolio tone calibration +##### 4) Portfolio tone calibration Look for balance between: @@ -583,7 +553,7 @@ Avoid: - overly promotional language - absolute claims not backed by links -#### 5) Consistency across pages +##### 5) Consistency across pages When reviewing a new page, compare with existing template pages for: @@ -596,7 +566,7 @@ When reviewing a new page, compare with existing template pages for: Consistency boosts professionalism at portfolio scale. -#### 6) Gaps section quality +##### 6) Gaps section quality A strong `Current Gaps / Future Improvements` section is: @@ -610,7 +580,7 @@ Common high-value bullets: - intentionally minimal architecture scope - deployment/docs not yet covered (if true) -### Quick Review Checklist +#### Quick Review Checklist Reuse the earlier template usage checklist as the canonical baseline review list. Use this section only for additional review-specific checks: @@ -621,7 +591,7 @@ Reuse the earlier template usage checklist as the canonical baseline review list - [ ] Final read feels evidence-based, concise, and professional ``` -### Common Pitfalls to Catch Early +#### Common Pitfalls to Catch Early - Claim/evidence mismatch (most frequent) - Hardcoded version/cadence details that will drift @@ -631,7 +601,7 @@ Reuse the earlier template usage checklist as the canonical baseline review list - Evidence is technically relevant but not representative of the current runtime/configured implementation - Mixed category labels in tooling inventory that blur automation, deployment, security, and dependency management -### One-Sentence Review Standard +#### One-Sentence Review Standard When you review the next page, use this rule: diff --git a/CLAUDE.md b/CLAUDE.md index 6ce5c34..63ab198 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,14 +17,9 @@ Updates to `CLAUDE.md` should be reflected, when appropriate, in `.github/copilo A growing toolkit of reusable TypeScript and JavaScript utilities for number checks, string checks, random number and element selection (including weighted selection), deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry, published to npm. -## Common Commands - -- `npm ci` — install dependencies from the lockfile. -- `npm run lint:all` — run both the JavaScript and TypeScript ESLint configurations. -- `npm run build` — bundle the package to `_dist/` with tsdown. -- `npm test` — run the Vitest suite once. -- `npm run test:coverage` — run tests with V8 coverage (output to `_coverage/`). -- `npm run docs` — generate TypeDoc API documentation to `_doc/`. +## npm Commands + +See the ["npm Scripts" section of `.github/copilot-instructions.md`](./.github/copilot-instructions.md#npm-scripts) for the full list of available commands. ## Generated Output Directories (not committed) diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/hierarchy.js new file mode 100644 index 0000000..fb85f0a --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/highlight.css new file mode 100644 index 0000000..2dc2614 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/highlight.css @@ -0,0 +1,22 @@ +:root { + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --code-background: var(--dark-code-background); +} + +pre, code, math[display='block'] { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.js new file mode 100644 index 0000000..4fbadc5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.svg new file mode 100644 index 0000000..be7798f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/main.js new file mode 100644 index 0000000..b0eda9e --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}};var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
${e}
`:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/navigation.js new file mode 100644 index 0000000..b715950 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJytlElPwzAQhf8K8jliKSpLb6iUCgk4tFAOVQ9uPDQWtlPZDlCh/neUPXacBbXqLZl535t05i1/kYYfjUboOSQRA4U85AeUEQkCjZbFW0KVLymnAutQIg9tsQ7QCPG06cx4fRpozpCHPqkgaDRwC05ExEFiTUPRxLyviqoSCiLiNtKsNR3c7Fd7r1AdM6xU45yGzgw2VGm5K9F+2twGz5tMDxcD08Wj0CA/sP8vI8nXKs3QQqOHn6TX+meGV4an190WTu4Yxb0+D5DSid5t20wAscDnt9cXw4GFnkZYdmgWZW696jALLCle91poIHM/AI5L9lfebPEdTaaTy9hE1YaI+BocB5M+73Up7Qv7kgi9acqodixqxjGqXJtZ9SyxICGve06fH8HzzALkZjPAzMGJXXqWQDrUFEScI6F8wL4OXcdqyLqb2mBzAALE2d3IaunpQi1AqiwUm7Xzojaxd6CbQAOZMOAgdOOKZLLu8gNTrOLVmVv1keoR1ThRm6JVenDw5XpPVGk7oyxkXHJ4Pn2bAzQnVEZ31neEk9KSik390NPnRzj0cchCOU/UGtcvg9VLWw+ll2aH3Cr9/QHQ6SnC" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/search.js new file mode 100644 index 0000000..c11e695 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/search.js @@ -0,0 +1 @@ +window.searchData = "eJy1nF1v2zoShv+LfCvkmJ+OfbfdPe0WKIqD9pzuhREsHJtxhLXlQJLTZoP89wNKsjSjGdmU7Vy1sDUvXw4fDilaymuU7X7m0Wz+Gv0vSVfRTMZRuti6aBatknyZJdskXRS7LIqjfbaJZtF2t9pvXP4b+vbmsdhuojhabhZ57vJoFkVv8UHxtlH8F4zJG0mX7rddQXwpox9HT4vMpQUx2jYsbNPyf1yyfizc6veN2/qggU2PftbxrokPsNJRgs5kT1K+uXWSF9lLY7Bu5pjFQ8x5SZJj3Xp5XORntzyqggfnpelyj6es/N5l5xsDCld397zYJKtF4c53BxSu4s7Yo2gtimSXNm6TtHDZw2IZZLgMPXMqjqU+UVjOtDLqqp2bxCoxPZbrQbqCXah0LatyPJ0II7lxd6vGcfHydMysW51bQHDjf748uU/7RXa84eaq8xpV7DLlVt+Xj267aFp+XmTJ4p4uV0zMmZ1vbKT77b2jy2T18dH1ES4GX8vL/yqSTVLQRaAWQxcd91276ileSf4xSZPCfcXeTzY3SvKHMrDp9LHWsUC/l89p4dYDbSRNzDUc/LHLkyJ5duc4eapjL3XUrnuLdLXbEqCqj4OB+oZVDj2pVb71iQHDtQ9g0Uqhdcdn1Z9PLnUZKpP9DY6qj6p8rEHgMRu1QO9eIbS3o+bKi1v7sNtt3CINb/S+Cbi47e529mTbp/avA9r+uNktBrT8UF9+cbufh/Q3uU5f+wrCsXaPVoEBbffdupz0EHrP0ueFlpHOJP+4WBY75l4FCfIxQ0sOTMsif0mXH/bJZnV2y6NS477WCEhLT897HN5fZu6avuAgfndu5VZsYJ/ZIyEDh9CIdmlb7tK8yPbLCxoeYY2jqTrW754RTN2v3pl20lodfAVP3dH74bI82aX0Jh2oHq65bFXPk//Te9q+Vkb11Sd73PjvSfvaFfUl4W2vXfHcxFzsIMl/+Bu0z+nK/Qr3kOTlbV1SR53jAg51p+T33Q7UgvzVl1TYsgAFrjtHWq8K2cBlqKfvIU6/JPnlNjeVyBU9Jnk5tZPlFTKa5OtK612zShyfm1li9z2ye5W0vnM+L0/k+2XwcAB5qceDznWdguNMUDm5YzhaXwfWQHTit3t4yF2RD2ho1IaELgA9He0jmnroXHlJh0+eyh5pMvAQllc4cua6d0ONHIKuYaACeaiDJupMC93zVHZaVkeqHS1/xUACwDnqT+yo9yS1bpS9fOimo91uFlmSrslhV/Vx8GHXP3ebXfa9jOnbM9WK9Mrj1mt/vdvlR/erlPxjURQuo7vX482OHt2vpf/qqQk/ZoORCXb27dOHC81l6/v39fePyw0uLnOI1+5/1w6H2kryg7H3cHPGQLaGLh7DXk+DBw+Zumzc0N1ySBW4YgHIk3S9cV+S1H3Z/XTZcpG7P7Nku3WrEyWBSUmltUlStzloFZVWYH0InHqt5ytYfWeHfz09XS2r+4PWlTzjyfB1l/6+fSpevuMl7bTBJE93qfOhzWp4DT/fe8k8w2E/mu/k+RpW39dhl8yLrHbRvK7nM5yd0/5dHFUnYbPX6HA0N4vkjbqZRnH0kLjNyj9xVhmLo+VuW9/lrHbLffnfu/qyH25ZPjk1m1dX/zaO4vk4VuMbqaZ3d/H8EFx+UX5w0Gg/KQNFFM9FrG5vJkKiQEECBQqUUTyXsVI3dqxRoCSBEgWqKJ4rrkVFAhUK1FE811ygJoEaBZoonhsu0JBAgwJtFM8tF2hJoEWBkyieT7jACQmcoMDbvnG8JYG3KHAaxfNbrsUpCZxiADwPU5YAyo7owFPSM2aDGX4wQMJjIXj2KEMCQyQ8GkKywZQjgUESHg/BMigoSwLDJDwiguVQUJ4EBkp4TATLoqBMCQyV8KgIlkdBuRIYLOFxERMOLUHZEhguMe0PpnwJDJj0zAiWTUkJk5gwKXpblpQw2SlRJWEs25KpUpgw6ZmRLNuSEiYxYdIzI1m2JSVMYsKkZ0aybEtKmMSESc+MZNmWlDCJCZOeGcmyLSlhEhMmPTOSZVtSwiQmTHpmJMu2pIRJTJjyzEi23ipKmMKEKc+MZPFUlDCFCVPlKsgSpihhqrMQlishS5hi1kJMmPLMKJYwRQlTmDDlmVEsYYoSpjBhyjOj+BWcEqYwYcozo1jCFCVMYcKUZ0axhClKmMKEKc+MYglTlDCFCdOeGcUSpilhGhOmPTOKJUxTwjQmTHtmFEuYpoRpTJj2zGiWME0J053tVrnfYgnTzI4LE6Y9M5olTFPCNCZMe2Y0S5imhGlMmPbMaH6fSAnTmDB927er1RQwjQHT0769m6Z8acyX8cRofo9K+TKYL+OJ0SzZhvJlMF/GE6NZsg3ly2C+TMkXS7ahfBnMlyn5Ysk2lC/T2dKXe3qWbMPs6jFfxhNjWLIN5ctgvownxrBkG8qXwXwZj4xhyTYUMIMBM54Zw5JtKGEGE2Y9M4YlzFLCLCbMemYMfydECbOYMOuZMSxhlhJmMWHWM2NYwiwlzGLCrGfGsIRZSpjFhFnPjGUJs5Qw27lxLO8cWcIsc++ICbOeGcsSZilhFhNmPTOWJcxSwiwmzHpmLEuYpYRZTNjEM2NZwiaUsPqj8kjk2WWFqx8t8ica8CHE1+i/9ZmJbH4Hfo3kNJq9vr21ZySz1zdwTOK/861RjUmrocbhGuQpiFZSAVtqgC38NADQAxZ1mMXyV4LqyGl/ONhvBc24FTQmUBA8QwiyNwVdlUFKK/zGTasFpERYL5FUXv8K2woKARQHm8MdBRkbV7G31T86bICRcIbeL2sbAeM8OVsVjbQCwzNcMUfZBMkMkoJPGwJH0JINEirflmwVNJgNYfHdn4zBTAC9MoFumN94gaAEgmGDyP4mCxRBwsxtkGL3nSMwiCB5Imzm9z9HBwb1FoxJGB09z7sBTVAPdNjshT8jgwSCPpuw2dr5+RdomVbLhhWp7q+2QAysEzY0a83rEmBQgSkRBjH9Aa2Vs2BO2FA58k4XsAe6KcKmRMivZ8AwmHN2eAP9umDm2dCZd/oHKtAAINOGksnIgPGfhEIJn8IGkw44UqGpPFIYNFg3ddgK1H1+E4gBMHVY6a/eLwD9A35UmB+miALexBARZismAGMirE/Ns5MgM3BNDBu2w1t9wArYfoh6dyOm1b8yrDx13toD2qCYy7Bi3nkLD+w5wRjKsPSj9+qAEgBKhiUfvCsHdAAQMmxV7bz7BrQAEDKs+va8HQqyD5ZnGVYgWM2Hw1tswC6oPTKsRva8cgc0Ac0ykObm71aA5RUs+0Eiefmi0clsSpBNFTYvvDKzF9ZgrHXYWAMlVAEUQFmFoRzw7BRIJui0DZt0/Q88AVlQF+xQ270PJ4GlEdQKG0hB+YIWyCyY3CpQgizRGvTTBPaz9+4d1GkbVkv9M9Dr6g9NgKoAciPCOG7/AAtIMXAzSKR3mQcJ12EJB38ppNUBxIbtrZ6rB+KBE1hCwurm4ZF2IAISZMLSfKw2gtJYReuwqtvRpKclGuTLhM3wjibDqgIZVMOMEiwA9iYA+7s4ekqeykIRzeZ3b29/A5cwXvI="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/style.css new file mode 100644 index 0000000..ec257d5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/assets/style.css @@ -0,0 +1,1648 @@ +@layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; + --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-background-active); + --light-color-text: #222; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + } + + :root { + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: var(--dark-color-background-active); + --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: var(--dim-footer-height); + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: var(--dim-container-main-margin-y) auto; + /* toolbar, footer, margin */ + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + "Noto Sans", + Helvetica, + Arial, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + margin: 0; + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + math[display="block"] { + position: relative; + padding: 10px; + border: 1px solid var(--color-accent); + border-radius: 0.8em; + margin-bottom: 8px; + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible, + pre > button:focus-visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + margin-top: 1rem; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 0; + margin-bottom: 1rem; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + color: var(--color-contrast-text); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 30px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary > a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-summary { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + display: flex; + align-content: center; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; + } + #tsd-search[open].closing { + animation-name: fade-out; + } + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { + box-sizing: border-box; + width: 100%; + padding: 0 0.625rem; /* 10px */ + outline: 0; + border: 2px solid var(--color-accent); + background-color: transparent; + color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; + } + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); + } + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; + } + #tsd-search-results { + margin: 0; + padding: 0; + list-style: none; + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; + } + #tsd-search-results > li { + background-color: var(--color-background); + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; + } + #tsd-search-results > li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); + } + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { + display: flex; + align-items: center; + padding: 0.5rem 0.25rem; + box-sizing: border-box; + width: 100%; + } + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + #tsd-search-results > li > a .parent { + color: var(--color-text-aside); + } + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; + } + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; + } + #tsd-search-status:not(:empty) { + min-height: 6rem; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + } + .tsd-toolbar-contents { + display: flex; + align-items: center; + height: var(--dim-toolbar-contents-height); + margin: 0 auto; + } + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; + } + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; + } + + .tsd-widget { + box-sizing: border-box; + display: inline-block; + opacity: 0.8; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; + cursor: pointer; + border: none; + background-color: transparent; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget:active { + opacity: 1; + background-color: var(--color-accent); + } + #tsd-toolbar-menu-trigger { + display: none; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + vertical-align: middle; + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + /* mobile */ + @media (max-width: 769px) { + #tsd-toolbar-menu-trigger { + display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; + } + + .container-main { + display: flex; + } + .col-content { + float: none; + max-width: 100%; + width: 100%; + } + .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + .col-sidebar > *:last-child { + padding-bottom: 20px; + } + .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 0rem; + } + + .page-menu, + .site-menu { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + } +} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/discriminator.DiscriminatorRegistry.html new file mode 100644 index 0000000..a322003 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/discriminator.DiscriminatorRegistry.html @@ -0,0 +1,156 @@ +DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class DiscriminatorRegistry

+
+

Static registry for managing discriminators and their associated type guards. +Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
    +
  • + +
    +

    Checks if a discriminator is already registered.

    +
    +
    +

    Parameters

    +
      +
    • discriminator: string +

      The discriminator value to check.

      +
    +

    Returns boolean

      +
    • true if the discriminator is registered, false otherwise.
    • +
    + +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
    +
  • + +
    +

    Validates an input against a specific discriminator.

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to validate.

      +
    • +
    • discriminator: string +

      The discriminator value to check.

      +
    +

    Returns boolean

      +
    • true if the input matches the type associated with the discriminator, false otherwise.
    • +
    + +
    +
    +

    0.1.0

    +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/number.NumberUtility.html new file mode 100644 index 0000000..84c54de --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/number.NumberUtility.html @@ -0,0 +1,135 @@ +NumberUtility | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class NumberUtility

+
+

Static properties and methods for validating number types.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
    +
  • + +
    +

    Is the given input a finite number?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is number

    true when the input is a finite number; false otherwise.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Is the given input an integer?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is number

    true when the input is an integer; false otherwise.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Is the given input a positive integer?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    • +
    • zeroInclusive: boolean = false +

      true if zero should be considered a valid input. +false if zero should be considered an invalid input. +Default value is false.

      +
    +

    Returns input is number

    true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

    + +
    +
    +

    0.1.0

    +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.Random.html new file mode 100644 index 0000000..2b3ef74 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.Random.html @@ -0,0 +1,317 @@ +Random | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class Random

+
+

Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
    +
  • +
    set randomNumberGenerator(rng: () => number): void
    +
    +

    Set the primary function used to generate random numbers.

    +
    +
    +

    Parameters

    +
      +
    • rng: () => number +

      A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive).

      +
    +

    Returns void

    +
    +
    +
      +
    • If the given random number generator is not a function.
    • +
    +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
    +
  • + +
    +

    Get a random number.

    +
    +

    Returns number

    A random number in the range [0, 1) (zero inclusive, one exclusive).

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Get a random boolean.

    +
    +
    +

    Parameters

    +
      +
    • chanceOfTrue: number = 0.5 +

      The probability of returning true (between 0 and 1). +Default value is 0.5.

      +
    +

    Returns boolean

    A random boolean value.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Get a random element from the given array.

    +
    +
    +

    Type Parameters

    +
      +
    • Type
    +
    +

    Parameters

    +
      +
    • elements: Type[] +

      An array of elements to choose from.

      +
    +

    Returns Type

    A random element from the array.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Get a random floating-point number within the given range.

    +
    +
    +

    Parameters

    +
      +
    • min: number +

      The minimum value (inclusive).

      +
    • +
    • max: number +

      The maximum value (exclusive).

      +
    +

    Returns number

    A random floating-point number in the range [min, max) (min inclusive, max exclusive).

    + +
    +
    +

    When min is not a finite number.

    +
    +
    +

    When max is not a finite number.

    +
    +
    +

    When min is not less than or equal max.

    +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Get a random integer within the given range. +If min or max is not an integer, it is rounded down with Math.floor before a value is generated.

    +
    +
    +

    Parameters

    +
      +
    • min: number +

      The minimum value (inclusive). +Non-integer values are rounded down with Math.floor.

      +
    • +
    • max: number +

      The maximum value (exclusive). +Non-integer values are rounded down with Math.floor.

      +
    +

    Returns number

    A random integer in the range [Math.floor(min), Math.floor(max)) (min inclusive, max exclusive).

    + +
    +
    +

    When min is not a finite number.

    +
    +
    +

    When max is not a finite number.

    +
    +
    +

    When min is not less than or equal max.

    +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Get a random integer within the given range. +If min or max is not an integer, it is rounded down with Math.floor before a value is generated.

    +
    +
    +

    Parameters

    +
      +
    • min: number +

      The minimum value (inclusive). +Non-integer values are rounded down with Math.floor.

      +
    • +
    • max: number +

      The maximum value (exclusive). +Non-integer values are rounded down with Math.floor.

      +
    +

    Returns number

    A random integer in the range [Math.floor(min), Math.floor(max)) (min inclusive, max exclusive).

    + +
    + +
    +

    When min is not a finite number.

    +
    +
    +

    When max is not a finite number.

    +
    +
    +

    When min is not less than or equal max.

    +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.RandomNumberGeneratorFactory.html new file mode 100644 index 0000000..d69f96a --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.RandomNumberGeneratorFactory.html @@ -0,0 +1,161 @@ +RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class RandomNumberGeneratorFactory

+
+

A static factory class for creating a SeededRandomNumberGenerator object.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
    +
  • + +
    +

    Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

    +
    +
    +

    Parameters

    +
      +
    • seed: string +

      The primary input to determine the random number sequence.

      +
    • +
    • Optionalnamespace: string +

      Namespace to create different sequences from the same seed.

      +
    +

    Returns Promise<SeededRandomNumberGenerator>

    + +
    +
    +

    This method relies on the Web Crypto API via crypto.subtle. +In Node.js environments, ensure you are using a version where the Web Crypto API is available.

    +
    +
    +
      +
    • When the given seed is not a string.
    • +
    +
    +
    +
      +
    • When the given namespace is not a string.
    • +
    +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeedVersions.html new file mode 100644 index 0000000..b13c75c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeedVersions.html @@ -0,0 +1,145 @@ +SeedVersions | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class SeedVersions

+
+

A static class for accessing different seed versions. +Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • +
    get size(): number
    +
    +

    The number of seed versions.

    +
    +

    Returns number

      +
    • The total number of seed versions that currently exist.
    • +
    + +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
+
+ +
    +
  • + +
    +

    Is the given index a valid seed version?

    +
    +
    +

    Parameters

    +
      +
    • index: number +

      The index to check.

      +
    +

    Returns boolean

      +
    • true if the given index is a valid seed version; false otherwise.
    • +
    + +
    +
    +

    0.1.0

    +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeededRandomNumberGenerator.html new file mode 100644 index 0000000..34a87ca --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.SeededRandomNumberGenerator.html @@ -0,0 +1,125 @@ +SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class SeededRandomNumberGenerator

+
+

Deterministic seeded pseudorandom number generator. +This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • + +
    +

    Get the next number in the seeded sequence.

    +
    +

    Returns number

      +
    • The next pseudorandom float in the range [0, 1).
    • +
    + +
    +
    +

    This method advances the internal 128-bit xoshiro128** state by one step. +Successive calls produce an independent, uniformly distributed sequence.

    +
    +
    +

    0.1.0

    +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.WeightedElementUtility.html new file mode 100644 index 0000000..b3c89b6 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/random.WeightedElementUtility.html @@ -0,0 +1,318 @@ +WeightedElementUtility | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class WeightedElementUtility

+
+

Static methods and properties for building and validating WeightedElement and WeightedList objects.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.ColorStringUtility.html new file mode 100644 index 0000000..19167c2 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.ColorStringUtility.html @@ -0,0 +1,192 @@ +ColorStringUtility | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class ColorStringUtility

+
+

Static properties and methods for validating formatted color strings.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
    +
  • +
    get hexColorPattern(): RegExp
    +
    +

    Get the regular expression for hex colors.

    +
    +

    Returns RegExp

    Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • +
    get hexColorPatternRGB(): RegExp
    +
    +

    Get the regular expression for hex colors in RGB format.

    +
    +

    Returns RegExp

    Regular expression pattern for validating hex color strings in the format #RRGGBB. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • +
    get hexColorPatternRGBA(): RegExp
    +
    +

    Get the regular expression for hex colors in RGBA format.

    +
    +

    Returns RegExp

    Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

    + +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.StringUtility.html new file mode 100644 index 0000000..9019b76 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/classes/string.StringUtility.html @@ -0,0 +1,264 @@ +StringUtility | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Class StringUtility

+
+

Static properties and methods for validating string types.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
    +
  • +
    get singleLineLowercaseTrimmedPattern(): RegExp
    +
    +

    Get the regular expression for single-line lowercase strings.

    +
    +

    Returns RegExp

    Regular expression pattern for validating single-line lowercase strings.

    + +
    +
    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +
    +
    +

    0.1.0

    +
+
+ +
    +
  • +
    get singleLineTrimmedPattern(): RegExp
    +
    +

    Get the regular expression for single-line mixed-case strings.

    +
    +

    Returns RegExp

    Regular expression pattern for validating single-line mixed-case strings.

    + +
    +
    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +
    +
    +

    0.1.0

    +
+
+ +
    +
  • +
    get singleLineUppercaseTrimmedPattern(): RegExp
    +
    +

    Get the regular expression for single-line uppercase strings.

    +
    +

    Returns RegExp

    Regular expression pattern for validating single-line uppercase strings.

    + +
    +
    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +
    +
    +

    0.1.0

    +
+
+ +
+
+ +
    +
  • + +
    +

    Is the given input a non-empty string? +Non-empty strings must contain at least one non-whitespace character.

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is string

      +
    • true if the given input is a non-empty string; false otherwise.
    • +
    + +
    +
    +

    0.1.0

    +
+
+ +
    +
  • + +
    +

    Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is string

      +
    • true if the given input is a single-line lowercase string that is trimmed; false otherwise.
    • +
    + +
+
+ +
    +
  • + +
    +

    Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is string

      +
    • true if the given input is a single-line string that is trimmed; false otherwise.
    • +
    + +
+
+ +
    +
  • + +
    +

    Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is string

      +
    • true if the given input is a single-line uppercase string that is trimmed; false otherwise.
    • +
    + +
+
+ +
    +
  • + +
    +

    Is the given input a string?

    +
    +
    +

    Parameters

    +
      +
    • input: unknown +

      The input to check.

      +
    +

    Returns input is string

      +
    • true if the given input is a string; false otherwise.
    • +
    + +
    +
    +

    0.1.0

    +
+
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/enums/discriminator.Discriminators.html new file mode 100644 index 0000000..0df3951 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/enums/discriminator.Discriminators.html @@ -0,0 +1,73 @@ +Discriminators | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Enumeration Discriminators

+
+

Valid discriminators for package types and interfaces.

+
+
+
+

0.1.0

+
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
WeightedElement: "@blwatkins/utils:WeightedElement"
+

Discriminator value for the WeightedElement interface.

+
+
+
+

0.1.0

+
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/hierarchy.html new file mode 100644 index 0000000..c806368 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/hierarchy.html @@ -0,0 +1,34 @@ +@blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+

@blwatkins/utils - v0.1.0-alpha.2

+

Hierarchy Summary

+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/index.html new file mode 100644 index 0000000..54a47c9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/index.html @@ -0,0 +1,113 @@ +@blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+

@blwatkins/utils - v0.1.0-alpha.2

+

TypeScript Utilities

+

A growing toolkit of reusable TypeScript and JavaScript utilities for number checks, string checks, random number and element selection (including weighted selection), deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry.

+ + + +

Development for this project originally began in March 2022 when I started creating utility classes in JavaScript to use across my personal algorithmic generative art projects. +Over the years, the utilities have been refined, expanded, updated, and organized into a series of cohesive libraries that can be used in a variety of projects.

+ +

The source code of this project is licensed under the MIT License. +The full text of the license is included with the project source code.

+ + +

npm License +npm Version +npm @alpha Version +npm Types +npm Node Version +npm Weekly Downloads +npm Total Downloads +npm Last Update +npm Unpacked Size

+ +

Socket Score

+ +

Bundlephobia Tree Shaking +Bundlephobia Dependency Count +Bundlephobia Minified +Bundlephobia Minified + gzip

+ +

Package Phobia Install Size +Package Phobia Publish Size

+ +

GitHub License +GitHub Dependabot +GitHub Latest Release +GitHub Releases +GitHub Last Commit +GitHub Commits +GitHub Commit Activity +GitHub Code Size in Bytes +GitHub Repo Size +GitHub Repo File or Directory Count +GitHub Language Count

+ +

CodeQL +npm Lint, Build, and Test +Deploy GitHub Pages with Jekyll

+ + + +

A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

+

A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of algorithmic art, web development, and computer science. +Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

+
+

Copyright © 2022-2026 Brittni Watkins.

+
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/discriminator.DiscriminatorRegistration.html new file mode 100644 index 0000000..f9fa6a9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -0,0 +1,104 @@ +DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Interface DiscriminatorRegistration

+
+

A registration for a discriminator to the DiscriminatorRegistry.

+
+
+
+

0.1.0

+
+
interface DiscriminatorRegistration {
    discriminator: string;
    validator: (input: unknown) => boolean;
}
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
discriminator: string
+

The discriminator value that identifies the type of a Discriminated object. +This value must be unique across all registered discriminators.

+
+
+
+

0.1.0

+
+
+ +
validator: (input: unknown) => boolean
+

A method that validates whether an input matches the type associated with the discriminator.

+
+
+

Type Declaration

+
    +
  • +
      +
    • (input: unknown): boolean
    • +
    • +
      +

      Parameters

      +
        +
      • input: unknown +

        The input to validate.

        +
      +

      Returns boolean

        +
      • true if the input matches the type associated with the discriminator, false otherwise.
      • +
      +
+
+
+

0.1.0

+
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.SeedVersion.html new file mode 100644 index 0000000..5531967 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.SeedVersion.html @@ -0,0 +1,76 @@ +SeedVersion | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Interface SeedVersion

+
+

A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. +A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

+
+
+
+

0.1.0

+
+
interface SeedVersion {
    offsets: readonly [number, number, number, number];
}
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
offsets: readonly [number, number, number, number]
+

A collection of offset values for the FNV-1a hashing algorithm. +Each offset value should be a 32-bit unsigned integer.

+
+
+
+

0.1.0

+
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.WeightedElement.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.WeightedElement.html new file mode 100644 index 0000000..98788d9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/interfaces/random.WeightedElement.html @@ -0,0 +1,103 @@ +WeightedElement | @blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+ +

Interface WeightedElement<TValue>

+
+

Interface for a weighted element, which can be used for non-uniform random selection from a list.

+
+
+
+

0.1.0

+
+
interface WeightedElement<TValue> {
    discriminator: WeightedElement;
    value: TValue;
    weight: number;
}
+
+

Type Parameters

+
    +
  • TValue
+
+
+
+
Index
+
+
+ +
+
+ +
+
+ +
discriminator: WeightedElement
+

The discriminator for the weighted element.

+
+
+
+

0.1.0

+
+
+ +
value: TValue
+

The value to be selected from the weighted list.

+
+
+
+

0.1.0

+
+
+ +
weight: number
+

The probability weight of the element. +Should be a number between 0 and 1, inclusive.

+
+
+
+

0.1.0

+
+
+ +
+

Generated using TypeDoc

+


Copyright © 2022-2026 Brittni Watkins.

+
diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules.html new file mode 100644 index 0000000..9637f29 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules.html @@ -0,0 +1,41 @@ +@blwatkins/utils - v0.1.0-alpha.2
+
+
+
+
+
    +

    @blwatkins/utils - v0.1.0-alpha.2

    +
    +
    discriminator
    number
    random
    string
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/discriminator.html new file mode 100644 index 0000000..dda4775 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/discriminator.html @@ -0,0 +1,58 @@ +discriminator | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Module discriminator

    +
    +
    Discriminators
    +
    +
    DiscriminatorRegistry
    +
    +
    DiscriminatorRegistration
    +
    +
    Discriminated
    TypeGuard
    +
    +
    discriminatedSchema
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/number.html new file mode 100644 index 0000000..d4bf879 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/number.html @@ -0,0 +1,42 @@ +number | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Module number

    +
    +
    NumberUtility
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/random.html new file mode 100644 index 0000000..745e5d9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/random.html @@ -0,0 +1,54 @@ +random | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    + +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/string.html new file mode 100644 index 0000000..1bd3d25 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/modules/string.html @@ -0,0 +1,42 @@ +string | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Module string

    +
    +
    ColorStringUtility
    StringUtility
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.Discriminated.html new file mode 100644 index 0000000..5563942 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.Discriminated.html @@ -0,0 +1,45 @@ +Discriminated | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Type Alias Discriminated

    +
    Discriminated: Static<typeof discriminatedSchema>
    +

    Discriminated objects can be type checked using the discriminator registry.

    +
    +
    +
    +

    0.1.0

    +
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.TypeGuard.html new file mode 100644 index 0000000..aaa6f78 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/discriminator.TypeGuard.html @@ -0,0 +1,61 @@ +TypeGuard | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Type Alias TypeGuard<T>

    +
    TypeGuard: (input: unknown) => input is T
    +

    A type guard function that checks if an input is of a specific Discriminated type.

    +
    +
    +

    Type Parameters

    +
    +
    +

    Type Declaration

    +
      +
    • +
        +
      • (input: unknown): input is T
      • +
      • +
        +

        Parameters

        +
          +
        • input: unknown
        +

        Returns input is T

    +
    +
    +

    0.1.0

    +
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/random.WeightedList.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/random.WeightedList.html new file mode 100644 index 0000000..935f996 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/types/random.WeightedList.html @@ -0,0 +1,52 @@ +WeightedList | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Type Alias WeightedList<TValue>

    +
    WeightedList: WeightedElement<TValue>[]
    +

    Type alias for a list of WeightedElement objects.

    +
    +
    +

    Type Parameters

    +
      +
    • TValue
    +
    + +
    +

    0.1.0

    +
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/discriminator.discriminatedSchema.html new file mode 100644 index 0000000..0883e95 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/discriminator.discriminatedSchema.html @@ -0,0 +1,45 @@ +discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Variable discriminatedSchemaConst

    +
    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...
    +

    TypeBox schema for validating that an object implements the Discriminated type.

    +
    +
    +
    +

    0.1.0

    +
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/random.weightedElementSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/random.weightedElementSchema.html new file mode 100644 index 0000000..0e24e3c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/variables/random.weightedElementSchema.html @@ -0,0 +1,45 @@ +weightedElementSchema | @blwatkins/utils - v0.1.0-alpha.2
    +
    +
    +
    +
    + +

    Variable weightedElementSchemaConst

    +
    weightedElementSchema: TGeneric<
        [TParameter<"T", TUnknown, TUnknown>],
        TIntersect<
            [
                TObject<{ discriminator: TReadonly<TString> }>,
                TObject<
                    {
                        discriminator: TLiteral<WeightedElement>;
                        value: TReadonly<TRef<"T">>;
                        weight: TReadonly<TNumber>;
                    },
                >,
            ],
        >,
    > = ...
    +

    TypeBox schema to validate a WeightedElement object.

    +
    +
    +
    +

    0.1.0

    +
    +
    + +
    +

    Generated using TypeDoc

    +


    Copyright © 2022-2026 Brittni Watkins.

    +
    diff --git a/eslint.config.ts.mjs b/eslint.config.ts.mjs index 1246f5c..01cd0e1 100644 --- a/eslint.config.ts.mjs +++ b/eslint.config.ts.mjs @@ -23,6 +23,7 @@ import eslint from '@eslint/js'; import stylistic from '@stylistic/eslint-plugin'; import esX from 'eslint-plugin-es-x'; +import jsdoc from 'eslint-plugin-jsdoc'; import globals from 'globals'; import tsEslint from 'typescript-eslint'; @@ -241,5 +242,108 @@ export default defineConfig([ allowBoolean: true }] } + }, + { + files: ['src/**/*.ts'], + plugins: { + jsdoc + }, + extends: [ + jsdoc.configs['flat/recommended-typescript'] + ], + rules: { + 'jsdoc/check-access': 'error', + + 'jsdoc/check-alignment': 'error', + + 'jsdoc/check-param-names': 'error', + + 'jsdoc/check-tag-names': ['error', { + typed: false, + definedTags: ['since', 'category'] + }], + + 'jsdoc/check-types': 'error', + + 'jsdoc/empty-tags': 'error', + + 'jsdoc/escape-inline-tags': 'error', + + 'jsdoc/implements-on-classes': 'error', + + 'jsdoc/multiline-blocks': 'error', + + 'jsdoc/no-defaults': 'error', + + 'jsdoc/no-multi-asterisks': 'error', + + 'jsdoc/no-types': 'off', + + 'jsdoc/reject-any-type': 'error', + + 'jsdoc/reject-function-type': 'error', + + 'jsdoc/require-description': 'error', + + 'jsdoc/require-jsdoc': 'error', + + 'jsdoc/require-param': 'error', + + 'jsdoc/require-param-description': 'error', + + 'jsdoc/require-param-name': 'error', + + 'jsdoc/require-param-type': 'error', + + 'jsdoc/require-returns': ['error', { + forceRequireReturn: true, + forceReturnsWithAsync: true + }], + + 'jsdoc/require-returns-check': 'error', + + 'jsdoc/require-returns-description': 'error', + + 'jsdoc/require-returns-type': 'error', + + 'jsdoc/require-throws': 'error', + + 'jsdoc/require-throws-type': 'error', + + 'jsdoc/sort-tags': ['error', { + tagSequence: [ + { tags: ['remarks'] }, + { tags: ['see'] }, + { tags: ['param'] }, + { tags: ['returns'] }, + { tags: ['throws'] }, + { tags: ['default'] }, + { tags: ['example'] }, + { tags: + [ + 'type', + 'readonly', + 'private', + 'protected', + 'public', + 'abstract', + 'override', + 'deprecated', + 'since', + 'category' + ] + } + ] + }], + + 'jsdoc/tag-lines': ['error', 'any', { + startLines: null, + endLines: null + }], + + 'jsdoc/ts-no-empty-object-type': 'error', + + 'jsdoc/valid-types': 'error' + } } ]); diff --git a/package-lock.json b/package-lock.json index 46d221d..81cbc9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@vitest/ui": "^4.1.10", "eslint": "^10.6.0", "eslint-plugin-es-x": "^9.7.0", + "eslint-plugin-jsdoc": "^63.0.13", "globals": "^17.7.0", "tsdown": "^0.22.4", "typedoc": "^0.28.20", @@ -124,6 +125,33 @@ "tslib": "^2.4.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.88.0.tgz", + "integrity": "sha512-GK/HL/claLLNo5KG705auIlZMwEtmn88ofSGuLsmVZwKBqMPJhW9DiznYNq07QEqz9BPtA3LBfYImtZmhVvRAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.9", + "@typescript-eslint/types": "^8.59.4", + "comment-parser": "1.4.7", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -740,6 +768,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -812,9 +853,9 @@ "license": "MIT" }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "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": { @@ -875,9 +916,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -1255,9 +1296,9 @@ } }, "node_modules/@yuku-codegen/binding-darwin-arm64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.5.44.tgz", - "integrity": "sha512-mpZc7hrjl/qxcbEMS6vVLE0lO4DjiXCvrp3gYbZ58bbmsSxSGCTlOCA0lpeLXAKOZxe0ZrVoqKteaewFF2Vbuw==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.5.46.tgz", + "integrity": "sha512-Kb3ULHGCN3lCfFj8L6YzSeIg1rcpXRuzbDc47KYBdK9R/8YW9HWKWfHji+WF/91QiCDb7u0VMhHgB/dPjpT2qg==", "cpu": [ "arm64" ], @@ -1268,9 +1309,9 @@ ] }, "node_modules/@yuku-codegen/binding-darwin-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-x64/-/binding-darwin-x64-0.5.44.tgz", - "integrity": "sha512-PCt776PnGtnQYimxk18IyvPf/BQ6CNU95W+6eaoQfeME8ra+7v3pNNoTAmLfSveUC9KZPaoajR9NqkKfEVjA2Q==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-x64/-/binding-darwin-x64-0.5.46.tgz", + "integrity": "sha512-5yJZFGJOU2ijYcD1gr7ooIlzqOTArE0YPNWEC2LlLGjqcYUpC3wPU+FVtDO1xLW60oJQlG2T54pbYsuXCsTdMA==", "cpu": [ "x64" ], @@ -1281,9 +1322,9 @@ ] }, "node_modules/@yuku-codegen/binding-freebsd-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-freebsd-x64/-/binding-freebsd-x64-0.5.44.tgz", - "integrity": "sha512-5MNu1R4ysytPLMdl1UlGyjgAbUdT8fguW/QRo+pyEymbuWRN5n8JEHCFpm4AsWdP61fStagSpPDJcwN+mwC9Lg==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-freebsd-x64/-/binding-freebsd-x64-0.5.46.tgz", + "integrity": "sha512-5K6x+Ll4qcfoU1lfDvkpK7i3r8a+bJYsE3zj8SnRoAHSu21au53E4c3XE1u8KlHo8JIiMsT6W8ZyXM3QKdSymQ==", "cpu": [ "x64" ], @@ -1294,9 +1335,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-arm-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.44.tgz", - "integrity": "sha512-xbP2qQ7/h6ZZKeckCiI2osB5SE5PBfLb4uzIfO1BSTX+9rlBKTqomxDaCib7aPf2X1CXMiIq+i7AK1EhBa5a7A==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.46.tgz", + "integrity": "sha512-biSavMngiyj1kk0BPvAAHm2y6Xw87cXzjfZtPHA0zETz0CwZLz8NLxe3K8ZroEJb1jZUCMhV6SnMR86gB5s8bA==", "cpu": [ "arm" ], @@ -1310,9 +1351,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-arm-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.44.tgz", - "integrity": "sha512-gmXKMCpgkUm5PllGMKBMoBmqgbTQkx+S85eE46LctuwTSKS/K7u65NE6t4zk6cLDvZpV67enycKXBORWn6q7xA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.46.tgz", + "integrity": "sha512-1Tuduchx+rt3xeWnZtLB430UYjP6mY2xhG3lw72q1YrFl9fHEvwzKaA9Uuiq3BkMhz5x5urIpfLV8XAf20Nqgw==", "cpu": [ "arm" ], @@ -1326,9 +1367,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-arm64-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.44.tgz", - "integrity": "sha512-eOoejNUtnHs1/TMn4wryOAG/TarvlOqSZtRPeS56liBKp/GVQSirqTM9AITSGPLSdK1u7fZWMdj5IOEoJp3ruw==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.46.tgz", + "integrity": "sha512-++sIi/yitZHeB3Xav8P88Vh+E53Ej/959FUfPdTElV4FNAwdRsEtxoNw37mASy2gkiwOhEjIIy986FXaKrYTdg==", "cpu": [ "arm64" ], @@ -1342,9 +1383,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-arm64-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.44.tgz", - "integrity": "sha512-xTzrhEMy1mdv5+SbJPPlwqlMrhXGPntE2f12TLi+dNPXhif4iXCGJpoh8pV9nwZFE/cq1ITuTnjIfTFj/PifzA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.46.tgz", + "integrity": "sha512-/UMkxyjjXMX5yq6mk4Z1GdSDYWv3CMNfN2Dv7SdKwKpl6Lwp6aR+RPIiiC+oRAI5PaFrrorJIg3BloU3ss/sLQ==", "cpu": [ "arm64" ], @@ -1358,9 +1399,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-x64-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.44.tgz", - "integrity": "sha512-2bvgIU4P+f4q18grdHoGnt9L6XlAciq/8GWpM06fmwj8qqruS8qwwwZXBk3/0U2+IHGv9pXRR8GtSXzl5n/blg==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.46.tgz", + "integrity": "sha512-/qtlyhxsXWGy1777IJ1RScNp2p+znbR/WJ9ZK5dZRQh0851pdJCPQALuLhEAFdQjfnT8sJPJgB61RPS9Ou6uzQ==", "cpu": [ "x64" ], @@ -1374,9 +1415,9 @@ ] }, "node_modules/@yuku-codegen/binding-linux-x64-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.44.tgz", - "integrity": "sha512-EzX5hWK0MmU4fbqY9coc5PJ0y0LYjrBdAF7mjSyetdK/yWRGBfHi9nh0dUJ0lqb47653hxB8/r9byfYgg6ecbA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.46.tgz", + "integrity": "sha512-9PtrZqSNvsz7UZl5Nbol8TFB6VXMKAVbBdF/CPU/96qt3kFAeNTNO7O4SZERiPr4dDYzf8i9IxmDSoMywJyQHQ==", "cpu": [ "x64" ], @@ -1390,9 +1431,9 @@ ] }, "node_modules/@yuku-codegen/binding-win32-arm64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-arm64/-/binding-win32-arm64-0.5.44.tgz", - "integrity": "sha512-/ajGFWcOLGtmVUdxWKXDW6Ixtez68xxtmd2l95xNg8Lzs4aqbV2cy0Ns2Bzg9vjHsgDIooQlLXHpWh6HsHcy6w==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-arm64/-/binding-win32-arm64-0.5.46.tgz", + "integrity": "sha512-VwW0f6z8NwpvI7DORWL9I5m2p51VF/Cz7FlemTEwMQT4DUWIvGEgqVLChty1+CVgdLros+OIIVmcgWbP1u/u2Q==", "cpu": [ "arm64" ], @@ -1403,9 +1444,9 @@ ] }, "node_modules/@yuku-codegen/binding-win32-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-x64/-/binding-win32-x64-0.5.44.tgz", - "integrity": "sha512-geuJQ7FKI8YUtBgW8w72ChMfMvYy3gSytACxB4HOkylsoutrhH6lUNYHk1ny/p8u8t47NGxktpnzVJzI8IzJkA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-x64/-/binding-win32-x64-0.5.46.tgz", + "integrity": "sha512-4l+eRLvivimYCpgODeyvaVutu7LsBxP9NexAPrTXEG+ttXNF6YcOL+ApYuC6/Jap2ojdm82t8d1wD4ExszLVrA==", "cpu": [ "x64" ], @@ -1416,9 +1457,9 @@ ] }, "node_modules/@yuku-parser/binding-darwin-arm64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.5.44.tgz", - "integrity": "sha512-EXSW5w1YOIMyxu53MFxP43gTDeHlQueOjk8AEI9tuLF5976bDq3MXuIgzQvZKPVAirxGZu8+ANVXH1WcAH1G6A==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.5.46.tgz", + "integrity": "sha512-k8ljigcfWnr+qEgJLBuayjXdTeXdAqS6yo0jITnDKE7zIoq73lmdAKvD5+g8pHXnfoGPzNA7+TH4z/MHwFHD4g==", "cpu": [ "arm64" ], @@ -1429,9 +1470,9 @@ ] }, "node_modules/@yuku-parser/binding-darwin-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-x64/-/binding-darwin-x64-0.5.44.tgz", - "integrity": "sha512-pJBHsKxqR/nPwwaXgkkYTVo3G9dJ/AXhWsYyKyadU1zLg9gGfVwVTMehqwwutMCONDsLqOmEv/UqItmhpVsQJw==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-x64/-/binding-darwin-x64-0.5.46.tgz", + "integrity": "sha512-yGeFK/ac5iWtwQyXIJbyKIFS2kODKZCVUSd/uVxFYT8OiA5KvG1jgq+Ca44ezBG2WrEyc3/IM+4sLwPRkJHp3w==", "cpu": [ "x64" ], @@ -1442,9 +1483,9 @@ ] }, "node_modules/@yuku-parser/binding-freebsd-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.5.44.tgz", - "integrity": "sha512-fOqYX5BQML94uj9hd3a+LlBNz54OoDm6l+wgUIZ8UUkOBfPV+w2lux1jj9FKXT85wwjDOFhgZ/XQYSEDK/N9mA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.5.46.tgz", + "integrity": "sha512-rZ8GTjrfavwS8QzYjv6OuXGWcuHJpyGCRSzDk1nfGr0d8dmdQx6htbTl/vUY8BgkiZftsiZnNeDulKjf4m0M8A==", "cpu": [ "x64" ], @@ -1455,9 +1496,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-arm-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.44.tgz", - "integrity": "sha512-kA2jRNh2cbbHDbhBN9IR8CnYI4UZHNQg0OVz6+V16Ph5VlLYpfv/6GdCmvQQoTGAnhFlbQiRoQys03ey91FTew==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.46.tgz", + "integrity": "sha512-gttOTy0Swirw40+tA5vnmraJ2xqLrY0Hn0VjPT8AIfMwUgKjefT7pvRxI8HTeLCCYHgAaNiud1LQWnvPMgUXiA==", "cpu": [ "arm" ], @@ -1471,9 +1512,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-arm-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.44.tgz", - "integrity": "sha512-TQ82L8c5Lxl3HBOmw0uGfCcsyw0mp7DVGwCuW24OdDWak6BKaumvB8/Ep1llPOvhk5xgSFB7fsqgh6sIwkNRew==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.46.tgz", + "integrity": "sha512-GBH7ASymEaazgC4Zo4LODpgEV4Sn3l8qQq6hTC9B7ftvfZGy8CJx0qtj0zNWH3SpOvjWjTDVVxUjRXVnHRpKDQ==", "cpu": [ "arm" ], @@ -1487,9 +1528,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-arm64-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.44.tgz", - "integrity": "sha512-o6up+m/MsoMEtq6h4JTzmzKOvH9o3o41vK8oiok0LOZoPOFOqOSqC+N5V2ArD1O54m5LUq6ErghAbGWiPsMsqg==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.46.tgz", + "integrity": "sha512-TWwBKtCjny12ef5tAScFYcIyTWG69WAx7I/vTyhQto2yydmotNUwOuViUsmwVex+Ldix05n1Z7naZF/5xTlWzg==", "cpu": [ "arm64" ], @@ -1503,9 +1544,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-arm64-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.44.tgz", - "integrity": "sha512-3XZoiHhtrjWKgk7CJC/sGzk1TE57SDPYzOFXUg6CZrigRZ+c0Q5ItzJpyAvhzlxv5ruNRYiuGvFbaRSIDnp2BA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.46.tgz", + "integrity": "sha512-7VfxvUQKepU6bwG5FX6XLU3cXvw50wePuW+f8cDYOfuTEWGCrirI8NlK6afy+udofAEmjhH82GsrXupOactIfw==", "cpu": [ "arm64" ], @@ -1519,9 +1560,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-x64-gnu": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.44.tgz", - "integrity": "sha512-7KYCySZI6cjsdeiiIwvviDfJFd4Xj5gjNBzm9akUpwxRXNwaHHuEq2yGkVdGqj3BT6dJsiNhJIhtS6k7/HJdFA==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.46.tgz", + "integrity": "sha512-r2ytt3LNpAyBP/s9kvLtPgldkyCXJGZFpteoZK40NaRo55Cfd5KFJRxdekK3mgBnm2gnQnx9qWaOniXUolj/HQ==", "cpu": [ "x64" ], @@ -1535,9 +1576,9 @@ ] }, "node_modules/@yuku-parser/binding-linux-x64-musl": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.44.tgz", - "integrity": "sha512-SLU/nXwOjET2XlOiO984sAzCloiWw0+JdcWpGzXLz3JQWbdiblxWC9cIvB0fCtKdDhX1mIutKNEH+RRRJADYcQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.46.tgz", + "integrity": "sha512-nsE+ajANECHyR09xCVHlXtbNiexSUutzrSb1fhU3JVEfVKIMfsP1LDIWh9w43FG2GRODv3lByuSl1AwnuBj0jA==", "cpu": [ "x64" ], @@ -1551,9 +1592,9 @@ ] }, "node_modules/@yuku-parser/binding-win32-arm64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-arm64/-/binding-win32-arm64-0.5.44.tgz", - "integrity": "sha512-LGmaJtB2mVqPD7Gu/RKAu9aIVxlaKPOgKB8RPHeFFD5Tf/apCiWZix1tkBjdOAo9cVEAoR9qnVHE6zJ+OG0drQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-arm64/-/binding-win32-arm64-0.5.46.tgz", + "integrity": "sha512-/jkn8U4s649vZXxDD+UmfqSB5OM8H9wjPg545q0V0d3Lj0K4CwaUOqvStaBrmxI21NM3WU/mM6xzslFHlJ3fVA==", "cpu": [ "arm64" ], @@ -1564,9 +1605,9 @@ ] }, "node_modules/@yuku-parser/binding-win32-x64": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-x64/-/binding-win32-x64-0.5.44.tgz", - "integrity": "sha512-2i0FTklLuhBIgILvtEQ3IN3J4qaTMKlxptseWNrz4F5mimL9UpQFUniVju9OOInwP2O1vgLdZn8EBjEXGNCHmg==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-x64/-/binding-win32-x64-0.5.46.tgz", + "integrity": "sha512-pZlngLHCrQT1lcQXTW/F+Vld6akOyRiaDjj8TAK9ongNRAEZawencz4X01kLOeWwJWx88Xvz7nT0iBwdY6ZkHA==", "cpu": [ "x64" ], @@ -1633,6 +1674,16 @@ "node": ">=14" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1705,6 +1756,16 @@ "node": ">=18" } }, + "node_modules/comment-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz", + "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1834,9 +1895,9 @@ } }, "node_modules/eslint": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz", - "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -1914,6 +1975,66 @@ "eslint": ">=9.29.0" } }, + "node_modules/eslint-plugin-jsdoc": { + "version": "63.0.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.13.tgz", + "integrity": "sha512-ahG1kWA8jYNwaQJtzJlnF+v4Gb9w5r+WL98gp+L8qjLN9ErpL5sevGuemN+fCYsU3Np27F36KmDc8UPi1ml/dg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.88.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.7", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.1", + "parse-imports-exports": "^0.2.4", + "semver": "^7.8.5", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" + }, + "engines": { + "node": "^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", @@ -2251,6 +2372,23 @@ "dev": true, "license": "MIT" }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2367,6 +2505,16 @@ "dev": true, "license": "MIT" }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", + "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2860,6 +3008,13 @@ "dev": true, "license": "MIT" }, + "node_modules/object-deep-merge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz", + "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==", + "dev": true, + "license": "MIT" + }, "node_modules/obug": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", @@ -2924,6 +3079,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3047,6 +3219,19 @@ ], "license": "MIT" }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -3092,9 +3277,9 @@ } }, "node_modules/rolldown-plugin-dts": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.27.2.tgz", - "integrity": "sha512-BzyD3qqF4DAg12c8QTVia73dXReDcsMsYHPvKxxjCeBolDbVxtYIy+YanF6osBLn5WGp2F43McOSUhxplgEZuQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.27.4.tgz", + "integrity": "sha512-z1uz1gH2sJ55i6JY/xi3q7gsI5CPthefDp5HYXnBlrkN1L3K4tx+gyAQO3Udt69ASWItWKwXJ55nKQq2HCMVfA==", "dev": true, "license": "MIT", "dependencies": { @@ -3201,6 +3386,31 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -3272,6 +3482,23 @@ "node": ">=14.0.0" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -3506,16 +3733,16 @@ } }, "node_modules/vite": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", - "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.5", "postcss": "^8.5.16", - "rolldown": "~1.1.3", + "rolldown": "~1.1.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -3759,49 +3986,49 @@ } }, "node_modules/yuku-codegen": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.5.44.tgz", - "integrity": "sha512-0rhtgWGz+bR3Pe7xqJ5E4VqxI1vqNtkeJRkeXM0Qd3tgldYClQipxa9bRZyuNOOfk0Ri02scrjnkoAHM16/f2g==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.5.46.tgz", + "integrity": "sha512-2qFouFH7ag332HJhqLd3/QGqGQtSIjnTU1/5Y4BTvRWMwR252rezKBtEBHq/s+rwLc7uKoLvbm2BzQzzsJghTQ==", "dev": true, "license": "MIT", "dependencies": { "@yuku-toolchain/types": "0.5.43" }, "optionalDependencies": { - "@yuku-codegen/binding-darwin-arm64": "0.5.44", - "@yuku-codegen/binding-darwin-x64": "0.5.44", - "@yuku-codegen/binding-freebsd-x64": "0.5.44", - "@yuku-codegen/binding-linux-arm-gnu": "0.5.44", - "@yuku-codegen/binding-linux-arm-musl": "0.5.44", - "@yuku-codegen/binding-linux-arm64-gnu": "0.5.44", - "@yuku-codegen/binding-linux-arm64-musl": "0.5.44", - "@yuku-codegen/binding-linux-x64-gnu": "0.5.44", - "@yuku-codegen/binding-linux-x64-musl": "0.5.44", - "@yuku-codegen/binding-win32-arm64": "0.5.44", - "@yuku-codegen/binding-win32-x64": "0.5.44" + "@yuku-codegen/binding-darwin-arm64": "0.5.46", + "@yuku-codegen/binding-darwin-x64": "0.5.46", + "@yuku-codegen/binding-freebsd-x64": "0.5.46", + "@yuku-codegen/binding-linux-arm-gnu": "0.5.46", + "@yuku-codegen/binding-linux-arm-musl": "0.5.46", + "@yuku-codegen/binding-linux-arm64-gnu": "0.5.46", + "@yuku-codegen/binding-linux-arm64-musl": "0.5.46", + "@yuku-codegen/binding-linux-x64-gnu": "0.5.46", + "@yuku-codegen/binding-linux-x64-musl": "0.5.46", + "@yuku-codegen/binding-win32-arm64": "0.5.46", + "@yuku-codegen/binding-win32-x64": "0.5.46" } }, "node_modules/yuku-parser": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.5.44.tgz", - "integrity": "sha512-mAhpQZ/bXjxZmKiGUqEWskC9mZTcTBv6/fdzVdzdjM6XuD1DP3IavdLVWdM39L9ewK9vS9OtJmaKNeWgRzpy0w==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.5.46.tgz", + "integrity": "sha512-eMNzX5eYnkqo6zNYf2H8WHcMPHfIf7ijmw0X8NYZ1ANXAU5Y9rwTB9MgfCuvLxlR7fV/96v3gWa8y/YUGFLxjw==", "dev": true, "license": "MIT", "dependencies": { "@yuku-toolchain/types": "0.5.43" }, "optionalDependencies": { - "@yuku-parser/binding-darwin-arm64": "0.5.44", - "@yuku-parser/binding-darwin-x64": "0.5.44", - "@yuku-parser/binding-freebsd-x64": "0.5.44", - "@yuku-parser/binding-linux-arm-gnu": "0.5.44", - "@yuku-parser/binding-linux-arm-musl": "0.5.44", - "@yuku-parser/binding-linux-arm64-gnu": "0.5.44", - "@yuku-parser/binding-linux-arm64-musl": "0.5.44", - "@yuku-parser/binding-linux-x64-gnu": "0.5.44", - "@yuku-parser/binding-linux-x64-musl": "0.5.44", - "@yuku-parser/binding-win32-arm64": "0.5.44", - "@yuku-parser/binding-win32-x64": "0.5.44" + "@yuku-parser/binding-darwin-arm64": "0.5.46", + "@yuku-parser/binding-darwin-x64": "0.5.46", + "@yuku-parser/binding-freebsd-x64": "0.5.46", + "@yuku-parser/binding-linux-arm-gnu": "0.5.46", + "@yuku-parser/binding-linux-arm-musl": "0.5.46", + "@yuku-parser/binding-linux-arm64-gnu": "0.5.46", + "@yuku-parser/binding-linux-arm64-musl": "0.5.46", + "@yuku-parser/binding-linux-x64-gnu": "0.5.46", + "@yuku-parser/binding-linux-x64-musl": "0.5.46", + "@yuku-parser/binding-win32-arm64": "0.5.46", + "@yuku-parser/binding-win32-x64": "0.5.46" } } } diff --git a/package.json b/package.json index 9758021..1d39dfd 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@vitest/ui": "^4.1.10", "eslint": "^10.6.0", "eslint-plugin-es-x": "^9.7.0", + "eslint-plugin-jsdoc": "^63.0.13", "globals": "^17.7.0", "tsdown": "^0.22.4", "typedoc": "^0.28.20", diff --git a/src/discriminator/discriminated.ts b/src/discriminator/discriminated.ts index ff234e0..cae9060 100644 --- a/src/discriminator/discriminated.ts +++ b/src/discriminator/discriminated.ts @@ -32,8 +32,8 @@ export const discriminatedSchema = Type.Object( * The discriminator value that identifies the type of a {@link Discriminated} object. * This value must be unique across all registered discriminators. * - * @since 0.1.0 * @type {string} + * @since 0.1.0 */ discriminator: Type.Readonly(Type.String()) } diff --git a/src/discriminator/discriminator-registry.ts b/src/discriminator/discriminator-registry.ts index 3a3bf31..66e0383 100644 --- a/src/discriminator/discriminator-registry.ts +++ b/src/discriminator/discriminator-registry.ts @@ -41,9 +41,9 @@ export interface DiscriminatorRegistration { * The discriminator value that identifies the type of a {@link Discriminated} object. * This value must be unique across all registered discriminators. * + * @type {string} * @readonly * @since 0.1.0 - * @type {string} */ readonly discriminator: string; @@ -54,9 +54,9 @@ export interface DiscriminatorRegistration { * * @returns {boolean} - `true` if the input matches the type associated with the discriminator, `false` otherwise. * + * @type {(input: unknown) => boolean} * @readonly * @since 0.1.0 - * @type {(input: unknown) => boolean} */ readonly validator: (input: unknown) => boolean; } @@ -72,13 +72,15 @@ export class DiscriminatorRegistry { /** * A map of discriminator values to their corresponding validation functions. * + * @type {Map boolean>} * @readonly * @private - * @type {Map boolean>} */ static readonly #discriminators: Map boolean> = new Map boolean>(); /** + * Private constructor. + * * @throws {Error} DiscriminatorRegistry is a static class and cannot be instantiated. * * @private @@ -91,6 +93,7 @@ export class DiscriminatorRegistry { * Checks if a discriminator is already registered. * * @param {string} discriminator - The discriminator value to check. + * * @returns {boolean} - `true` if the discriminator is registered, `false` otherwise. * * @public @@ -104,6 +107,7 @@ export class DiscriminatorRegistry { * Registers a new discriminator and its associated validation function. * * @param {DiscriminatorRegistration} registration - The registration details for the discriminator. + * * @returns {TypeGuard} - A type guard function for the registered type. * * @throws {TypeError} If the given input is not an object. diff --git a/src/number/number-utility.ts b/src/number/number-utility.ts index 5b385a2..58b255c 100644 --- a/src/number/number-utility.ts +++ b/src/number/number-utility.ts @@ -25,6 +25,8 @@ */ export class NumberUtility { /** + * Private constructor. + * * @throws {Error} - NumberUtility is a static class and cannot be instantiated. * * @private @@ -36,7 +38,7 @@ export class NumberUtility { /** * Is the given input a finite number? * - * @param {unknown} input + * @param {unknown} input - The input to check. * * @returns {input is number} `true` when the input is a finite number; `false` otherwise. * @@ -50,7 +52,7 @@ export class NumberUtility { /** * Is the given input an integer? * - * @param {unknown} input + * @param {unknown} input - The input to check. * * @returns {input is number} `true` when the input is an integer; `false` otherwise. * @@ -64,7 +66,7 @@ export class NumberUtility { /** * Is the given input a positive integer? * - * @param {unknown} input + * @param {unknown} input - The input to check. * @param {boolean} zeroInclusive - `true` if zero should be considered a valid input. * `false` if zero should be considered an invalid input. * Default value is `false`. diff --git a/src/random/random.ts b/src/random/random.ts index e2c8df4..9147fee 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -40,6 +40,8 @@ export class Random { static #rng: () => number = Math.random; /** + * Private constructor. + * * @throws {Error} - Random is a static class and cannot be instantiated. * * @private @@ -69,6 +71,8 @@ export class Random { } /** + * Get a random number. + * * @returns {number} A random number in the range [0, 1) (zero inclusive, one exclusive). * * @public @@ -79,6 +83,8 @@ export class Random { } /** + * Get a random floating-point number within the given range. + * * @param {number} min - The minimum value (inclusive). * @param {number} max - The maximum value (exclusive). * @@ -97,6 +103,7 @@ export class Random { } /** + * Get a random integer within the given range. * If `min` or `max` is not an integer, it is rounded down with `Math.floor` before a value is generated. * * @param {number} min - The minimum value (inclusive). @@ -121,6 +128,7 @@ export class Random { } /** + * Get a random integer within the given range. * If `min` or `max` is not an integer, it is rounded down with `Math.floor` before a value is generated. * * @see {@link Random.randomInt} @@ -144,6 +152,8 @@ export class Random { } /** + * Get a random boolean. + * * @param {number} chanceOfTrue - The probability of returning `true` (between 0 and 1). * Default value is `0.5`. * @@ -158,6 +168,8 @@ export class Random { } /** + * Get a random element from the given array. + * * @param {Type[]} elements - An array of elements to choose from. * * @returns {Type} A random element from the array. @@ -171,6 +183,8 @@ export class Random { } /** + * Get a random element from the given {@link WeightedList}. + * * @see {@link WeightedElementUtility.isGenericWeightedList} * @see {@link WeightedElementUtility.isGenericWeightedElement} * @@ -207,6 +221,8 @@ export class Random { * @param {unknown} min - Minimum value to validate. Should be a finite number less than or equal to the given max. * @param {unknown} max - Maximum value to validate. Should be a finite number greater than or equal to the given min. * + * @returns {void} + * * @throws {TypeError} - When the given min is not a finite number. * @throws {TypeError} - When the given max is not a finite number. * @throws {RangeError} - When the given min is not less than or equal to the given max. @@ -230,7 +246,9 @@ export class Random { /** * Validate chanceOfTrue input for random boolean generation. * - * @param {unknown} chanceOfTrue - Chance of returning true. Should be a finite number between 0 and 1 (inclusive). + * @param {unknown} chanceOfTrue - Chance of returning `true`. Should be a finite number between 0 and 1 (inclusive). + * + * @returns {void} * * @throws {TypeError} - When the given chanceOfTrue is not a finite number. * @throws {RangeError} - When the given chanceOfTrue is not between 0 and 1 (inclusive). @@ -252,6 +270,8 @@ export class Random { * * @param {unknown} elements - Elements to select from. Should be a non-empty array. * + * @returns {void} + * * @throws {TypeError} - When the given elements is not a non-empty array. * * @private diff --git a/src/random/seeded-random/random-number-generator-factory.ts b/src/random/seeded-random/random-number-generator-factory.ts index 2ce6f76..dd9b0cf 100644 --- a/src/random/seeded-random/random-number-generator-factory.ts +++ b/src/random/seeded-random/random-number-generator-factory.ts @@ -36,6 +36,8 @@ const textEncoder: TextEncoder = new TextEncoder(); */ export class RandomNumberGeneratorFactory { /** + * Private constructor. + * * @throws {Error} - RandomNumberGeneratorFactory is a static class and cannot be instantiated. * * @private @@ -68,7 +70,7 @@ export class RandomNumberGeneratorFactory { * @param {number|undefined} version - The {@link SeedVersions} index to use for selecting the offsets for hashing. * Changing the version number will result in a different sequence of random numbers for the same seed and namespace. * - * @returns {SeededRandomNumberGenerator} + * @returns {SeededRandomNumberGenerator} - A {@link SeededRandomNumberGenerator} object with the resulting initial state. * * @throws {TypeError} - When the given seed is not a string. * @throws {TypeError} - When the given namespace is not a string. @@ -94,7 +96,7 @@ export class RandomNumberGeneratorFactory { * @param {string} seed - The primary input to determine the random number sequence. * @param {string|undefined} namespace - Namespace to create different sequences from the same seed. * - * @returns {Promise} + * @returns {Promise} - A {@link SeededRandomNumberGenerator} object with the resulting initial state. * * @throws {TypeError} - When the given seed is not a string. * @throws {TypeError} - When the given namespace is not a string. @@ -121,6 +123,8 @@ export class RandomNumberGeneratorFactory { * @param {unknown} version - Version to validate. * Should be undefined or an integer that is also a valid {@link SeedVersions} index. * + * @returns {void} + * * @throws {TypeError} - When the given seed is not a string. * @throws {TypeError} - When the given namespace is not a string. * @throws {TypeError} - When the given version is not an integer. @@ -149,10 +153,10 @@ export class RandomNumberGeneratorFactory { /** * Build the hash algorithm input string from the given seed and namespace. * - * @param {string} seed + * @param {string} seed - The primary input to determine the random number sequence. * @param {string|undefined} namespace - Optional namespace to create different sequences from the same seed. * - * @returns {string} + * @returns {string} - The input string for the hash algorithm. * * @private */ @@ -176,7 +180,7 @@ export class RandomNumberGeneratorFactory { * Changing the version number will result in a different sequence of random numbers for the same input. * Default value is 0. * - * @returns {[number, number, number, number]} + * @returns {[number, number, number, number]} - The initial state array for the random number generator. * * @throws {TypeError} - When the given input is not a string. * @throws {TypeError} - When the given version is not an integer. @@ -213,7 +217,7 @@ export class RandomNumberGeneratorFactory { * * @param {string} input - Input to be hashed and converted into the initial state of the random number generator. * - * @returns {[number, number, number, number]} + * @returns {Promise<[number, number, number, number]>} - The initial state array for the random number generator. * * @throws {TypeError} - When the given input is not a string. * diff --git a/src/random/seeded-random/seed-versions.ts b/src/random/seeded-random/seed-versions.ts index 977c38f..c2ceded 100644 --- a/src/random/seeded-random/seed-versions.ts +++ b/src/random/seeded-random/seed-versions.ts @@ -62,6 +62,8 @@ const seedVersions: readonly SeedVersion[] = [ */ export class SeedVersions { /** + * Private constructor. + * * @throws {Error} - SeedVersions is a static class and cannot be instantiated. * * @private @@ -71,6 +73,8 @@ export class SeedVersions { } /** + * The number of seed versions. + * * @returns {number} - The total number of seed versions that currently exist. * * @public @@ -85,7 +89,7 @@ export class SeedVersions { * * @param {number} index - The index to check. * - * @returns {boolean} + * @returns {boolean} - `true` if the given index is a valid seed version; `false` otherwise. * * @public * @since 0.1.0 @@ -95,6 +99,8 @@ export class SeedVersions { } /** + * Get a {@link SeedVersion} object. + * * @param {number} index - The index of the seed version to retrieve. * Must be a valid {@link SeedVersions} index. * diff --git a/src/random/seeded-random/seeded-random-number-generator.ts b/src/random/seeded-random/seeded-random-number-generator.ts index 327fbba..89df1ac 100644 --- a/src/random/seeded-random/seeded-random-number-generator.ts +++ b/src/random/seeded-random/seeded-random-number-generator.ts @@ -30,13 +30,15 @@ export class SeededRandomNumberGenerator { /** * Internal xoshiro128** state (4 x 32-bit unsigned integers). * - * @private - * @readonly * @type {[number, number, number, number]} + * @readonly + * @private */ readonly #state: [number, number, number, number]; /** + * {@link SeededRandomNumberGenerator} constructor. + * * @param {[number, number, number, number]} state - Initial 128-bit state. * Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0. * @@ -53,6 +55,8 @@ export class SeededRandomNumberGenerator { } /** + * Get the next number in the seeded sequence. + * * @remarks This method advances the internal 128-bit xoshiro128** state by one step. * Successive calls produce an independent, uniformly distributed sequence. * @@ -84,7 +88,7 @@ export class SeededRandomNumberGenerator { * @param {number} x - The number to rotate. Must be a 32-bit unsigned integer. * @param {number} k - The number of bits to rotate. * - * @returns {number} + * @returns {number} - The rotated 32-bit unsigned integer. * * @private */ @@ -106,7 +110,9 @@ export class SeededRandomNumberGenerator { /** * Validate that state is an array with 4 32-bit unsigned integers, where at least one element is greater than 0. * - * @param {[number, number, number, number]} state - The state to validate. + * @param {number[]} state - The state to validate. + * + * @returns {void} * * @throws {TypeError} If state is not an array with 4 elements. * @throws {RangeError} If each element of state is not a 32-bit unsigned integer diff --git a/src/random/weighted-element/weighted-element-utility.ts b/src/random/weighted-element/weighted-element-utility.ts index f903226..e16af9f 100644 --- a/src/random/weighted-element/weighted-element-utility.ts +++ b/src/random/weighted-element/weighted-element-utility.ts @@ -33,6 +33,8 @@ import { WeightedElement, WeightedList, weightedElementSchema } from './weighted */ export class WeightedElementUtility { /** + * Private constructor. + * * @throws {Error} - WeightedElementUtility is a static class and cannot be instantiated. * * @private @@ -64,6 +66,8 @@ export class WeightedElementUtility { * @see {@link WeightedElementUtility.isGenericWeightedElement} * * @param {{ value: TValue; weight: number; }} input - The input to build the {@link WeightedElement} from. + * @param {TValue} input.value - The value to be selected from the weighted list. + * @param {number} input.weight - The probability weight of the element. Should be a number between 0 and 1, inclusive. * * @returns {WeightedElement} A {@link WeightedElement} object with a value of the given type. * diff --git a/src/random/weighted-element/weighted-element.ts b/src/random/weighted-element/weighted-element.ts index 9d365f4..edd258f 100644 --- a/src/random/weighted-element/weighted-element.ts +++ b/src/random/weighted-element/weighted-element.ts @@ -44,8 +44,8 @@ export const weightedElementSchema = Type.Generic( * The probability weight of the element. * Should be a number between 0 and 1, inclusive. * - * @readonly * @type {number} + * @readonly */ weight: Type.Readonly(Type.Number({ minimum: 0, @@ -55,8 +55,8 @@ export const weightedElementSchema = Type.Generic( /** * The discriminator for the weighted element. * - * @readonly * @type {Discriminators.WeightedElement} + * @readonly */ discriminator: Type.Literal(Discriminators.WeightedElement) }, @@ -83,18 +83,18 @@ export interface WeightedElement { * The probability weight of the element. * Should be a number between 0 and 1, inclusive. * + * @type {number} * @readonly * @since 0.1.0 - * @type {number} */ readonly weight: number; /** * The discriminator for the weighted element. * + * @type {Discriminators.WeightedElement} * @readonly * @since 0.1.0 - * @type {Discriminators.WeightedElement} */ readonly discriminator: Discriminators.WeightedElement; } diff --git a/src/string/color-string-utility.ts b/src/string/color-string-utility.ts index 48604e6..75f71a6 100644 --- a/src/string/color-string-utility.ts +++ b/src/string/color-string-utility.ts @@ -33,6 +33,8 @@ const regularExpressions = { */ export class ColorStringUtility { /** + * Private constructor. + * * @throws {Error} - ColorStringUtility is a static class and cannot be instantiated. * * @private @@ -42,6 +44,8 @@ export class ColorStringUtility { } /** + * Get the regular expression for hex colors. + * * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBB` or `#RRGGBBAA`. * Case must be consistent in hex color strings: either all lowercase or all uppercase. * @@ -53,6 +57,8 @@ export class ColorStringUtility { } /** + * Get the regular expression for hex colors in RGB format. + * * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBB`. * Case must be consistent in hex color strings: either all lowercase or all uppercase. * @@ -64,6 +70,8 @@ export class ColorStringUtility { } /** + * Get the regular expression for hex colors in RGBA format. + * * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBBAA`. * Case must be consistent in hex color strings: either all lowercase or all uppercase. * @@ -77,7 +85,7 @@ export class ColorStringUtility { /** * Is the given input a string matching the {@link ColorStringUtility.hexColorPattern} pattern? * - * @param {unknown} input + * @param {unknown} input - The input to check. * * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPattern} pattern; `false` otherwise. * @@ -91,7 +99,7 @@ export class ColorStringUtility { /** * Is the given input a string matching the {@link ColorStringUtility.hexColorPatternRGB} pattern? * - * @param {unknown} input + * @param {unknown} input - The input to check. * * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPatternRGB} pattern; `false` otherwise. * @@ -105,7 +113,7 @@ export class ColorStringUtility { /** * Is the given input a string matching the {@link ColorStringUtility.hexColorPatternRGBA} pattern? * - * @param {unknown} input + * @param {unknown} input - The input to check. * * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPatternRGBA} pattern; `false` otherwise. * diff --git a/src/string/string-utility.ts b/src/string/string-utility.ts index 33e91fe..ad8b219 100644 --- a/src/string/string-utility.ts +++ b/src/string/string-utility.ts @@ -31,6 +31,8 @@ const regularExpressions = { */ export class StringUtility { /** + * Private constructor. + * * @throws {Error} - StringUtility is a static class and cannot be instantiated. * * @private @@ -40,6 +42,8 @@ export class StringUtility { } /** + * Get the regular expression for single-line lowercase strings. + * * @remarks This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string. * * @returns {RegExp} Regular expression pattern for validating single-line lowercase strings. @@ -52,6 +56,8 @@ export class StringUtility { } /** + * Get the regular expression for single-line uppercase strings. + * * @remarks This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string. * * @returns {RegExp} Regular expression pattern for validating single-line uppercase strings. @@ -64,6 +70,8 @@ export class StringUtility { } /** + * Get the regular expression for single-line mixed-case strings. + * * @remarks This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string. * * @returns {RegExp} Regular expression pattern for validating single-line mixed-case strings. @@ -78,9 +86,9 @@ export class StringUtility { /** * Is the given input a string? * - * @param {unknown} input + * @param {unknown} input - The input to check. * - * @returns {input is string} + * @returns {input is string} - `true` if the given input is a string; `false` otherwise. * * @public * @since 0.1.0 @@ -93,9 +101,9 @@ export class StringUtility { * Is the given input a non-empty string? * Non-empty strings must contain at least one non-whitespace character. * - * @param {unknown} input + * @param {unknown} input - The input to check. * - * @returns {input is string} + * @returns {input is string} - `true` if the given input is a non-empty string; `false` otherwise. * * @public * @since 0.1.0 @@ -109,9 +117,9 @@ export class StringUtility { * * @see {@link StringUtility.singleLineLowercaseTrimmedPattern} * - * @param {unknown} input + * @param {unknown} input - The input to check. * - * @returns {input is string} + * @returns {input is string} - `true` if the given input is a single-line lowercase string that is trimmed; `false` otherwise. * * @public * @since 0.1.0 @@ -125,9 +133,9 @@ export class StringUtility { * * @see {@link StringUtility.singleLineUppercaseTrimmedPattern} * - * @param {unknown} input + * @param {unknown} input - The input to check. * - * @returns {input is string} + * @returns {input is string} - `true` if the given input is a single-line uppercase string that is trimmed; `false` otherwise. * * @public * @since 0.1.0 @@ -141,9 +149,9 @@ export class StringUtility { * * @see {@link StringUtility.singleLineTrimmedPattern} * - * @param {unknown} input + * @param {unknown} input - The input to check. * - * @returns {input is string} + * @returns {input is string} - `true` if the given input is a single-line string that is trimmed; `false` otherwise. * * @public * @since 0.1.0