From 6f2bca352c8042d6ea4b235d52c339ae30da0d56 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 16 Apr 2025 08:59:27 +0000 Subject: [PATCH 01/16] Initial commit for the issue #61 From 5b294568067c3d8760ef036a1c12bcc427c27c26 Mon Sep 17 00:00:00 2001 From: amirahosbr Date: Wed, 16 Apr 2025 18:04:50 +0800 Subject: [PATCH 02/16] fix few typos and inconsistencies --- doc/development-guide.md | 6 +++--- doc/on-boarding.md | 2 +- doc/predefining-non-functional-requirements.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/development-guide.md b/doc/development-guide.md index b88452b..a5becbf 100644 --- a/doc/development-guide.md +++ b/doc/development-guide.md @@ -8,7 +8,7 @@ In this page, you will find the standard development policy and workflow in OSBR ### 1-1. Setup Your Machine -Following checklist is all mandatory by our security policy: +The following checklist is all mandatory by our security policy: * Use company-provided laptop or company-approved personal device. * Sleep mode activation within 5 minutes, mandatory reauthentication after sleep mode. @@ -148,8 +148,8 @@ The following GitHub Actions are pre-configured in each repository. | --- | ---- | ----------- | | 1 | `start-pull-request` | Create a pull request by assigning a developer to the issue. | | 2 | `prepare-release` | Prepare a release pull request merging main to release. | -| 3 | `run-tests` | Skelton action which is supposed to run tests. | -| 4 | `release` | Skelton action which is supposed to deploy and publish release note. | +| 3 | `run-tests` | Skeleton action which is supposed to run tests. | +| 4 | `release` | Skeleton action which is supposed to deploy and publish release note. | #### Status diff --git a/doc/on-boarding.md b/doc/on-boarding.md index cbc8e29..0ed0dd0 100644 --- a/doc/on-boarding.md +++ b/doc/on-boarding.md @@ -85,7 +85,7 @@ To subscribe to a holiday calendar on macOS: 4. And follow the prompts to name the calendar, choose an account, and set update frequency. ::: info NOTE -You can use your preffered calendar app such as Google Calendar. +You can use your preferred calendar app such as Google Calendar. ::: ## 2. First Week diff --git a/doc/predefining-non-functional-requirements.md b/doc/predefining-non-functional-requirements.md index f5d5e9c..1518f24 100644 --- a/doc/predefining-non-functional-requirements.md +++ b/doc/predefining-non-functional-requirements.md @@ -1,6 +1,6 @@ # Non-functional Requirements -In the development process, it is necessary to define non-functional and functional requirements. Functional requirements are deep rooted in the specific things that a system needs to be able to do. What about non-functional requirements? (NFRs) +In the development process, it is necessary to define non-functional and functional requirements. Functional requirements are deep-rooted in the specific things that a system needs to be able to do. What about non-functional requirements? (NFRs) [[TOC]] @@ -81,7 +81,7 @@ Focuses on how well the system can handle growth. ### 2-7. Compliance -The system should adheres to laws, regulations, and industry standards. +The system should adhere to laws, regulations, and industry standards. #### Examples: From 8803297071dfec95eb78dfafe258fd8656c61ec6 Mon Sep 17 00:00:00 2001 From: sn0wm1ku Date: Thu, 9 Jul 2026 14:18:01 +0900 Subject: [PATCH 03/16] Add Coding Style Guide (TypeScript, Go, Python) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language-agnostic Style Guide plus per-language guides for TypeScript, Go, and Python, in policy register (RFC 2119). Lead principle: Zero Runtime Errors; followed by Functional Style, Design Principles & Separation of Responsibilities (SRP, Separation of Concerns, Clean Architecture Dependency Rule, functional Dependency Inversion, Ports & Adapters, CQS/CQRS), KISS/YAGNI, Error Handling, and Formatting & Tooling. Each rule is tagged 🌎 industry-standard or 🏠 house-rule and cites an authoritative source (deep-research verified: Google TS/Python, Airbnb, PEP 8/484, Effective Go, Uber Go, tsconfig strict, Ruff, Martin, Cockburn, Dijkstra, Evans, Fowler, Bernhardt, Seemann). Divergences (TS/Python Result types & no-classes, Python mandatory hints) are flagged as deliberate house rules. Filed under the handbook's Development Guide (nested Style Guide), following the industry convention (Google/Airbnb/GitLab) of treating style guides as guides. Co-Authored-By: Claude Opus 4.8 (1M context) --- doc/.vitepress/config.mts | 18 +++- doc/style-guide-golang.md | 55 ++++++++++ doc/style-guide-python.md | 53 ++++++++++ doc/style-guide-typescript.md | 93 +++++++++++++++++ doc/style-guide.md | 187 ++++++++++++++++++++++++++++++++++ 5 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 doc/style-guide-golang.md create mode 100644 doc/style-guide-python.md create mode 100644 doc/style-guide-typescript.md create mode 100644 doc/style-guide.md diff --git a/doc/.vitepress/config.mts b/doc/.vitepress/config.mts index 3b3b155..2216437 100644 --- a/doc/.vitepress/config.mts +++ b/doc/.vitepress/config.mts @@ -59,7 +59,23 @@ export default defineConfig({ text: "Guideline", items: [ { text: "On-boarding Guide", link: "/on-boarding" }, - { text: "Development Guide", link: "/development-guide" }, + { + text: "Development Guide", + link: "/development-guide", + collapsed: false, + items: [ + { + text: "Style Guide", + link: "/style-guide", + collapsed: true, + items: [ + { text: "TypeScript", link: "/style-guide-typescript" }, + { text: "Golang", link: "/style-guide-golang" }, + { text: "Python", link: "/style-guide-python" }, + ], + }, + ], + }, { text: "Non-functional Requirements", link: "/predefining-non-functional-requirements", diff --git a/doc/style-guide-golang.md b/doc/style-guide-golang.md new file mode 100644 index 0000000..4509e5b --- /dev/null +++ b/doc/style-guide-golang.md @@ -0,0 +1,55 @@ +# Golang Style Guide + +Per-language policy for Go. Shared rules: the +[Coding Style Guide](/style-guide). Requirement levels follow +RFC 2119; tags 🌎 / 🏠 are defined there. + +[[TOC]] + +## 1. Formatting 🌎 + +* Code MUST be formatted with `gofmt`. A `gofmt` diff MUST block review. +* Code MUST follow [Effective Go](https://go.dev/doc/effective_go) and + [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments). + +## 2. Error Handling 🌎 + +* Functions MUST return `error`; callers MUST handle it at the call site: + + ```go + v, err := doThing() + if err != nil { + return fmt.Errorf("doThing: %w", err) + } + ``` + +* Errors MUST be wrapped with `%w` to add context. Errors MUST NOT be discarded + with `_`. +* `panic` MUST NOT be used for normal error handling. +* `panic` MAY be used for unrecoverable bugs or program init, but MUST NOT cross + a package boundary — convert it to an `error` first. + +*Rationale: errors-as-values is mandated by Go (Go Code Review Comments, Uber, +Effective Go). Go's `error` return is the idiomatic +[**Result (Either)**](/technical-glossary#result-either).* + +## 3. Mutation 🌎 *(scoped)* + +* Mutable global state MUST be avoided; use dependency injection. +* Slices and maps MUST be copied at API boundaries to avoid aliasing. + +*Note: Go idiom permits local mutation; the constraint is on globals and +boundary aliasing.* + +## 4. Interfaces + +* Interfaces SHOULD be small and defined by the consumer. An interface with a + single implementation MUST NOT be exported. + +## References + +* Go Code Review Comments — +* Effective Go — +* Go: Defer, Panic, and Recover — +* Go Wiki: PanicAndRecover — +* Uber Go Style Guide — diff --git a/doc/style-guide-python.md b/doc/style-guide-python.md new file mode 100644 index 0000000..b3fc0a3 --- /dev/null +++ b/doc/style-guide-python.md @@ -0,0 +1,53 @@ +# Python Style Guide + +Per-language policy for Python. Shared rules: the +[Coding Style Guide](/style-guide). Requirement levels follow +RFC 2119; tags 🌎 / 🏠 are defined there. + +[[TOC]] + +## 1. Formatting & Linting 🌎 + +* Code MUST be formatted and linted with [Ruff](https://docs.astral.sh/ruff/) + (Black-compatible). Editors MUST format on save. +* Code MUST follow [PEP 8](https://peps.python.org/pep-0008/). + +*Note: Ruff replaces Flake8 + Black + isort in one tool; a project MAY run Black +directly instead.* + +## 2. Type Hints 🏠 + +* Function signatures MUST carry type hints. +* Type hints MUST be enforced by [mypy](https://mypy.readthedocs.io/) or pyright + in CI. + +*Rationale: stricter than PEP 484, which says hints will never be mandatory; the +language does not check them at runtime.* + +## 3. Functional Style 🏠 + +* Plain functions, frozen `dataclasses` (a + [**Value Object**](/technical-glossary#value-object)), and immutable data MUST + be preferred over stateful classes. +* The core MUST be free of [**Side Effect**](/technical-glossary#side-effect)s. +* Comprehensions and generator expressions SHOULD be preferred over manual + accumulation loops where they stay readable. + +## 4. Error Handling 🏠 + +* Expected failures SHOULD be modelled as return values where it aids clarity. +* `raise` MUST be reserved for programmer bugs and broken invariants; exceptions + MUST be caught at the IO boundary. +* Bare `except:` MUST NOT be used; catch specific exceptions and chain with + `raise X from Y` (PEP 8). + +*Rationale: divergent from Python's EAFP idiom, where exceptions are the standard +error-handling mechanism.* + +## References + +* PEP 8 — +* PEP 484 (Type Hints) — +* Google Python Style Guide — +* Python tutorial, Errors and Exceptions — +* Ruff — diff --git a/doc/style-guide-typescript.md b/doc/style-guide-typescript.md new file mode 100644 index 0000000..03430e9 --- /dev/null +++ b/doc/style-guide-typescript.md @@ -0,0 +1,93 @@ +# TypeScript Style Guide + +Per-language policy for TypeScript. Shared rules: the +[Coding Style Guide](/style-guide). Requirement levels follow +RFC 2119; tags 🌎 / 🏠 are defined there. + +[[TOC]] + +## 1. Formatting 🌎 + +* Code MUST be formatted with Prettier. Editors MUST format on save. + +*Note: Prettier is used by Google's `gts`. [Biome](https://biomejs.dev/) is a +rising 2026 alternative; Prettier remains the default.* + +## 2. Type Safety 🌎 + +* `tsconfig` MUST enable `strict`. Implicit `any` MUST NOT be used. +* `type` aliases and discriminated unions SHOULD be preferred over `class` + hierarchies (§5). +* A [**Brand Type**](/technical-glossary#brand-type) MUST be used to give + [**Nominal Typing**](/technical-glossary#nominal-typing) where two structurally + identical types must not be interchangeable (e.g. `UserId` vs `OrderId`). + +## 3. Immutability 🏠 + +* Variables MUST be declared `const`. `let` MAY be used only where reassignment + is required. `var` MUST NOT be used. 🌎 +* Data types MUST be deeply `readonly` (`readonly` members, `ReadonlyArray`, + `Readonly`, `as const` for literals). A mutable type MUST be used only where + in-place mutation is intended. +* Function parameters MUST NOT be mutated; spread SHOULD be preferred over + `Object.assign`. +* Immutability MUST be enforced by + [`eslint-plugin-functional`](https://github.com/eslint-functional/eslint-plugin-functional). + +*Rationale: `const` prevents rebinding only, not content mutation. Deep +`readonly` is stricter than Google/Airbnb.* + +## 4. Total Types 🏠 + +* Own types MUST NOT use `undefined`. +* Domain and application types MUST NOT signal absence with `undefined` or a bare + `null` — use [**Option (Maybe)**](/technical-glossary#option-maybe). Optional + properties (`x?: T`) and `T | undefined` unions MUST NOT mean "maybe absent." +* Functions MUST return `T` or `Option`, never `T | undefined`. +* `null` MAY appear at the boundary (DB rows, JSON, the DOM, `Map.get`, + third-party APIs). It MUST be converted to `Option` in the adapter before + entering the domain. +* `tsconfig` MUST enable `strictNullChecks` and `noUncheckedIndexedAccess`. + +*Rationale: `null` is a defined value and the DB-native representation of +absence; `undefined` is accidental "not set." Divergent from Google, which +treats `undefined` as normal; not a language-wide ban.* + +## 5. Classes 🏠 + +* `class` MUST NOT be used in project code; prefer functions, plain data, and + closures. +* Classes MAY be used where a framework or library requires them. + +*Rationale: divergent from mainstream — classes are first-class in TypeScript; +Google discourages only static-only namespacing classes.* + +## 6. Error Handling 🏠 + +* The error channel MUST be modelled as a + [**Result (Either)**](/technical-glossary#result-either): + + ```ts + type Result = + | { ok: true; value: T } + | { ok: false; error: E[] }; + ``` + +* The `Result` union SHOULD be hand-rolled (KISS / YAGNI). + [`neverthrow`](https://github.com/supermacro/neverthrow) MAY be adopted only + where its combinators (`map` / `andThen` / `mapErr` / `ResultAsync`) are needed + at scale. +* IO / `fetch` / DB calls MUST be wrapped at the boundary and return a `Result`; + the core MUST stay pure. + +*Rationale: divergent from Google's TS guide, which prefers throwing exceptions.* + +## References + +* Google TypeScript Style Guide — +* TypeScript Handbook, Classes — +* `tsconfig` `strict` reference — +* Airbnb JavaScript Style Guide — +* Google `gts` — +* `eslint-plugin-functional` — +* Biome — diff --git a/doc/style-guide.md b/doc/style-guide.md new file mode 100644 index 0000000..4913f42 --- /dev/null +++ b/doc/style-guide.md @@ -0,0 +1,187 @@ +# Coding Style Guide + +Language-agnostic coding policy for OSBR repositories. Per-language policy: + +* [TypeScript Style Guide](/style-guide-typescript) +* [Golang Style Guide](/style-guide-golang) +* [Python Style Guide](/style-guide-python) + +Requirement levels follow RFC 2119 (MUST / MUST NOT / SHOULD / MAY). Terms in +**bold links** are defined in the [Technical Glossary](/technical-glossary). + +Each rule is tagged 🌎 (**Industry standard** — backed by an official or widely +adopted source) or 🏠 (**OSBR house rule** — deliberately stricter than, or +divergent from, mainstream practice). Sources are listed under References. + +[[TOC]] + +## 1. Correctness by Construction — Zero Runtime Errors 🏠 + +Eliminating runtime errors is the goal every rule below serves. + +* Avoidable errors MUST be moved to compile time. Illegal states MUST be made + unrepresentable through the type system (strict types, total types, + discriminated unions, [**Brand Type**](/technical-glossary#brand-type)s) rather + than guarded at runtime. +* Code MUST NOT fail at runtime for a condition the types could have rejected: + no `any` escape hatch, no unchecked `null` / `undefined`, no unvalidated + external input reaching the core. +* Unavoidable failures (IO, network, DB, external input) MUST be handled + explicitly as values ([**Result (Either)**](/technical-glossary#result-either) / + [**Option (Maybe)**](/technical-glossary#option-maybe), §5) and MUST NOT be + left to throw uncaught. + +*Rationale: literal zero runtime errors is impossible — external systems fail. +The policy is to make every avoidable error a compile error and every +unavoidable one an explicit, handled value. The strict-typing, total-type, and +error-handling rules below are the mechanism.* + +## 2. Functional Style 🏠 + +* Project code MUST NOT use classes. Prefer functions, plain data, and + composition. +* Project code MUST NOT mutate data in place. +* Functions MUST be free of [**Side Effect**](/technical-glossary#side-effect)s; + IO MUST be pushed to the boundary (§3-5, §5). +* Dependencies SHOULD be inverted by passing behaviour as a + [**Higher Order Function**](/technical-glossary#higher-order-function), not by + hard-wiring a concretion. +* Classes and mutation MAY be used inside external libraries, or at framework + boundaries that require them (e.g. React error boundaries, ORM entities). + +*Rationale: stricter than mainstream, which permits classes and limits +immutability to the binding level.* + +## 3. Design Principles & Separation of Responsibilities + +These rules apply the handbook's +[**Clean Architecture**](/technical-glossary#clean-architecture), +[**DiP**](/technical-glossary#dip-dependency-inversion-principle), +[**DI**](/technical-glossary#di-dependency-injection), and +[**Ubiquitous Language**](/technical-glossary#ubiquitous-language) commitments. +SOLID is stated paradigm-neutrally; Robert C. Martin restates it without +reference to classes. + +### 3-1. Single Responsibility 🌎 + +* A module MUST have one reason to change — one *actor* (person or business + function). Group code that changes for the same reason; separate code that + changes for different reasons. +* The rule applies to functions and modules, not only classes. + +*Rationale: SRP is a cohesion rule, not "do one thing." The function-cohesion +reading is the functional community's.* + +### 3-2. Separation of Concerns 🌎 + +* Each concern — domain rules, application orchestration, IO, presentation — + MUST live in its own module. + +*Rationale: the term originates with Dijkstra (EWD447, 1974).* + +### 3-3. The Dependency Rule 🌎 + +* Source-code dependencies MUST point inward only. An inner layer MUST NOT know + anything about an outer layer. +* **Domain (Entities)** — enterprise-wide business rules. MUST be pure: no + [**Side Effect**](/technical-glossary#side-effect), no IO; built from + [**Value Object**](/technical-glossary#value-object)s named in the + [**Ubiquitous Language**](/technical-glossary#ubiquitous-language). +* **Application (Use Cases)** — application-specific rules orchestrating the + domain. +* **Infrastructure** — UI, DB, frameworks; outermost and replaceable. +* The Domain MUST NOT import from Application or Infrastructure — Domain-Driven + Design concentrates domain-model code in one isolated layer (Evans). + +*Rationale: an entity "can be a set of data structures and functions" (Martin), +so a pure functional domain is in scope; the layer count is an example, not a +mandate.* + +### 3-4. Dependency Inversion 🌎 *(functional mapping is community practice)* + +* High-level modules MUST depend on abstractions, not concretions + ([**DiP**](/technical-glossary#dip-dependency-inversion-principle)). +* In no-classes code, dependencies MUST be inverted by passing functions inward: + the inner layer declares the signature it needs; an outer layer supplies it + ([**Higher Order Function**](/technical-glossary#higher-order-function) / + [**DI**](/technical-glossary#di-dependency-injection)). +* A port with several operations SHOULD be a record of functions, not a + multi-method interface. + +*Rationale: the function mapping is Seemann's synthesis, not Martin's wording.* + +### 3-5. Ports & Adapters 🌎 + +* The core MUST define *ports*; technology-specific IO MUST live in *adapters* at + the edge. Inside code MUST NOT leak to the outside. + +*Rationale: Hexagonal Architecture (Cockburn); the structural form of §5's +boundary rule — Bernhardt's "functional core, imperative shell."* + +### 3-6. Responsibility Segregation 🌎 + +* A function SHOULD either perform an effect (command) or return a value + (query), not both (Command–Query Separation, Meyer). +* CQRS (separate read and write models) MUST NOT be a default. It MAY be used + only where a specific bounded context requires it. + +*Rationale: Fowler — "for most systems CQRS adds risky complexity"; using it by +default is [**Over Engineering**](/technical-glossary#over-engineering) (§4).* + +## 4. Simplicity First — KISS / YAGNI 🌎 + +* Abstractions MUST NOT be added before they are needed: no interface with a + single implementation, no factory for a single product, no config for a value + that never changes. +* Deletion SHOULD be preferred over addition, and boring over clever. +* The standard library, then an already-installed dependency, MUST be preferred + before writing custom code or adding a new dependency. +* Non-obvious design decisions MUST be recorded as an + [**ADR**](/technical-glossary#adr-architecture-decision-record), not encoded in + speculative abstraction. + +## 5. Error Handling + +* Failures MUST be returned as values + ([**Result (Either)**](/technical-glossary#result-either)), not thrown. + Absence MUST be represented with + [**Option (Maybe)**](/technical-glossary#option-maybe), not `null`. +* Programmer bugs, broken invariants, and impossible states MUST throw or panic: + crash, log, no recovery. +* Expected failures (bad input, not-found, IO failure) MUST return a `Result`. + Test: *"would retrying succeed?"* — yes → `Result`; no → throw. +* `try`/`catch` MUST be confined to the external boundary (IO / network / DB) and + convert throws into a `Result` there. The pure core MUST stay free of + `try`/`catch`. One top-level catch-all SHOULD remain as a safety net. +* The error channel MUST be an array (`E[]`); a single error is length 1. +* Context MUST be appended to the flat error array (chain), not nested. + +*Rationale: Go 🌎 — errors-as-values is mandated by Go. TypeScript & Python 🏠 — +Google's guides and PEP 8 use exceptions; the `Result` policy is an OSBR choice.* + +## 6. Formatting & Tooling 🌎 + +* Editors MUST format on save. +* Formatting MUST be enforced by tooling (gofmt, Prettier / gts, Black / Ruff); + see each language page. +* [**TDD**](/technical-glossary#tdd-test-driven-development) SHOULD be used; the + pure core (§3-5) is testable without mocks. + +## References + +* Robert C. Martin, The Single Responsibility Principle — +* Robert C. Martin, SOLID Relevance — +* Robert C. Martin, The Clean Architecture — +* Alistair Cockburn, Hexagonal Architecture — +* Edsger W. Dijkstra, EWD447, On the role of scientific thought — +* Eric Evans, Domain-Driven Design — +* Gary Bernhardt, Boundaries — +* Martin Fowler, CQRS — +* Martin Fowler, CommandQuerySeparation — +* Mark Seemann, SOLID: the next step is Functional — +* Google TypeScript Style Guide — +* Go Code Review Comments — +* Uber Go Style Guide — +* Effective Go — +* PEP 8 — +* Google Python Style Guide — From 2008d4f6f07f887a621320a7e7597e853fba7f04 Mon Sep 17 00:00:00 2001 From: sn0wm1ku Date: Thu, 9 Jul 2026 14:18:01 +0900 Subject: [PATCH 04/16] Adopt pnpm and upgrade VitePress to 2.0 (resolves audit vulnerabilities) - Pin pnpm@11.10.0 and add pnpm-lock.yaml + pnpm-workspace.yaml (allowBuilds: esbuild). - Upgrade vitepress -> 2.0.0-alpha.18 and mermaid; brings vite 8 / rolldown, clearing every advisory pnpm audit previously reported (audit now clean). - Fix invalid CSS in doc/.vitepress/theme/font.css (stray `;` after :root{}) that vite 8's lightningcss rejects. Co-Authored-By: Claude Opus 4.8 (1M context) --- doc/.vitepress/theme/font.css | 6 +- package.json | 7 +- pnpm-lock.yaml | 2114 +++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 2 + 4 files changed, 2123 insertions(+), 6 deletions(-) create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/doc/.vitepress/theme/font.css b/doc/.vitepress/theme/font.css index d9bae5b..90448fe 100644 --- a/doc/.vitepress/theme/font.css +++ b/doc/.vitepress/theme/font.css @@ -1,5 +1,5 @@ @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap'); -:root{ - --vp-font-family-base: 'Montserrat' -}; +:root { + --vp-font-family-base: 'Montserrat'; +} diff --git a/package.json b/package.json index cf7e7fd..aea0bfb 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,9 @@ }, "homepage": "https://github.com/osbrjp/handbook#readme", "devDependencies": { - "mermaid": "^11.4.1", - "vitepress": "^1.6.3", + "mermaid": "^11.16.0", + "vitepress": "2.0.0-alpha.18", "vitepress-plugin-mermaid": "^2.0.17" - } + }, + "packageManager": "pnpm@11.10.0+sha512.0b7f8b98060031904c017e3a41eb187a16d40eeb829b95c4f8cb03681761fc4ab53dd219115b9b447f4dce1a05a214764461e7d3703392a9f32f9511ce8c86c8" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..e5db3b7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2114 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + mermaid: + specifier: ^11.16.0 + version: 11.16.0 + vitepress: + specifier: 2.0.0-alpha.18 + version: 2.0.0-alpha.18(postcss@8.5.16) + vitepress-plugin-mermaid: + specifier: ^2.0.17 + version: 2.0.17(mermaid@11.16.0)(vitepress@2.0.0-alpha.18(postcss@8.5.16)) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + + '@docsearch/css@4.6.3': + resolution: {integrity: sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==} + + '@docsearch/js@4.6.3': + resolution: {integrity: sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==} + + '@docsearch/sidepanel-js@4.6.3': + resolution: {integrity: sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@iconify-json/simple-icons@1.2.89': + resolution: {integrity: sha512-hRaCY5s2G5oWAIhc4LCGYn6g6RrwLL4zhoLOT+KUO3joVCxVlZKA+839bv/47Nbe9/ZD4UA6dznZ4XPYcI53wA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@mermaid-js/mermaid-mindmap@9.3.0': + resolution: {integrity: sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==} + + '@mermaid-js/parser@1.2.0': + resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} + + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.138.0': + resolution: {integrity: sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==} + + '@rolldown/binding-android-arm64@1.1.4': + resolution: {integrity: sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.4': + resolution: {integrity: sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.4': + resolution: {integrity: sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.4': + resolution: {integrity: sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.4': + resolution: {integrity: sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.4': + resolution: {integrity: sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.1.4': + resolution: {integrity: sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.1.4': + resolution: {integrity: sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.4': + resolution: {integrity: sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.1.4': + resolution: {integrity: sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.1.4': + resolution: {integrity: sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.1.4': + resolution: {integrity: sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.4': + resolution: {integrity: sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.4': + resolution: {integrity: sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.4': + resolution: {integrity: sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.3.1': + resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.1': + resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} + engines: {node: '>=20'} + + '@shikijs/themes@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@shikijs/transformers@4.3.1': + resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} + engines: {node: '>=20'} + + '@shikijs/types@4.3.1': + resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.2': + resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} + + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + + '@vitejs/plugin-vue@6.0.7': + resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.39': + resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==} + + '@vue/compiler-dom@3.5.39': + resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==} + + '@vue/compiler-sfc@3.5.39': + resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==} + + '@vue/compiler-ssr@3.5.39': + resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + + '@vue/devtools-api@8.1.5': + resolution: {integrity: sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==} + + '@vue/devtools-kit@8.1.5': + resolution: {integrity: sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==} + + '@vue/devtools-shared@8.1.5': + resolution: {integrity: sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==} + + '@vue/reactivity@3.5.39': + resolution: {integrity: sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==} + + '@vue/runtime-core@3.5.39': + resolution: {integrity: sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==} + + '@vue/runtime-dom@3.5.39': + resolution: {integrity: sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==} + + '@vue/server-renderer@3.5.39': + resolution: {integrity: sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==} + peerDependencies: + vue: 3.5.39 + + '@vue/shared@3.5.39': + resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==} + + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@14.3.0': + resolution: {integrity: sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 || ^8 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.34.0: + resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dompurify@3.4.11: + resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + focus-trap@8.2.2: + resolution: {integrity: sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mermaid@11.16.0: + resolution: {integrity: sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + package-manager-detector@1.7.0: + resolution: {integrity: sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + + rolldown@1.1.4: + resolution: {integrity: sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-dedent@2.3.0: + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} + engines: {node: '>=6.10'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + hasBin: true + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@8.1.3: + resolution: {integrity: sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress-plugin-mermaid@2.0.17: + resolution: {integrity: sha512-IUzYpwf61GC6k0XzfmAmNrLvMi9TRrVRMsUyCA8KNXhg/mQ1VqWnO0/tBVPiX5UoKF1mDUwqn5QV4qAJl6JnUg==} + peerDependencies: + mermaid: 10 || 11 + vitepress: ^1.0.0 || ^1.0.0-alpha + + vitepress@2.0.0-alpha.18: + resolution: {integrity: sha512-Lk1G2/QqSf+MwNLICl9fmzWOtoCEwjZoWgaQy41QvWTfcGpLE9XwJDbcCyES/9rj6R2g1zFqFvLVkYKLLDALFw==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.39: + resolution: {integrity: sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.7.0 + tinyexec: 1.2.4 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@braintree/sanitize-url@6.0.4': + optional: true + + '@braintree/sanitize-url@7.1.2': {} + + '@chevrotain/types@11.1.2': {} + + '@docsearch/css@4.6.3': {} + + '@docsearch/js@4.6.3': {} + + '@docsearch/sidepanel-js@4.6.3': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@iconify-json/simple-icons@1.2.89': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.4': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@mermaid-js/mermaid-mindmap@9.3.0': + dependencies: + '@braintree/sanitize-url': 6.0.4 + cytoscape: 3.34.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) + cytoscape-fcose: 2.2.0(cytoscape@3.34.0) + d3: 7.9.0 + khroma: 2.1.0 + non-layered-tidy-tree-layout: 2.0.2 + optional: true + + '@mermaid-js/parser@1.2.0': + dependencies: + '@chevrotain/types': 11.1.2 + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@oxc-project/types@0.138.0': {} + + '@rolldown/binding-android-arm64@1.1.4': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.4': + optional: true + + '@rolldown/binding-darwin-x64@1.1.4': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.4': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.4': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.4': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.4': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.4': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.4': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.4': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.4': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.4': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.4': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.4': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.4': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@shikijs/core@4.3.1': + dependencies: + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/primitive@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/transformers@4.3.1': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + + '@shikijs/types@4.3.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.4': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.2': {} + + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + '@vitejs/plugin-vue@6.0.7(vite@8.1.3)(vue@3.5.39)': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.1.3 + vue: 3.5.39 + + '@vue/compiler-core@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.39 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.39': + dependencies: + '@vue/compiler-core': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/compiler-sfc@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.39 + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.16 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.39': + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/devtools-api@8.1.5': + dependencies: + '@vue/devtools-kit': 8.1.5 + + '@vue/devtools-kit@8.1.5': + dependencies: + '@vue/devtools-shared': 8.1.5 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.1.5': {} + + '@vue/reactivity@3.5.39': + dependencies: + '@vue/shared': 3.5.39 + + '@vue/runtime-core@3.5.39': + dependencies: + '@vue/reactivity': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/runtime-dom@3.5.39': + dependencies: + '@vue/reactivity': 3.5.39 + '@vue/runtime-core': 3.5.39 + '@vue/shared': 3.5.39 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.39(vue@3.5.39)': + dependencies: + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + vue: 3.5.39 + + '@vue/shared@3.5.39': {} + + '@vueuse/core@14.3.0(vue@3.5.39)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.39) + vue: 3.5.39 + + '@vueuse/integrations@14.3.0(focus-trap@8.2.2)(vue@3.5.39)': + dependencies: + '@vueuse/core': 14.3.0(vue@3.5.39) + '@vueuse/shared': 14.3.0(vue@3.5.39) + vue: 3.5.39 + optionalDependencies: + focus-trap: 8.2.2 + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.39)': + dependencies: + vue: 3.5.39 + + birpc@2.9.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + comma-separated-tokens@2.0.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + csstype@3.2.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.34.0 + + cytoscape-fcose@2.2.0(cytoscape@3.34.0): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.34.0 + + cytoscape@3.34.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.1.0 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.18.1 + + dayjs@1.11.21: {} + + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dompurify@3.4.11: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + entities@7.0.1: {} + + es-toolkit@1.49.0: {} + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + focus-trap@8.2.2: + dependencies: + tabbable: 6.5.0 + + fsevents@2.3.3: + optional: true + + hachure-fill@0.5.2: {} + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hookable@5.5.3: {} + + html-void-elements@3.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + import-meta-resolve@4.2.0: {} + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + katex@0.16.47: + dependencies: + commander: 8.3.0 + + khroma@2.1.0: {} + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lodash-es@4.18.1: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + marked@16.4.2: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.2 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mermaid@11.16.0: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.4 + '@mermaid-js/parser': 1.2.0 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.34.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) + cytoscape-fcose: 2.2.0(cytoscape@3.34.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.21 + dompurify: 3.4.11 + es-toolkit: 1.49.0 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.4.0 + ts-dedent: 2.3.0 + uuid: 14.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + minisearch@7.2.0: {} + + nanoid@3.3.15: {} + + non-layered-tidy-tree-layout@2.0.2: + optional: true + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + package-manager-detector@1.7.0: {} + + path-data-parser@0.1.0: {} + + perfect-debounce@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss@8.5.16: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.2.0: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + robust-predicates@3.0.3: {} + + rolldown@1.1.4: + dependencies: + '@oxc-project/types': 0.138.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.4 + '@rolldown/binding-darwin-arm64': 1.1.4 + '@rolldown/binding-darwin-x64': 1.1.4 + '@rolldown/binding-freebsd-x64': 1.1.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.4 + '@rolldown/binding-linux-arm64-gnu': 1.1.4 + '@rolldown/binding-linux-arm64-musl': 1.1.4 + '@rolldown/binding-linux-ppc64-gnu': 1.1.4 + '@rolldown/binding-linux-s390x-gnu': 1.1.4 + '@rolldown/binding-linux-x64-gnu': 1.1.4 + '@rolldown/binding-linux-x64-musl': 1.1.4 + '@rolldown/binding-openharmony-arm64': 1.1.4 + '@rolldown/binding-wasm32-wasi': 1.1.4 + '@rolldown/binding-win32-arm64-msvc': 1.1.4 + '@rolldown/binding-win32-x64-msvc': 1.1.4 + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + rw@1.3.3: {} + + safer-buffer@2.1.2: {} + + shiki@4.3.1: + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/engine-javascript': 4.3.1 + '@shikijs/engine-oniguruma': 4.3.1 + '@shikijs/langs': 4.3.1 + '@shikijs/themes': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stylis@4.4.0: {} + + tabbable@6.5.0: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + trim-lines@3.0.1: {} + + ts-dedent@2.3.0: {} + + tslib@2.8.1: + optional: true + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + uuid@14.0.1: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@8.1.3: + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.16 + rolldown: 1.1.4 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vitepress-plugin-mermaid@2.0.17(mermaid@11.16.0)(vitepress@2.0.0-alpha.18(postcss@8.5.16)): + dependencies: + mermaid: 11.16.0 + vitepress: 2.0.0-alpha.18(postcss@8.5.16) + optionalDependencies: + '@mermaid-js/mermaid-mindmap': 9.3.0 + + vitepress@2.0.0-alpha.18(postcss@8.5.16): + dependencies: + '@docsearch/css': 4.6.3 + '@docsearch/js': 4.6.3 + '@docsearch/sidepanel-js': 4.6.3 + '@iconify-json/simple-icons': 1.2.89 + '@shikijs/core': 4.3.1 + '@shikijs/transformers': 4.3.1 + '@shikijs/types': 4.3.1 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.7(vite@8.1.3)(vue@3.5.39) + '@vue/devtools-api': 8.1.5 + '@vue/shared': 3.5.39 + '@vueuse/core': 14.3.0(vue@3.5.39) + '@vueuse/integrations': 14.3.0(focus-trap@8.2.2)(vue@3.5.39) + focus-trap: 8.2.2 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 4.3.1 + vite: 8.1.3 + vue: 3.5.39 + optionalDependencies: + postcss: 8.5.16 + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - async-validator + - axios + - change-case + - drauu + - esbuild + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - nprogress + - qrcode + - sass + - sass-embedded + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vue@3.5.39: + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-sfc': 3.5.39 + '@vue/runtime-dom': 3.5.39 + '@vue/server-renderer': 3.5.39(vue@3.5.39) + '@vue/shared': 3.5.39 + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true From 2d8829d09a735dd73ca65462acfa42d7d7c134af Mon Sep 17 00:00:00 2001 From: sn0wm1ku Date: Thu, 9 Jul 2026 14:29:07 +0900 Subject: [PATCH 05/16] Add ticket for rewriting the Style Guide pages Editorial rewrite (wording/grammar, US English, terminology + structural consistency) plus Google-style bad/good worked examples for the per-language pages. Scope excludes new citations and any policy/level/tag change. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...ewrite-style-guide-wording-and-examples.md | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 .workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md diff --git a/.workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md b/.workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md new file mode 100644 index 0000000..00ca437 --- /dev/null +++ b/.workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md @@ -0,0 +1,126 @@ +--- +title: Rewrite the Style Guide pages — wording, grammar, consistency, worked examples +layer: Documentation +mission: null +depends_on: [] +status: todo +created: 2026-07-09 +branch: coding-convention +pr: 73 +--- + +# Rewrite the Style Guide pages — wording, grammar, consistency, worked examples + +## Summary + +Editorial rewrite of the four Style Guide pages so they read cleanly and +consistently, and so the per-language pages teach with worked examples in the +manner of the Google / Airbnb / GitLab guides. This is a copy-edit and +presentation pass — **not** a policy change: every rule's substance, RFC-2119 +level, and 🌎/🏠 tag is preserved. + +"Reference GitLab / Google / Airbnb" here means emulate their **grammar and +document style** (writing quality, formatting conventions, and Google-style +bad/good code examples). It does **not** mean adding new citations to those +guides or importing their content. + +## Scope + +In scope: +- Fix wording, grammar, and clarity; normalize to **American English** spelling + (behavior, modeled, organize — currently mixed with British forms). +- Enforce one-concept-one-word terminology across all four pages (e.g. settle on + a single term chain for domain-layer code — "project code" / "own types" / + "the core" / "the pure core" are used near-synonymously; likewise + "boundary" / "edge" / "adapter", and "Result (Either)" / "Result" / "error + channel"). +- Reconcile the §1 core framing contradiction ("Eliminating runtime errors is + the goal every rule below serves" vs "literal zero runtime errors is + impossible"). +- Structural consistency across the four pages: every section heading carries + exactly one 🌎/🏠 tag (fix Go §4 "Interfaces" — currently untagged and with no + Rationale); every 🏠 section ends with a *Rationale:* line that names the + mainstream baseline it diverges from; normalize section names (Python + "Formatting & Linting" vs siblings' "Formatting"). +- Add Google-style **bad/good** (❌ / ✅) worked examples to the per-language + pages for the highest-value rules (at least TypeScript Total Types, Result + error handling, no-classes; Go errors-as-values / panic; Python EAFP vs + return-values). +- Add a short "How to read this guide" convention note (GitLab-handbook style) + in the core page explaining the RFC-2119 levels, the 🌎/🏠 tags, and the + bad/good example format — once, single-sourced. + +Out of scope: +- No new citations or reference entries (do not add GitLab or others to + References; existing References stay for 🌎/🏠 provenance). +- No change to any rule's substance, RFC-2119 level, or 🌎/🏠 classification. +- No file/slug/H1 renames; no sidebar restructure. + +## Key Files + +- `doc/style-guide.md` — language-agnostic hub; sets the RFC-2119 legend, 🌎/🏠 + definitions, Rationale-line convention. Primary template the others mirror. +- `doc/style-guide-typescript.md` — already names Google/Airbnb as divergence + baselines; natural anchor for bad/good examples. +- `doc/style-guide-golang.md` — has the untagged "Interfaces" section to fix. +- `doc/style-guide-python.md` — section naming diverges from siblings. +- `doc/.vitepress/config.mts` — do **not** touch unless a title/slug changes + (not planned). The four `/style-guide*` routes + H1s are wired here. +- `doc/technical-glossary.md` — only if a new **bold-link** term is introduced + (add a matching heading, or the build flags a dead anchor). + +## Related History + +- PR #73 (branch `coding-convention`) contains the guides; the rewrite lands on + this branch/PR. Commits: `8803297` (Add Coding Style Guide), `9e8c3ee` + (rename to Style Guide + nest), `25bae56` (original). +- No prior ticket or overlapping work (moderation: clear). + +## Implementation Steps + +1. Read all four pages together; build a terminology map and pick the canonical + term for each concept cluster. Apply consistently across all four in the same + change (terminology policy: update all affected areas together). +2. Copy-edit each page for grammar/clarity; normalize to US English spelling. +3. Fix the §1 framing contradiction in the core page. +4. Tag every section (fix Go "Interfaces"); ensure every 🏠 section has a + *Rationale:* naming its baseline; align section names across pages. +5. Add the "How to read this guide" note to the core page. +6. Add ❌/✅ bad-then-good examples to the per-language pages for the listed + high-value rules; keep them minimal and correct. +7. Preserve every glossary **bold-link** (14 anchors), the four slugs/H1s, and + the [[TOC]] + single-sourced RFC-2119 legend. +8. `pnpm docs:build` and confirm no dead-link / build errors. + +## Considerations + +- **Objective documentation** (実装 pillar): keep language factual and + verifiable; do not introduce evaluative adjectives (elegant, powerful, simple) + or empty hedges (basically, essentially) while "improving wording." +- **One concept, one word** (企画 pillar): do not add synonyms or notational + variants for terms already fixed in the Technical Glossary; reword sentences, + not the defined vocabulary. +- **Honest provenance**: the rewrite must not flip a rule's 🌎/🏠 tag or + misstate what it diverges from; editorial polish only. +- **Load-bearing invariants**: 14 `/technical-glossary#` links (exact + spelling), the four `/style-guide*` slugs + H1s wired in `config.mts`, and the + core page's single RFC-2119 legend must all survive. + +## Quality Gate + +Both must hold before approval: + +1. **Build passes** — `pnpm docs:build` completes with no dead-link or build + errors (this is the only automated check; VitePress fails the build on a + broken `/technical-glossary#anchor` or `/style-guide*` link). Confirms all 14 + glossary anchors and the four slugs/H1s still resolve. +2. **Named human review** — a reviewer reads all four pages and confirms: + - grammar/wording is clean and consistent; spelling is uniformly US English; + - terminology is consistent (one word per concept, matching the glossary); + - every section is 🌎/🏠-tagged and every 🏠 section has a Rationale line; + - bad/good examples are present for the listed high-value rules and are + correct; + - **no rule's substance, RFC-2119 level, or 🌎/🏠 tag changed** (diff read + against the pre-rewrite version to confirm editorial-only). + +Reviewer: to be assigned on the PR (mention on PR #73). From c4bca16f9a287c6594b5dc38bf77e2062b838cb4 Mon Sep 17 00:00:00 2001 From: sn0wm1ku Date: Thu, 9 Jul 2026 14:45:14 +0900 Subject: [PATCH 06/16] Rewrite Style Guide pages: wording, grammar, consistency, worked examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Editorial pass over the four Style Guide pages (ticket rewrite-style-guide-wording-and-examples): - Normalize to American English; copy-edit for grammar and clarity. - Canonical terminology, applied across all four pages: "project code" (code we author), "the pure core" (the pure inner layer), "Result" (the failure value; glossary term "Result (Either)" kept only in bold-links), "the boundary" (the IO edge). "project code" and "the pure core" are kept distinct on purpose. - Reconcile the §1 framing: eliminate avoidable runtime errors, make the unavoidable ones explicit (matches the "literal zero is impossible" rationale). - Structural consistency: tag every section (fix Go "Interfaces" -> 🌎), add the missing Rationale to Python "Functional Style", align section names (Python "Formatting & Linting" -> "Formatting"). - Add a "How to read this guide" note to the hub (RFC 2119 levels, 🌎/🏠 tags, ❌/✅ example convention), single-sourced. - Add Google-style bad/good (❌/✅) worked examples to the language pages: TS Total Types, Result, no-classes; Go errors-as-values; Python EAFP. Scope: editorial only — no rule substance, RFC 2119 level, or 🌎/🏠 tag changed; no new citations; slugs/H1s/config and all 14 glossary anchors preserved. Quality Gate: `pnpm docs:build` passes (dead-link check). Named human review pending on PR #73. Archives ticket to .workaholic/tickets/archive/coding-convention/. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...ewrite-style-guide-wording-and-examples.md | 2 +- doc/style-guide-golang.md | 29 +++++++- doc/style-guide-python.md | 29 ++++++-- doc/style-guide-typescript.md | 70 +++++++++++++++++-- doc/style-guide.md | 41 ++++++----- 5 files changed, 145 insertions(+), 26 deletions(-) rename .workaholic/tickets/{todo/sn0wm1ku => archive/coding-convention}/rewrite-style-guide-wording-and-examples.md (99%) diff --git a/.workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md b/.workaholic/tickets/archive/coding-convention/rewrite-style-guide-wording-and-examples.md similarity index 99% rename from .workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md rename to .workaholic/tickets/archive/coding-convention/rewrite-style-guide-wording-and-examples.md index 00ca437..f43961d 100644 --- a/.workaholic/tickets/todo/sn0wm1ku/rewrite-style-guide-wording-and-examples.md +++ b/.workaholic/tickets/archive/coding-convention/rewrite-style-guide-wording-and-examples.md @@ -3,7 +3,7 @@ title: Rewrite the Style Guide pages — wording, grammar, consistency, worked e layer: Documentation mission: null depends_on: [] -status: todo +status: archived created: 2026-07-09 branch: coding-convention pr: 73 diff --git a/doc/style-guide-golang.md b/doc/style-guide-golang.md index 4509e5b..5d654ed 100644 --- a/doc/style-guide-golang.md +++ b/doc/style-guide-golang.md @@ -29,6 +29,30 @@ RFC 2119; tags 🌎 / 🏠 are defined there. * `panic` MAY be used for unrecoverable bugs or program init, but MUST NOT cross a package boundary — convert it to an `error` first. +❌ `panic` used for an expected failure crashes the caller: + +```go +func mustLoad(id string) User { + u, err := db.Load(id) + if err != nil { + panic(err) + } + return u +} +``` + +✅ The failure is returned as an `error` the caller must handle: + +```go +func load(id string) (User, error) { + u, err := db.Load(id) + if err != nil { + return User{}, fmt.Errorf("load %s: %w", id, err) + } + return u, nil +} +``` + *Rationale: errors-as-values is mandated by Go (Go Code Review Comments, Uber, Effective Go). Go's `error` return is the idiomatic [**Result (Either)**](/technical-glossary#result-either).* @@ -41,11 +65,14 @@ Effective Go). Go's `error` return is the idiomatic *Note: Go idiom permits local mutation; the constraint is on globals and boundary aliasing.* -## 4. Interfaces +## 4. Interfaces 🌎 * Interfaces SHOULD be small and defined by the consumer. An interface with a single implementation MUST NOT be exported. +*Note: Go idiom is "accept interfaces, return structs" with consumer-defined +interfaces (Go Code Review Comments, Effective Go).* + ## References * Go Code Review Comments — diff --git a/doc/style-guide-python.md b/doc/style-guide-python.md index b3fc0a3..d9b773d 100644 --- a/doc/style-guide-python.md +++ b/doc/style-guide-python.md @@ -6,7 +6,7 @@ RFC 2119; tags 🌎 / 🏠 are defined there. [[TOC]] -## 1. Formatting & Linting 🌎 +## 1. Formatting 🌎 * Code MUST be formatted and linted with [Ruff](https://docs.astral.sh/ruff/) (Black-compatible). Editors MUST format on save. @@ -29,18 +29,39 @@ language does not check them at runtime.* * Plain functions, frozen `dataclasses` (a [**Value Object**](/technical-glossary#value-object)), and immutable data MUST be preferred over stateful classes. -* The core MUST be free of [**Side Effect**](/technical-glossary#side-effect)s. +* The pure core MUST be free of + [**Side Effect**](/technical-glossary#side-effect)s. * Comprehensions and generator expressions SHOULD be preferred over manual accumulation loops where they stay readable. +*Rationale: stricter than mainstream Python, which treats classes and +object-oriented style as the default structuring tool.* + ## 4. Error Handling 🏠 -* Expected failures SHOULD be modelled as return values where it aids clarity. +* Expected failures SHOULD be modeled as return values where it aids clarity. * `raise` MUST be reserved for programmer bugs and broken invariants; exceptions - MUST be caught at the IO boundary. + MUST be caught at the boundary. * Bare `except:` MUST NOT be used; catch specific exceptions and chain with `raise X from Y` (PEP 8). +❌ An expected "not found" flows through an exception, caught blindly: + +```python +def find_user(users: dict[str, User], uid: str) -> User: + try: + return users[uid] + except: # bare except hides real bugs + return None # absence smuggled back through the type +``` + +✅ Expected absence is a return value; `raise` is kept for real bugs: + +```python +def find_user(users: dict[str, User], uid: str) -> User | None: + return users.get(uid) +``` + *Rationale: divergent from Python's EAFP idiom, where exceptions are the standard error-handling mechanism.* diff --git a/doc/style-guide-typescript.md b/doc/style-guide-typescript.md index 03430e9..012d26b 100644 --- a/doc/style-guide-typescript.md +++ b/doc/style-guide-typescript.md @@ -39,16 +39,35 @@ rising 2026 alternative; Prettier remains the default.* ## 4. Total Types 🏠 -* Own types MUST NOT use `undefined`. +* Project code MUST NOT use `undefined` in its own types. * Domain and application types MUST NOT signal absence with `undefined` or a bare `null` — use [**Option (Maybe)**](/technical-glossary#option-maybe). Optional properties (`x?: T`) and `T | undefined` unions MUST NOT mean "maybe absent." * Functions MUST return `T` or `Option`, never `T | undefined`. * `null` MAY appear at the boundary (DB rows, JSON, the DOM, `Map.get`, third-party APIs). It MUST be converted to `Option` in the adapter before - entering the domain. + entering the pure core. * `tsconfig` MUST enable `strictNullChecks` and `noUncheckedIndexedAccess`. +❌ "Maybe absent" leaks out of the function as `undefined`: + +```ts +function findUser(id: UserId): User | undefined { + return users.get(id); // callers must remember to check +} +``` + +✅ Absence is explicit in the type: + +```ts +import { type Option, some, none } from "./option"; + +function findUser(id: UserId): Option { + const user = users.get(id); + return user === undefined ? none : some(user); +} +``` + *Rationale: `null` is a defined value and the DB-native representation of absence; `undefined` is accidental "not set." Divergent from Google, which treats `undefined` as normal; not a language-wide ban.* @@ -59,12 +78,31 @@ treats `undefined` as normal; not a language-wide ban.* closures. * Classes MAY be used where a framework or library requires them. +❌ State and behavior bundled in a class: + +```ts +class Rectangle { + constructor(private readonly w: number, private readonly h: number) {} + area(): number { + return this.w * this.h; + } +} +``` + +✅ Plain data plus a function: + +```ts +type Rectangle = { readonly w: number; readonly h: number }; + +const area = (r: Rectangle): number => r.w * r.h; +``` + *Rationale: divergent from mainstream — classes are first-class in TypeScript; Google discourages only static-only namespacing classes.* ## 6. Error Handling 🏠 -* The error channel MUST be modelled as a +* Failures MUST be modeled as a [**Result (Either)**](/technical-glossary#result-either): ```ts @@ -78,7 +116,31 @@ Google discourages only static-only namespacing classes.* where its combinators (`map` / `andThen` / `mapErr` / `ResultAsync`) are needed at scale. * IO / `fetch` / DB calls MUST be wrapped at the boundary and return a `Result`; - the core MUST stay pure. + the pure core MUST stay free of `try`/`catch`. + +❌ Failure is thrown, and a caller can ignore it: + +```ts +async function loadUser(id: UserId): Promise { + const res = await fetch(`/users/${id}`); + if (!res.ok) throw new Error("request failed"); + return res.json(); +} +``` + +✅ Failure is returned as a `Result` the caller must handle: + +```ts +async function loadUser(id: UserId): Promise> { + try { + const res = await fetch(`/users/${id}`); + if (!res.ok) return { ok: false, error: ["request failed"] }; + return { ok: true, value: await res.json() }; + } catch { + return { ok: false, error: ["network error"] }; + } +} +``` *Rationale: divergent from Google's TS guide, which prefers throwing exceptions.* diff --git a/doc/style-guide.md b/doc/style-guide.md index 4913f42..f427e5e 100644 --- a/doc/style-guide.md +++ b/doc/style-guide.md @@ -6,18 +6,27 @@ Language-agnostic coding policy for OSBR repositories. Per-language policy: * [Golang Style Guide](/style-guide-golang) * [Python Style Guide](/style-guide-python) -Requirement levels follow RFC 2119 (MUST / MUST NOT / SHOULD / MAY). Terms in -**bold links** are defined in the [Technical Glossary](/technical-glossary). - -Each rule is tagged 🌎 (**Industry standard** — backed by an official or widely -adopted source) or 🏠 (**OSBR house rule** — deliberately stricter than, or -divergent from, mainstream practice). Sources are listed under References. +## How to read this guide + +* **Requirement levels** follow RFC 2119. **MUST** / **MUST NOT** are absolute. + **SHOULD** / **SHOULD NOT** state a strong default that MAY be overridden only + with a documented reason. **MAY** marks a choice left to the author. +* **Rule tags.** Every rule carries exactly one tag. 🌎 (**Industry standard**) + is backed by an official or widely adopted source. 🏠 (**OSBR house rule**) is + deliberately stricter than, or divergent from, mainstream practice; every 🏠 + section ends with a *Rationale:* line naming the baseline it diverges from. + Sources are listed under References. +* **Worked examples.** The per-language pages state a rule, then show it with a + ❌ counter-example followed by the ✅ form to write instead. +* **Defined terms.** Words in **bold links** are defined in the + [Technical Glossary](/technical-glossary). [[TOC]] ## 1. Correctness by Construction — Zero Runtime Errors 🏠 -Eliminating runtime errors is the goal every rule below serves. +Every rule below serves one goal: eliminate avoidable runtime errors and make +the unavoidable ones explicit. * Avoidable errors MUST be moved to compile time. Illegal states MUST be made unrepresentable through the type system (strict types, total types, @@ -25,14 +34,14 @@ Eliminating runtime errors is the goal every rule below serves. than guarded at runtime. * Code MUST NOT fail at runtime for a condition the types could have rejected: no `any` escape hatch, no unchecked `null` / `undefined`, no unvalidated - external input reaching the core. + external input reaching the pure core. * Unavoidable failures (IO, network, DB, external input) MUST be handled explicitly as values ([**Result (Either)**](/technical-glossary#result-either) / [**Option (Maybe)**](/technical-glossary#option-maybe), §5) and MUST NOT be left to throw uncaught. *Rationale: literal zero runtime errors is impossible — external systems fail. -The policy is to make every avoidable error a compile error and every +The target is to make every avoidable error a compile error and every unavoidable one an explicit, handled value. The strict-typing, total-type, and error-handling rules below are the mechanism.* @@ -43,7 +52,7 @@ error-handling rules below are the mechanism.* * Project code MUST NOT mutate data in place. * Functions MUST be free of [**Side Effect**](/technical-glossary#side-effect)s; IO MUST be pushed to the boundary (§3-5, §5). -* Dependencies SHOULD be inverted by passing behaviour as a +* Dependencies SHOULD be inverted by passing behavior as a [**Higher Order Function**](/technical-glossary#higher-order-function), not by hard-wiring a concretion. * Classes and mutation MAY be used inside external libraries, or at framework @@ -112,8 +121,8 @@ mandate.* ### 3-5. Ports & Adapters 🌎 -* The core MUST define *ports*; technology-specific IO MUST live in *adapters* at - the edge. Inside code MUST NOT leak to the outside. +* The pure core MUST define *ports*; technology-specific IO MUST live in + *adapters* at the boundary. Inner code MUST NOT leak to the outside. *Rationale: Hexagonal Architecture (Cockburn); the structural form of §5's boundary rule — Bernhardt's "functional core, imperative shell."* @@ -150,10 +159,10 @@ default is [**Over Engineering**](/technical-glossary#over-engineering) (§4).* crash, log, no recovery. * Expected failures (bad input, not-found, IO failure) MUST return a `Result`. Test: *"would retrying succeed?"* — yes → `Result`; no → throw. -* `try`/`catch` MUST be confined to the external boundary (IO / network / DB) and - convert throws into a `Result` there. The pure core MUST stay free of - `try`/`catch`. One top-level catch-all SHOULD remain as a safety net. -* The error channel MUST be an array (`E[]`); a single error is length 1. +* `try`/`catch` MUST be confined to the boundary (IO / network / DB) and convert + throws into a `Result` there. The pure core MUST stay free of `try`/`catch`. + One top-level catch-all SHOULD remain as a safety net. +* Errors MUST be collected in an array (`E[]`); a single error is length 1. * Context MUST be appended to the flat error array (chain), not nested. *Rationale: Go 🌎 — errors-as-values is mandated by Go. TypeScript & Python 🏠 — From 8aabe80f37c1fefe64a6c68109421065ebe9fb90 Mon Sep 17 00:00:00 2001 From: sn0wm1ku Date: Thu, 9 Jul 2026 15:21:53 +0900 Subject: [PATCH 07/16] Add shared formatter/lint config templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow the Google/Airbnb pattern of shipping config, layered like the Style Guide: a language-agnostic base plus per-language configs. - templates/.editorconfig — language-agnostic base (charset, EOL, indent, final newline, trailing whitespace, max_line_length = 100; Python indent 4; Go tabs). - templates/.prettierrc.json — TypeScript/JS/Markdown (printWidth 100). - templates/ruff.toml — Python (line-length 100). - Go: none; gofmt is mandatory and unconfigurable. - templates/README.md documents the layers and usage. Line length is 100 across languages (gofmt excepted). Style Guide §6 now points to templates/; the same files will be mirrored in osbrjp/standard-repository so scaffolded repos inherit them. Co-Authored-By: Claude Opus 4.8 (1M context) --- doc/style-guide.md | 5 +++++ templates/.editorconfig | 24 ++++++++++++++++++++++++ templates/.prettierrc.json | 3 +++ templates/README.md | 21 +++++++++++++++++++++ templates/ruff.toml | 1 + 5 files changed, 54 insertions(+) create mode 100644 templates/.editorconfig create mode 100644 templates/.prettierrc.json create mode 100644 templates/README.md create mode 100644 templates/ruff.toml diff --git a/doc/style-guide.md b/doc/style-guide.md index f427e5e..7ad01b6 100644 --- a/doc/style-guide.md +++ b/doc/style-guide.md @@ -173,6 +173,11 @@ Google's guides and PEP 8 use exceptions; the `Result` policy is an OSBR choice. * Editors MUST format on save. * Formatting MUST be enforced by tooling (gofmt, Prettier / gts, Black / Ruff); see each language page. +* Repositories MUST use the shared config templates + ([`templates/`](https://github.com/osbrjp/handbook/tree/main/templates)): + the language-agnostic `.editorconfig` plus the per-language formatter config. + The same files ship in `osbrjp/standard-repository`, so a repo scaffolded from + that template already carries them. * [**TDD**](/technical-glossary#tdd-test-driven-development) SHOULD be used; the pure core (§3-5) is testable without mocks. diff --git a/templates/.editorconfig b/templates/.editorconfig new file mode 100644 index 0000000..960f33c --- /dev/null +++ b/templates/.editorconfig @@ -0,0 +1,24 @@ +# OSBR shared EditorConfig — the language-agnostic formatting base. +# Copy to a repository root. Language-specific formatters (Prettier, Ruff) +# mirror these values; gofmt controls Go. See the OSBR Style Guide. +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 +max_line_length = 100 + +[*.py] +indent_size = 4 + +[*.go] +indent_style = tab +# gofmt controls Go formatting and does not enforce a line length. + +[*.md] +# Trailing spaces are significant in Markdown (hard line breaks). +trim_trailing_whitespace = false diff --git a/templates/.prettierrc.json b/templates/.prettierrc.json new file mode 100644 index 0000000..de753c5 --- /dev/null +++ b/templates/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "printWidth": 100 +} diff --git a/templates/README.md b/templates/README.md new file mode 100644 index 0000000..dc1b348 --- /dev/null +++ b/templates/README.md @@ -0,0 +1,21 @@ +# Formatter & Linter Config Templates + +Canonical formatting configuration for OSBR repositories, layered like the +[Style Guide](https://osbrjp.github.io/handbook/style-guide) itself. + +## Layers + +- **Language-agnostic base — `.editorconfig`.** Charset, line endings, indent, + final newline, trailing whitespace, and `max_line_length`. Every editor and + many formatters read it, so it is the single source for cross-language rules. +- **Language-specific:** + - TypeScript / JavaScript / Markdown — `.prettierrc.json` (Prettier). + - Python — `ruff.toml` (Ruff formats and lints). + - Go — none. `gofmt` is mandatory and takes no configuration; it does not + enforce a line length. + +## Usage + +Copy the relevant files to a repository root. These same files are mirrored in +`osbrjp/standard-repository`, so a repo scaffolded from that template already +carries them. diff --git a/templates/ruff.toml b/templates/ruff.toml new file mode 100644 index 0000000..71de868 --- /dev/null +++ b/templates/ruff.toml @@ -0,0 +1 @@ +line-length = 100 From 6205b2c4263bdc408755c4f8c0301d9701aeb355 Mon Sep 17 00:00:00 2001 From: amirahosbr Date: Thu, 9 Jul 2026 16:45:49 +0800 Subject: [PATCH 08/16] Add HTML & CSS Style Guide and update README - Added a new section for HTML & CSS Style Guide in the main style guide document. - Updated the VitePress configuration to include a link to the HTML & CSS Style Guide. - Revised the README to reflect the inclusion of HTML & CSS in the shared formatting configuration. --- doc/.vitepress/config.mts | 1 + doc/style-guide-html-css.md | 349 ++++++++++++++++++++++++++++++++++++ doc/style-guide.md | 1 + templates/README.md | 3 +- 4 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 doc/style-guide-html-css.md diff --git a/doc/.vitepress/config.mts b/doc/.vitepress/config.mts index 2216437..7e1d1d1 100644 --- a/doc/.vitepress/config.mts +++ b/doc/.vitepress/config.mts @@ -72,6 +72,7 @@ export default defineConfig({ { text: "TypeScript", link: "/style-guide-typescript" }, { text: "Golang", link: "/style-guide-golang" }, { text: "Python", link: "/style-guide-python" }, + { text: "HTML & CSS", link: "/style-guide-html-css" }, ], }, ], diff --git a/doc/style-guide-html-css.md b/doc/style-guide-html-css.md new file mode 100644 index 0000000..4fc7e23 --- /dev/null +++ b/doc/style-guide-html-css.md @@ -0,0 +1,349 @@ +# HTML & CSS Style Guide + +Per-language policy for HTML and CSS. Shared rules: the +[Coding Style Guide](/style-guide). Requirement levels follow +RFC 2119; tags 🌎 / 🏠 are defined there. + +[[TOC]] + +## 1. Formatting 🌎 + +* HTML and CSS MUST be formatted with Prettier. Editors MUST format on save. +* Prettier's shared [`.prettierrc.json`](https://github.com/osbrjp/handbook/tree/main/templates) + applies unchanged: Prettier formats `.html`, `.css`, `.scss`, and `.less` out + of the box, so no extra config is needed. + +*Note: Prettier is the single formatter across TypeScript, Markdown, HTML, and +CSS. Stylelint MAY be added for lint rules Prettier does not cover (e.g. +declaration order, disallowed units), but MUST NOT re-implement formatting.* + +*Note: Prettier is mandated because its HTML formatter is the only stable one. +[Biome](https://biomejs.dev/) (CSS stable, HTML still experimental) and +[oxfmt](https://oxc.rs/docs/guide/usage/formatter.html) (beta, ~30× faster) are +Prettier-compatible alternatives to revisit once their HTML support stabilizes. +A toolchain-wide switch MUST be an [**ADR**](/technical-glossary#adr-architecture-decision-record), +not a per-page choice.* + +## 2. Semantic HTML 🌎 + +* Elements MUST be chosen for meaning, not appearance. Landmarks + (`
`, `