diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..2a6ad41
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,29 @@
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [18, 20, 22]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: npm
+ - run: npm ci
+ - run: npm run generate
+ - run: npm run lint
+ - run: npm run typecheck
+ # Vitest 4 (rolldown) needs Node >= 20.12 for `node:util.styleText`. The
+ # SDK itself supports Node >= 18, which the lint/typecheck/build steps
+ # validate across the whole matrix.
+ - run: npm test
+ if: ${{ matrix.node-version != 18 }}
+ - run: npm run build
diff --git a/.gitignore b/.gitignore
index 872d5f6..75a6468 100644
--- a/.gitignore
+++ b/.gitignore
@@ -141,3 +141,6 @@ dist
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.vite/
+
+
+tasks
\ No newline at end of file
diff --git a/README.md b/README.md
index 9012533..39462df 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,147 @@
-# xedo-node
-Official Node.js/TypeScript SDK for the Xedo Developer API v1 — typed client for products, collections, orders & checkout. Server-side, MIT licensed.
+# @xedo/sdk
+
+Official Node.js / TypeScript SDK for the **Xedo Developer API v1** — a typed,
+ergonomic client for products, collections, orders & checkout. Server-side,
+MIT licensed.
+
+```bash
+npm install @xedo/sdk
+```
+
+> Requires **Node ≥ 18** (native `fetch`).
+
+## Quickstart
+
+```ts
+import { Xedo } from '@xedo/sdk';
+
+const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! }); // xdk_live_… or xdk_test_…
+
+await xedo.ping(); // validate the key
+const { data, total } = await xedo.products.list({ perPage: 20 });
+```
+
+## ⚠️ Server-side only
+
+The SDK sends your `xdk_live_…` key as a Bearer token. **Never import it into a
+browser bundle** — your key would be exposed to anyone. Call it from a server:
+Next.js Server Components / Route Handlers, Express, workers, scripts. The
+constructor throws if it detects a browser environment (override only if you
+truly know what you are doing via `dangerouslyAllowBrowser`).
+
+## Configuration
+
+```ts
+const xedo = new Xedo({
+ apiKey: process.env.XEDO_API_KEY!,
+ baseUrl: 'https://systems.xedoapp.com/marketplace', // default
+ maxRetries: 4, // auto-retry on 429 (default)
+ timeoutMs: 30000, // per-request timeout
+ fetch: customFetch, // optional injection (tests, edge)
+});
+
+xedo.environment; // 'test' | 'live' | 'unknown' (from key prefix)
+xedo.lastRateLimit; // { limit, remaining, reset } from the last call
+```
+
+## Resources
+
+| Resource | Methods |
+|---|---|
+| `xedo.ping()` | validate the key → `{ marketplaceId, timestamp }` |
+| `xedo.products` | `list`, `listAll`, `retrieve`, `retrieveBySlug` |
+| `xedo.collections` | `list`, `listAll`, `retrieve`, `retrieveBySlug` |
+| `xedo.orders` | `list`, `listAll`, `retrieve`, `invoice` (PDF) |
+| `xedo.carts` | `list`, `listAll`, `retrieve`, `preview`, `create`, `pay`, `createAndPay` |
+
+### Pagination
+
+`list()` returns `{ data, total, start, end }`. `listAll()` is an async iterator
+that walks every page for you:
+
+```ts
+const { data, total } = await xedo.orders.list({ page: 1, perPage: 50 });
+
+for await (const order of xedo.orders.listAll()) {
+ // …
+}
+```
+
+### Checkout
+
+```ts
+// Stateless totals — nothing is persisted.
+const totals = await xedo.carts.preview({
+ items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],
+ delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },
+ paymentMethod: 'external_wallet',
+});
+
+// Create the cart and get a hosted checkout URL. createAndPay() also retries
+// once if the payment provider was unreachable (502 PAYMENT_INIT_FAILED).
+const { checkoutUrl } = await xedo.carts.createAndPay({
+ customer: { firstName: 'Jean', lastName: 'Kouassi', email: 'jean@example.com', phone: '+225 07 12 34 56 78' },
+ items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],
+ delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },
+ paymentMethod: 'external_wallet',
+ returnUrl: 'https://my-shop.com/after-checkout', // HTTPS required
+ meta: { internalOrderId: 'ORD-12345' }, // echoed back in cart/order responses
+});
+```
+
+The `meta` field is your correlation hook: store your own identifiers in it and
+they come back unchanged on every cart/order response.
+
+### Invoices
+
+```ts
+const pdf = await xedo.orders.invoice('ORD-XPK39ZQA01'); // ArrayBuffer (404 if not generated yet)
+```
+
+## Error handling
+
+Every `success: false` response throws a typed error. **Route on `error.code`**
+(stable), never on `error.message` (French, may change).
+
+```ts
+import { XedoNotFoundError, XedoStockError, XedoError } from '@xedo/sdk';
+
+try {
+ await xedo.carts.create(input);
+} catch (err) {
+ if (err instanceof XedoStockError) console.log(err.errors); // per-product detail
+ else if (err instanceof XedoNotFoundError) console.log(err.code);
+ else if (err instanceof XedoError) console.log(err.code, err.status);
+ else throw err;
+}
+```
+
+| Class | Codes | HTTP |
+|---|---|---|
+| `XedoAuthError` | `MISSING_DEVELOPER_API_KEY`, `INVALID_DEVELOPER_API_KEY` | 401 |
+| `XedoValidationError` | `BAD_REQUEST`, `INVALID_PAYMENT_METHOD`, `SPLIT_PAYMENT_NOT_ENABLED`, `COMBINATION_PRODUCT_MISMATCH` | 400 |
+| `XedoNotFoundError` | `PRODUCT_NOT_FOUND`, `COMBINATION_NOT_FOUND`, `DELIVERY_AREA_NOT_FOUND`, `CART_NOT_FOUND`, `NOT_FOUND` | 404 |
+| `XedoStockError` | `INSUFFICIENT_STOCK` (detail in `errors`) | 422 |
+| `XedoConflictError` | `CART_NOT_RETRYABLE` | 409 |
+| `XedoRateLimitError` | `RATE_LIMITED` (exposes `retryAfter`) | 429 |
+| `XedoPaymentInitError` | `PAYMENT_INIT_FAILED` (exposes `cartPublicId`) | 502 |
+| `XedoConnectionError` | timeout / network / malformed response | 0 |
+
+`429` responses are retried automatically (respecting `Retry-After`, then
+exponential backoff + jitter, up to `maxRetries`). `POST /v1/carts` is **never**
+auto-retried on `5xx` — the cart may already exist; use `pay()` / `createAndPay()`.
+
+## Development
+
+```bash
+npm install
+npm run generate # regenerate src/types/generated.ts from openapi.json
+npm run lint
+npm run typecheck
+npm test # vitest + msw
+npm run build # ESM + CJS + .d.ts (tsup)
+```
+
+## License
+
+MIT
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..f88003a
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,13 @@
+import js from '@eslint/js';
+import tseslint from 'typescript-eslint';
+
+export default tseslint.config(
+ { ignores: ['dist', 'src/types/generated.ts', 'examples'] },
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ {
+ rules: {
+ '@typescript-eslint/no-explicit-any': 'off',
+ },
+ },
+);
diff --git a/examples/nextjs-server-component.tsx b/examples/nextjs-server-component.tsx
new file mode 100644
index 0000000..5805606
--- /dev/null
+++ b/examples/nextjs-server-component.tsx
@@ -0,0 +1,43 @@
+/**
+ * Next.js (App Router) Server Component. The Xedo client is instantiated and
+ * used entirely on the server, so the xdk_live_… key never reaches the browser.
+ */
+import { Xedo } from '@xedo/sdk';
+
+// Module-scope is fine: this file is never bundled for the client.
+const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });
+
+export default async function ProductsPage() {
+ // Pagination metadata comes back alongside the data.
+ const { data: products, total } = await xedo.products.list({
+ perPage: 24,
+ sort: 'createdAt',
+ order: 'desc',
+ });
+
+ return (
+
+ Catalogue ({total})
+
+ {products.map((p) => (
+ - {String(p.name)}
+ ))}
+
+
+ );
+}
+
+// --- A Route Handler that kicks off checkout -------------------------------
+//
+// export async function POST(req: Request) {
+// const body = await req.json();
+// const { checkoutUrl } = await xedo.carts.createAndPay({
+// customer: body.customer,
+// items: body.items,
+// delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },
+// paymentMethod: 'external_wallet',
+// returnUrl: 'https://my-shop.com/after-checkout',
+// meta: { internalOrderId: body.orderId },
+// });
+// return Response.redirect(checkoutUrl, 303);
+// }
diff --git a/examples/script.ts b/examples/script.ts
new file mode 100644
index 0000000..948d503
--- /dev/null
+++ b/examples/script.ts
@@ -0,0 +1,38 @@
+/**
+ * Plain Node script. Run with: XEDO_API_KEY=xdk_test_… npx tsx examples/script.ts
+ */
+import { Xedo, XedoNotFoundError } from '@xedo/sdk';
+
+const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });
+
+async function main() {
+ // 1. Validate the key.
+ const ping = await xedo.ping();
+ console.log('marketplace', ping.marketplaceId, '(', xedo.environment, ')');
+
+ // 2. Iterate the whole catalogue, page by page.
+ for await (const product of xedo.products.listAll({ perPage: 100 })) {
+ console.log(product.publicId, product.name);
+ }
+
+ // 3. Preview a cart (stateless — no cart is created).
+ const totals = await xedo.carts.preview({
+ items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],
+ delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },
+ paymentMethod: 'external_wallet',
+ });
+ console.log('totals', totals);
+
+ // 4. Robust single-resource lookup.
+ try {
+ await xedo.products.retrieve('PRD-does-not-exist');
+ } catch (err) {
+ if (err instanceof XedoNotFoundError) console.log('not found:', err.code);
+ else throw err;
+ }
+}
+
+main().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/openapi.json b/openapi.json
new file mode 100644
index 0000000..55bb31b
--- /dev/null
+++ b/openapi.json
@@ -0,0 +1,1020 @@
+{
+ "openapi": "3.0.0",
+ "info": {
+ "title": "Xedo Developer API",
+ "description": "API REST publique de Xedo. Authentification par clé Bearer xdk_…. Toutes les routes sont préfixées par `/v1`.",
+ "version": "1.0.0",
+ "contact": {}
+ },
+ "servers": [
+ {
+ "url": "https://systems.xedoapp.com/marketplace",
+ "description": "Production"
+ }
+ ],
+ "security": [{ "developer-api-key": [] }],
+ "tags": [
+ { "name": "Ping", "description": "Vérification de la clé API." },
+ { "name": "Products", "description": "Catalogue produits du marchand." },
+ { "name": "Collections", "description": "Collections (catégories) de produits." },
+ { "name": "Orders", "description": "Commandes payées." },
+ { "name": "Carts", "description": "Paniers et checkout (preview, création, retry paiement)." }
+ ],
+ "paths": {
+ "/v1/ping": {
+ "get": {
+ "operationId": "ping",
+ "summary": "Vérifier la clé API",
+ "description": "Renvoie l'identifiant du marketplace résolu depuis la clé fournie. Utilisez cet endpoint pour valider votre clé de bout en bout.",
+ "tags": ["Ping"],
+ "responses": {
+ "200": {
+ "description": "Clé valide",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" },
+ "example": {
+ "success": true,
+ "data": {
+ "marketplaceId": 42,
+ "timestamp": "2026-05-28T10:15:00.000Z"
+ }
+ }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ },
+ "x-codeSamples": [
+ {
+ "lang": "curl",
+ "label": "curl",
+ "source": "curl https://systems.xedoapp.com/marketplace/v1/ping \\\n -H \"Authorization: Bearer xdk_live_xxx\""
+ },
+ {
+ "lang": "JavaScript",
+ "label": "Node",
+ "source": "const res = await fetch('https://systems.xedoapp.com/marketplace/v1/ping', {\n headers: { Authorization: 'Bearer xdk_live_xxx' }\n});\nconst json = await res.json();"
+ }
+ ]
+ }
+ },
+ "/v1/products": {
+ "get": {
+ "operationId": "listProducts",
+ "summary": "Lister les produits",
+ "description": "Renvoie les produits du marchand (paginés). Par défaut, seuls les produits activés sont retournés — passez `includeDisabled=true` pour inclure également les brouillons.",
+ "tags": ["Products"],
+ "parameters": [
+ { "$ref": "#/components/parameters/Page" },
+ { "$ref": "#/components/parameters/PerPage" },
+ {
+ "name": "_sort",
+ "in": "query",
+ "required": false,
+ "description": "Colonne de tri.",
+ "schema": {
+ "type": "string",
+ "enum": ["id", "name", "price", "createdAt"],
+ "example": "createdAt"
+ }
+ },
+ { "$ref": "#/components/parameters/Order" },
+ {
+ "name": "search",
+ "in": "query",
+ "required": false,
+ "description": "Recherche plein-texte sur le nom du produit (3 caractères minimum).",
+ "schema": { "type": "string", "example": "burger" }
+ },
+ {
+ "name": "collection",
+ "in": "query",
+ "required": false,
+ "description": "Filtrer par slug de collection.",
+ "schema": { "type": "string", "example": "fast-food" }
+ },
+ {
+ "name": "includeVariations",
+ "in": "query",
+ "required": false,
+ "description": "Inclure les variations et combinaisons (SKU) dans la réponse.",
+ "schema": { "type": "boolean", "default": false, "example": false }
+ },
+ {
+ "name": "includeDisabled",
+ "in": "query",
+ "required": false,
+ "description": "Inclure les produits désactivés (brouillons). Par défaut, seuls les produits activés sont retournés.",
+ "schema": { "type": "boolean", "default": false, "example": false }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Liste paginée de produits",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiPaginatedEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ },
+ "x-codeSamples": [
+ {
+ "lang": "curl",
+ "label": "curl",
+ "source": "curl 'https://systems.xedoapp.com/marketplace/v1/products?per_page=20&_sort=createdAt&_order=desc' \\\n -H \"Authorization: Bearer xdk_live_xxx\""
+ },
+ {
+ "lang": "JavaScript",
+ "label": "Node",
+ "source": "const url = new URL('https://systems.xedoapp.com/marketplace/v1/products');\nurl.searchParams.set('per_page', '20');\nurl.searchParams.set('_sort', 'createdAt');\nurl.searchParams.set('_order', 'desc');\nconst res = await fetch(url, {\n headers: { Authorization: 'Bearer xdk_live_xxx' }\n});\nconst { data, total } = await res.json();"
+ }
+ ]
+ }
+ },
+ "/v1/products/{publicId}": {
+ "get": {
+ "operationId": "getProductByPublicId",
+ "summary": "Récupérer un produit par son identifiant public",
+ "description": "Renvoie un produit unique (avec variations, combinaisons et galerie). Passez `includeDisabled=true` pour résoudre également les brouillons.",
+ "tags": ["Products"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "PRD-XPK39ZQA01" }
+ },
+ {
+ "name": "includeDisabled",
+ "in": "query",
+ "required": false,
+ "description": "Permet de résoudre un produit désactivé (brouillon).",
+ "schema": { "type": "boolean", "default": false, "example": false }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Produit trouvé",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/ProductNotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/products/by-slug/{slug}": {
+ "get": {
+ "operationId": "getProductBySlug",
+ "summary": "Récupérer un produit par son slug",
+ "description": "Renvoie un produit unique recherché par son slug URL-friendly. Passez `includeDisabled=true` pour résoudre également les brouillons.",
+ "tags": ["Products"],
+ "parameters": [
+ {
+ "name": "slug",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "burger-classic" }
+ },
+ {
+ "name": "includeDisabled",
+ "in": "query",
+ "required": false,
+ "description": "Permet de résoudre un produit désactivé (brouillon).",
+ "schema": { "type": "boolean", "default": false, "example": false }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Produit trouvé",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/ProductNotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/collections": {
+ "get": {
+ "operationId": "listCollections",
+ "summary": "Lister les collections",
+ "description": "Renvoie les collections du marchand (paginées). Supporte le tri et la recherche par nom.",
+ "tags": ["Collections"],
+ "parameters": [
+ { "$ref": "#/components/parameters/Page" },
+ { "$ref": "#/components/parameters/PerPage" },
+ {
+ "name": "_sort",
+ "in": "query",
+ "required": false,
+ "description": "Colonne de tri.",
+ "schema": {
+ "type": "string",
+ "enum": ["id", "name", "createdAt"],
+ "example": "createdAt"
+ }
+ },
+ { "$ref": "#/components/parameters/Order" },
+ {
+ "name": "search",
+ "in": "query",
+ "required": false,
+ "description": "Recherche plein-texte sur le nom de la collection (3 caractères minimum).",
+ "schema": { "type": "string", "example": "fast-food" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Liste paginée de collections",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiPaginatedEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/collections/{publicId}": {
+ "get": {
+ "operationId": "getCollectionByPublicId",
+ "summary": "Récupérer une collection par son identifiant public",
+ "tags": ["Collections"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "COL-9023748120" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Collection trouvée",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/NotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/collections/by-slug/{slug}": {
+ "get": {
+ "operationId": "getCollectionBySlug",
+ "summary": "Récupérer une collection par son slug",
+ "tags": ["Collections"],
+ "parameters": [
+ {
+ "name": "slug",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "fast-food" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Collection trouvée",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/NotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/orders": {
+ "get": {
+ "operationId": "listOrders",
+ "summary": "Lister les commandes",
+ "description": "Renvoie les commandes du marchand (paniers payés) paginées. Supporte la recherche sur le `publicId` de commande, la référence de paiement et les données client.",
+ "tags": ["Orders"],
+ "parameters": [
+ { "$ref": "#/components/parameters/Page" },
+ { "$ref": "#/components/parameters/PerPage" },
+ {
+ "name": "_sort",
+ "in": "query",
+ "required": false,
+ "description": "Colonne de tri.",
+ "schema": {
+ "type": "string",
+ "enum": ["id", "createdAt", "amount"],
+ "example": "createdAt"
+ }
+ },
+ { "$ref": "#/components/parameters/Order" },
+ {
+ "name": "search",
+ "in": "query",
+ "required": false,
+ "description": "Recherche plein-texte sur le `publicId` de commande, la référence de paiement ou les infos client.",
+ "schema": { "type": "string", "example": "ORD-XPK" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Liste paginée de commandes",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiPaginatedEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/orders/{publicId}": {
+ "get": {
+ "operationId": "getOrderByPublicId",
+ "summary": "Récupérer une commande par son identifiant public",
+ "description": "Renvoie le détail d'une commande (items, totaux, paiement, livraison).",
+ "tags": ["Orders"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "ORD-XPK39ZQA01" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Commande trouvée",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/NotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/orders/{publicId}/invoice": {
+ "get": {
+ "operationId": "getOrderInvoice",
+ "summary": "Télécharger la facture (PDF)",
+ "description": "Renvoie la facture de la commande au format PDF (`application/pdf`). Renvoie 404 si aucune facture n'a encore été générée.",
+ "tags": ["Orders"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "ORD-XPK39ZQA01" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Flux PDF de la facture",
+ "content": {
+ "application/pdf": {
+ "schema": { "type": "string", "format": "binary" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/NotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/carts": {
+ "get": {
+ "operationId": "listCarts",
+ "summary": "Lister les paniers",
+ "description": "Renvoie les paniers du marchand (paginés). Les paniers `DRAFT` sont réservés à un usage interne et ne sont jamais exposés.",
+ "tags": ["Carts"],
+ "parameters": [
+ { "$ref": "#/components/parameters/Page" },
+ { "$ref": "#/components/parameters/PerPage" },
+ {
+ "name": "_sort",
+ "in": "query",
+ "required": false,
+ "description": "Colonne de tri.",
+ "schema": {
+ "type": "string",
+ "enum": ["id", "createdAt"],
+ "example": "createdAt"
+ }
+ },
+ { "$ref": "#/components/parameters/Order" },
+ {
+ "name": "search",
+ "in": "query",
+ "required": false,
+ "description": "Recherche plein-texte sur le `publicId` de panier ou les infos client.",
+ "schema": { "type": "string", "example": "CART-XPK" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Liste paginée de paniers",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiPaginatedEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ },
+ "post": {
+ "operationId": "createCart",
+ "summary": "Créer un panier et initier le paiement",
+ "description": "Crée un panier en `PENDING_PAYMENT` avec le client / les items / la livraison fournis, génère une ligne de paiement et demande une URL de checkout au provider de paiement. Si l'appel provider échoue, le panier est conservé et un `502 PAYMENT_INIT_FAILED` est retourné — relancez via `POST /v1/carts/{publicId}/pay`.",
+ "tags": ["Carts"],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiCheckoutCreateDto" }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Panier créé, URL de checkout dans `data.checkoutUrl`",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/CheckoutNotFound" },
+ "422": { "$ref": "#/components/responses/InsufficientStock" },
+ "429": { "$ref": "#/components/responses/RateLimited" },
+ "502": { "$ref": "#/components/responses/PaymentInitFailed" }
+ },
+ "x-codeSamples": [
+ {
+ "lang": "curl",
+ "label": "curl",
+ "source": "curl -X POST https://systems.xedoapp.com/marketplace/v1/carts \\\n -H \"Authorization: Bearer xdk_live_xxx\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"customer\": { \"firstName\": \"Jean\", \"lastName\": \"Kouassi\", \"email\": \"jean@example.com\", \"phone\": \"+225 07 12 34 56 78\" },\n \"items\": [{ \"publicProductId\": \"PRD-XPK39ZQA01\", \"quantity\": 2 }],\n \"delivery\": { \"deliveryType\": \"DELIVERY\", \"deliveryAreaId\": 11 },\n \"paymentMethod\": \"external_wallet\",\n \"returnUrl\": \"https://my-shop.com/after-checkout\"\n }'"
+ },
+ {
+ "lang": "JavaScript",
+ "label": "Node",
+ "source": "const res = await fetch('https://systems.xedoapp.com/marketplace/v1/carts', {\n method: 'POST',\n headers: {\n Authorization: 'Bearer xdk_live_xxx',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n customer: { firstName: 'Jean', lastName: 'Kouassi', email: 'jean@example.com', phone: '+225 07 12 34 56 78' },\n items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],\n delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },\n paymentMethod: 'external_wallet',\n returnUrl: 'https://my-shop.com/after-checkout'\n })\n});\nconst { data } = await res.json();\nwindow.location.href = data.checkoutUrl;"
+ }
+ ]
+ }
+ },
+ "/v1/carts/{publicId}": {
+ "get": {
+ "operationId": "getCartByPublicId",
+ "summary": "Récupérer un panier par son identifiant public",
+ "description": "Renvoie le détail d'un panier (items, totaux, livraison).",
+ "tags": ["Carts"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "CART-XPK39ZQA01" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Panier trouvé",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/CartNotFound" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ }
+ }
+ },
+ "/v1/carts/preview": {
+ "post": {
+ "operationId": "previewCart",
+ "summary": "Calculer les totaux d'un panier sans le persister",
+ "description": "Prévisualisation sans état. Valide les items, la zone de livraison et la configuration split, puis renvoie les totaux finaux. Aucun panier n'est créé.",
+ "tags": ["Carts"],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiCheckoutPreviewDto" }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Totaux calculés",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "400": { "$ref": "#/components/responses/BadRequest" },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/CheckoutNotFound" },
+ "422": { "$ref": "#/components/responses/InsufficientStock" },
+ "429": { "$ref": "#/components/responses/RateLimited" }
+ },
+ "x-codeSamples": [
+ {
+ "lang": "curl",
+ "label": "curl",
+ "source": "curl -X POST https://systems.xedoapp.com/marketplace/v1/carts/preview \\\n -H \"Authorization: Bearer xdk_live_xxx\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"items\": [{ \"publicProductId\": \"PRD-XPK39ZQA01\", \"quantity\": 2 }],\n \"delivery\": { \"deliveryType\": \"DELIVERY\", \"deliveryAreaId\": 11 },\n \"paymentMethod\": \"external_wallet\"\n }'"
+ },
+ {
+ "lang": "JavaScript",
+ "label": "Node",
+ "source": "const res = await fetch('https://systems.xedoapp.com/marketplace/v1/carts/preview', {\n method: 'POST',\n headers: {\n Authorization: 'Bearer xdk_live_xxx',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],\n delivery: { deliveryType: 'DELIVERY', deliveryAreaId: 11 },\n paymentMethod: 'external_wallet'\n })\n});\nconst { data } = await res.json();"
+ }
+ ]
+ }
+ },
+ "/v1/carts/{publicId}/pay": {
+ "post": {
+ "operationId": "retryCartPayment",
+ "summary": "Relancer l'initialisation du paiement d'un panier existant",
+ "description": "À utiliser uniquement lorsque l'appel précédent à `POST /v1/carts` a renvoyé `502 PAYMENT_INIT_FAILED` — c'est-à-dire que le panier est en `PENDING_PAYMENT` avec une ligne de paiement en attente. Re-sollicite le provider de paiement avec la même référence.",
+ "tags": ["Carts"],
+ "parameters": [
+ {
+ "name": "publicId",
+ "in": "path",
+ "required": true,
+ "schema": { "type": "string", "example": "CART-XPK39ZQA01" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiCheckoutRetryPayDto" }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Nouvelle URL de checkout dans `data.checkoutUrl`",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiSuccessEnvelopeDto" }
+ }
+ }
+ },
+ "401": { "$ref": "#/components/responses/Unauthorized" },
+ "404": { "$ref": "#/components/responses/CartNotFound" },
+ "409": { "$ref": "#/components/responses/CartNotRetryable" },
+ "429": { "$ref": "#/components/responses/RateLimited" },
+ "502": { "$ref": "#/components/responses/PaymentInitFailed" }
+ }
+ }
+ }
+ },
+ "components": {
+ "securitySchemes": {
+ "developer-api-key": {
+ "type": "http",
+ "scheme": "bearer",
+ "bearerFormat": "xdk_…",
+ "description": "Clé API Developer émise depuis le tableau de bord marchand. Format : `xdk_live_…` ou `xdk_test_…`."
+ }
+ },
+ "parameters": {
+ "Page": {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "description": "Numéro de page (≥ 1).",
+ "schema": { "type": "integer", "minimum": 1, "default": 1, "example": 1 }
+ },
+ "PerPage": {
+ "name": "per_page",
+ "in": "query",
+ "required": false,
+ "description": "Taille de page (bornée par la config plateforme, ~100 max).",
+ "schema": { "type": "integer", "minimum": 1, "default": 10, "example": 10 }
+ },
+ "Order": {
+ "name": "_order",
+ "in": "query",
+ "required": false,
+ "description": "Sens de tri.",
+ "schema": {
+ "type": "string",
+ "enum": ["asc", "desc"],
+ "default": "desc",
+ "example": "desc"
+ }
+ }
+ },
+ "responses": {
+ "Unauthorized": {
+ "description": "Clé API manquante ou invalide",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "examples": {
+ "missing": {
+ "summary": "Header Authorization absent",
+ "value": {
+ "success": false,
+ "code": "MISSING_DEVELOPER_API_KEY",
+ "message": "Aucune clé API n'a été fournie"
+ }
+ },
+ "invalid": {
+ "summary": "Clé inconnue ou désactivée",
+ "value": {
+ "success": false,
+ "code": "INVALID_DEVELOPER_API_KEY",
+ "message": "Clé API invalide"
+ }
+ }
+ }
+ }
+ }
+ },
+ "BadRequest": {
+ "description": "Requête invalide (validation du body ou de la query)",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "BAD_REQUEST",
+ "message": "La requête est invalide",
+ "errors": {
+ "items": ["doit contenir au moins 1 élément"]
+ }
+ }
+ }
+ }
+ },
+ "NotFound": {
+ "description": "Ressource introuvable",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "NOT_FOUND",
+ "message": "Ressource introuvable"
+ }
+ }
+ }
+ },
+ "ProductNotFound": {
+ "description": "Produit introuvable",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "PRODUCT_NOT_FOUND",
+ "message": "Le produit n'a pas été trouvé"
+ }
+ }
+ }
+ },
+ "CartNotFound": {
+ "description": "Panier introuvable",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "CART_NOT_FOUND",
+ "message": "Le panier n'a pas été trouvé"
+ }
+ }
+ }
+ },
+ "CartNotRetryable": {
+ "description": "Le panier n'est plus dans un état autorisant un retry",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "CART_NOT_RETRYABLE",
+ "message": "Ce panier n'est plus en attente de paiement"
+ }
+ }
+ }
+ },
+ "CheckoutNotFound": {
+ "description": "Une dépendance du checkout est introuvable (produit, combinaison ou zone de livraison)",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "examples": {
+ "product": {
+ "summary": "Produit inconnu",
+ "value": {
+ "success": false,
+ "code": "PRODUCT_NOT_FOUND",
+ "message": "Le produit n'a pas été trouvé"
+ }
+ },
+ "combination": {
+ "summary": "Combinaison inconnue",
+ "value": {
+ "success": false,
+ "code": "COMBINATION_NOT_FOUND",
+ "message": "La combinaison n'a pas été trouvée"
+ }
+ },
+ "deliveryArea": {
+ "summary": "Zone de livraison inconnue",
+ "value": {
+ "success": false,
+ "code": "DELIVERY_AREA_NOT_FOUND",
+ "message": "La zone de livraison n'a pas été trouvée"
+ }
+ }
+ }
+ }
+ }
+ },
+ "InsufficientStock": {
+ "description": "Stock insuffisant pour un ou plusieurs items",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "INSUFFICIENT_STOCK",
+ "message": "Le stock est insuffisant",
+ "errors": {
+ "PRD-XPK39ZQA01": ["stock disponible : 1, demandé : 2"]
+ }
+ }
+ }
+ }
+ },
+ "RateLimited": {
+ "description": "Limite de débit dépassée. Consultez le header `Retry-After` (secondes).",
+ "headers": {
+ "Retry-After": {
+ "description": "Nombre de secondes à attendre avant de réessayer.",
+ "schema": { "type": "integer", "example": 24 }
+ },
+ "X-RateLimit-Limit": {
+ "description": "Limite de la fenêtre courante.",
+ "schema": { "type": "integer", "example": 600 }
+ },
+ "X-RateLimit-Remaining": {
+ "description": "Requêtes restantes dans la fenêtre.",
+ "schema": { "type": "integer", "example": 0 }
+ },
+ "X-RateLimit-Reset": {
+ "description": "Timestamp Unix de réinitialisation de la fenêtre.",
+ "schema": { "type": "integer", "example": 1716639600 }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "RATE_LIMITED",
+ "message": "Trop de requêtes, veuillez patienter"
+ }
+ }
+ }
+ },
+ "PaymentInitFailed": {
+ "description": "Le provider de paiement n'a pas pu être joint. Le panier est conservé — relancez via `POST /v1/carts/{publicId}/pay`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/DevApiErrorEnvelopeDto" },
+ "example": {
+ "success": false,
+ "code": "PAYMENT_INIT_FAILED",
+ "message": "L'initialisation du paiement a échoué, réessayez via /pay",
+ "data": {
+ "cartPublicId": "CART-XPK39ZQA01"
+ }
+ }
+ }
+ }
+ }
+ },
+ "schemas": {
+ "DevApiSuccessEnvelopeDto": {
+ "type": "object",
+ "description": "Enveloppe de réponse standard pour une ressource unique.",
+ "properties": {
+ "success": { "type": "boolean", "example": true },
+ "data": { "type": "object", "description": "Charge utile de la réponse." }
+ },
+ "required": ["success", "data"]
+ },
+ "DevApiPaginatedEnvelopeDto": {
+ "type": "object",
+ "description": "Enveloppe de réponse standard pour une collection paginée. Le header `Content-Range` accompagne toujours cette réponse.",
+ "properties": {
+ "success": { "type": "boolean", "example": true },
+ "data": {
+ "type": "array",
+ "items": { "type": "object" },
+ "description": "Tableau d'éléments pour la page courante."
+ },
+ "total": {
+ "type": "integer",
+ "example": 42,
+ "description": "Nombre total de lignes correspondant à la requête."
+ },
+ "start": {
+ "type": "integer",
+ "example": 1,
+ "description": "Index (1-based) de la première ligne renvoyée."
+ },
+ "end": {
+ "type": "integer",
+ "example": 10,
+ "description": "Index (1-based) de la dernière ligne renvoyée."
+ }
+ },
+ "required": ["success", "data", "total", "start", "end"]
+ },
+ "DevApiErrorEnvelopeDto": {
+ "type": "object",
+ "description": "Enveloppe d'erreur standard. Le champ `errors` (optionnel) détaille les violations par champ pour les erreurs de validation.",
+ "properties": {
+ "success": { "type": "boolean", "example": false },
+ "code": {
+ "type": "string",
+ "description": "Code d'erreur machine-readable. Voir la page Ressources › Erreurs pour la liste complète.",
+ "example": "PRODUCT_NOT_FOUND"
+ },
+ "message": {
+ "type": "string",
+ "description": "Message lisible par un humain (français).",
+ "example": "Le produit n'a pas été trouvé"
+ },
+ "errors": {
+ "type": "object",
+ "description": "Détail des violations par champ (uniquement pour les erreurs de validation).",
+ "additionalProperties": {
+ "type": "array",
+ "items": { "type": "string" }
+ }
+ },
+ "data": {
+ "type": "object",
+ "description": "Contexte additionnel optionnel (ex. `cartPublicId` sur `PAYMENT_INIT_FAILED`)."
+ }
+ },
+ "required": ["success", "code", "message"]
+ },
+ "DevApiCheckoutItemDto": {
+ "type": "object",
+ "properties": {
+ "publicProductId": { "type": "string", "example": "PRD-XPK39ZQA01" },
+ "quantity": { "type": "integer", "example": 2, "minimum": 1 },
+ "combinationPublicId": {
+ "type": "string",
+ "example": "COMB-ABC123",
+ "description": "Identifiant public de la combinaison (SKU) si le produit a des variations."
+ }
+ },
+ "required": ["publicProductId", "quantity"]
+ },
+ "DevApiCheckoutDeliveryDto": {
+ "type": "object",
+ "properties": {
+ "deliveryType": {
+ "type": "string",
+ "enum": ["DELIVERY", "PICKUP"],
+ "example": "DELIVERY"
+ },
+ "deliveryAreaId": {
+ "type": "integer",
+ "example": 11,
+ "description": "Requis lorsque `deliveryType = DELIVERY`."
+ }
+ },
+ "required": ["deliveryType"]
+ },
+ "DevApiCheckoutCustomerDto": {
+ "type": "object",
+ "properties": {
+ "firstName": { "type": "string", "example": "Jean" },
+ "lastName": { "type": "string", "example": "Kouassi" },
+ "email": { "type": "string", "format": "email", "example": "jean@example.com" },
+ "phone": { "type": "string", "example": "+225 07 12 34 56 78" }
+ },
+ "required": ["firstName", "lastName", "email", "phone"]
+ },
+ "DevApiCheckoutPreviewDto": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/DevApiCheckoutItemDto" }
+ },
+ "delivery": { "$ref": "#/components/schemas/DevApiCheckoutDeliveryDto" },
+ "paymentMethod": {
+ "type": "string",
+ "enum": ["external_wallet", "split_payment"],
+ "example": "external_wallet",
+ "description": "Modes de paiement actuellement exposés par la Developer API."
+ }
+ },
+ "required": ["items", "delivery", "paymentMethod"]
+ },
+ "DevApiCheckoutCreateDto": {
+ "type": "object",
+ "properties": {
+ "customer": { "$ref": "#/components/schemas/DevApiCheckoutCustomerDto" },
+ "items": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/DevApiCheckoutItemDto" }
+ },
+ "delivery": { "$ref": "#/components/schemas/DevApiCheckoutDeliveryDto" },
+ "paymentMethod": {
+ "type": "string",
+ "enum": ["external_wallet", "split_payment"],
+ "example": "external_wallet"
+ },
+ "returnUrl": {
+ "type": "string",
+ "format": "uri",
+ "example": "https://my-shop.com/after-checkout",
+ "description": "URL HTTPS vers laquelle le client est redirigé après le checkout. Doit obligatoirement être en HTTPS."
+ },
+ "additionalDetails": {
+ "type": "string",
+ "example": "Appeler 30 min avant"
+ },
+ "meta": {
+ "type": "object",
+ "description": "Charge JSON libre renvoyée telle quelle dans toutes les réponses panier / commande. Utilisez-la pour rattacher vos propres identifiants (ex. `internalOrderId`).",
+ "example": {
+ "internalOrderId": "ORD-12345",
+ "source": "mobile-app"
+ }
+ }
+ },
+ "required": [
+ "customer",
+ "items",
+ "delivery",
+ "paymentMethod",
+ "returnUrl"
+ ]
+ },
+ "DevApiCheckoutRetryPayDto": {
+ "type": "object",
+ "properties": {
+ "returnUrl": {
+ "type": "string",
+ "format": "uri",
+ "example": "https://my-shop.com/after-checkout"
+ }
+ },
+ "required": ["returnUrl"]
+ }
+ }
+ }
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..7b14ea8
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,4884 @@
+{
+ "name": "@xedo/sdk",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@xedo/sdk",
+ "version": "0.1.0",
+ "license": "MIT",
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@types/node": "^20.16.0",
+ "eslint": "^9.13.0",
+ "msw": "^2.4.0",
+ "openapi-typescript": "^7.4.0",
+ "tsup": "^8.3.0",
+ "typescript": "^5.6.0",
+ "typescript-eslint": "^8.10.0",
+ "vitest": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@inquirer/ansi": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz",
+ "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz",
+ "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.2.1",
+ "@inquirer/type": "^4.0.7"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz",
+ "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.7",
+ "@inquirer/type": "^4.0.7",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz",
+ "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz",
+ "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mswjs/interceptors": {
+ "version": "0.41.9",
+ "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz",
+ "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@open-draft/deferred-promise": "^2.2.0",
+ "@open-draft/logger": "^0.3.0",
+ "@open-draft/until": "^2.0.0",
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.3",
+ "strict-event-emitter": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
+ "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz",
+ "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@open-draft/deferred-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz",
+ "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@open-draft/logger": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
+ "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.0"
+ }
+ },
+ "node_modules/@open-draft/until": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
+ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.133.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz",
+ "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@redocly/ajv": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz",
+ "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js-replace": "^1.0.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@redocly/ajv/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@redocly/config": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz",
+ "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@redocly/openapi-core": {
+ "version": "1.34.15",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.15.tgz",
+ "integrity": "sha512-HAwCnNyKcs5XGQqms+9t7OdAPM/5TDstmhF+0i7tdCFato2QKuYIlyWETwkXd8c5zbltr1oB+6y9NTeQLr2d6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/ajv": "8.11.2",
+ "@redocly/config": "0.22.0",
+ "colorette": "1.4.0",
+ "https-proxy-agent": "7.0.6",
+ "js-levenshtein": "1.1.6",
+ "js-yaml": "4.1.1",
+ "minimatch": "5.1.9",
+ "pluralize": "8.0.0",
+ "yaml-ast-parser": "0.0.43"
+ },
+ "engines": {
+ "node": ">=18.17.0",
+ "npm": ">=9.5.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/brace-expansion": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz",
+ "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz",
+ "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz",
+ "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz",
+ "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz",
+ "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz",
+ "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz",
+ "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz",
+ "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz",
+ "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz",
+ "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz",
+ "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz",
+ "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz",
+ "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz",
+ "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz",
+ "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz",
+ "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz",
+ "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz",
+ "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz",
+ "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz",
+ "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz",
+ "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz",
+ "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz",
+ "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz",
+ "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz",
+ "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz",
+ "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz",
+ "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz",
+ "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz",
+ "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz",
+ "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz",
+ "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz",
+ "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz",
+ "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz",
+ "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz",
+ "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz",
+ "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz",
+ "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz",
+ "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz",
+ "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz",
+ "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz",
+ "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.19.43",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz",
+ "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/set-cookie-parser": {
+ "version": "2.4.10",
+ "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz",
+ "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/statuses": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
+ "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz",
+ "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/type-utils": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.61.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz",
+ "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz",
+ "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.61.0",
+ "@typescript-eslint/types": "^8.61.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz",
+ "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz",
+ "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz",
+ "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz",
+ "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz",
+ "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.61.0",
+ "@typescript-eslint/tsconfig-utils": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz",
+ "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz",
+ "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz",
+ "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.8",
+ "@vitest/utils": "4.1.8",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz",
+ "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "4.1.8",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz",
+ "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz",
+ "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.8",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz",
+ "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.8",
+ "@vitest/utils": "4.1.8",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz",
+ "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz",
+ "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.8",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.17.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
+ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
+ "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/bundle-require": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
+ "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "load-tsconfig": "^0.2.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.18"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz",
+ "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-string-width": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-truncated-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-width": "^3.0.2"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fix-dts-default-cjs-exports": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
+ "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "rollup": "^4.34.8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphql": {
+ "version": "16.14.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz",
+ "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/headers-polyfill": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-5.0.1.tgz",
+ "integrity": "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/set-cookie-parser": "^2.4.10",
+ "set-cookie-parser": "^3.0.1"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-node-process": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
+ "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
+ "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "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"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/load-tsconfig": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+ "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/msw": {
+ "version": "2.14.6",
+ "resolved": "https://registry.npmjs.org/msw/-/msw-2.14.6.tgz",
+ "integrity": "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/confirm": "^6.0.11",
+ "@mswjs/interceptors": "^0.41.3",
+ "@open-draft/deferred-promise": "^3.0.0",
+ "@types/statuses": "^2.0.6",
+ "cookie": "^1.1.1",
+ "graphql": "^16.13.2",
+ "headers-polyfill": "^5.0.1",
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.3",
+ "path-to-regexp": "^6.3.0",
+ "picocolors": "^1.1.1",
+ "rettime": "^0.11.11",
+ "statuses": "^2.0.2",
+ "strict-event-emitter": "^0.5.1",
+ "tough-cookie": "^6.0.1",
+ "type-fest": "^5.5.0",
+ "until-async": "^3.0.2",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "msw": "cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mswjs"
+ },
+ "peerDependencies": {
+ "typescript": ">= 4.8.x"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
+ "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz",
+ "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/openapi-typescript": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz",
+ "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/openapi-core": "^1.34.6",
+ "ansi-colors": "^4.1.3",
+ "change-case": "^5.4.4",
+ "parse-json": "^8.3.0",
+ "supports-color": "^10.2.2",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "openapi-typescript": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "typescript": "^5.x"
+ }
+ },
+ "node_modules/openapi-typescript/node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/outvariant": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
+ "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.15",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rettime": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.11.11.tgz",
+ "integrity": "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz",
+ "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.133.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.3",
+ "@rolldown/binding-darwin-arm64": "1.0.3",
+ "@rolldown/binding-darwin-x64": "1.0.3",
+ "@rolldown/binding-freebsd-x64": "1.0.3",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.3",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.3",
+ "@rolldown/binding-linux-arm64-musl": "1.0.3",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.3",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-musl": "1.0.3",
+ "@rolldown/binding-openharmony-arm64": "1.0.3",
+ "@rolldown/binding-wasm32-wasi": "1.0.3",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.3",
+ "@rolldown/binding-win32-x64-msvc": "1.0.3"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.61.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz",
+ "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.61.1",
+ "@rollup/rollup-android-arm64": "4.61.1",
+ "@rollup/rollup-darwin-arm64": "4.61.1",
+ "@rollup/rollup-darwin-x64": "4.61.1",
+ "@rollup/rollup-freebsd-arm64": "4.61.1",
+ "@rollup/rollup-freebsd-x64": "4.61.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.61.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.61.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.61.1",
+ "@rollup/rollup-linux-arm64-musl": "4.61.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.61.1",
+ "@rollup/rollup-linux-loong64-musl": "4.61.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.61.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.61.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.61.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.61.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.61.1",
+ "@rollup/rollup-linux-x64-gnu": "4.61.1",
+ "@rollup/rollup-linux-x64-musl": "4.61.1",
+ "@rollup/rollup-openbsd-x64": "4.61.1",
+ "@rollup/rollup-openharmony-arm64": "4.61.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.61.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.61.1",
+ "@rollup/rollup-win32-x64-gnu": "4.61.1",
+ "@rollup/rollup-win32-x64-msvc": "4.61.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
+ "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz",
+ "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz",
+ "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/strict-event-emitter": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
+ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.1",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "tinyglobby": "^0.2.11",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz",
+ "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^7.4.2"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz",
+ "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tough-cookie": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz",
+ "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^7.0.5"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/tsup": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz",
+ "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bundle-require": "^5.1.0",
+ "cac": "^6.7.14",
+ "chokidar": "^4.0.3",
+ "consola": "^3.4.0",
+ "debug": "^4.4.0",
+ "esbuild": "^0.27.0",
+ "fix-dts-default-cjs-exports": "^1.0.0",
+ "joycon": "^3.1.1",
+ "picocolors": "^1.1.1",
+ "postcss-load-config": "^6.0.1",
+ "resolve-from": "^5.0.0",
+ "rollup": "^4.34.8",
+ "source-map": "^0.7.6",
+ "sucrase": "^3.35.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.11",
+ "tree-kill": "^1.2.2"
+ },
+ "bin": {
+ "tsup": "dist/cli-default.js",
+ "tsup-node": "dist/cli-node.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@microsoft/api-extractor": "^7.36.0",
+ "@swc/core": "^1",
+ "postcss": "^8.4.12",
+ "typescript": ">=4.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@microsoft/api-extractor": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tsup/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz",
+ "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz",
+ "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.61.0",
+ "@typescript-eslint/parser": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/until-async": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz",
+ "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/kettanaito"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uri-js-replace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz",
+ "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz",
+ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.15",
+ "rolldown": "1.0.3",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.18",
+ "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
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz",
+ "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.8",
+ "@vitest/mocker": "4.1.8",
+ "@vitest/pretty-format": "4.1.8",
+ "@vitest/runner": "4.1.8",
+ "@vitest/snapshot": "4.1.8",
+ "@vitest/spy": "4.1.8",
+ "@vitest/utils": "4.1.8",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.8",
+ "@vitest/browser-preview": "4.1.8",
+ "@vitest/browser-webdriverio": "4.1.8",
+ "@vitest/coverage-istanbul": "4.1.8",
+ "@vitest/coverage-v8": "4.1.8",
+ "@vitest/ui": "4.1.8",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/tinyexec": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
+ "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml-ast-parser": {
+ "version": "0.0.43",
+ "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
+ "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7b5a076
--- /dev/null
+++ b/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "@xedo/sdk",
+ "version": "0.1.0",
+ "description": "Official Node.js/TypeScript SDK for the Xedo Developer API v1 — typed client for products, collections, orders & checkout.",
+ "license": "MIT",
+ "author": "Xedo",
+ "homepage": "https://developers.xedoapp.com",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/xedoapp/xedo-node.git"
+ },
+ "keywords": [
+ "xedo",
+ "sdk",
+ "ecommerce",
+ "headless",
+ "checkout",
+ "typescript"
+ ],
+ "type": "module",
+ "main": "./dist/index.cjs",
+ "module": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js",
+ "require": "./dist/index.cjs"
+ }
+ },
+ "files": [
+ "dist",
+ "README.md",
+ "LICENSE"
+ ],
+ "sideEffects": false,
+ "engines": {
+ "node": ">=18"
+ },
+ "scripts": {
+ "generate": "openapi-typescript openapi.json -o src/types/generated.ts",
+ "build": "tsup",
+ "typecheck": "tsc --noEmit",
+ "lint": "eslint .",
+ "test": "vitest run",
+ "test:watch": "vitest",
+ "prepublishOnly": "npm run build"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@types/node": "^20.16.0",
+ "eslint": "^9.13.0",
+ "msw": "^2.4.0",
+ "openapi-typescript": "^7.4.0",
+ "tsup": "^8.3.0",
+ "typescript": "^5.6.0",
+ "typescript-eslint": "^8.10.0",
+ "vitest": "^4.1.8"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/src/client.ts b/src/client.ts
new file mode 100644
index 0000000..194ecc2
--- /dev/null
+++ b/src/client.ts
@@ -0,0 +1,115 @@
+import { XedoConnectionError, XedoError } from './errors';
+import { Carts } from './resources/carts';
+import { Collections } from './resources/collections';
+import { Orders } from './resources/orders';
+import { Products } from './resources/products';
+import { Transport, type FetchLike } from './transport';
+import type { PingResult, RateLimitInfo, RequestOptions } from './types/public';
+
+const DEFAULT_BASE_URL = 'https://systems.xedoapp.com/marketplace';
+const DEFAULT_MAX_RETRIES = 4;
+const DEFAULT_TIMEOUT_MS = 30_000;
+
+export interface XedoOptions {
+ /** Developer API key: `xdk_live_…` or `xdk_test_…`. */
+ apiKey: string;
+ /** Override the API base URL. Defaults to the production marketplace URL. */
+ baseUrl?: string;
+ /** Max automatic retries on `429`. Defaults to 4. */
+ maxRetries?: number;
+ /** Per-request timeout in milliseconds. Defaults to 30000. */
+ timeoutMs?: number;
+ /** Inject a custom fetch (tests, edge runtimes). Defaults to global fetch. */
+ fetch?: FetchLike;
+ /**
+ * Escape hatch to run in a browser. Strongly discouraged: your
+ * `xdk_live_…` key would be exposed in the client bundle.
+ */
+ dangerouslyAllowBrowser?: boolean;
+}
+
+/**
+ * The Xedo Developer API client. Server-side only — see
+ * `dangerouslyAllowBrowser`.
+ *
+ * ```ts
+ * const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });
+ * const { data } = await xedo.products.list({ perPage: 20 });
+ * ```
+ */
+export class Xedo {
+ readonly products: Products;
+ readonly collections: Collections;
+ readonly orders: Orders;
+ readonly carts: Carts;
+
+ private readonly apiKey: string;
+ private readonly transport: Transport;
+
+ constructor(options: XedoOptions) {
+ if (!options?.apiKey) {
+ throw new XedoError({
+ code: 'MISSING_DEVELOPER_API_KEY',
+ status: 0,
+ message: 'A Xedo `apiKey` is required.',
+ });
+ }
+
+ const maybeWindow = (globalThis as { window?: { document?: unknown } }).window;
+ const isBrowser = typeof maybeWindow !== 'undefined' && typeof maybeWindow.document !== 'undefined';
+ if (isBrowser && !options.dangerouslyAllowBrowser) {
+ throw new XedoError({
+ code: 'BROWSER_ENV_DETECTED',
+ status: 0,
+ message:
+ 'The Xedo SDK is server-side only: running it in a browser would expose your ' +
+ 'xdk_live_… key in the client bundle. Call it from a server (Next.js Server ' +
+ 'Component / Route Handler, Express, a worker, …). See the README on authentication.',
+ });
+ }
+
+ const fetchImpl: FetchLike =
+ options.fetch ?? ((input, init) => globalThis.fetch(input, init));
+ if (typeof globalThis.fetch !== 'function' && !options.fetch) {
+ throw new XedoConnectionError({
+ code: 'NO_FETCH',
+ status: 0,
+ message: 'Global fetch is unavailable (Node >= 18 required) — pass `options.fetch`.',
+ });
+ }
+
+ this.apiKey = options.apiKey;
+ this.transport = new Transport({
+ apiKey: options.apiKey,
+ baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
+ maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
+ timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,
+ fetchImpl,
+ });
+
+ this.products = new Products(this.transport);
+ this.collections = new Collections(this.transport);
+ this.orders = new Orders(this.transport);
+ this.carts = new Carts(this.transport);
+ }
+
+ /**
+ * The environment inferred from the key prefix. The rest of the key is
+ * treated as opaque.
+ */
+ get environment(): 'test' | 'live' | 'unknown' {
+ if (this.apiKey.startsWith('xdk_live_')) return 'live';
+ if (this.apiKey.startsWith('xdk_test_')) return 'test';
+ return 'unknown';
+ }
+
+ /** Rate-limit headers from the most recent response, for monitoring. */
+ get lastRateLimit(): RateLimitInfo | null {
+ return this.transport.lastRateLimit;
+ }
+
+ /** `GET /v1/ping` — validate the API key end to end. */
+ ping(opts: RequestOptions = {}): Promise {
+ return this.transport.getData('GET', '/v1/ping', { signal: opts.signal });
+ }
+}
diff --git a/src/errors.ts b/src/errors.ts
new file mode 100644
index 0000000..0caec37
--- /dev/null
+++ b/src/errors.ts
@@ -0,0 +1,128 @@
+/**
+ * Typed error hierarchy. Every `success: false` response (and every transport
+ * failure) is thrown as a {@link XedoError} or one of its subclasses. Route on
+ * `error.code` (stable, machine-readable), never on `error.message` (French,
+ * subject to change).
+ */
+
+export interface XedoErrorParams {
+ message: string;
+ /** Machine-readable code, e.g. "PRODUCT_NOT_FOUND". */
+ code: string;
+ /** HTTP status (0 for transport/connection errors). */
+ status: number;
+ /** Per-field validation details. */
+ errors?: Record;
+ /** Extra context (e.g. `cartPublicId` on PAYMENT_INIT_FAILED). */
+ data?: unknown;
+ /** Request id, when the API returns one. */
+ requestId?: string;
+ /** `Retry-After` value in seconds, when present. */
+ retryAfter?: number;
+}
+
+export class XedoError extends Error {
+ readonly code: string;
+ readonly status: number;
+ readonly errors?: Record;
+ readonly data?: unknown;
+ readonly requestId?: string;
+
+ constructor(params: XedoErrorParams) {
+ super(params.message);
+ // Keep the concrete subclass name on instances created via `new.target`.
+ this.name = new.target.name;
+ this.code = params.code;
+ this.status = params.status;
+ this.errors = params.errors;
+ this.data = params.data;
+ this.requestId = params.requestId;
+ // Restore the prototype chain for `instanceof` under transpiled targets.
+ Object.setPrototypeOf(this, new.target.prototype);
+ }
+}
+
+/** 401 — `MISSING_DEVELOPER_API_KEY`, `INVALID_DEVELOPER_API_KEY`. */
+export class XedoAuthError extends XedoError {}
+
+/** 400 — bad request / invalid payment configuration. */
+export class XedoValidationError extends XedoError {}
+
+/** 404 — product, combination, delivery area, cart or generic not found. */
+export class XedoNotFoundError extends XedoError {}
+
+/** 422 — `INSUFFICIENT_STOCK` (per-product detail in `errors`). */
+export class XedoStockError extends XedoError {}
+
+/** 409 — `CART_NOT_RETRYABLE`. */
+export class XedoConflictError extends XedoError {}
+
+/** 429 — `RATE_LIMITED`. Exposes `retryAfter` (seconds). */
+export class XedoRateLimitError extends XedoError {
+ readonly retryAfter?: number;
+ constructor(params: XedoErrorParams) {
+ super(params);
+ this.retryAfter = params.retryAfter;
+ }
+}
+
+/**
+ * 502 — `PAYMENT_INIT_FAILED`. The cart was kept; relaunch the payment via
+ * `xedo.carts.pay(cartPublicId, …)`. Exposes `cartPublicId`.
+ */
+export class XedoPaymentInitError extends XedoError {
+ readonly cartPublicId?: string;
+ constructor(params: XedoErrorParams) {
+ super(params);
+ const data = params.data as { cartPublicId?: string } | undefined;
+ this.cartPublicId = data?.cartPublicId;
+ }
+}
+
+/** Transport-level failure (timeout, network, malformed response). */
+export class XedoConnectionError extends XedoError {}
+
+const CODE_MAP: Record XedoError> = {
+ MISSING_DEVELOPER_API_KEY: XedoAuthError,
+ INVALID_DEVELOPER_API_KEY: XedoAuthError,
+ BAD_REQUEST: XedoValidationError,
+ INVALID_PAYMENT_METHOD: XedoValidationError,
+ SPLIT_PAYMENT_NOT_ENABLED: XedoValidationError,
+ COMBINATION_PRODUCT_MISMATCH: XedoValidationError,
+ PRODUCT_NOT_FOUND: XedoNotFoundError,
+ COMBINATION_NOT_FOUND: XedoNotFoundError,
+ DELIVERY_AREA_NOT_FOUND: XedoNotFoundError,
+ CART_NOT_FOUND: XedoNotFoundError,
+ NOT_FOUND: XedoNotFoundError,
+ INSUFFICIENT_STOCK: XedoStockError,
+ CART_NOT_RETRYABLE: XedoConflictError,
+ RATE_LIMITED: XedoRateLimitError,
+ PAYMENT_INIT_FAILED: XedoPaymentInitError,
+};
+
+function fallbackByStatus(status: number): new (p: XedoErrorParams) => XedoError {
+ switch (status) {
+ case 400:
+ return XedoValidationError;
+ case 401:
+ return XedoAuthError;
+ case 404:
+ return XedoNotFoundError;
+ case 409:
+ return XedoConflictError;
+ case 422:
+ return XedoStockError;
+ case 429:
+ return XedoRateLimitError;
+ case 502:
+ return XedoPaymentInitError;
+ default:
+ return XedoError;
+ }
+}
+
+/** Build the most specific {@link XedoError} subclass for a failed response. */
+export function createXedoError(params: XedoErrorParams): XedoError {
+ const Ctor = CODE_MAP[params.code] ?? fallbackByStatus(params.status);
+ return new Ctor(params);
+}
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..fb408c1
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,43 @@
+export { Xedo, type XedoOptions } from './client';
+export type { FetchLike } from './transport';
+
+export {
+ XedoError,
+ XedoAuthError,
+ XedoValidationError,
+ XedoNotFoundError,
+ XedoStockError,
+ XedoConflictError,
+ XedoRateLimitError,
+ XedoPaymentInitError,
+ XedoConnectionError,
+ type XedoErrorParams,
+} from './errors';
+
+export type {
+ JsonObject,
+ SortOrder,
+ PingResult,
+ Product,
+ Collection,
+ Order,
+ Cart,
+ CheckoutPreview,
+ CheckoutResult,
+ ListParams,
+ ProductListParams,
+ CollectionListParams,
+ OrderListParams,
+ CartListParams,
+ RetrieveOptions,
+ RequestOptions,
+ PaginatedResult,
+ RateLimitInfo,
+ CheckoutItem,
+ CheckoutDelivery,
+ CheckoutCustomer,
+ PaymentMethod,
+ CheckoutPreviewInput,
+ CheckoutCreateInput,
+ CheckoutRetryPayInput,
+} from './types/public';
diff --git a/src/resources/base.ts b/src/resources/base.ts
new file mode 100644
index 0000000..8fb9af7
--- /dev/null
+++ b/src/resources/base.ts
@@ -0,0 +1,36 @@
+import type { Transport } from '../transport';
+import type { ListParams, PaginatedResult } from '../types/public';
+
+export abstract class Resource {
+ constructor(protected readonly transport: Transport) {}
+}
+
+/** Map the SDK's camelCase list params to the API's wire query keys. */
+export function toListQuery(params: ListParams): Record {
+ return {
+ page: params.page,
+ per_page: params.perPage,
+ _sort: (params as { sort?: string }).sort,
+ _order: params.order,
+ search: params.search,
+ };
+}
+
+/**
+ * Walk every page of a list endpoint, yielding items one by one. Defaults to a
+ * large page size to minimise round-trips; the transport's 429 retry provides
+ * the throughput guard.
+ */
+export async function* paginate(
+ fetchPage: (params: P) => Promise>,
+ params: P,
+): AsyncGenerator {
+ let page = params.page ?? 1;
+ const perPage = params.perPage ?? 100;
+ for (;;) {
+ const result = await fetchPage({ ...params, page, perPage });
+ for (const item of result.data) yield item;
+ if (result.data.length === 0 || result.end >= result.total) break;
+ page += 1;
+ }
+}
diff --git a/src/resources/carts.ts b/src/resources/carts.ts
new file mode 100644
index 0000000..8189d6d
--- /dev/null
+++ b/src/resources/carts.ts
@@ -0,0 +1,90 @@
+import { paginate, Resource, toListQuery } from './base';
+import { XedoPaymentInitError } from '../errors';
+import type {
+ Cart,
+ CartListParams,
+ CheckoutCreateInput,
+ CheckoutPreview,
+ CheckoutPreviewInput,
+ CheckoutResult,
+ CheckoutRetryPayInput,
+ PaginatedResult,
+ RequestOptions,
+} from '../types/public';
+
+export class Carts extends Resource {
+ /**
+ * `GET /v1/carts` — one page of carts. `DRAFT` carts are never exposed by
+ * the API.
+ */
+ list(params: CartListParams = {}): Promise> {
+ return this.transport.getPage('/v1/carts', {
+ query: toListQuery(params),
+ signal: params.signal,
+ });
+ }
+
+ /** Async iterator over every cart across all pages. */
+ listAll(params: CartListParams = {}): AsyncGenerator {
+ return paginate((p) => this.list(p), params);
+ }
+
+ /** `GET /v1/carts/{publicId}`. */
+ retrieve(publicId: string, opts: RequestOptions = {}): Promise {
+ return this.transport.getData('GET', `/v1/carts/${encodeURIComponent(publicId)}`, {
+ signal: opts.signal,
+ });
+ }
+
+ /** `POST /v1/carts/preview` — compute totals without persisting anything. */
+ preview(input: CheckoutPreviewInput, opts: RequestOptions = {}): Promise {
+ return this.transport.getData('POST', '/v1/carts/preview', {
+ body: input,
+ signal: opts.signal,
+ });
+ }
+
+ /**
+ * `POST /v1/carts` — create the cart (`PENDING_PAYMENT`) and return
+ * `data.checkoutUrl`. On a `502 PAYMENT_INIT_FAILED` the cart is kept; retry
+ * the payment with {@link Carts.pay} (or use {@link Carts.createAndPay}).
+ */
+ create(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise {
+ return this.transport.getData('POST', '/v1/carts', {
+ body: input,
+ signal: opts.signal,
+ });
+ }
+
+ /**
+ * `POST /v1/carts/{publicId}/pay` — relaunch payment initialization after a
+ * `502 PAYMENT_INIT_FAILED`.
+ */
+ pay(publicId: string, input: CheckoutRetryPayInput, opts: RequestOptions = {}): Promise {
+ return this.transport.getData(
+ 'POST',
+ `/v1/carts/${encodeURIComponent(publicId)}/pay`,
+ { body: input, signal: opts.signal },
+ );
+ }
+
+ /**
+ * Convenience wrapper around the 502 checkout flow: create the cart, and if
+ * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry
+ * `pay()` once with the same `returnUrl`. Stays transparent — it logs the
+ * code and never swallows a definitive failure.
+ */
+ async createAndPay(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise {
+ try {
+ return await this.create(input, opts);
+ } catch (err) {
+ if (err instanceof XedoPaymentInitError && err.cartPublicId) {
+ console.warn(
+ `[xedo] PAYMENT_INIT_FAILED for cart ${err.cartPublicId}; retrying once via pay().`,
+ );
+ return this.pay(err.cartPublicId, { returnUrl: input.returnUrl }, opts);
+ }
+ throw err;
+ }
+ }
+}
diff --git a/src/resources/collections.ts b/src/resources/collections.ts
new file mode 100644
index 0000000..7019460
--- /dev/null
+++ b/src/resources/collections.ts
@@ -0,0 +1,35 @@
+import { paginate, Resource, toListQuery } from './base';
+import type { Collection, CollectionListParams, PaginatedResult, RequestOptions } from '../types/public';
+
+export class Collections extends Resource {
+ /** `GET /v1/collections` — one page of collections. */
+ list(params: CollectionListParams = {}): Promise> {
+ return this.transport.getPage('/v1/collections', {
+ query: toListQuery(params),
+ signal: params.signal,
+ });
+ }
+
+ /** Async iterator over every collection across all pages. */
+ listAll(params: CollectionListParams = {}): AsyncGenerator {
+ return paginate((p) => this.list(p), params);
+ }
+
+ /** `GET /v1/collections/{publicId}`. */
+ retrieve(publicId: string, opts: RequestOptions = {}): Promise {
+ return this.transport.getData(
+ 'GET',
+ `/v1/collections/${encodeURIComponent(publicId)}`,
+ { signal: opts.signal },
+ );
+ }
+
+ /** `GET /v1/collections/by-slug/{slug}`. */
+ retrieveBySlug(slug: string, opts: RequestOptions = {}): Promise {
+ return this.transport.getData(
+ 'GET',
+ `/v1/collections/by-slug/${encodeURIComponent(slug)}`,
+ { signal: opts.signal },
+ );
+ }
+}
diff --git a/src/resources/orders.ts b/src/resources/orders.ts
new file mode 100644
index 0000000..8672413
--- /dev/null
+++ b/src/resources/orders.ts
@@ -0,0 +1,36 @@
+import { paginate, Resource, toListQuery } from './base';
+import type { Order, OrderListParams, PaginatedResult, RequestOptions } from '../types/public';
+
+export class Orders extends Resource {
+ /** `GET /v1/orders` — one page of paid orders. */
+ list(params: OrderListParams = {}): Promise> {
+ return this.transport.getPage('/v1/orders', {
+ query: toListQuery(params),
+ signal: params.signal,
+ });
+ }
+
+ /** Async iterator over every order across all pages. */
+ listAll(params: OrderListParams = {}): AsyncGenerator {
+ return paginate((p) => this.list(p), params);
+ }
+
+ /** `GET /v1/orders/{publicId}`. */
+ retrieve(publicId: string, opts: RequestOptions = {}): Promise {
+ return this.transport.getData('GET', `/v1/orders/${encodeURIComponent(publicId)}`, {
+ signal: opts.signal,
+ });
+ }
+
+ /**
+ * `GET /v1/orders/{publicId}/invoice` — the invoice PDF as a binary
+ * `ArrayBuffer` (not JSON). Throws {@link XedoNotFoundError} if the invoice
+ * has not been generated yet.
+ */
+ invoice(publicId: string, opts: RequestOptions = {}): Promise {
+ return this.transport.getBinary('GET', `/v1/orders/${encodeURIComponent(publicId)}/invoice`, {
+ accept: 'application/pdf',
+ signal: opts.signal,
+ });
+ }
+}
diff --git a/src/resources/products.ts b/src/resources/products.ts
new file mode 100644
index 0000000..33824db
--- /dev/null
+++ b/src/resources/products.ts
@@ -0,0 +1,38 @@
+import { paginate, Resource, toListQuery } from './base';
+import type { PaginatedResult, Product, ProductListParams, RetrieveOptions } from '../types/public';
+
+export class Products extends Resource {
+ /** `GET /v1/products` — one page of products. */
+ list(params: ProductListParams = {}): Promise> {
+ return this.transport.getPage('/v1/products', {
+ query: {
+ ...toListQuery(params),
+ collection: params.collection,
+ includeVariations: params.includeVariations,
+ includeDisabled: params.includeDisabled,
+ },
+ signal: params.signal,
+ });
+ }
+
+ /** Async iterator over every product across all pages. */
+ listAll(params: ProductListParams = {}): AsyncGenerator {
+ return paginate((p) => this.list(p), params);
+ }
+
+ /** `GET /v1/products/{publicId}`. */
+ retrieve(publicId: string, opts: RetrieveOptions = {}): Promise {
+ return this.transport.getData('GET', `/v1/products/${encodeURIComponent(publicId)}`, {
+ query: { includeDisabled: opts.includeDisabled },
+ signal: opts.signal,
+ });
+ }
+
+ /** `GET /v1/products/by-slug/{slug}`. */
+ retrieveBySlug(slug: string, opts: RetrieveOptions = {}): Promise {
+ return this.transport.getData('GET', `/v1/products/by-slug/${encodeURIComponent(slug)}`, {
+ query: { includeDisabled: opts.includeDisabled },
+ signal: opts.signal,
+ });
+ }
+}
diff --git a/src/transport.ts b/src/transport.ts
new file mode 100644
index 0000000..baeef5f
--- /dev/null
+++ b/src/transport.ts
@@ -0,0 +1,232 @@
+import { createXedoError, XedoConnectionError, type XedoErrorParams } from './errors';
+import type { PaginatedResult, RateLimitInfo } from './types/public';
+
+export type FetchLike = (
+ input: string | URL,
+ init?: RequestInit,
+) => Promise;
+
+export interface TransportOptions {
+ apiKey: string;
+ baseUrl: string;
+ maxRetries: number;
+ timeoutMs: number;
+ fetchImpl: FetchLike;
+}
+
+export interface RequestConfig {
+ query?: Record;
+ body?: unknown;
+ signal?: AbortSignal;
+ /** Accept header; defaults to `application/json`. */
+ accept?: string;
+}
+
+type HttpMethod = 'GET' | 'POST';
+
+interface Envelope {
+ success: boolean;
+ code?: string;
+ message?: string;
+ errors?: Record;
+ data?: unknown;
+ total?: number;
+ start?: number;
+ end?: number;
+}
+
+function sleep(ms: number, signal?: AbortSignal): Promise {
+ return new Promise((resolve, reject) => {
+ if (signal?.aborted) {
+ reject(signal.reason ?? new Error('Aborted'));
+ return;
+ }
+ const timer = setTimeout(() => {
+ signal?.removeEventListener('abort', onAbort);
+ resolve();
+ }, ms);
+ const onAbort = () => {
+ clearTimeout(timer);
+ reject(signal?.reason ?? new Error('Aborted'));
+ };
+ signal?.addEventListener('abort', onAbort, { once: true });
+ });
+}
+
+function parseHeaderInt(value: string | null): number | null {
+ if (value == null) return null;
+ const n = Number(value);
+ return Number.isFinite(n) ? n : null;
+}
+
+/**
+ * Owns the HTTP concern: auth header, query/body serialization, per-request
+ * timeout + abort, automatic 429 retries, envelope parsing and error mapping.
+ * Resources sit on top and never touch `fetch` directly.
+ */
+export class Transport {
+ lastRateLimit: RateLimitInfo | null = null;
+
+ constructor(private readonly opts: TransportOptions) {}
+
+ // --- Public helpers used by resources --------------------------------------
+
+ /** Run a request and return the unwrapped `data` payload, typed as `T`. */
+ async getData(method: HttpMethod, path: string, config: RequestConfig = {}): Promise {
+ const env = await this.requestJson(method, path, config);
+ return env.data as T;
+ }
+
+ /** Run a GET list request and return `{ data, total, start, end }`. */
+ async getPage(path: string, config: RequestConfig = {}): Promise> {
+ const env = await this.requestJson('GET', path, config);
+ return {
+ data: (env.data as T[]) ?? [],
+ total: env.total ?? 0,
+ start: env.start ?? 0,
+ end: env.end ?? 0,
+ };
+ }
+
+ /** Run a request that returns a binary body (e.g. the invoice PDF). */
+ async getBinary(method: HttpMethod, path: string, config: RequestConfig = {}): Promise {
+ const res = await this.execute(method, path, config);
+ if (!res.ok) {
+ throw this.toError(res, await this.tryParseJson(res));
+ }
+ return res.arrayBuffer();
+ }
+
+ // --- Internals -------------------------------------------------------------
+
+ private async requestJson(method: HttpMethod, path: string, config: RequestConfig): Promise {
+ const res = await this.execute(method, path, config);
+ const body = await this.tryParseJson(res);
+ if (!res.ok || body?.success === false) {
+ throw this.toError(res, body);
+ }
+ if (!body) {
+ throw new XedoConnectionError({
+ code: 'INVALID_RESPONSE',
+ status: res.status,
+ message: 'Expected a JSON response body but received none.',
+ });
+ }
+ return body;
+ }
+
+ private async tryParseJson(res: Response): Promise {
+ const text = await res.text();
+ if (!text) return undefined;
+ try {
+ return JSON.parse(text) as Envelope;
+ } catch {
+ return undefined;
+ }
+ }
+
+ private toError(res: Response, body: Envelope | undefined): Error {
+ const retryAfter = parseHeaderInt(res.headers.get('retry-after'));
+ const params: XedoErrorParams = {
+ code: body?.code ?? `HTTP_${res.status}`,
+ message: body?.message ?? res.statusText ?? 'Request failed',
+ status: res.status,
+ errors: body?.errors,
+ data: body?.data,
+ requestId: res.headers.get('x-request-id') ?? undefined,
+ retryAfter: retryAfter ?? undefined,
+ };
+ return createXedoError(params);
+ }
+
+ /** Fetch with retry on 429; returns the final {@link Response}. */
+ private async execute(method: HttpMethod, path: string, config: RequestConfig): Promise {
+ const url = this.buildUrl(path, config.query);
+ let attempt = 0;
+ for (;;) {
+ const res = await this.fetchOnce(method, url, config);
+ this.captureRateLimit(res);
+ if (res.status === 429 && attempt < this.opts.maxRetries) {
+ await sleep(this.retryDelayMs(res, attempt), config.signal);
+ attempt += 1;
+ continue;
+ }
+ return res;
+ }
+ }
+
+ private async fetchOnce(method: HttpMethod, url: URL, config: RequestConfig): Promise {
+ const controller = new AbortController();
+ let timedOut = false;
+ const timer = setTimeout(() => {
+ timedOut = true;
+ controller.abort();
+ }, this.opts.timeoutMs);
+
+ const userSignal = config.signal;
+ const onUserAbort = () => controller.abort();
+ if (userSignal) {
+ if (userSignal.aborted) controller.abort();
+ else userSignal.addEventListener('abort', onUserAbort, { once: true });
+ }
+
+ const headers: Record = {
+ Authorization: `Bearer ${this.opts.apiKey}`,
+ Accept: config.accept ?? 'application/json',
+ };
+ let body: string | undefined;
+ if (config.body !== undefined) {
+ headers['Content-Type'] = 'application/json';
+ body = JSON.stringify(config.body);
+ }
+
+ try {
+ return await this.opts.fetchImpl(url, { method, headers, body, signal: controller.signal });
+ } catch (err) {
+ if (timedOut) {
+ throw new XedoConnectionError({
+ code: 'TIMEOUT',
+ status: 0,
+ message: `Request to ${url.pathname} timed out after ${this.opts.timeoutMs}ms.`,
+ });
+ }
+ // Genuine user-initiated cancellation: surface it untouched.
+ if (userSignal?.aborted) throw err;
+ throw new XedoConnectionError({
+ code: 'CONNECTION_ERROR',
+ status: 0,
+ message: err instanceof Error ? err.message : 'Network request failed.',
+ });
+ } finally {
+ clearTimeout(timer);
+ userSignal?.removeEventListener('abort', onUserAbort);
+ }
+ }
+
+ private buildUrl(path: string, query: Record | undefined): URL {
+ const url = new URL(this.opts.baseUrl.replace(/\/+$/, '') + path);
+ if (query) {
+ for (const [key, value] of Object.entries(query)) {
+ if (value === undefined || value === null) continue;
+ url.searchParams.set(key, String(value));
+ }
+ }
+ return url;
+ }
+
+ private captureRateLimit(res: Response): void {
+ const limit = parseHeaderInt(res.headers.get('x-ratelimit-limit'));
+ const remaining = parseHeaderInt(res.headers.get('x-ratelimit-remaining'));
+ const reset = parseHeaderInt(res.headers.get('x-ratelimit-reset'));
+ if (limit === null && remaining === null && reset === null) return;
+ this.lastRateLimit = { limit, remaining, reset };
+ }
+
+ private retryDelayMs(res: Response, attempt: number): number {
+ const retryAfter = parseHeaderInt(res.headers.get('retry-after'));
+ if (retryAfter !== null) return retryAfter * 1000;
+ // Exponential backoff with jitter: 500ms, 1s, 2s, … capped at 8s.
+ const base = Math.min(8000, 500 * 2 ** attempt);
+ return base + Math.random() * base * 0.25;
+ }
+}
diff --git a/src/types/generated.ts b/src/types/generated.ts
new file mode 100644
index 0000000..113b1d1
--- /dev/null
+++ b/src/types/generated.ts
@@ -0,0 +1,1046 @@
+/**
+ * This file was auto-generated by openapi-typescript.
+ * Do not make direct changes to the file.
+ */
+
+export interface paths {
+ "/v1/ping": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Vérifier la clé API
+ * @description Renvoie l'identifiant du marketplace résolu depuis la clé fournie. Utilisez cet endpoint pour valider votre clé de bout en bout.
+ */
+ get: operations["ping"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/products": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Lister les produits
+ * @description Renvoie les produits du marchand (paginés). Par défaut, seuls les produits activés sont retournés — passez `includeDisabled=true` pour inclure également les brouillons.
+ */
+ get: operations["listProducts"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/products/{publicId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Récupérer un produit par son identifiant public
+ * @description Renvoie un produit unique (avec variations, combinaisons et galerie). Passez `includeDisabled=true` pour résoudre également les brouillons.
+ */
+ get: operations["getProductByPublicId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/products/by-slug/{slug}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Récupérer un produit par son slug
+ * @description Renvoie un produit unique recherché par son slug URL-friendly. Passez `includeDisabled=true` pour résoudre également les brouillons.
+ */
+ get: operations["getProductBySlug"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/collections": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Lister les collections
+ * @description Renvoie les collections du marchand (paginées). Supporte le tri et la recherche par nom.
+ */
+ get: operations["listCollections"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/collections/{publicId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Récupérer une collection par son identifiant public */
+ get: operations["getCollectionByPublicId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/collections/by-slug/{slug}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Récupérer une collection par son slug */
+ get: operations["getCollectionBySlug"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/orders": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Lister les commandes
+ * @description Renvoie les commandes du marchand (paniers payés) paginées. Supporte la recherche sur le `publicId` de commande, la référence de paiement et les données client.
+ */
+ get: operations["listOrders"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/orders/{publicId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Récupérer une commande par son identifiant public
+ * @description Renvoie le détail d'une commande (items, totaux, paiement, livraison).
+ */
+ get: operations["getOrderByPublicId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/orders/{publicId}/invoice": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Télécharger la facture (PDF)
+ * @description Renvoie la facture de la commande au format PDF (`application/pdf`). Renvoie 404 si aucune facture n'a encore été générée.
+ */
+ get: operations["getOrderInvoice"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/carts": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Lister les paniers
+ * @description Renvoie les paniers du marchand (paginés). Les paniers `DRAFT` sont réservés à un usage interne et ne sont jamais exposés.
+ */
+ get: operations["listCarts"];
+ put?: never;
+ /**
+ * Créer un panier et initier le paiement
+ * @description Crée un panier en `PENDING_PAYMENT` avec le client / les items / la livraison fournis, génère une ligne de paiement et demande une URL de checkout au provider de paiement. Si l'appel provider échoue, le panier est conservé et un `502 PAYMENT_INIT_FAILED` est retourné — relancez via `POST /v1/carts/{publicId}/pay`.
+ */
+ post: operations["createCart"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/carts/{publicId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Récupérer un panier par son identifiant public
+ * @description Renvoie le détail d'un panier (items, totaux, livraison).
+ */
+ get: operations["getCartByPublicId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/carts/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Calculer les totaux d'un panier sans le persister
+ * @description Prévisualisation sans état. Valide les items, la zone de livraison et la configuration split, puis renvoie les totaux finaux. Aucun panier n'est créé.
+ */
+ post: operations["previewCart"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/v1/carts/{publicId}/pay": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Relancer l'initialisation du paiement d'un panier existant
+ * @description À utiliser uniquement lorsque l'appel précédent à `POST /v1/carts` a renvoyé `502 PAYMENT_INIT_FAILED` — c'est-à-dire que le panier est en `PENDING_PAYMENT` avec une ligne de paiement en attente. Re-sollicite le provider de paiement avec la même référence.
+ */
+ post: operations["retryCartPayment"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+}
+export type webhooks = Record;
+export interface components {
+ schemas: {
+ /** @description Enveloppe de réponse standard pour une ressource unique. */
+ DevApiSuccessEnvelopeDto: {
+ /** @example true */
+ success: boolean;
+ /** @description Charge utile de la réponse. */
+ data: Record;
+ };
+ /** @description Enveloppe de réponse standard pour une collection paginée. Le header `Content-Range` accompagne toujours cette réponse. */
+ DevApiPaginatedEnvelopeDto: {
+ /** @example true */
+ success: boolean;
+ /** @description Tableau d'éléments pour la page courante. */
+ data: Record[];
+ /**
+ * @description Nombre total de lignes correspondant à la requête.
+ * @example 42
+ */
+ total: number;
+ /**
+ * @description Index (1-based) de la première ligne renvoyée.
+ * @example 1
+ */
+ start: number;
+ /**
+ * @description Index (1-based) de la dernière ligne renvoyée.
+ * @example 10
+ */
+ end: number;
+ };
+ /** @description Enveloppe d'erreur standard. Le champ `errors` (optionnel) détaille les violations par champ pour les erreurs de validation. */
+ DevApiErrorEnvelopeDto: {
+ /** @example false */
+ success: boolean;
+ /**
+ * @description Code d'erreur machine-readable. Voir la page Ressources › Erreurs pour la liste complète.
+ * @example PRODUCT_NOT_FOUND
+ */
+ code: string;
+ /**
+ * @description Message lisible par un humain (français).
+ * @example Le produit n'a pas été trouvé
+ */
+ message: string;
+ /** @description Détail des violations par champ (uniquement pour les erreurs de validation). */
+ errors?: {
+ [key: string]: string[];
+ };
+ /** @description Contexte additionnel optionnel (ex. `cartPublicId` sur `PAYMENT_INIT_FAILED`). */
+ data?: Record;
+ };
+ DevApiCheckoutItemDto: {
+ /** @example PRD-XPK39ZQA01 */
+ publicProductId: string;
+ /** @example 2 */
+ quantity: number;
+ /**
+ * @description Identifiant public de la combinaison (SKU) si le produit a des variations.
+ * @example COMB-ABC123
+ */
+ combinationPublicId?: string;
+ };
+ DevApiCheckoutDeliveryDto: {
+ /**
+ * @example DELIVERY
+ * @enum {string}
+ */
+ deliveryType: "DELIVERY" | "PICKUP";
+ /**
+ * @description Requis lorsque `deliveryType = DELIVERY`.
+ * @example 11
+ */
+ deliveryAreaId?: number;
+ };
+ DevApiCheckoutCustomerDto: {
+ /** @example Jean */
+ firstName: string;
+ /** @example Kouassi */
+ lastName: string;
+ /**
+ * Format: email
+ * @example jean@example.com
+ */
+ email: string;
+ /** @example +225 07 12 34 56 78 */
+ phone: string;
+ };
+ DevApiCheckoutPreviewDto: {
+ items: components["schemas"]["DevApiCheckoutItemDto"][];
+ delivery: components["schemas"]["DevApiCheckoutDeliveryDto"];
+ /**
+ * @description Modes de paiement actuellement exposés par la Developer API.
+ * @example external_wallet
+ * @enum {string}
+ */
+ paymentMethod: "external_wallet" | "split_payment";
+ };
+ DevApiCheckoutCreateDto: {
+ customer: components["schemas"]["DevApiCheckoutCustomerDto"];
+ items: components["schemas"]["DevApiCheckoutItemDto"][];
+ delivery: components["schemas"]["DevApiCheckoutDeliveryDto"];
+ /**
+ * @example external_wallet
+ * @enum {string}
+ */
+ paymentMethod: "external_wallet" | "split_payment";
+ /**
+ * Format: uri
+ * @description URL HTTPS vers laquelle le client est redirigé après le checkout. Doit obligatoirement être en HTTPS.
+ * @example https://my-shop.com/after-checkout
+ */
+ returnUrl: string;
+ /** @example Appeler 30 min avant */
+ additionalDetails?: string;
+ /**
+ * @description Charge JSON libre renvoyée telle quelle dans toutes les réponses panier / commande. Utilisez-la pour rattacher vos propres identifiants (ex. `internalOrderId`).
+ * @example {
+ * "internalOrderId": "ORD-12345",
+ * "source": "mobile-app"
+ * }
+ */
+ meta?: Record;
+ };
+ DevApiCheckoutRetryPayDto: {
+ /**
+ * Format: uri
+ * @example https://my-shop.com/after-checkout
+ */
+ returnUrl: string;
+ };
+ };
+ responses: {
+ /** @description Clé API manquante ou invalide */
+ Unauthorized: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Requête invalide (validation du body ou de la query) */
+ BadRequest: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "BAD_REQUEST",
+ * "message": "La requête est invalide",
+ * "errors": {
+ * "items": [
+ * "doit contenir au moins 1 élément"
+ * ]
+ * }
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Ressource introuvable */
+ NotFound: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "NOT_FOUND",
+ * "message": "Ressource introuvable"
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Produit introuvable */
+ ProductNotFound: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "PRODUCT_NOT_FOUND",
+ * "message": "Le produit n'a pas été trouvé"
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Panier introuvable */
+ CartNotFound: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "CART_NOT_FOUND",
+ * "message": "Le panier n'a pas été trouvé"
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Le panier n'est plus dans un état autorisant un retry */
+ CartNotRetryable: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "CART_NOT_RETRYABLE",
+ * "message": "Ce panier n'est plus en attente de paiement"
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Une dépendance du checkout est introuvable (produit, combinaison ou zone de livraison) */
+ CheckoutNotFound: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Stock insuffisant pour un ou plusieurs items */
+ InsufficientStock: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "INSUFFICIENT_STOCK",
+ * "message": "Le stock est insuffisant",
+ * "errors": {
+ * "PRD-XPK39ZQA01": [
+ * "stock disponible : 1, demandé : 2"
+ * ]
+ * }
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Limite de débit dépassée. Consultez le header `Retry-After` (secondes). */
+ RateLimited: {
+ headers: {
+ /** @description Nombre de secondes à attendre avant de réessayer. */
+ "Retry-After"?: number;
+ /** @description Limite de la fenêtre courante. */
+ "X-RateLimit-Limit"?: number;
+ /** @description Requêtes restantes dans la fenêtre. */
+ "X-RateLimit-Remaining"?: number;
+ /** @description Timestamp Unix de réinitialisation de la fenêtre. */
+ "X-RateLimit-Reset"?: number;
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "RATE_LIMITED",
+ * "message": "Trop de requêtes, veuillez patienter"
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ /** @description Le provider de paiement n'a pas pu être joint. Le panier est conservé — relancez via `POST /v1/carts/{publicId}/pay`. */
+ PaymentInitFailed: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": false,
+ * "code": "PAYMENT_INIT_FAILED",
+ * "message": "L'initialisation du paiement a échoué, réessayez via /pay",
+ * "data": {
+ * "cartPublicId": "CART-XPK39ZQA01"
+ * }
+ * }
+ */
+ "application/json": components["schemas"]["DevApiErrorEnvelopeDto"];
+ };
+ };
+ };
+ parameters: {
+ /** @description Numéro de page (≥ 1). */
+ Page: number;
+ /** @description Taille de page (bornée par la config plateforme, ~100 max). */
+ PerPage: number;
+ /** @description Sens de tri. */
+ Order: "asc" | "desc";
+ };
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
+}
+export type $defs = Record;
+export interface operations {
+ ping: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Clé valide */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /**
+ * @example {
+ * "success": true,
+ * "data": {
+ * "marketplaceId": 42,
+ * "timestamp": "2026-05-28T10:15:00.000Z"
+ * }
+ * }
+ */
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ listProducts: {
+ parameters: {
+ query?: {
+ /** @description Numéro de page (≥ 1). */
+ page?: components["parameters"]["Page"];
+ /** @description Taille de page (bornée par la config plateforme, ~100 max). */
+ per_page?: components["parameters"]["PerPage"];
+ /** @description Colonne de tri. */
+ _sort?: "id" | "name" | "price" | "createdAt";
+ /** @description Sens de tri. */
+ _order?: components["parameters"]["Order"];
+ /** @description Recherche plein-texte sur le nom du produit (3 caractères minimum). */
+ search?: string;
+ /** @description Filtrer par slug de collection. */
+ collection?: string;
+ /** @description Inclure les variations et combinaisons (SKU) dans la réponse. */
+ includeVariations?: boolean;
+ /** @description Inclure les produits désactivés (brouillons). Par défaut, seuls les produits activés sont retournés. */
+ includeDisabled?: boolean;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Liste paginée de produits */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiPaginatedEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getProductByPublicId: {
+ parameters: {
+ query?: {
+ /** @description Permet de résoudre un produit désactivé (brouillon). */
+ includeDisabled?: boolean;
+ };
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Produit trouvé */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["ProductNotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getProductBySlug: {
+ parameters: {
+ query?: {
+ /** @description Permet de résoudre un produit désactivé (brouillon). */
+ includeDisabled?: boolean;
+ };
+ header?: never;
+ path: {
+ slug: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Produit trouvé */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["ProductNotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ listCollections: {
+ parameters: {
+ query?: {
+ /** @description Numéro de page (≥ 1). */
+ page?: components["parameters"]["Page"];
+ /** @description Taille de page (bornée par la config plateforme, ~100 max). */
+ per_page?: components["parameters"]["PerPage"];
+ /** @description Colonne de tri. */
+ _sort?: "id" | "name" | "createdAt";
+ /** @description Sens de tri. */
+ _order?: components["parameters"]["Order"];
+ /** @description Recherche plein-texte sur le nom de la collection (3 caractères minimum). */
+ search?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Liste paginée de collections */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiPaginatedEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getCollectionByPublicId: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Collection trouvée */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["NotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getCollectionBySlug: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ slug: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Collection trouvée */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["NotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ listOrders: {
+ parameters: {
+ query?: {
+ /** @description Numéro de page (≥ 1). */
+ page?: components["parameters"]["Page"];
+ /** @description Taille de page (bornée par la config plateforme, ~100 max). */
+ per_page?: components["parameters"]["PerPage"];
+ /** @description Colonne de tri. */
+ _sort?: "id" | "createdAt" | "amount";
+ /** @description Sens de tri. */
+ _order?: components["parameters"]["Order"];
+ /** @description Recherche plein-texte sur le `publicId` de commande, la référence de paiement ou les infos client. */
+ search?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Liste paginée de commandes */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiPaginatedEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getOrderByPublicId: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Commande trouvée */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["NotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ getOrderInvoice: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Flux PDF de la facture */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/pdf": string;
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["NotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ listCarts: {
+ parameters: {
+ query?: {
+ /** @description Numéro de page (≥ 1). */
+ page?: components["parameters"]["Page"];
+ /** @description Taille de page (bornée par la config plateforme, ~100 max). */
+ per_page?: components["parameters"]["PerPage"];
+ /** @description Colonne de tri. */
+ _sort?: "id" | "createdAt";
+ /** @description Sens de tri. */
+ _order?: components["parameters"]["Order"];
+ /** @description Recherche plein-texte sur le `publicId` de panier ou les infos client. */
+ search?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Liste paginée de paniers */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiPaginatedEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ createCart: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DevApiCheckoutCreateDto"];
+ };
+ };
+ responses: {
+ /** @description Panier créé, URL de checkout dans `data.checkoutUrl` */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["CheckoutNotFound"];
+ 422: components["responses"]["InsufficientStock"];
+ 429: components["responses"]["RateLimited"];
+ 502: components["responses"]["PaymentInitFailed"];
+ };
+ };
+ getCartByPublicId: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Panier trouvé */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["CartNotFound"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ previewCart: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DevApiCheckoutPreviewDto"];
+ };
+ };
+ responses: {
+ /** @description Totaux calculés */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 400: components["responses"]["BadRequest"];
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["CheckoutNotFound"];
+ 422: components["responses"]["InsufficientStock"];
+ 429: components["responses"]["RateLimited"];
+ };
+ };
+ retryCartPayment: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ publicId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DevApiCheckoutRetryPayDto"];
+ };
+ };
+ responses: {
+ /** @description Nouvelle URL de checkout dans `data.checkoutUrl` */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DevApiSuccessEnvelopeDto"];
+ };
+ };
+ 401: components["responses"]["Unauthorized"];
+ 404: components["responses"]["CartNotFound"];
+ 409: components["responses"]["CartNotRetryable"];
+ 429: components["responses"]["RateLimited"];
+ 502: components["responses"]["PaymentInitFailed"];
+ };
+ };
+}
diff --git a/src/types/public.ts b/src/types/public.ts
new file mode 100644
index 0000000..f9eeee7
--- /dev/null
+++ b/src/types/public.ts
@@ -0,0 +1,163 @@
+/**
+ * Public, hand-written type surface for the Xedo SDK.
+ *
+ * The Xedo Developer API returns its resource payloads inside a generic
+ * envelope (`{ success, data }`). The entity payloads themselves are described
+ * loosely in `openapi.json` (`type: object`), so we expose them as open
+ * JSON objects here and keep the precise, validated shapes for the checkout
+ * inputs — which the API does constrain. The generated mirror of the spec
+ * lives in `./generated.ts` (do not edit by hand).
+ */
+
+/** A free-form JSON object returned by the API. */
+export type JsonObject = { [key: string]: unknown };
+
+/** Sort direction shared by every paginated list endpoint. */
+export type SortOrder = 'asc' | 'desc';
+
+/** Result of `GET /v1/ping` — use it to validate an API key end to end. */
+export interface PingResult {
+ marketplaceId: number;
+ timestamp: string;
+}
+
+/** A product from the merchant catalogue (`GET /v1/products`). */
+export type Product = JsonObject;
+
+/** A collection / category of products (`GET /v1/collections`). */
+export type Collection = JsonObject;
+
+/** A paid order (`GET /v1/orders`). */
+export type Order = JsonObject;
+
+/** A cart (`GET /v1/carts`). `DRAFT` carts are never exposed by the API. */
+export type Cart = JsonObject;
+
+/** Computed totals returned by `POST /v1/carts/preview` (nothing persisted). */
+export type CheckoutPreview = JsonObject;
+
+/**
+ * Returned by `POST /v1/carts` and `POST /v1/carts/{publicId}/pay`. Always
+ * carries the hosted `checkoutUrl` to redirect the customer to.
+ */
+export interface CheckoutResult extends JsonObject {
+ checkoutUrl: string;
+}
+
+/** Shared cursor parameters for every paginated list endpoint. */
+export interface ListParams {
+ /** Page number (1-based). */
+ page?: number;
+ /** Page size (capped by the platform, ~100 max). */
+ perPage?: number;
+ /** Sort direction. */
+ order?: SortOrder;
+ /** Full-text search (3 characters minimum). */
+ search?: string;
+ /** Abort signal for this request. */
+ signal?: AbortSignal;
+}
+
+export interface ProductListParams extends ListParams {
+ sort?: 'id' | 'name' | 'price' | 'createdAt';
+ /** Filter by collection slug. */
+ collection?: string;
+ /** Include variations and combinations (SKUs) in the response. */
+ includeVariations?: boolean;
+ /** Include disabled products (drafts). */
+ includeDisabled?: boolean;
+}
+
+export interface CollectionListParams extends ListParams {
+ sort?: 'id' | 'name' | 'createdAt';
+}
+
+export interface OrderListParams extends ListParams {
+ sort?: 'id' | 'createdAt' | 'amount';
+}
+
+export interface CartListParams extends ListParams {
+ sort?: 'id' | 'createdAt';
+}
+
+/** Options for single-resource retrieval that supports draft resolution. */
+export interface RetrieveOptions {
+ /** Resolve a disabled product (draft) as well. */
+ includeDisabled?: boolean;
+ signal?: AbortSignal;
+}
+
+/** Options for a plain single-resource retrieval. */
+export interface RequestOptions {
+ signal?: AbortSignal;
+}
+
+/**
+ * One page of a paginated list. The SDK unwraps the API envelope but keeps the
+ * pagination metadata so callers can build their own UIs.
+ */
+export interface PaginatedResult {
+ data: T[];
+ /** Total number of rows matching the query, across all pages. */
+ total: number;
+ /** 1-based index of the first row returned. */
+ start: number;
+ /** 1-based index of the last row returned. */
+ end: number;
+}
+
+/** Rate-limit headers captured from the most recent response. */
+export interface RateLimitInfo {
+ limit: number | null;
+ remaining: number | null;
+ reset: number | null;
+}
+
+// --- Checkout inputs (precisely typed from openapi.json) ---------------------
+
+export interface CheckoutItem {
+ /** e.g. "PRD-XPK39ZQA01". */
+ publicProductId: string;
+ /** Quantity, >= 1. */
+ quantity: number;
+ /** SKU public id, when the product has variations. */
+ combinationPublicId?: string;
+}
+
+export interface CheckoutDelivery {
+ deliveryType: 'DELIVERY' | 'PICKUP';
+ /** Required when `deliveryType === 'DELIVERY'`. */
+ deliveryAreaId?: number;
+}
+
+export interface CheckoutCustomer {
+ firstName: string;
+ lastName: string;
+ email: string;
+ phone: string;
+}
+
+export type PaymentMethod = 'external_wallet' | 'split_payment';
+
+export interface CheckoutPreviewInput {
+ items: CheckoutItem[];
+ delivery: CheckoutDelivery;
+ paymentMethod: PaymentMethod;
+}
+
+export interface CheckoutCreateInput extends CheckoutPreviewInput {
+ customer: CheckoutCustomer;
+ /** HTTPS is mandatory. */
+ returnUrl: string;
+ additionalDetails?: string;
+ /**
+ * Free JSON payload echoed back, unchanged, in every cart/order response.
+ * Use it to correlate a Xedo order with your own state (`internalOrderId`,
+ * `source`, `templateId`, …).
+ */
+ meta?: Record;
+}
+
+export interface CheckoutRetryPayInput {
+ returnUrl: string;
+}
diff --git a/test/client.test.ts b/test/client.test.ts
new file mode 100644
index 0000000..f37b546
--- /dev/null
+++ b/test/client.test.ts
@@ -0,0 +1,56 @@
+import { http } from 'msw';
+import { describe, expect, it } from 'vitest';
+import { Xedo } from '../src/index';
+import { BASE, server } from './server';
+import { makeClient, ok } from './helpers';
+
+describe('Xedo client', () => {
+ it('requires an apiKey', () => {
+ // @ts-expect-error intentionally missing apiKey
+ expect(() => new Xedo({})).toThrow(/apiKey/i);
+ });
+
+ it('infers the environment from the key prefix', () => {
+ expect(makeClient({ apiKey: 'xdk_live_x' }).environment).toBe('live');
+ expect(makeClient({ apiKey: 'xdk_test_x' }).environment).toBe('test');
+ expect(makeClient({ apiKey: 'whatever' }).environment).toBe('unknown');
+ });
+
+ it('sends the Bearer auth header and unwraps `data` on ping', async () => {
+ let authHeader: string | null = null;
+ server.use(
+ http.get(`${BASE}/v1/ping`, ({ request }) => {
+ authHeader = request.headers.get('authorization');
+ return ok({ marketplaceId: 42, timestamp: '2026-05-28T10:15:00.000Z' });
+ }),
+ );
+
+ const xedo = makeClient();
+ const result = await xedo.ping();
+
+ expect(authHeader).toBe('Bearer xdk_test_abc123');
+ expect(result).toEqual({ marketplaceId: 42, timestamp: '2026-05-28T10:15:00.000Z' });
+ });
+
+ it('captures rate-limit headers from the last response', async () => {
+ server.use(
+ http.get(`${BASE}/v1/ping`, () =>
+ Response.json(
+ { success: true, data: { marketplaceId: 1, timestamp: 'now' } },
+ {
+ headers: {
+ 'X-RateLimit-Limit': '600',
+ 'X-RateLimit-Remaining': '599',
+ 'X-RateLimit-Reset': '1716639600',
+ },
+ },
+ ),
+ ),
+ );
+
+ const xedo = makeClient();
+ await xedo.ping();
+
+ expect(xedo.lastRateLimit).toEqual({ limit: 600, remaining: 599, reset: 1716639600 });
+ });
+});
diff --git a/test/errors.test.ts b/test/errors.test.ts
new file mode 100644
index 0000000..ff9aaa5
--- /dev/null
+++ b/test/errors.test.ts
@@ -0,0 +1,142 @@
+import { http } from 'msw';
+import { describe, expect, it } from 'vitest';
+import {
+ XedoAuthError,
+ XedoNotFoundError,
+ XedoPaymentInitError,
+ XedoRateLimitError,
+ XedoStockError,
+ XedoValidationError,
+} from '../src/index';
+import { BASE, server } from './server';
+import { fail, makeClient } from './helpers';
+
+describe('typed errors', () => {
+ it('maps 401 to XedoAuthError routed on code', async () => {
+ server.use(
+ http.get(`${BASE}/v1/ping`, () =>
+ fail(401, 'INVALID_DEVELOPER_API_KEY', 'Clé API invalide'),
+ ),
+ );
+ const xedo = makeClient();
+ await expect(xedo.ping()).rejects.toMatchObject({
+ name: 'XedoAuthError',
+ code: 'INVALID_DEVELOPER_API_KEY',
+ status: 401,
+ });
+ await expect(xedo.ping()).rejects.toBeInstanceOf(XedoAuthError);
+ });
+
+ it('maps 404 to XedoNotFoundError', async () => {
+ server.use(
+ http.get(`${BASE}/v1/products/:id`, () =>
+ fail(404, 'PRODUCT_NOT_FOUND', "Le produit n'a pas été trouvé"),
+ ),
+ );
+ await expect(makeClient().products.retrieve('PRD-x')).rejects.toBeInstanceOf(XedoNotFoundError);
+ });
+
+ it('exposes per-field detail on 422 stock errors', async () => {
+ server.use(
+ http.post(`${BASE}/v1/carts/preview`, () =>
+ fail(422, 'INSUFFICIENT_STOCK', 'Le stock est insuffisant', {
+ errors: { 'PRD-XPK39ZQA01': ['stock disponible : 1, demandé : 2'] },
+ }),
+ ),
+ );
+ const err = await makeClient()
+ .carts.preview({
+ items: [{ publicProductId: 'PRD-XPK39ZQA01', quantity: 2 }],
+ delivery: { deliveryType: 'PICKUP' },
+ paymentMethod: 'external_wallet',
+ })
+ .catch((e) => e);
+
+ expect(err).toBeInstanceOf(XedoStockError);
+ expect(err.errors).toEqual({ 'PRD-XPK39ZQA01': ['stock disponible : 1, demandé : 2'] });
+ });
+
+ it('400 maps to XedoValidationError', async () => {
+ server.use(
+ http.get(`${BASE}/v1/products`, () => fail(400, 'BAD_REQUEST', 'La requête est invalide')),
+ );
+ await expect(makeClient().products.list()).rejects.toBeInstanceOf(XedoValidationError);
+ });
+
+ it('502 PAYMENT_INIT_FAILED exposes cartPublicId', async () => {
+ server.use(
+ http.post(`${BASE}/v1/carts`, () =>
+ fail(502, 'PAYMENT_INIT_FAILED', 'échec', { data: { cartPublicId: 'CART-99' } }),
+ ),
+ );
+ const err = await makeClient()
+ .carts.create({
+ customer: { firstName: 'A', lastName: 'B', email: 'a@b.c', phone: '+1' },
+ items: [{ publicProductId: 'PRD-1', quantity: 1 }],
+ delivery: { deliveryType: 'PICKUP' },
+ paymentMethod: 'external_wallet',
+ returnUrl: 'https://shop.test/done',
+ })
+ .catch((e) => e);
+
+ expect(err).toBeInstanceOf(XedoPaymentInitError);
+ expect(err.cartPublicId).toBe('CART-99');
+ });
+});
+
+describe('429 retry', () => {
+ it('retries on 429 respecting Retry-After, then succeeds', async () => {
+ let calls = 0;
+ server.use(
+ http.get(`${BASE}/v1/ping`, () => {
+ calls += 1;
+ if (calls === 1) {
+ return fail(429, 'RATE_LIMITED', 'slow down', {}, { 'Retry-After': '0' });
+ }
+ return Response.json({ success: true, data: { marketplaceId: 1, timestamp: 'now' } });
+ }),
+ );
+ const result = await makeClient().ping();
+ expect(calls).toBe(2);
+ expect(result.marketplaceId).toBe(1);
+ });
+
+ it('throws XedoRateLimitError after exhausting maxRetries', async () => {
+ server.use(
+ http.get(`${BASE}/v1/ping`, () =>
+ fail(429, 'RATE_LIMITED', 'slow down', {}, { 'Retry-After': '0' }),
+ ),
+ );
+ const err = await makeClient({ maxRetries: 1 })
+ .ping()
+ .catch((e) => e);
+ expect(err).toBeInstanceOf(XedoRateLimitError);
+ expect(err.retryAfter).toBe(0);
+ });
+});
+
+describe('carts.createAndPay', () => {
+ it('retries via pay() once after PAYMENT_INIT_FAILED', async () => {
+ server.use(
+ http.post(`${BASE}/v1/carts`, () =>
+ fail(502, 'PAYMENT_INIT_FAILED', 'échec', { data: { cartPublicId: 'CART-42' } }),
+ ),
+ http.post(`${BASE}/v1/carts/:id/pay`, ({ params }) =>
+ Response.json({
+ success: true,
+ data: { checkoutUrl: `https://pay.test/${String(params.id)}` },
+ }),
+ ),
+ );
+
+ const result = await makeClient().carts.createAndPay({
+ customer: { firstName: 'A', lastName: 'B', email: 'a@b.c', phone: '+1' },
+ items: [{ publicProductId: 'PRD-1', quantity: 1 }],
+ delivery: { deliveryType: 'PICKUP' },
+ paymentMethod: 'external_wallet',
+ returnUrl: 'https://shop.test/done',
+ });
+
+ expect(result.checkoutUrl).toBe('https://pay.test/CART-42');
+ });
+});
diff --git a/test/helpers.ts b/test/helpers.ts
new file mode 100644
index 0000000..d94e1c2
--- /dev/null
+++ b/test/helpers.ts
@@ -0,0 +1,30 @@
+import { Xedo, type XedoOptions } from '../src/index';
+import { BASE } from './server';
+
+export function makeClient(overrides: Partial = {}): Xedo {
+ return new Xedo({
+ apiKey: 'xdk_test_abc123',
+ baseUrl: BASE,
+ maxRetries: 2,
+ timeoutMs: 1000,
+ ...overrides,
+ });
+}
+
+export function ok(data: unknown): Response {
+ return Response.json({ success: true, data });
+}
+
+export function page(data: unknown[], total: number, start: number, end: number): Response {
+ return Response.json({ success: true, data, total, start, end });
+}
+
+export function fail(
+ status: number,
+ code: string,
+ message: string,
+ extra: { errors?: Record; data?: unknown } = {},
+ headers: Record = {},
+): Response {
+ return Response.json({ success: false, code, message, ...extra }, { status, headers });
+}
diff --git a/test/resources.test.ts b/test/resources.test.ts
new file mode 100644
index 0000000..3ea2759
--- /dev/null
+++ b/test/resources.test.ts
@@ -0,0 +1,85 @@
+import { http } from 'msw';
+import { describe, expect, it } from 'vitest';
+import { BASE, server } from './server';
+import { makeClient, ok, page } from './helpers';
+
+describe('list endpoints', () => {
+ it('maps camelCase params to wire query keys and returns pagination metadata', async () => {
+ let url: URL | undefined;
+ server.use(
+ http.get(`${BASE}/v1/products`, ({ request }) => {
+ url = new URL(request.url);
+ return page([{ publicId: 'PRD-1' }], 42, 1, 1);
+ }),
+ );
+
+ const xedo = makeClient();
+ const result = await xedo.products.list({
+ page: 1,
+ perPage: 20,
+ sort: 'createdAt',
+ order: 'desc',
+ search: 'burger',
+ collection: 'fast-food',
+ includeVariations: true,
+ includeDisabled: false,
+ });
+
+ expect(result).toEqual({ data: [{ publicId: 'PRD-1' }], total: 42, start: 1, end: 1 });
+ expect(url?.searchParams.get('per_page')).toBe('20');
+ expect(url?.searchParams.get('_sort')).toBe('createdAt');
+ expect(url?.searchParams.get('_order')).toBe('desc');
+ expect(url?.searchParams.get('search')).toBe('burger');
+ expect(url?.searchParams.get('collection')).toBe('fast-food');
+ expect(url?.searchParams.get('includeVariations')).toBe('true');
+ });
+
+ it('listAll walks every page until end >= total', async () => {
+ server.use(
+ http.get(`${BASE}/v1/products`, ({ request }) => {
+ const p = Number(new URL(request.url).searchParams.get('page'));
+ if (p === 1) return page([{ id: 1 }, { id: 2 }], 3, 1, 2);
+ return page([{ id: 3 }], 3, 3, 3);
+ }),
+ );
+
+ const xedo = makeClient();
+ const seen: unknown[] = [];
+ for await (const item of xedo.products.listAll({ perPage: 2 })) seen.push(item);
+
+ expect(seen).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);
+ });
+
+ it('retrieve encodes the path id and forwards includeDisabled', async () => {
+ let url: URL | undefined;
+ server.use(
+ http.get(`${BASE}/v1/products/:id`, ({ request }) => {
+ url = new URL(request.url);
+ return ok({ publicId: 'PRD-XPK39ZQA01' });
+ }),
+ );
+
+ const xedo = makeClient();
+ const product = await xedo.products.retrieve('PRD-XPK39ZQA01', { includeDisabled: true });
+
+ expect(product).toEqual({ publicId: 'PRD-XPK39ZQA01' });
+ expect(url?.searchParams.get('includeDisabled')).toBe('true');
+ });
+});
+
+describe('orders.invoice', () => {
+ it('returns the PDF as an ArrayBuffer', async () => {
+ const pdf = new Uint8Array([0x25, 0x50, 0x44, 0x46]); // %PDF
+ server.use(
+ http.get(`${BASE}/v1/orders/:id/invoice`, () =>
+ new Response(pdf, { status: 200, headers: { 'Content-Type': 'application/pdf' } }),
+ ),
+ );
+
+ const xedo = makeClient();
+ const buffer = await xedo.orders.invoice('ORD-1');
+
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
+ expect(new Uint8Array(buffer)).toEqual(pdf);
+ });
+});
diff --git a/test/server.ts b/test/server.ts
new file mode 100644
index 0000000..740a0c9
--- /dev/null
+++ b/test/server.ts
@@ -0,0 +1,7 @@
+import { setupServer } from 'msw/node';
+
+/** Shared MSW server. Handlers are registered per-test via `server.use(...)`. */
+export const server = setupServer();
+
+/** Base URL the test client points at (must match the handlers below). */
+export const BASE = 'https://api.xedo.test/marketplace';
diff --git a/test/setup.ts b/test/setup.ts
new file mode 100644
index 0000000..a85121e
--- /dev/null
+++ b/test/setup.ts
@@ -0,0 +1,6 @@
+import { afterAll, afterEach, beforeAll } from 'vitest';
+import { server } from './server';
+
+beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
+afterEach(() => server.resetHandlers());
+afterAll(() => server.close());
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7a0701c
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "lib": ["ES2022"],
+ "types": ["node"],
+ "strict": true,
+ "noUncheckedIndexedAccess": true,
+ "noFallthroughCasesInSwitch": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "verbatimModuleSyntax": true,
+ "forceConsistentCasingInFileNames": true,
+ "outDir": "dist"
+ },
+ "include": ["src", "test"]
+}
diff --git a/tsup.config.ts b/tsup.config.ts
new file mode 100644
index 0000000..97a34df
--- /dev/null
+++ b/tsup.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: true,
+ clean: true,
+ sourcemap: true,
+ target: 'node18',
+ outExtension({ format }) {
+ return { js: format === 'cjs' ? '.cjs' : '.js' };
+ },
+});
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..6170d5f
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ environment: 'node',
+ setupFiles: ['./test/setup.ts'],
+ },
+});