diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg deleted file mode 100755 index b52f190..0000000 --- a/.husky/prepare-commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -# gitmoji as a commit hook -exec < /dev/tty -gitmoji --hook $1 $2 diff --git a/README.md b/README.md index ad0d56b..44ded48 100644 --- a/README.md +++ b/README.md @@ -1,156 +1,372 @@ -![metal-fetch-banner](./assets/metal-fetch.png) +
+ metal-fetch banner +
-## Overview +

metal-fetch

-> **metal-fetch** is a declarative fetch api library for typescript inspired by `trpc`. -> -> Currently, it's still in development, so it's not recommended for production use. +
+ A type-safe, fluent, and chainable wrapper around the native Fetch API, designed for maximum flexibility and developer experience. +
-1. Define api using `f.router` function +
-```ts -const api = f.router(BASE_URL, REST_API_STRUCTURE) +
+ NPM Version + License +
+ +--- + +**metal-fetch** provides a robust, immutable builder that empowers you to define API endpoints declaratively. It enforces type safety for request bodies, search parameters, and responses, catching errors at compile time, not runtime. With a powerful middleware system and first-class error handling, it's built for creating resilient and maintainable API layers. + +## Features + +- **⛓️ Fluent, Chainable API:** Define every aspect of a request with a clean, readable, and chainable interface. +- **🔒 Type-Safe by Default:** Enforces validation for request bodies, path parameters, and responses. If you don't define a validator, you can't send the data. +- **✨ Immutable Builder:** Every method on the `FetchBuilder` returns a new, cloned instance, preventing side effects and making your API definitions safe to reuse and extend. +- **🔌 Full-Cycle Middleware:** Intercept and modify requests and responses with a standard `(request, next) => Promise` middleware pattern. Perfect for logging, authentication, caching, and more. +- **💪 Flexible Response Handling:** Get full control over the raw `Response` object. Inspect headers or check status codes before deciding how to parse the body, preventing crashes from unexpected API responses. +- **🚨 Granular Error Handling:** Define separate handlers for typed fetch errors (like a 404 or 500) and unknown network errors. + +## Installation + +```bash +# Using pnpm +pnpm add @metal-box/fetch + +# Using npm +npm install @metal-box/fetch + +# Using yarn +yarn add @metal-box/fetch ``` -2. Define rest api structure +> **Note:** `metal-fetch` is a runtime-agnostic library. For validation, you can bring your own library, such as `zod`, `yup`, `@metal-box/type`, or any other. -`REST_API_STRUCTURE` is the declarative REST api structure. +--- -For example there is an api structure like this: +## Quick Start -> Book api -> -> - `BASE_URL` : `/api/v1` -> - `BASE_URL/books` : `GET` -> - `BASE_URL/books` : `POST` -> - `BASE_URL/books/:id` : `GET` -> - `BASE_URL/books/:id` : `PUT` -> - `BASE_URL/books/:id` : `DELETE` -> - `BASE_URL/category/:name` : `GET` +Here's a quick look at defining and using an API endpoint to fetch a user by their ID. -then we can define the api like this: +```typescript +import { f } from '@metal-box/fetch' +import { z } from 'zod' -```ts -export const api = f.router(BASE_URL, { - auth: { - login: { - GET: f - // create fetch unit - .unit() - // json mode - .def_json() - // default referrer - .def_default_referrer('about:client') - // response parser - .def_response(({ json }) => - t.union(t.string, t.undefined).parse(json) - ), - }, +const BASE_URL = 'https://api.example.com' + +// Define a validator for the user response +const UserResponse = z.object({ + id: z.string(), + name: z.string(), + email: z.string().email(), +}) + +// 1. Create a reusable API client instance +const apiClient = f + .builder() + .def_url(BASE_URL) + .def_json() // Automatically handle JSON parsing + .def_query_mode('throw') // Throw an error on non-2xx responses + +// 2. Define a specific endpoint +const getUser = apiClient + .def_method('GET') + .def_url(`${BASE_URL}/users/$id`) // Dynamic path parameter + .def_response(async ({ json }) => UserResponse.parse(await json())) + .build() + +// 3. Execute the query +async function fetchUser(userId: string) { + try { + const user = await getUser.query({ + path: { id: userId }, + }) + + console.log('Fetched User:', user) + // Type of `user` is inferred as: + // { id: string; name: string; email: string; } + + return user + } catch (error) { + console.error('Failed to fetch user:', error) + } +} + +fetchUser('123') +``` + +## Core Concepts + +### The Immutable Builder + +The core of `metal-fetch` is the `FetchBuilder`. It's immutable, meaning every method call creates a new, refined builder instance. This allows you to safely create a base client and extend it for specific endpoints without any side effects. + +```typescript +// Base client with shared configuration +const baseClient = f + .builder() + .def_url('https://api.my-service.com') + .def_query_mode('throw') + +// Endpoint for fetching products +const getProducts = baseClient + .def_method('GET') + .def_url('https://api.my-service.com/products') + .build() + +// Endpoint for creating a product (extends the same baseClient) +const createProduct = baseClient + .def_method('POST') + .def_url('https://api.my-service.com/products') + // ... add body definition + .build() +``` + +### Type-Safe Validation + +`metal-fetch` helps you eliminate runtime errors by enforcing compile-time checks. You cannot pass a `body` or `search` object to `.query()` unless you have first defined a validator for it. + +#### Body Validation + +Use `.def_body()` with your favorite validation library. + +```typescript +const ProductRequest = z.object({ + name: z.string(), + price: z.number().positive(), +}) + +const createProduct = apiClient + .def_method('POST') + .def_url(`${BASE_URL}/products`) + .def_body(ProductRequest.parse) // Pass the validation function + .build() + +// This is now type-safe! +await createProduct.query({ + body: { + name: 'Laptop', + price: 1200, + }, +}) + +// This would cause a TypeScript error, as `body` is not defined +// await getProducts.query({ body: { name: 'Laptop' } }); +``` + +#### Response Validation + +Similarly, use `.def_response()` to parse and validate the data you receive. When combined with `.def_json()`, you get a `json()` helper function to safely parse the body. + +```typescript +const ProductResponse = z.object({ id: z.string() /* ... */ }) + +const getProduct = apiClient + .def_method('GET') + .def_url(`${BASE_URL}/products/$id`) + .def_response(async ({ response, json }) => { + // You can inspect the raw response first + if (!response.ok) { + throw new Error(`Request failed with status ${response.status}`) + } + // Then parse the body + return ProductResponse.parse(await json()) + }) + .build() +``` + +### Path and Search Parameters + +- **Path Parameters:** Define dynamic segments in your URL with a `$` prefix (e.g., `/$id`). Pass the corresponding values in the `path` object in `.query()`. +- **Search Parameters:** Use `.def_searchparams()` to define a validator for query strings. Pass the data in the `search` object in `.query()`. + +```typescript +const ProductSearch = z.object({ + category: z.string(), + limit: z.number().optional(), +}) + +const findProducts = apiClient + .def_method('GET') + .def_url(`${BASE_URL}/products`) + .def_searchparams(ProductSearch.parse) + .build() + +await findProducts.query({ + search: { + category: 'electronics', + limit: 10, }, - books: { +}) +// Resulting URL: https://api.example.com/products?category=electronics&limit=10 +``` + +## Declarative API Routers + +While the `FetchBuilder` is perfect for defining individual endpoints, `metal-fetch` also provides a powerful `router` function to define your entire API surface in a single, organized, and type-safe object. This creates a fully-typed client SDK, eliminating guesswork and ensuring your frontend and backend stay in sync. + +The router takes a `baseUrl` and a nested structure of `FetchBuilder` instances. It automatically assigns the URL and HTTP method to each builder based on its position in the tree. + +### Example: Defining a Router + +```typescript +import { f, type GetRouterConfig } from '@metal-box/fetch' +import { z } from 'zod' + +const BASE_URL = 'https://api.example.com' + +// Define your validators +const UserResponse = z.object({ id: z.string(), name: z.string() }) +const UserListResponse = z.array(UserResponse) +const UserRequest = z.object({ name: z.string() }) + +// Define the entire API structure +export const api = f.router(BASE_URL, { + users: { GET: f - .unit() + .builder() .def_json() - .def_default_referrer('about:client') - .def_response(({ json }) => Model.bookList.parse(json)), + .def_response(async ({ json }) => + UserListResponse.parse(await json()) + ), + POST: f - .unit() + .builder() .def_json() - .def_default_referrer('about:client') - .def_body(Model.bookRequest.parse) - .def_response(({ json }) => Model.book.parse(json)), - // /books/:id, dynamic path using $ prefix + .def_body(UserRequest.parse) + .def_response(async ({ json }) => UserResponse.parse(await json())), + + // Dynamic path: /users/:id $id: { GET: f - .unit() - .def_json() - .def_default_referrer('about:client') - .def_response(async ({ json }) => Model.book.parse(json)), - PUT: f - .unit() - .def_json() - .def_default_referrer('about:client') - .def_body(Model.bookRequest.parse) - .def_response(({ json }) => Model.book.parse(json)), - DELETE: f - .unit() - .def_json() - .def_default_referrer('about:client') - .def_response(({ json }) => Model.book.parse(json)), - }, - }, - category: { - // /category/:name, dynamic path using $ prefix - $name: { - GET: f - .unit() + .builder() .def_json() - .def_default_referrer('about:client') - .def_response(({ json }) => Model.bookList.parse(json)), + .def_response(async ({ json }) => + UserResponse.parse(await json()) + ), }, }, }) + +// The `api` object is now a fully-typed client +async function main() { + // GET /users + const users = await api.users.GET.query() + + // POST /users + const newUser = await api.users.POST.query({ + body: { name: 'Jane Doe' }, + }) + + // GET /users/123 + const user = await api.users.$id.GET.query({ + path: { id: '123' }, + }) +} ``` -> Note: parser library is your choice, you can use `io-ts`, `zod`, `joi`, etc. +### End-to-End Type Safety with `GetRouterConfig` -After define the api, we can get the router config type using `f.GetRouterConfig` type +The most powerful feature of the router is its ability to infer types for your entire API. The `GetRouterConfig` utility creates a type definition that maps directly to your router structure. -- Export the router config type - ```ts - export type BookApi = f.GetRouterConfig - ``` -- Use the router config type +```typescript +// 1. Export the inferred type from your API definition file +export type ApiConfig = GetRouterConfig - ```ts - import { BookApi } from './api' +// 2. In another file, you can import and use this type +import { type ApiConfig } from './api' - type Books = BookApi['books']['GET']['response'] +// You can now extract the exact response type for any endpoint +type GetUsersResponse = ApiConfig['users']['GET']['response'] +// `GetUsersResponse` is now: +// Array<{ id: string; name: string; }> - /** - >> Books = Model.bookList - - predefined models: - Model.bookList = t.array(Model.book) - Model.book = t.type({ id: t.number, title: t.string, author: t.string }) - - >> typescript type: - - type Books = Array<{ id: number, title: string, author: string }> - */ - ``` +// Or the body type for a POST request +type CreateUserBody = ApiConfig['users']['POST']['body'] +// `CreateUserBody` is now: +// { name: string; } +``` -3. Use the api +This creates a single source of truth for your API's contract, providing autocomplete and compile-time errors if the frontend usage ever diverges from the backend definition. -**Middleware support for the router will be available soon.** +## Advanced Usage -```ts -const books = await api.books.GET.query({ - headers: { - Authorization: `Bearer ${Auth}`, - }, -}) +### Middleware -const removed = await api.books.$id.DELETE.query({ - headers: { - Authorization: `Bearer ${Auth}`, - }, - path: { - id: removeTarget.uuid, - }, -}) +Middleware allows you to implement cross-cutting concerns. It follows the standard `(request, next) => Promise` pattern. + +```typescript +// An authentication middleware that adds a bearer token +const authMiddleware: f.MiddlewareFunction = async (request, next) => { + const token = localStorage.getItem('auth_token') + if (token) { + request.headers.set('Authorization', `Bearer ${token}`) + } + // Continue to the next middleware or the actual fetch call + return next(request) +} + +const secureApiClient = apiClient.def_middleware(authMiddleware) + +// All endpoints created from `secureApiClient` will now have the auth header +const getMyProfile = secureApiClient + .def_method('GET') + .def_url(`${BASE_URL}/me`) + .build() +``` + +### Error Handling + +`metal-fetch` provides three distinct handlers for processing outcomes: + +- `def_fetch_err_handler`: Handles `FetchResponseError`, which occurs when the server responds with a non-2xx status code (e.g., 404, 500). You get access to the typed error and status code. +- `def_unknown_err_handler`: Catches any other error, such as network failures, DNS issues, or CORS errors. +- `def_final_handler`: A `finally` block that executes after every request, regardless of success or failure. Useful for cleanup logic. + +```typescript +const robustClient = apiClient + .def_fetch_err_handler(({ error, status }) => { + console.error( + `[API Error] Status: ${status}, Message: ${error.statusMessage}` + ) + }) + .def_unknown_err_handler(({ error }) => { + console.error('[Network Error]', error) + }) + .def_final_handler(() => { + console.log('Request finished.') + }) ``` -This is native `fetch` wrapper, so you can integrate with any state management library like `redux`, `mobx`, `react-query`, etc. +### Aborting Requests + +You can easily abort requests using either a timeout or an `AbortSignal`. + +```typescript +const controller = new AbortController() + +// Abort after 2 seconds +setTimeout(() => controller.abort(), 2000) + +try { + await getUser.query({ + path: { id: '123' }, + // Option 1: Timeout in milliseconds + timeout: 5000, + // Option 2: Provide one or more AbortSignals + abortSignal: controller.signal, + }) +} catch (error) { + // Catches the abort error + console.log(error.name) // 'TimeoutError' or 'AbortError' +} +``` -## Roadmap +## Contributing -- [x] Declarative `fetch` api -- [ ] Middleware support -- [ ] Plugin support (e.g. retry, cache, etc) -- [ ] `OpenAPI` spec based auto generation support -- [ ] Documentation +Contributions are welcome! Please see the [CONTRIBUTING.md](./CONTRIBUTING.md) file for guidelines. ## License -MIT +This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for details. diff --git a/package.json b/package.json index b9dc601..6961773 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "bench": "pnpm --filter=\"benchmark\" start run", "start": "turbo run start", "clean": "turbo run clean", - "test": "vitest", + "test": "vitest --run", "test:watch": "vitest --watch -u", "test:coverage": "vitest run --coverage", "test:ci": "pnpm test:coverage && pnpm prettier && pnpm ts:typecheck && pnpm build", @@ -56,7 +56,8 @@ "turbo": "^2.3.3", "typescript": "^5.7.3", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.0.0" + "vitest": "^3.0.0", + "@metal-box/type": "^0.2.0" }, "engines": { "node": ">=20.0.0" diff --git a/packages/fetch/package.json b/packages/fetch/package.json index 5d8736e..3a037d0 100644 --- a/packages/fetch/package.json +++ b/packages/fetch/package.json @@ -18,8 +18,5 @@ "scripts": { "build": "tsup src/index.ts --format=cjs,esm --dts", "build:fast": "tsup src/index.ts --format=cjs,esm" - }, - "devDependencies": { - "@metal-box/type": "^0.2.0" } } diff --git a/packages/fetch/src/__tests__/__mocks__/client.ts b/packages/fetch/src/__tests__/__mocks__/client.ts index 5ad0367..009e2de 100644 --- a/packages/fetch/src/__tests__/__mocks__/client.ts +++ b/packages/fetch/src/__tests__/__mocks__/client.ts @@ -1,5 +1,5 @@ import { MetalSchemaShape, t } from '@metal-box/type' -import * as f from '../../index' +import { type GetRouterConfig, f } from '../..' import { BASE_URL } from './constant' import { Model } from './model' @@ -12,67 +12,69 @@ export const api = f.router(BASE_URL, { auth: { login: { GET: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') - .def_response(({ json }) => - ApiResponse(t.union(t.string, t.undefined)).parse(json) + .def_response(async ({ json }) => + ApiResponse(t.union(t.string, t.undefined)).parse( + await json() + ) ), }, }, books: { GET: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') - .def_response(({ json }) => - ApiResponse(Model.bookList).parse(json) + .def_response(async ({ json }) => + ApiResponse(Model.bookList).parse(await json()) ), POST: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') .def_body(Model.bookRequest.parse) - .def_response(({ json }) => { - const parsed = ApiResponse(Model.book).parse(json) + .def_response(async ({ json }) => { + const parsed = ApiResponse(Model.book).parse(await json()) return parsed }), $id: { GET: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') .def_response(async ({ json }) => { - return ApiResponse(Model.book).parse(json) + return ApiResponse(Model.book).parse(await json()) }), PUT: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') .def_body(Model.bookRequest.parse) - .def_response(({ json }) => - ApiResponse(Model.book).parse(json) + .def_response(async ({ json }) => + ApiResponse(Model.book).parse(await json()) ), DELETE: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') - .def_response(({ json }) => - ApiResponse(Model.book).parse(json) + .def_response(async ({ json }) => + ApiResponse(Model.book).parse(await json()) ), }, }, category: { $name: { GET: f - .unit() + .builder() .def_json() .def_default_referrer('about:client') - .def_response(({ json }) => { - return ApiResponse(Model.bookList).parse(json) + .def_response(async ({ json }) => { + return ApiResponse(Model.bookList).parse(await json()) }), }, }, }) -export type BookApi = f.GetRouterConfig +export type BookApi = GetRouterConfig diff --git a/packages/fetch/src/__tests__/__mocks__/server.ts b/packages/fetch/src/__tests__/__mocks__/server.ts index e1db3d3..1043500 100644 --- a/packages/fetch/src/__tests__/__mocks__/server.ts +++ b/packages/fetch/src/__tests__/__mocks__/server.ts @@ -132,7 +132,7 @@ class BookServer { header: Headers, data: (authId: UUID) => T, skipAuth: boolean = false - ): HttpResponse { + ): HttpResponse { if (skipAuth) { return HttpResponse.json( { diff --git a/packages/fetch/src/__tests__/build.router.test.ts b/packages/fetch/src/__tests__/build.router.test.ts index 96eaeb3..6d87efe 100644 --- a/packages/fetch/src/__tests__/build.router.test.ts +++ b/packages/fetch/src/__tests__/build.router.test.ts @@ -1,5 +1,5 @@ import { setupServer } from 'msw/node' -import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { api } from './__mocks__/client' import { type BookModel, @@ -14,7 +14,6 @@ const apiServer = setupServer(...bookServer.routes) beforeAll(() => apiServer.listen({ onUnhandledRequest: 'error' })) afterAll(() => apiServer.close()) -afterEach(() => apiServer.resetHandlers()) // ---------------------------------------------------- // describe(label.unit('router api request'), () => { diff --git a/packages/fetch/src/__tests__/builder.test.ts b/packages/fetch/src/__tests__/builder.test.ts new file mode 100644 index 0000000..20065e6 --- /dev/null +++ b/packages/fetch/src/__tests__/builder.test.ts @@ -0,0 +1,82 @@ +import { t } from '@metal-box/type' +import { describe, expect, it, vi } from 'vitest' +import { f } from '..' +import { FetchBuilder } from '../core/fetcher' +import { FetchUnit } from '../core/fetcher/unit' + +describe('FetchBuilder', () => { + it('should create a new FetchBuilder instance', () => { + const b = f.builder() + expect(b).toBeInstanceOf(FetchBuilder) + }) + + it('should set the method', () => { + const b = f.builder().def_method('POST') + expect(b.$store.method).toBe('POST') + }) + + it('should set the base URL', () => { + const url = 'https://api.test.com' + const b = f.builder().def_url(url) + expect(b.$store.defaultUrl).toBe(url) + }) + + it('should set json mode', () => { + const b = f.builder().def_json() + expect(b.isJsonMode).toBe(true) + }) + + it('should build a FetchUnit', () => { + const unit = f.builder().build() + expect(unit).toBeInstanceOf(FetchUnit) + }) + + it('should define a body validator', () => { + const bodySchema = t.object({ name: t.string }) + const b = f.builder().def_body(bodySchema.parse) + const testBody = { name: 'test' } + expect(b.bodyValidator(testBody)).toEqual(testBody) + expect(() => b.bodyValidator({ name: 123 })).toThrow() + }) + + it('should be immutable', () => { + const originalBuilder = f + .builder() + .def_method('GET') + .def_url('https://a.com') + const modifiedBuilder = originalBuilder.def_method('POST') + + expect(originalBuilder.$store.method).toBe('GET') + expect(modifiedBuilder.$store.method).toBe('POST') + expect(originalBuilder.$store.defaultUrl).toBe('https://a.com') + expect(modifiedBuilder.$store.defaultUrl).toBe('https://a.com') + }) + + it('should handle request handler modification', async () => { + const fetchUnit = f + .builder() + .def_url('https://api.com') + .def_request_handler(({ request }) => { + if (request instanceof Request) { + request.headers.set('X-Test', 'true') + } + return request + }) + .build() + + const mockFetch = vi + .spyOn(global, 'fetch') + .mockImplementation(async (req) => { + if (req instanceof Request) { + expect(req.headers.get('X-Test')).toBe('true') + } else { + throw new Error('Expected a Request object') + } + return new Response('OK') + }) + + await fetchUnit.query() + expect(mockFetch).toHaveBeenCalledOnce() + mockFetch.mockRestore() + }) +}) diff --git a/packages/fetch/src/__tests__/middleware.integration.test.ts b/packages/fetch/src/__tests__/middleware.integration.test.ts new file mode 100644 index 0000000..fe5943c --- /dev/null +++ b/packages/fetch/src/__tests__/middleware.integration.test.ts @@ -0,0 +1,69 @@ +import { describe, expect, it, vi } from 'vitest' +import { f } from '..' + +describe('Middleware Integration', () => { + it('should run middleware and modify request headers', async () => { + const TOKEN = 'token' + const middleware = new f.Middleware() + + middleware.use(async (req, next) => { + req.headers.set('Authorization', TOKEN) + return next(req) + }) + + const fetchBuilder = f + .builder() + .def_method('GET') + .def_url('https://api.com') + .def_middleware(middleware.procedures[0]!) + + const fetchUnit = fetchBuilder.build() + + const mockFetch = vi + .spyOn(global, 'fetch') + .mockImplementation(async (req) => { + if (req instanceof Request) { + expect(req.headers.get('Authorization')).toBe(TOKEN) + } else { + throw new Error('Expected a Request object') + } + return new Response('OK', { status: 200 }) + }) + + await fetchUnit.query() + + expect(mockFetch).toHaveBeenCalledOnce() + mockFetch.mockRestore() + }) + + it('should run middleware and modify the response', async () => { + const middleware = new f.Middleware() + + middleware.use(async (req, next) => { + const response = await next(req) + response.headers.set('X-Middleware-Handled', 'true') + return response + }) + + const fetchUnit = f + .builder() + .def_method('GET') + .def_url('https://api.com') + .def_middleware(middleware.procedures[0]!) + .def_response(async ({ response }) => { + expect(response.headers.get('X-Middleware-Handled')).toBe( + 'true' + ) + return response.text() + }) + .build() + + const mockFetch = vi + .spyOn(global, 'fetch') + .mockImplementation(async () => new Response('OK')) + + await fetchUnit.query() + expect(mockFetch).toHaveBeenCalledOnce() + mockFetch.mockRestore() + }) +}) diff --git a/packages/fetch/src/__tests__/middleware.test.ts b/packages/fetch/src/__tests__/middleware.test.ts index 17274de..1e692e9 100644 --- a/packages/fetch/src/__tests__/middleware.test.ts +++ b/packages/fetch/src/__tests__/middleware.test.ts @@ -1,41 +1,36 @@ import { describe, expect, it } from 'vitest' -import { Middleware } from '../utils/middleware' +import { f } from '..' import { label } from './utils/test.label' describe(label.unit('middleware'), () => { - it(label.case('should add middleware'), () => { - const middleware = new Middleware<{ counter: number }, { b: string }>() + it(label.case('should execute middleware in order'), async () => { + const middleware = new f.Middleware() + const executionOrder: number[] = [] - let counter = 0 - middleware.use([ - ({ next }) => { - counter++ + middleware.use(async (req, next) => { + executionOrder.push(1) + const response = await next(req) + executionOrder.push(6) + return response + }) - next({ - req: { counter }, - }) - }, - ({ next }) => { - counter++ + middleware.use(async (req, next) => { + executionOrder.push(2) + const response = await next(req) + executionOrder.push(5) + return response + }) - next({ - req: { counter }, - res: { - b: 'love', - }, - }) - }, - ({ next }) => { - counter++ + middleware.use(async (req, next) => { + executionOrder.push(3) + const response = await next(req) + executionOrder.push(4) + return response + }) - next({ - req: { counter }, - }) - }, - ]) + const mockFetcher = async (req: Request) => new Response('ok') + await middleware.execute(new Request('https://test.com'), mockFetcher) - middleware.execute({ counter }, { b: '2' }) - - expect(counter).toBe(3) + expect(executionOrder).toEqual([1, 2, 3, 4, 5, 6]) }) }) diff --git a/packages/fetch/src/__tests__/unit.test.ts b/packages/fetch/src/__tests__/unit.test.ts index c8a4323..a9e772e 100644 --- a/packages/fetch/src/__tests__/unit.test.ts +++ b/packages/fetch/src/__tests__/unit.test.ts @@ -3,8 +3,8 @@ import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { TypeEqual, expectType } from 'ts-expect' import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest' +import { f } from '..' import { FetchPathParamsError, FetchResponseError } from '../core/error' -import { FetchBuilder } from '../core/fetcher' import { FetchUnit, type InferFetchUnit } from '../core/fetcher/unit' import { label } from './utils/test.label' @@ -34,9 +34,7 @@ const apiServer = setupServer( }) }), - http.get<{ - id: string - }>(`${BASE_URL}/books/:id`, ({ params, request }) => { + http.get(`${BASE_URL}/books/:id`, ({ params, request }) => { const id = params.id const searchParams = new URL(request.url).searchParams const name = searchParams.get('name') @@ -50,6 +48,14 @@ const apiServer = setupServer( status: 'success', }) }), + + http.get('https://unknown.com/', async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(HttpResponse.json({})) + }, 15) + }) + }), ] ) @@ -59,71 +65,58 @@ afterEach(() => apiServer.resetHandlers()) describe('FetchUnit', () => { it(label.case('should CREATE a new instance'), () => { - const fetchUnit = FetchBuilder.Create().build() + const fetchUnit = f.builder().build() expect(fetchUnit).toBeInstanceOf(FetchUnit) }) it(label.case('should SET fetch error procedure'), () => { - const fetchUnit = FetchBuilder.Create() - const result = fetchUnit - .def_fetch_err_handler(({ error, status }) => { - // eslint-disable-next-line no-console - console.error(error, status) - }) - .def_fetch_err_handler(({ error, status }) => { - // eslint-disable-next-line no-console - console.error(error, status) - }) + const fetchUnit = f.builder() + const result = fetchUnit.def_fetch_err_handler(({ error, status }) => { + // eslint-disable-next-line no-console + console.error(error, status) + }) - expect(fetchUnit).toBe(result) + expect(fetchUnit).not.toBe(result) + expect(fetchUnit.fetchErrorProcedure.procedures).toHaveLength(0) + expect(result.fetchErrorProcedure.procedures).toHaveLength(1) }) it(label.case('should SET unknown error procedure'), () => { - const fetchUnit = FetchBuilder.Create() - const result = fetchUnit - .def_unknown_err_handler(({ error }) => { - // eslint-disable-next-line no-console - console.error(error) - }) - .def_unknown_err_handler(({ error }) => { - // eslint-disable-next-line no-console - console.error(error) - }) - expect(fetchUnit).toBe(result) + const fetchUnit = f.builder() + const result = fetchUnit.def_unknown_err_handler(({ error }) => { + // eslint-disable-next-line no-console + console.error(error) + }) + + expect(fetchUnit).not.toBe(result) + expect(fetchUnit.unknownErrorProcedure.procedures).toHaveLength(0) + expect(result.unknownErrorProcedure.procedures).toHaveLength(1) }) it(label.case('should SET finally procedure'), () => { - const fetchUnit = FetchBuilder.Create() - const result = fetchUnit - .def_final_handler(({ headers }) => { - // eslint-disable-next-line no-console - console.log('HEADERS', headers) - }) - .def_final_handler((info) => { - // eslint-disable-next-line no-console - console.log('FETCH_INFO', info) - }) - expect(fetchUnit).toBe(result) + const fetchUnit = f.builder() + const result = fetchUnit.def_final_handler((info) => { + // eslint-disable-next-line no-console + console.log('FETCH_INFO', info) + }) + + expect(fetchUnit).not.toBe(result) + expect(fetchUnit.finallyProcedure.procedures).toHaveLength(0) + expect(result.finallyProcedure.procedures).toHaveLength(1) }) it(label.case('should SET request procedure'), () => { - const fetchUnit = FetchBuilder.Create() - const result = fetchUnit - .def_request_handler(({ request, queryOptions }) => { - // eslint-disable-next-line no-console - console.log('REQUEST', request, queryOptions) - return request - }) - .def_request_handler(({ request }) => { - request.headers.set('Authorization', 'Bearer token') - return request - }) + const fetchUnit = f.builder() + const result = fetchUnit.def_request_handler(({ request }) => { + request.headers.set('Authorization', 'Bearer token') + return request + }) - expect(fetchUnit).toBe(result) + expect(fetchUnit).not.toBe(result) }) it(label.case('should SET json mode for automatic parsing'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const result = fetchUnit.def_json().build() type InjectedFetchUnit = FetchUnit< @@ -142,77 +135,88 @@ describe('FetchUnit', () => { }) it(label.case('should SET credentials'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const credentials = 'same-origin' const result = fetchUnit.def_default_credentials(credentials) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultCredentials).toBe(credentials) }) it(label.case('should SET redirect'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const redirect = 'follow' const result = fetchUnit.def_default_redirect(redirect) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultRedirect).toBe(redirect) }) it(label.case('should SET referrer'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const referrer = 'client' const result = fetchUnit.def_default_referrer(referrer) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultReferrer).toBe(referrer) }) it(label.case('should SET referrer policy'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const referrerPolicy = 'no-referrer' const result = fetchUnit.def_default_referrer_policy(referrerPolicy) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultReferrerPolicy).toBe(referrerPolicy) }) it(label.case('should SET integrity'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const integrity = 'sha256-abcde' const result = fetchUnit.def_default_integrity(integrity) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultIntegrity).toBe(integrity) }) it(label.case('should SET keepalive'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const keepalive = true const result = fetchUnit.def_default_keepalive(keepalive) - expect(fetchUnit).toBe(result) - }) - it(label.case('should SET signal'), () => { - const fetchUnit = FetchBuilder.Create() - const controller = new AbortController() - const result = fetchUnit.def_default_signal(controller.signal) - expect(fetchUnit).toBe(result) + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultKeepalive).toBe(keepalive) }) it(label.case('should SET window'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const window = null const result = fetchUnit.def_default_window(window) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultWindow).toBe(window) }) it(label.case('should SET mode'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const mode = 'cors' const result = fetchUnit.def_default_mode(mode) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultMode).toBe(mode) }) it(label.case('should SET cache'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const cache = 'default' const result = fetchUnit.def_default_cache(cache) - expect(fetchUnit).toBe(result) + + expect(fetchUnit).not.toBe(result) + expect(result.$store.defaultCache).toBe(cache) }) it(label.case('should SET safe mode'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const result = fetchUnit.def_query_mode('not_throw').build() type InjectedFetchUnit = FetchUnit< @@ -231,7 +235,7 @@ describe('FetchUnit', () => { }) it(label.case('should DEFINE search params shape'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const SearchParams = t .object({ name: t.string, @@ -261,7 +265,7 @@ describe('FetchUnit', () => { }) it(label.case('should DEFINE body shape'), () => { - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f.builder() const BookRequest = t.object({ name: t.string, category: t.string, @@ -309,7 +313,8 @@ describe('FetchUnit', () => { }, })) - const postDynamicUnit = FetchBuilder.Create() + const postDynamicUnit = f + .builder() .def_method('GET') // DYNAMIC path params: $id .def_url(`${BASE_URL}/books/$id`) @@ -317,7 +322,7 @@ describe('FetchUnit', () => { .def_default_referrer('about:client') .def_json() .def_searchparams(SearchParams.parse) - .def_response(({ json }) => BookResponse.parse(json)) + .def_response(async ({ json }) => BookResponse.parse(await json())) .build() const searchParams = { @@ -345,7 +350,7 @@ describe('FetchUnit', () => { it( label.case('should DEFINE response shape [json mode - activated]'), () => { - const fetchUnit = FetchBuilder.Create().def_json() + const fetchUnit = f.builder().def_json() const Product = t.object({ name: t.string, @@ -375,7 +380,7 @@ describe('FetchUnit', () => { it( label.case('should DEFINE response shape [json mode - deactivated]'), async () => { - const fetchUnit = FetchBuilder.Create().def_json() + const fetchUnit = f.builder().def_json() const Product = t.object({ name: t.string, @@ -384,7 +389,7 @@ describe('FetchUnit', () => { const result = fetchUnit .def_response(async ({ json }) => { // Manual parsing for json response - const product = Product.parse(json) + const product = Product.parse(await json()) return product }) .build() @@ -417,14 +422,15 @@ describe('FetchUnit', () => { status: t.union(t.literal('success'), t.literal('error')), 'message?': t.string, }) - const postUnit = FetchBuilder.Create() + const postUnit = f + .builder() .def_query_mode('throw') .def_method('POST') .def_default_referrer('about:client') .def_url(`${BASE_URL}/books`) .def_json() .def_body(Body.parse) - .def_response(({ json }) => ApiResponse.parse(json)) + .def_response(async ({ json }) => ApiResponse.parse(await json())) .build() type PostUnit = FetchUnit< @@ -493,7 +499,8 @@ describe('FetchUnit', () => { >('FormData', (e) => e instanceof FormData) .transform(toJson) - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f + .builder() .def_query_mode('throw') .def_method('POST') .def_default_referrer('about:client') @@ -523,7 +530,8 @@ describe('FetchUnit', () => { let isFetchErrorHandled = false let errorStatusCode: number | undefined - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f + .builder() .def_query_mode('throw') .def_method('GET') .def_default_referrer('about:client') @@ -564,13 +572,13 @@ describe('FetchUnit', () => { it(label.case('should HANDLE unknown error & handled once'), async () => { let errorHandled = false - const fetchUnit = FetchBuilder.Create() + const fetchUnit = f + .builder() .def_query_mode('throw') .def_method('GET') .def_default_referrer('about:client') .def_url('https://unknown.com') .def_json() - .def_query_mode('not_throw') .def_unknown_err_handler(() => { // ERROR_HANDLED should be called only once errorHandled = true @@ -582,23 +590,44 @@ describe('FetchUnit', () => { }) .build() - try { - await fetchUnit.query() - } catch (error) { - expect(errorHandled).toBe(true) - expect(error).toBeInstanceOf(Error) - errorHandled = false - } + await fetchUnit.query() + expect(errorHandled).toBe(false) + }) - try { - await fetchUnit.query() - } catch (error) { - expect(errorHandled).toBe(false) - expect(error).toBeInstanceOf(Error) - } + it(label.case('should ABORT request with timeout'), async () => { + const fetchUnit = f.builder().def_url('https://unknown.com').build() + await expect(fetchUnit.query({ timeout: 1 })).rejects.toThrowError( + 'The operation was aborted due to timeout' + ) + }) - const thisWillNotThrowError = await fetchUnit.query() - expect(thisWillNotThrowError).toBeUndefined() + it(label.case('should ABORT request with single signal'), async () => { + const fetchUnit = f.builder().def_url('https://unknown.com').build() + const controller = new AbortController() + setTimeout(() => controller.abort(), 1) + await expect( + fetchUnit.query({ signal: controller.signal }) + ).rejects.toThrowError('This operation was aborted') + }) + + it(label.case('should ABORT request with multiple signals'), async () => { + const fetchUnit = f.builder().def_url('https://unknown.com').build() + const controller1 = new AbortController() + const controller2 = new AbortController() + setTimeout(() => controller1.abort(), 1) + await expect( + fetchUnit.query({ + signal: [controller1.signal, controller2.signal], + }) + ).rejects.toThrowError('This operation was aborted') + }) + + it(label.case('should ABORT request with timeout and signal'), async () => { + const fetchUnit = f.builder().def_url('https://unknown.com').build() + const controller = new AbortController() + await expect( + fetchUnit.query({ timeout: 1, signal: controller.signal }) + ).rejects.toThrowError('The operation was aborted due to timeout') }) it( @@ -607,7 +636,7 @@ describe('FetchUnit', () => { ), () => { try { - FetchBuilder.Create().def_url(`${BASE_URL}/books/_$id`).build() + f.builder().def_url(`${BASE_URL}/books/_$id`).build() } catch (e) { expect(e).toBeInstanceOf(FetchPathParamsError) } diff --git a/packages/fetch/src/core/error/index.ts b/packages/fetch/src/core/error/index.ts index a84e13e..1ad7495 100644 --- a/packages/fetch/src/core/error/index.ts +++ b/packages/fetch/src/core/error/index.ts @@ -39,7 +39,7 @@ export class FetchSearchParamsError extends FetchError { cause?: unknown ) { super( - 'SearchParams', + 'Search Params', `${FetchError.formatJson(searchParams)} at ${basePath}`, undefined, cause @@ -54,7 +54,7 @@ export class FetchPathParamsError extends FetchError { cause?: unknown ) { super( - 'PathParams', + 'Path Params', `${FetchError.formatJson(pathParams)} at ${basePath}`, undefined, cause @@ -62,15 +62,6 @@ export class FetchPathParamsError extends FetchError { } } -export class FetchBodyError extends FetchError { - public constructor( - public readonly body: unknown, - cause?: unknown - ) { - super('Body', FetchError.formatJson(body), undefined, cause) - } -} - export type FetchErrorCode = | 400 // Bad Request | 401 // Unauthorized @@ -115,7 +106,7 @@ export type FetchErrorCode = export class FetchResponseError extends FetchError { private static statusMessage(response: Response): string { - return `Error_code - ${response.status}\n› ${response.statusText}` + return `Error Code - ${response.status}\n› ${response.statusText}` } public status: FetchErrorCode diff --git a/packages/fetch/src/core/fetcher/builder.ts b/packages/fetch/src/core/fetcher/builder.ts index 69157ae..4e7bdab 100644 --- a/packages/fetch/src/core/fetcher/builder.ts +++ b/packages/fetch/src/core/fetcher/builder.ts @@ -1,6 +1,12 @@ +import { Middleware, MiddlewareFunction } from '../../utils/middleware' import { Procedure, ProcedureSet } from '../../utils/procedure' import type { ConcreteBoolean, JSON } from '../../utils/types' -import { FetchErrorCode, FetchResponseError } from '../error' +import { + FetchErrorCode, + FetchPathParamsError, + FetchResponseError, + FetchSearchParamsError, +} from '../error' import { DefaultFetchModeOptions, FetchMethod, @@ -11,6 +17,7 @@ import { FetchQueryOptions, FetchSearchParamsShape, FetchUnitRequestHandler, + Param, } from './core.type' import { FetchOptionStore } from './fetch.option' import { FetchUnit } from './unit' @@ -24,9 +31,15 @@ export class FetchBuilder< $ModeOptions extends FetchModeOptionsShape = DefaultFetchModeOptions, const $BaseUrl extends string = '', > { - public copy( - newStore: FetchOptionStore - ): FetchBuilder< + private _clone< + $Method extends FetchMethodString, + $PathParams extends FetchPathParamsShape, + $SearchParams extends FetchSearchParamsShape, + $Body, + $Response, + $ModeOptions extends FetchModeOptionsShape, + $BaseUrl extends string, + >(): FetchBuilder< $Method, $PathParams, $SearchParams, @@ -35,7 +48,7 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - const copy = new FetchBuilder< + const newBuilder = new FetchBuilder< $Method, $PathParams, $SearchParams, @@ -44,19 +57,30 @@ export class FetchBuilder< $ModeOptions, $BaseUrl >() - copy._store = newStore - copy.def_fetch_err_handler(this.fetchErrorProcedure.executor) - copy.def_unknown_err_handler(this.unknownErrorProcedure.executor) - copy.def_final_handler(this.finallyProcedure.executor) - copy.def_response(this.responseHandler) - copy.def_request_handler(this.requestHandler) - copy.def_searchparams(this.searchParamsValidator) - copy.def_query_mode(this.isSafeMode ? 'not_throw' : 'throw') - this.isJsonMode && copy.def_json() - - return copy + + newBuilder._store = this._store.copy() + ;(newBuilder.fetchErrorProcedure as any) = + this.fetchErrorProcedure.copy() + ;(newBuilder.unknownErrorProcedure as any) = + this.unknownErrorProcedure.copy() + ;(newBuilder.finallyProcedure as any) = this.finallyProcedure.copy() + ;(newBuilder.middleware as any) = this.middleware.copy() + + newBuilder.bodyValidator = this.bodyValidator as any + newBuilder.responseHandler = this.responseHandler as any + newBuilder.requestHandler = this.requestHandler as any + newBuilder.searchParamsValidator = this.searchParamsValidator as any + + newBuilder.isJsonMode = this.isJsonMode + newBuilder.isSafeMode = this.isSafeMode + + return newBuilder } + /** + * Build fetch unit + * @returns Fetch Unit + */ public build(): FetchUnit< $Method, $PathParams, @@ -77,7 +101,7 @@ export class FetchBuilder< >(this.$store, this) } - public static Create< + public static new< FetchMethod extends FetchMethodString, FetchPathParams extends FetchPathParamsShape = unknown, FetchSearchParams extends FetchSearchParamsShape = unknown, @@ -126,8 +150,17 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this._store.method = method - return this + const newBuilder = this._clone< + Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder._store.method = method + return newBuilder } public def_url( url: Url @@ -140,59 +173,154 @@ export class FetchBuilder< $ModeOptions, Url > { - this.$store.defaultUrl = url - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + Url + >() + newBuilder.$store.defaultUrl = url + return newBuilder } public def_default_cache(cache: FetchOption['cache']) { - this.$store.defaultCache = cache - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultCache = cache + return newBuilder } public def_default_mode(mode: FetchOption['mode']) { - this.$store.defaultMode = mode - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultMode = mode + return newBuilder } public def_default_credentials(credentials: FetchOption['credentials']) { - this.$store.defaultCredentials = credentials - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultCredentials = credentials + return newBuilder } public def_default_redirect(redirect: FetchOption['redirect']) { - this.$store.defaultRedirect = redirect - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultRedirect = redirect + return newBuilder } public def_default_referrer(referrer: FetchOption['referrer']) { - this.$store.defaultReferrer = referrer - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultReferrer = referrer + return newBuilder } public def_default_referrer_policy( referrerPolicy: FetchOption['referrerPolicy'] ) { - this.$store.defaultReferrerPolicy = referrerPolicy - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultReferrerPolicy = referrerPolicy + return newBuilder } public def_default_integrity(integrity: FetchOption['integrity']) { - this.$store.defaultIntegrity = integrity - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultIntegrity = integrity + return newBuilder } public def_default_keepalive(keepalive: FetchOption['keepalive']) { - this.$store.defaultKeepalive = keepalive - return this - } - public def_default_signal(signal: FetchOption['signal']) { - this.$store.defaultSignal = signal - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultKeepalive = keepalive + return newBuilder } public def_default_window(window: FetchOption['window']) { - this.$store.defaultWindow = window - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultWindow = window + return newBuilder } public def_default_priority(priority: FetchOption['priority']) { - this.$store.defaultPriority = priority - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.$store.defaultPriority = priority + return newBuilder } - public searchParamsValidator: ( + public searchParamsValidator!: ( searchParams: FetchSearchParamsShape - ) => $SearchParams = (s) => s as $SearchParams + ) => $SearchParams public def_searchparams( searchParamsValidator: ( params: FetchSearchParamsShape @@ -206,8 +334,7 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.searchParamsValidator = searchParamsValidator - return this as unknown as FetchBuilder< + const newBuilder = this._clone< $Method, $PathParams, FetchSearchParamsInjection, @@ -215,7 +342,9 @@ export class FetchBuilder< $Response, $ModeOptions, $BaseUrl - > + >() + newBuilder.searchParamsValidator = searchParamsValidator + return newBuilder } public readonly fetchErrorProcedure: ProcedureSet<{ @@ -237,8 +366,17 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.fetchErrorProcedure.use(fetchErrorProcedure, once) - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.fetchErrorProcedure.use(fetchErrorProcedure, once) + return newBuilder } public readonly unknownErrorProcedure: ProcedureSet<{ @@ -258,8 +396,17 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.unknownErrorProcedure.use(unknownErrorProcedure, once) - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.unknownErrorProcedure.use(unknownErrorProcedure, once) + return newBuilder } public readonly finallyProcedure: ProcedureSet< @@ -279,11 +426,20 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.finallyProcedure.use(finallyHandler, once) - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.finallyProcedure.use(finallyHandler, once) + return newBuilder } - public bodyValidator: (body: unknown) => $Body = (s) => s as $Body + public bodyValidator!: (body: unknown) => $Body /** * @description Validate body data using any schema validation library * @param bodyValidator validate body data, return parsed body data @@ -293,13 +449,13 @@ export class FetchBuilder< * import { z } from "zod" * * const BodyZod = z.object({ name: z.string() }) - * const fetchUnit = f.unit().def_body(BodyZod.parse) + * const fetchUnit = f.builder().def_body(BodyZod.parse) * * // Example using metal-box/type * import { t } from "@metal-box/type" * * const BodyMetal = t.object({ name: t.string }) - * const fetchUnit2 = f.unit().def_body(BodyMetal.parse) + * const fetchUnit2 = f.builder().def_body(BodyMetal.parse) * ``` */ public def_body( @@ -313,8 +469,7 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.bodyValidator = bodyValidator - return this as unknown as FetchBuilder< + const newBuilder = this._clone< $Method, $PathParams, $SearchParams, @@ -322,14 +477,16 @@ export class FetchBuilder< $Response, $ModeOptions, $BaseUrl - > + >() + newBuilder.bodyValidator = bodyValidator + return newBuilder } public responseHandler: ( responseArgument: $ModeOptions['isJsonMode'] extends true ? { response: Response - json: JSON + json: () => Promise } : { response: Response @@ -339,12 +496,12 @@ export class FetchBuilder< * @description Define response data * @param responseHandler validate response data, return processed response data */ - public def_response( + public def_response( responseHandler: ( responseArgument: $ModeOptions['isJsonMode'] extends true ? { response: Response - json: JSON + json: () => Promise } : { response: Response @@ -359,8 +516,7 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.responseHandler = responseHandler - return this as unknown as FetchBuilder< + const newBuilder = this._clone< $Method, $PathParams, $SearchParams, @@ -368,14 +524,16 @@ export class FetchBuilder< Awaited, $ModeOptions, $BaseUrl - > + >() + newBuilder.responseHandler = responseHandler as any + return newBuilder } public requestHandler: FetchUnitRequestHandler< $PathParams, $SearchParams, $Body - > = (s) => s.request + > = (s) => s.request as any /** * @description Handle request data * @param requestHandler handle request data, return processed request data @@ -395,8 +553,32 @@ export class FetchBuilder< $ModeOptions, $BaseUrl > { - this.requestHandler = requestHandler - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.requestHandler = requestHandler + return newBuilder + } + + public middleware: Middleware = new Middleware() + public def_middleware(...middleware: Array): this { + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + $ModeOptions, + $BaseUrl + >() + newBuilder.middleware.use(middleware) + return newBuilder as this } public isJsonMode: ConcreteBoolean = false @@ -412,22 +594,7 @@ export class FetchBuilder< }, $BaseUrl > { - if (this.isJsonMode) - return this as unknown as FetchBuilder< - $Method, - $PathParams, - $SearchParams, - $Body, - $Response, - { - isJsonMode: true - isSafeMode: $ModeOptions['isSafeMode'] - }, - $BaseUrl - > - - this.isJsonMode = true - return this as unknown as FetchBuilder< + const newBuilder = this._clone< $Method, $PathParams, $SearchParams, @@ -438,7 +605,9 @@ export class FetchBuilder< isSafeMode: $ModeOptions['isSafeMode'] }, $BaseUrl - > + >() + newBuilder.isJsonMode = true + return newBuilder } public isSafeMode: ConcreteBoolean = false @@ -456,8 +625,100 @@ export class FetchBuilder< }, $BaseUrl > { - this.isSafeMode = queryMode === 'not_throw' - return this + const newBuilder = this._clone< + $Method, + $PathParams, + $SearchParams, + $Body, + $Response, + { + isJsonMode: $ModeOptions['isJsonMode'] + isSafeMode: QueryMode extends 'throw' ? false : true + }, + $BaseUrl + >() + newBuilder.isSafeMode = queryMode === 'not_throw' + return newBuilder + } + + public buildPathParams(baseUrl: string, pathParams?: $PathParams): string { + if (!pathParams) return baseUrl + + try { + const baseUrlObject: URL = new URL(baseUrl) + const dynamicParamsProcessedPath: string = baseUrlObject.pathname + .split('/') + .filter(Boolean) + .reduce>((paramList, params) => { + const isDynamicParam: boolean = params.startsWith('$') + + if (params.includes('$') && !isDynamicParam) + throw new SyntaxError( + `Invalid path params, ${params}\nDynamic Params should be started with $, ex) $id, $name\nCheck your base url: ${baseUrl}` + ) + + if (isDynamicParam) { + const paramKey: string = params.slice(1) + const dynamicParam: Param | undefined = ( + pathParams as Record + )?.[paramKey] + + if ( + !dynamicParam || + (typeof dynamicParam !== 'number' && + typeof dynamicParam !== 'string') + ) + return paramList + + paramList.push(String(dynamicParam)) + return paramList + } + + paramList.push(params) + return paramList + }, []) + .join('/') + + baseUrlObject.pathname = dynamicParamsProcessedPath + return baseUrlObject.toString() + } catch (e) { + throw new FetchPathParamsError(baseUrl.toString(), pathParams, e) + } + } + + public buildSearchParams( + baseUrl: string, + searchParams?: $SearchParams + ): string { + if (!searchParams) return baseUrl + + try { + const validatedSearchParams: Record> = + this.searchParamsValidator(searchParams) as Record< + string, + Param | Array + > + + const baseUrlObject: URL = new URL(baseUrl) + + Object.entries(validatedSearchParams).forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach((v) => { + baseUrlObject.searchParams.append(key, v.toString()) + }) + } else { + baseUrlObject.searchParams.append(key, value.toString()) + } + }) + + return baseUrlObject.toString() + } catch (e) { + throw new FetchSearchParamsError( + baseUrl.toString(), + searchParams, + e + ) + } } } @@ -487,4 +748,4 @@ export type DefaultFetchBuilderShape = FetchBuilder< '' > -export const unit = FetchBuilder.Create +export const builder = FetchBuilder.new diff --git a/packages/fetch/src/core/fetcher/core.type.ts b/packages/fetch/src/core/fetcher/core.type.ts index 8767106..128700e 100644 --- a/packages/fetch/src/core/fetcher/core.type.ts +++ b/packages/fetch/src/core/fetcher/core.type.ts @@ -1,7 +1,7 @@ import type { ConcreteBoolean, IncludeString, - OptionalAndNeverAtUnknown, + OmitNever, } from '../../utils/types' type BaseFetchOption = Required @@ -169,9 +169,12 @@ type DefaultFetchModeOptions = { isSafeMode: false } -type FetchUnitOption = Omit +type FetchUnitOption = Omit< + FetchOption, + 'body' | 'method' | 'headers' | 'signal' +> type FetchQueryOptions = - OptionalAndNeverAtUnknown<{ + OmitNever<{ /** * @description Path params */ @@ -193,6 +196,15 @@ type FetchQueryOptions = * @description Fetch option */ options?: Partial + /** + * @description Timeout for request + * @example 1000 = `1000ms` + */ + timeout?: number + /** + * @description `AbortSignal` for request + */ + signal?: AbortSignal | AbortSignal[] } interface FetchQueryOptionsPartial< @@ -205,6 +217,8 @@ interface FetchQueryOptionsPartial< body?: FetchBody options?: Partial headers?: FetchHeader + timeout?: number + signal?: AbortSignal | AbortSignal[] } type FetchUnitRequestHandler = diff --git a/packages/fetch/src/core/fetcher/fetch.option.ts b/packages/fetch/src/core/fetcher/fetch.option.ts index 417f562..b063ef3 100644 --- a/packages/fetch/src/core/fetcher/fetch.option.ts +++ b/packages/fetch/src/core/fetcher/fetch.option.ts @@ -1,156 +1,14 @@ -import { IncludeString } from '../../utils/types' - -export type FetchUrl = Parameters[0] -export type FetchOption = Required -export type FetchMethod = - | 'GET' - | 'POST' - | 'PUT' - | 'DELETE' - | 'PATCH' - | 'CONNECT' - | 'HEAD' - | 'OPTIONS' - | 'TRACE' -export type FetchHeader = FetchOption['headers'] & { - [key in FetchHeaderKeyString]?: string -} -export type FetchMethodString = FetchMethod | IncludeString - -type FetchHeaderKey = - | 'Accept' - | 'Accept-CH' - | 'Accept-CH-Lifetime' - | 'Accept-Charset' - | 'Accept-Encoding' - | 'Accept-Language' - | 'Accept-Patch' - | 'Accept-Post' - | 'Accept-Ranges' - | 'Access-Control-Allow-Credentials' - | 'Access-Control-Allow-Headers' - | 'Access-Control-Allow-Methods' - | 'Access-Control-Allow-Origin' - | 'Access-Control-Expose-Headers' - | 'Access-Control-Max-Age' - | 'Access-Control-Request-Headers' - | 'Access-Control-Request-Method' - | 'Age' - | 'Allow' - | 'Alt-Svc' - | 'Alt-Used' - | 'Authorization' - | 'Cache-Control' - | 'Clear-Site-Data' - | 'Connection' - | 'Content-DPR' - | 'Content-Disposition' - | 'Content-Encoding' - | 'Content-Language' - | 'Content-Length' - | 'Content-Location' - | 'Content-Range' - | 'Content-Security-Policy' - | 'Content-Security-Policy-Report-Only' - | 'Content-Type' - | 'Cookie' - | 'Critical-CH' - | 'Cross-Origin-Embedder-Policy' - | 'Cross-Origin-Opener-Policy' - | 'Cross-Origin-Resource-Policy' - | 'DNT' - | 'DPR' - | 'Date' - | 'Device-Memory' - | 'Digest' - | 'Downlink' - | 'ECT' - | 'ETag' - | 'Early-Data' - | 'Expect' - | 'Expect-CT' - | 'Expires' - | 'Forwarded' - | 'From' - | 'Host' - | 'If-Match' - | 'If-Modified-Since' - | 'If-None-Match' - | 'If-Range' - | 'If-Unmodified-Since' - | 'Keep-Alive' - | 'Large-Allocation' - | 'Last-Modified' - | 'Link' - | 'Location' - | 'Max-Forwards' - | 'NEL' - | 'Origin' - | 'Origin-Agent-Cluster' - | 'Permissions-Policy' - | 'Pragma' - | 'Proxy-Authenticate' - | 'Proxy-Authorization' - | 'RTT' - | 'Range' - | 'Referer' - | 'Referrer-Policy' - | 'Retry-After' - | 'Save-Data' - | 'Sec-CH-Prefers-Color-Scheme' - | 'Sec-CH-Prefers-Reduced-Motion' - | 'Sec-CH-Prefers-Reduced-Transparency' - | 'Sec-CH-UA' - | 'Sec-CH-UA-Arch' - | 'Sec-CH-UA-Bitness' - | 'Sec-CH-UA-Full-Version' - | 'Sec-CH-UA-Full-Version-List' - | 'Sec-CH-UA-Mobile' - | 'Sec-CH-UA-Model' - | 'Sec-CH-UA-Platform' - | 'Sec-CH-UA-Platform-Version' - | 'Sec-Fetch-Dest' - | 'Sec-Fetch-Mode' - | 'Sec-Fetch-Site' - | 'Sec-Fetch-User' - | 'Sec-GPC' - | 'Sec-Purpose' - | 'Sec-WebSocket-Accept' - | 'Server' - | 'Server-Timing' - | 'Service-Worker-Navigation-Preload' - | 'Set-Cookie' - | 'Set-Login' - | 'SourceMap' - | 'Strict-Transport-Security' - | 'Supports-Loading-Mode' - | 'TE' - | 'Timing-Allow-Origin' - | 'Tk' - | 'Trailer' - | 'Transfer-Encoding' - | 'Upgrade' - | 'Upgrade-Insecure-Requests' - | 'User-Agent' - | 'Vary' - | 'Via' - | 'Viewport-Width' - | 'WWW-Authenticate' - | 'Want-Digest' - | 'Warning' - | 'Width' - | 'X-Content-Type-Options' - | 'X-DNS-Prefetch-Control' - | 'X-Forwarded-For' - | 'X-Forwarded-Host' - | 'X-Forwarded-Proto' - | 'X-Frame-Options' - | 'X-XSS-Protection' -type FetchHeaderKeyString = FetchHeaderKey | IncludeString +import type { + FetchHeader, + FetchMethod, + FetchOption, + FetchUrl, +} from './core.type' export class FetchOptionStore { public get options(): FetchOption { return { + signal: null, cache: this.cache, body: this.body, headers: this.headers, @@ -161,7 +19,6 @@ export class FetchOptionStore { referrerPolicy: this.referrerPolicy, integrity: this.integrity, keepalive: this.keepalive, - signal: this.signal, window: this.window, priority: this.priority, method: this.method, @@ -169,23 +26,9 @@ export class FetchOptionStore { } public copy(): FetchOptionStore { - const copy = new FetchOptionStore() - copy.url = this.url - copy.method = this.method - copy.cache = this.cache - copy.body = this.body - copy.headers = this.headers - copy.mode = this.mode - copy.credentials = this.credentials - copy.redirect = this.redirect - copy.referrer = this.referrer - copy.referrerPolicy = this.referrerPolicy - copy.integrity = this.integrity - copy.keepalive = this.keepalive - copy.signal = this.signal - copy.window = this.window - copy.priority = this.priority - return copy + const newStore = new FetchOptionStore() + Object.assign(newStore, this) + return newStore } /* @@ -296,7 +139,7 @@ export class FetchOptionStore { * Referrer */ private _referrer: FetchOption['referrer'] | null = null - public defaultReferrer: FetchOption['referrer'] = 'client' + public defaultReferrer: FetchOption['referrer'] = 'about:client' public get referrer(): FetchOption['referrer'] { return this._referrer ?? this.defaultReferrer } @@ -341,18 +184,6 @@ export class FetchOptionStore { this._keepalive = value } - /* - * Signal - */ - private _signal: FetchOption['signal'] | null = null - public defaultSignal: FetchOption['signal'] = null - public get signal(): FetchOption['signal'] { - return this._signal ?? this.defaultSignal - } - public set signal(value: FetchOption['signal']) { - this._signal = value - } - /* * Window */ diff --git a/packages/fetch/src/core/fetcher/unit.ts b/packages/fetch/src/core/fetcher/unit.ts index eb89c2a..e551fa6 100644 --- a/packages/fetch/src/core/fetcher/unit.ts +++ b/packages/fetch/src/core/fetcher/unit.ts @@ -1,11 +1,5 @@ import type { ConcreteBoolean, JSON, OmitUnknown } from '../../utils/types' -import { - FetchBodyError, - type FetchErrorCode, - FetchPathParamsError, - FetchResponseError, - FetchSearchParamsError, -} from '../error' +import { type FetchErrorCode, FetchResponseError } from '../error' import type { FetchBuilder } from './builder' import type { DefaultFetchModeOptions, @@ -17,7 +11,6 @@ import type { FetchQueryOptionsPartial, FetchSearchParamsShape, FetchUnitOption, - Param, } from './core.type' import type { FetchOptionStore } from './fetch.option' @@ -44,7 +37,25 @@ export class FetchUnit< $ModeOptions, $BaseUrl > - ) {} + ) { + this.copy = this.copy.bind(this) + + this.set_options = this.set_options.bind(this) + this.set_cache = this.set_cache.bind(this) + this.set_credentials = this.set_credentials.bind(this) + this.set_redirect = this.set_redirect.bind(this) + this.set_referrer = this.set_referrer.bind(this) + this.set_referrer_policy = this.set_referrer_policy.bind(this) + this.set_integrity = this.set_integrity.bind(this) + this.set_keepalive = this.set_keepalive.bind(this) + this.set_window = this.set_window.bind(this) + this.set_mode = this.set_mode.bind(this) + this.set_priority = this.set_priority.bind(this) + + this.getRequestURI = this.getRequestURI.bind(this) + this.createRequest = this.createRequest.bind(this) + this.query = this.query.bind(this) + } public copy(): FetchUnit< $Method, @@ -56,7 +67,7 @@ export class FetchUnit< $BaseUrl > { const newStore = this.$store.copy() - return new FetchUnit(newStore, this.$builder.copy(newStore)) + return new FetchUnit(newStore, this.$builder) } public set_options( @@ -82,7 +93,6 @@ export class FetchUnit< options.referrer && copyUnit.set_referrer(options.referrer) options.referrerPolicy && copyUnit.set_referrer_policy(options.referrerPolicy) - options.signal && copyUnit.set_signal(options.signal) options.window && copyUnit.set_window(options.window) return copyUnit @@ -193,21 +203,6 @@ export class FetchUnit< copyUnit.$store.keepalive = keepalive return copyUnit } - public set_signal( - signal: FetchOption['signal'] - ): FetchUnit< - $Method, - $PathParams, - $SearchParams, - $Body, - $Response, - $ModeOptions, - $BaseUrl - > { - const copyUnit = this.copy() - copyUnit.$store.signal = signal - return copyUnit - } public set_window( window: FetchOption['window'] ): FetchUnit< @@ -254,93 +249,13 @@ export class FetchUnit< return copyUnit } - private buildPathParams(baseUrl: string, pathParams?: $PathParams): string { - if (!pathParams) return baseUrl - - try { - const baseUrlObject: URL = new URL(baseUrl) - const dynamicParamsProcessedPath: string = baseUrlObject.pathname - .split('/') - .filter(Boolean) - .reduce>((paramList, params) => { - const isDynamicParam: boolean = params.startsWith('$') - - if (params.includes('$') && !isDynamicParam) - throw new SyntaxError( - `Invalid path params, ${params}\nDynamic Params should be started with $, ex) $id, $name\nCheck your base url: ${baseUrl}` - ) - - if (isDynamicParam) { - const paramKey: string = params.slice(1) - const dynamicParam: Param | undefined = ( - pathParams as Record - )?.[paramKey] - - if ( - !dynamicParam || - (typeof dynamicParam !== 'number' && - typeof dynamicParam !== 'string') - ) - return paramList - - paramList.push(String(dynamicParam)) - return paramList - } - - paramList.push(params) - return paramList - }, []) - .join('/') - - baseUrlObject.pathname = dynamicParamsProcessedPath - return baseUrlObject.toString() - } catch (e) { - throw new FetchPathParamsError(baseUrl.toString(), pathParams, e) - } - } - - private buildSearchParams( - baseUrl: string, - searchParams?: $SearchParams - ): string { - if (!searchParams) return baseUrl - - try { - const validatedSearchParams: Record> = - this.$builder.searchParamsValidator(searchParams) as Record< - string, - Param | Array - > - - const baseUrlObject: URL = new URL(baseUrl) - - Object.entries(validatedSearchParams).forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach((v) => { - baseUrlObject.searchParams.append(key, v.toString()) - }) - } else { - baseUrlObject.searchParams.append(key, value.toString()) - } - }) - - return baseUrlObject.toString() - } catch (e) { - throw new FetchSearchParamsError( - baseUrl.toString(), - searchParams, - e - ) - } - } - private getRequestURI( pathParams?: $PathParams, searchParams?: $SearchParams ): string { const baseUrl = this.$store.url - const requestURI = this.buildSearchParams( - this.buildPathParams( + const requestURI = this.$builder.buildSearchParams( + this.$builder.buildPathParams( baseUrl instanceof Request ? baseUrl.url : baseUrl.toString(), pathParams ), @@ -362,9 +277,6 @@ export class FetchUnit< try { const serializedJson: string = JSON.stringify(targetBody) - const isJson: boolean = serializedJson !== '{}' - if (!isJson) throw new FetchBodyError(targetBody) - return serializedJson } catch (e) { throw new SyntaxError( @@ -383,24 +295,48 @@ export class FetchUnit< $Body > ): Request { - const validatedBody: BodyInit | null = queryOptions?.body + // Generate body + const body: BodyInit | null = queryOptions?.body ? this.getValidBody(this.$builder.bodyValidator(queryOptions?.body)) : this.$store.body - const requestHeaders: HeadersInit = queryOptions?.headers - ? { - ...this.$store.headers, - ...(queryOptions.headers as Record), - } - : this.$store.headers + // Generate headers + const headers: Headers = new Headers( + queryOptions?.headers + ? { + ...this.$store.headers, + ...(queryOptions.headers as Record), + } + : this.$store.headers + ) + + // Validate headers + if (this.$builder.isJsonMode && !headers.has('Content-Type')) { + headers.set('Content-Type', 'application/json') + } + + // Attaching signals + const signals: AbortSignal[] = [] + if (queryOptions?.timeout) { + signals.push(AbortSignal.timeout(queryOptions.timeout)) + } + if (queryOptions?.signal) { + if (Array.isArray(queryOptions.signal)) { + signals.push(...queryOptions.signal) + } else { + signals.push(queryOptions.signal) + } + } + // Create request const request: Request = new Request( this.getRequestURI(queryOptions?.path, queryOptions?.search), { ...this.$store.options, ...queryOptions?.options, - headers: requestHeaders, - body: validatedBody, + headers, + body: body, + signal: signals.length > 0 ? AbortSignal.any(signals) : null, } ) @@ -427,20 +363,22 @@ export class FetchUnit< > { const request: Request = this.createRequest(queryOptions) + const fetcher = (req: Request) => fetch(req) + let response: Response try { - response = await fetch(request) + response = await this.$builder.middleware.execute(request, fetcher) if (!response.ok) throw new FetchResponseError(response) - const processedResponse: $Response = this.$builder.responseHandler( - // @ts-ignore - this.$builder.isJsonMode - ? { - response, - json: (await response.json()) as JSON, - } - : { response } - ) + const processedResponse: $Response = + await this.$builder.responseHandler( + (this.$builder.isJsonMode + ? { + response, + json: () => response.json() as Promise, + } + : { response }) as any + ) return processedResponse } catch (error) { diff --git a/packages/fetch/src/core/router.ts b/packages/fetch/src/core/router.ts index 12860c0..ff0773b 100644 --- a/packages/fetch/src/core/router.ts +++ b/packages/fetch/src/core/router.ts @@ -88,10 +88,11 @@ class Router< if (Router.isFetchMethod(key) && Router.isFetchBuilder(value)) { // 1. URL / Method - value.def_url(Router.getUrlPath(baseUrl)) - value.def_method(key) + const newBuilder = value + .def_url(Router.getUrlPath(baseUrl)) + .def_method(key) // 2. Build - result[key] = value.build() + result[key] = newBuilder.build() } else if (Router.isRecord(value)) { result[key] = this.buildRouterStructure( value, @@ -160,17 +161,17 @@ class Router< * export const api = f.router(BASE_URL, { * auth: { * login: { - * GET: f.unit() + * GET: f.builder() * }, * }, * books: { - * GET: f.unit() - * POST: f.unit() + * GET: f.builder() + * POST: f.builder() * // Dynamic path parameter via $ symbol * $id: { - * GET: f.unit() - * PUT: f.unit() - * DELETE: f.unit() + * GET: f.builder() + * PUT: f.builder() + * DELETE: f.builder() * }, * }, * }) diff --git a/packages/fetch/src/index.ts b/packages/fetch/src/index.ts index b3dffa8..fb53e6b 100644 --- a/packages/fetch/src/index.ts +++ b/packages/fetch/src/index.ts @@ -1,2 +1,18 @@ -export { unit, type FetchUnitShape, FetchBuilder } from './core/fetcher' -export { router, type GetRouterConfig } from './core/router' +import { FetchBuilder, type FetchUnitShape, builder } from './core/fetcher' +import { GetRouterConfig, router } from './core/router' +import { Middleware } from './utils/middleware' + +/** + * @description Metal Fetch Root + */ +export const f: { + builder: typeof builder + router: typeof router + Middleware: typeof Middleware +} = { + builder, + router, + Middleware, +} + +export type { GetRouterConfig, FetchUnitShape, FetchBuilder } diff --git a/packages/fetch/src/utils/middleware.ts b/packages/fetch/src/utils/middleware.ts index a78a901..6b4afd0 100644 --- a/packages/fetch/src/utils/middleware.ts +++ b/packages/fetch/src/utils/middleware.ts @@ -1,56 +1,40 @@ -import { Procedure } from './procedure' - -interface MiddlewareHandler { - req: Req - res: Res - next: (middlewareNext?: { req?: Req; res?: Res }) => void -} - -interface MiddlewareProcedure { - req: Req - res: Res - next?: MiddlewareNext -} - -type MiddlewareNext = ( - nextArgument: MiddlewareProcedure -) => void - -export class Middleware { - private procedure: MiddlewareNext | undefined +export type NextFunction = (request: Request) => Promise +export type MiddlewareFunction = ( + request: Request, + next: NextFunction +) => Promise + +export class Middleware { + public readonly procedures: Array = [] + + public copy(): Middleware { + const newMiddleware = new Middleware() + newMiddleware.use(this.procedures) + return newMiddleware + } + /** + * Use middleware + * @param middleware Target registration middleware + */ public use( - middleware: Array>> + middleware: MiddlewareFunction | Array ): void { - this.procedure = ({ - req: baseReq, - res: baseRes, - }: MiddlewareProcedure) => { - let procedurePointer = 0 - - const next: MiddlewareHandler['next'] = ( - nextArgs - ) => { - procedurePointer++ - middleware[procedurePointer]?.({ - req: nextArgs?.req ?? baseReq, - res: nextArgs?.res ?? baseRes, - next, - }) - } - - middleware[0]?.({ - req: baseReq, - res: baseRes, - next, - }) + if (Array.isArray(middleware)) { + this.procedures.push(...middleware) + } else { + this.procedures.push(middleware) } } - public execute(req: Request, res: Response): void { - this.procedure?.({ - req, - res, - }) + public execute( + initialRequest: Request, + fetcher: (request: Request) => Promise + ): Promise { + const chain = this.procedures.reduceRight( + (next, middleware) => (request) => middleware(request, next), + fetcher + ) + return chain(initialRequest) } } diff --git a/packages/fetch/src/utils/procedure.ts b/packages/fetch/src/utils/procedure.ts index e0d56d9..bddac0c 100644 --- a/packages/fetch/src/utils/procedure.ts +++ b/packages/fetch/src/utils/procedure.ts @@ -10,6 +10,10 @@ export class ProcedureSet { private procedureList: Array> = [] public constructor() {} + public get procedures(): ReadonlyArray> { + return Array.from(this.registeredProcedure) + } + public get executor(): Procedure { return (arg: I): void => { const executionList = this.procedureList @@ -22,6 +26,14 @@ export class ProcedureSet { } } + public copy(): ProcedureSet { + const newProcedureSet = new ProcedureSet() + for (const p of this.procedures) { + newProcedureSet.use(p.$, p.once) + } + return newProcedureSet + } + public use(procedure: Procedure, once: boolean = false): void { this.registeredProcedure.add({ $: procedure, diff --git a/packages/fetch/src/utils/types/index.ts b/packages/fetch/src/utils/types/index.ts index 3b04d67..fe0d389 100644 --- a/packages/fetch/src/utils/types/index.ts +++ b/packages/fetch/src/utils/types/index.ts @@ -34,14 +34,6 @@ export type ToOptionalField< > = Prettify & Partial>> type IfUnknown = [unknown] extends [T] ? Y : N -export type OptionalAndNeverAtUnknown = Prettify< - { - [Key in keyof RecordT as IfUnknown< - RecordT[Key], - never, - Key - >]: RecordT[Key] - } & Partial<{ - [Key in keyof RecordT as IfUnknown]: never - }> -> +export type OmitNever = Prettify<{ + [Key in keyof RecordT as IfUnknown]: RecordT[Key] +}> diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 140e299..fd23137 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,46 +10,49 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.27.11 - version: 2.27.11 + version: 2.29.5 + '@metal-box/type': + specifier: ^0.2.0 + version: 0.2.0 '@typescript-eslint/eslint-plugin': specifier: ^8.20.0 - version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.20.0 - version: 8.20.0(eslint@9.18.0)(typescript@5.7.3) + version: 8.37.0(eslint@9.31.0)(typescript@5.8.3) '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.0.0(vitest@3.0.0(@types/node@12.20.55)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(yaml@2.6.1)) + version: 3.2.4(vitest@3.2.4(msw@2.10.4(typescript@5.8.3))(yaml@2.8.0)) chalk: specifier: ^5.4.1 version: 5.4.1 eslint: specifier: ^9.18.0 - version: 9.18.0 + version: 9.31.0 eslint-config-prettier: specifier: ^10.0.1 - version: 10.0.1(eslint@9.18.0) + version: 10.1.5(eslint@9.31.0) eslint-config-turbo: specifier: ^2.3.3 - version: 2.3.3(eslint@9.18.0) + version: 2.5.4(eslint@9.31.0)(turbo@2.5.4) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0) + version: 2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0) eslint-plugin-prettier: specifier: ^5.2.2 - version: 5.2.2(eslint-config-prettier@10.0.1(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2) + version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2) husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: specifier: ^15.4.0 - version: 15.4.0 + version: 15.5.2 msw: specifier: ^2.7.0 - version: 2.7.0(@types/node@12.20.55)(typescript@5.7.3) + version: 2.10.4(typescript@5.8.3) prettier: specifier: ^3.4.2 - version: 3.4.2 + version: 3.6.2 rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -58,25 +61,21 @@ importers: version: 1.3.0 tsup: specifier: ^8.3.5 - version: 8.3.5(postcss@8.5.1)(typescript@5.7.3)(yaml@2.6.1) + version: 8.5.0(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.0) turbo: specifier: ^2.3.3 - version: 2.3.3 + version: 2.5.4 typescript: specifier: ^5.7.3 - version: 5.7.3 + version: 5.8.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@12.20.55)(yaml@2.6.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.0.4(yaml@2.8.0)) vitest: specifier: ^3.0.0 - version: 3.0.0(@types/node@12.20.55)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(yaml@2.6.1) + version: 3.2.4(msw@2.10.4(typescript@5.8.3))(yaml@2.8.0) - packages/fetch: - devDependencies: - '@metal-box/type': - specifier: ^0.2.0 - version: 0.2.0 + packages/fetch: {} packages: @@ -84,25 +83,25 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.5': - resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.5': - resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -118,213 +117,219 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@changesets/apply-release-plan@7.0.7': - resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.5': - resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.27.11': - resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true - '@changesets/config@3.0.5': - resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.6': - resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.2': - resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -333,28 +338,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -373,29 +382,48 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/confirm@5.1.3': - resolution: {integrity: sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==} + '@inquirer/confirm@5.1.13': + resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/core@10.1.4': - resolution: {integrity: sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==} + '@inquirer/core@10.1.14': + resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/figures@1.0.9': - resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} engines: {node: '>=18'} - '@inquirer/type@3.0.2': - resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + '@inquirer/type@3.0.7': + resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -405,23 +433,18 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -432,8 +455,8 @@ packages: '@metal-box/type@0.2.0': resolution: {integrity: sha512-JPmJ85QaE1H0sSAAZXSP69AEabRfDTE+iOYTtYz0bvJX6SHx0RV7XlYRS526M5qc2uFysTHYmKYMm/6uyNfhzw==} - '@mswjs/interceptors@0.37.5': - resolution: {integrity: sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==} + '@mswjs/interceptors@0.39.2': + resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -461,113 +484,124 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/rollup-android-arm-eabi@4.30.1': - resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.30.1': - resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.30.1': - resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.30.1': - resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.30.1': - resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.30.1': - resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': - resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.30.1': - resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.30.1': - resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.30.1': - resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': - resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': - resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.30.1': - resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.30.1': - resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.30.1': - resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.30.1': - resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.30.1': - resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.30.1': - resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.30.1': - resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -578,104 +612,116 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/statuses@2.0.5': - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@typescript-eslint/eslint-plugin@8.20.0': - resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} + '@typescript-eslint/eslint-plugin@8.37.0': + resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.37.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.20.0': - resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} + '@typescript-eslint/parser@8.37.0': + resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.37.0': + resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.20.0': - resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.20.0': - resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} + '@typescript-eslint/type-utils@8.37.0': + resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.20.0': - resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.20.0': - resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.20.0': - resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} + '@typescript-eslint/utils@8.37.0': + resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.20.0': - resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@3.0.0': - resolution: {integrity: sha512-wfXdOyYhm6L5GndWv6qP95gfyfkNKDFpTZPplOxHLo9DiQ1B7L3bMNngWAvDa+PMK4WrX4Pzef2FZ8E8qKVBuw==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: - '@vitest/browser': 3.0.0 - vitest: 3.0.0 + '@vitest/browser': 3.2.4 + vitest: 3.2.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.0.0': - resolution: {integrity: sha512-Qx+cHyB59mWrQywT3/dZIIpSKwIpWbYFdBX2zixMYpOGZmbaP2jbbd4i/TAKJq/jBgSfww++d6YnrlGMFb2XBg==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.0.0': - resolution: {integrity: sha512-8ytqYjIRzAM90O7n8A0TCbziTnouIG+UGuMHmoRJpKh4vvah4uENw5UAMMNjdKCtzgMiTrZ9XU+xzwCwcxuxGQ==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.0.0': - resolution: {integrity: sha512-24y+MS04ZHZbbbfAvfpi9hM2oULePbiL6Dir8r1nFMN97hxuL0gEXKWRGmlLPwzKDtaOKNjtyTx0+GiZcWCxDA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.0.0': - resolution: {integrity: sha512-6MCYobtatsgG3DlM+dk6njP+R+28iSUqWbJzXp/nuOy6SkAKzJ1wby3fDgimmy50TeK8g6y+E6rP12REyinYPw==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.0.0': - resolution: {integrity: sha512-W0X6fJFJ3RbSThncSYUNSnXkMJFyXX9sOvxP1HSQRsWCLB1U3JnZc0SrLpLzcyByMUDXHsiXQ+x+xsr/G5fXNw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.0.0': - resolution: {integrity: sha512-pfK5O3lRqeCG8mbV+Lr8lLUBicFRm5TlggF7bLZpzpo111LKhMN/tZRXvyOGOgbktxAR9bTf4x8U6RtHuFBTVA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.0.0': - resolution: {integrity: sha512-l300v2/4diHyv5ZiQOj6y/H6VbaTWM6i1c2lC3lUZ5nn9rv9C+WneS/wqyaGLwM37reoh/QkrrYMSMKdfnDZpw==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -723,16 +769,16 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: @@ -751,6 +797,13 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -762,11 +815,11 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -782,25 +835,25 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} - engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -851,8 +904,8 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} commander@4.1.1: @@ -862,8 +915,11 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} cookie@0.7.2: @@ -894,8 +950,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -958,8 +1014,8 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -970,8 +1026,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -981,15 +1037,16 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} engines: {node: '>=18'} hasBin: true @@ -1001,22 +1058,23 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.3.3: - resolution: {integrity: sha512-cM9wSBYowQIrjx2MPCzFE6jTnG4vpTPJKZ/O+Ps3CqrmGK/wtNOsY6WHGMwLtKY/nNbgRahAJH6jGVF6k2coOg==} + eslint-config-turbo@2.5.4: + resolution: {integrity: sha512-OpjpDLXIaus0N/Y+pMj17K430xjpd6WTo0xPUESqYZ9BkMngv2n0ZdjktgJTbJVnDmK7gHrXgJAljtdIMcYBIg==} peerDependencies: eslint: '>6.6.0' + turbo: '>2.0.0' eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1036,8 +1094,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1046,13 +1104,13 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-prettier@5.2.2: - resolution: {integrity: sha512-1yI3/hf35wmlq66C8yOyrujQnel+v5l1Vop5Cl2I6ylyNTT1JbuUUnV3/41PzwTzcyDp/oF0jWE3HXvcH5AQOQ==} + eslint-plugin-prettier@5.5.1: + resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' - eslint-config-prettier: '*' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' prettier: '>=3.0.0' peerDependenciesMeta: '@types/eslint': @@ -1060,25 +1118,26 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-turbo@2.3.3: - resolution: {integrity: sha512-j8UEA0Z+NNCsjZep9G5u5soDQHcXq/x4amrwulk6eHF1U91H2qAjp5I4jQcvJewmccCJbVp734PkHHTRnosjpg==} + eslint-plugin-turbo@2.5.4: + resolution: {integrity: sha512-IZsW61DFj5mLMMaCJxhh1VE4HvNhfdnHnAaXajgne+LUzdyHk2NvYT0ECSa/1SssArcqgTvV74MrLL68hWLLFw==} peerDependencies: eslint: '>6.6.0' + turbo: '>2.0.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1087,8 +1146,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -1122,8 +1181,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} extendable-error@0.1.7: @@ -1149,11 +1208,11 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1176,18 +1235,22 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} fs-extra@7.0.1: @@ -1221,8 +1284,8 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -1249,8 +1312,8 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} hasBin: true @@ -1279,8 +1342,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql@16.10.0: - resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: @@ -1316,8 +1379,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -1336,8 +1400,12 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1352,16 +1420,16 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-async-function@2.1.0: - resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-callable@1.2.7: @@ -1412,6 +1480,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -1459,8 +1531,8 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} is-weakset@2.0.4: @@ -1496,14 +1568,17 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1542,13 +1617,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.4.0: - resolution: {integrity: sha512-UdODqEZiQimd7rCzZ2vqFuELRNUda3mdv7M93jhE4SmDiqAj/w/msvwKgagH23jv2iCPw6Q5m+ltX4VlHvp2LQ==} + lint-staged@15.5.2: + resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} engines: {node: '>=18.12.0'} hasBin: true - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} load-tsconfig@0.2.5: @@ -1576,14 +1651,14 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} magic-string@0.30.17: @@ -1619,8 +1694,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -1637,6 +1712,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1644,8 +1722,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.7.0: - resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} + msw@2.10.4: + resolution: {integrity: sha512-6R1or/qyele7q3RyPwNuvc0IxO8L8/Aim6Sz5ncXEgcWUNxSKE+udriTOWHtpMwmfkLYlacA2y7TIx4cL5lgHA==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1661,8 +1739,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1677,8 +1755,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -1758,8 +1836,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -1795,11 +1873,11 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@2.0.1: - resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} picocolors@1.1.1: @@ -1809,8 +1887,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.6.0: @@ -1822,12 +1900,15 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-load-config@6.0.1: @@ -1848,8 +1929,8 @@ packages: yaml: optional: true - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1865,8 +1946,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -1877,6 +1958,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -1887,17 +1971,14 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -1926,8 +2007,8 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -1938,8 +2019,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.30.1: - resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1965,8 +2046,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -2042,12 +2123,16 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -2100,6 +2185,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2113,8 +2201,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} term-size@2.2.1: @@ -2138,20 +2226,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -2173,8 +2261,8 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2185,8 +2273,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfck@3.1.4: - resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -2198,11 +2286,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsup@8.3.5: - resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -2220,38 +2305,38 @@ packages: typescript: optional: true - turbo-darwin-64@2.3.3: - resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} + turbo-darwin-64@2.5.4: + resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.3.3: - resolution: {integrity: sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==} + turbo-darwin-arm64@2.5.4: + resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.3.3: - resolution: {integrity: sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==} + turbo-linux-64@2.5.4: + resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.3.3: - resolution: {integrity: sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==} + turbo-linux-arm64@2.5.4: + resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.3.3: - resolution: {integrity: sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==} + turbo-windows-64@2.5.4: + resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.3.3: - resolution: {integrity: sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==} + turbo-windows-arm64@2.5.4: + resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} cpu: [arm64] os: [win32] - turbo@2.3.3: - resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} + turbo@2.5.4: + resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} hasBin: true type-check@0.4.0: @@ -2262,8 +2347,8 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@4.32.0: - resolution: {integrity: sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} typed-array-buffer@1.0.3: @@ -2282,11 +2367,14 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -2305,8 +2393,8 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - vite-node@3.0.0: - resolution: {integrity: sha512-V5p05fpAzkHM3aYChsHWV1RTeLAhPejbKX6MqiWWyuIfNcDgXq5p0GnYV6Wa4OAU588XC70XCJB9chRZsOh4yg==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -2318,19 +2406,19 @@ packages: vite: optional: true - vite@6.0.7: - resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.4: + resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + 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 @@ -2358,20 +2446,23 @@ packages: yaml: optional: true - vitest@3.0.0: - resolution: {integrity: sha512-fwfPif+EV0jyms9h1Crb6rwJttH/KBzKrcUesjxHgldmc6R0FaMNLsd+Rgc17NoxzLcb/sYE2Xs9NQ/vnTBf6Q==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.0 - '@vitest/ui': 3.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -2401,8 +2492,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -2439,9 +2530,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: @@ -2464,25 +2555,23 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.26.5': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.28.1 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.6': {} - '@babel/types@7.26.5': + '@babel/types@7.28.1': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} @@ -2492,20 +2581,20 @@ snapshots: '@bundled-es-modules/statuses@1.0.1': dependencies: - statuses: 2.0.1 + statuses: 2.0.2 '@bundled-es-modules/tough-cookie@0.1.6': dependencies: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 - '@changesets/apply-release-plan@7.0.7': + '@changesets/apply-release-plan@7.0.12': dependencies: - '@changesets/config': 3.0.5 + '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -2513,37 +2602,37 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.5': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.3 + semver: 7.7.2 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/cli@2.27.11': + '@changesets/cli@2.29.5': dependencies: - '@changesets/apply-release-plan': 7.0.7 - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 - '@changesets/git': 3.0.2 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -2552,19 +2641,19 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.5': + '@changesets/config@3.1.1': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-dependents-graph': 2.1.3 '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.8 @@ -2573,25 +2662,25 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': + '@changesets/get-dependents-graph@2.1.3': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.6.3 + semver: 7.7.2 - '@changesets/get-release-plan@4.0.6': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -2603,159 +2692,164 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.1': + '@changesets/pre@2.0.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.2': + '@changesets/read@0.6.5': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.1': + '@changesets/should-skip-package@0.1.2': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.1 prettier: 2.8.8 - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.25.6': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm@0.25.6': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-x64@0.25.6': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/darwin-arm64@0.25.6': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-x64@0.25.6': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/freebsd-arm64@0.25.6': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-x64@0.25.6': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/linux-arm64@0.25.6': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm@0.25.6': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-ia32@0.25.6': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-loong64@0.25.6': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-mips64el@0.25.6': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-ppc64@0.25.6': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-riscv64@0.25.6': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-s390x@0.25.6': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-x64@0.25.6': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/netbsd-arm64@0.25.6': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-x64@0.25.6': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/openbsd-arm64@0.25.6': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-x64@0.25.6': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openharmony-arm64@0.25.6': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.6': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.6': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.6': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.6': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': dependencies: - eslint: 9.18.0 + eslint: 9.31.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.21.0': dependencies: - '@eslint/object-schema': 2.1.5 - debug: 4.4.0 + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.31.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -2769,33 +2863,33 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.3': {} - '@inquirer/confirm@5.1.3(@types/node@12.20.55)': + '@inquirer/confirm@5.1.13': dependencies: - '@inquirer/core': 10.1.4(@types/node@12.20.55) - '@inquirer/type': 3.0.2(@types/node@12.20.55) - '@types/node': 12.20.55 + '@inquirer/core': 10.1.14 + '@inquirer/type': 3.0.7 - '@inquirer/core@10.1.4(@types/node@12.20.55)': + '@inquirer/core@10.1.14': dependencies: - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@12.20.55) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 - strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 - transitivePeerDependencies: - - '@types/node' - '@inquirer/figures@1.0.9': {} + '@inquirer/figures@1.0.12': {} + + '@inquirer/type@3.0.7': {} + + '@isaacs/balanced-match@4.0.1': {} - '@inquirer/type@3.0.2(@types/node@12.20.55)': + '@isaacs/brace-expansion@5.0.0': dependencies: - '@types/node': 12.20.55 + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: @@ -2808,33 +2902,30 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.27.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.27.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -2843,7 +2934,7 @@ snapshots: '@metal-box/type@0.2.0': {} - '@mswjs/interceptors@0.37.5': + '@mswjs/interceptors@0.39.2': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -2862,7 +2953,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 '@open-draft/deferred-promise@2.2.0': {} @@ -2876,70 +2967,79 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/core@0.2.7': {} + + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.30.1': + '@rollup/rollup-android-arm64@4.45.1': optional: true - '@rollup/rollup-android-arm64@4.30.1': + '@rollup/rollup-darwin-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-arm64@4.30.1': + '@rollup/rollup-darwin-x64@4.45.1': optional: true - '@rollup/rollup-darwin-x64@4.30.1': + '@rollup/rollup-freebsd-arm64@4.45.1': optional: true - '@rollup/rollup-freebsd-arm64@4.30.1': + '@rollup/rollup-freebsd-x64@4.45.1': optional: true - '@rollup/rollup-freebsd-x64@4.30.1': + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + '@rollup/rollup-linux-arm-musleabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.30.1': + '@rollup/rollup-linux-arm64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.30.1': + '@rollup/rollup-linux-arm64-musl@4.45.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.30.1': + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-musl@4.45.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.30.1': + '@rollup/rollup-linux-s390x-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.30.1': + '@rollup/rollup-linux-x64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-musl@4.30.1': + '@rollup/rollup-linux-x64-musl@4.45.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.30.1': + '@rollup/rollup-win32-arm64-msvc@4.45.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.30.1': + '@rollup/rollup-win32-ia32-msvc@4.45.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.30.1': + '@rollup/rollup-win32-x64-msvc@4.45.1': optional: true '@rtsao/scc@1.1.0': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/cookie@0.6.0': {} - '@types/estree@1.0.6': {} + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -2947,151 +3047,170 @@ snapshots: '@types/node@12.20.55': {} - '@types/statuses@2.0.5': {} + '@types/statuses@2.0.6': {} '@types/tough-cookie@4.0.5': {} - '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 - eslint: 9.18.0 + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 + eslint: 9.31.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.4.0 - eslint: 9.18.0 - typescript: 5.7.3 + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + eslint: 9.31.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.20.0': + '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - debug: 4.4.0 - eslint: 9.18.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.37.0(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.31.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.20.0': {} + '@typescript-eslint/types@8.37.0': {} - '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.37.0(eslint@9.31.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - eslint: 9.18.0 - typescript: 5.7.3 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + eslint: 9.31.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.20.0': + '@typescript-eslint/visitor-keys@8.37.0': dependencies: - '@typescript-eslint/types': 8.20.0 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.0.0(vitest@3.0.0(@types/node@12.20.55)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(yaml@2.6.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(msw@2.10.4(typescript@5.8.3))(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.17 magicast: 0.3.5 - std-env: 3.8.0 + std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.0(@types/node@12.20.55)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(yaml@2.6.1) + vitest: 3.2.4(msw@2.10.4(typescript@5.8.3))(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.0.0': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.0.0 - '@vitest/utils': 3.0.0 - chai: 5.1.2 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.0(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(vite@6.0.7(@types/node@12.20.55)(yaml@2.6.1))': + '@vitest/mocker@3.2.4(msw@2.10.4(typescript@5.8.3))(vite@7.0.4(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.0.0 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - msw: 2.7.0(@types/node@12.20.55)(typescript@5.7.3) - vite: 6.0.7(@types/node@12.20.55)(yaml@2.6.1) + msw: 2.10.4(typescript@5.8.3) + vite: 7.0.4(yaml@2.8.0) - '@vitest/pretty-format@3.0.0': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.0': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.0.0 - pathe: 2.0.1 + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.0.0': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.0 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 - pathe: 2.0.1 + pathe: 2.0.3 - '@vitest/spy@3.0.0': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/utils@3.0.0': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.0 - loupe: 3.1.2 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 - acorn@8.14.0: {} + acorn@8.15.0: {} ajv@6.12.6: dependencies: @@ -3130,58 +3249,69 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 assertion-error@2.0.1: {} + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + async-function@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 balanced-match@1.0.2: {} @@ -3189,12 +3319,12 @@ snapshots: dependencies: is-windows: 1.0.2 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3202,39 +3332,39 @@ snapshots: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.24.2): + bundle-require@5.1.0(esbuild@0.25.6): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.6 load-tsconfig: 0.2.5 cac@6.7.14: {} - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} - chai@5.1.2: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 - pathval: 2.0.0 + loupe: 3.1.4 + pathval: 2.0.1 chalk@4.1.2: dependencies: @@ -3249,7 +3379,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.1.1 + readdirp: 4.1.2 ci-info@3.9.0: {} @@ -3278,13 +3408,15 @@ snapshots: colorette@2.0.20: {} - commander@12.1.0: {} + commander@13.1.0: {} commander@4.1.1: {} concat-map@0.0.1: {} - consola@3.4.0: {} + confbox@0.1.8: {} + + consola@3.4.2: {} cookie@0.7.2: {} @@ -3296,19 +3428,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -3316,7 +3448,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -3350,7 +3482,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -3369,13 +3501,13 @@ snapshots: environment@1.1.0: {} - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -3385,7 +3517,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -3398,13 +3530,15 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -3413,6 +3547,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -3421,13 +3556,13 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -3436,11 +3571,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -3450,46 +3585,48 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.24.2: + esbuild@0.25.6: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.0.1(eslint@9.18.0): + eslint-config-prettier@10.1.5(eslint@9.31.0): dependencies: - eslint: 9.18.0 + eslint: 9.31.0 - eslint-config-turbo@2.3.3(eslint@9.18.0): + eslint-config-turbo@2.5.4(eslint@9.31.0)(turbo@2.5.4): dependencies: - eslint: 9.18.0 - eslint-plugin-turbo: 2.3.3(eslint@9.18.0) + eslint: 9.31.0 + eslint-plugin-turbo: 2.5.4(eslint@9.31.0)(turbo@2.5.4) + turbo: 2.5.4 eslint-import-resolver-node@0.3.9: dependencies: @@ -3499,28 +3636,28 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.31.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.8.3) + eslint: 9.31.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0 + eslint: 9.31.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.31.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3532,57 +3669,59 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.2.2(eslint-config-prettier@10.0.1(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2): + eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2): dependencies: - eslint: 9.18.0 - prettier: 3.4.2 + eslint: 9.31.0 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 + synckit: 0.11.8 optionalDependencies: - eslint-config-prettier: 10.0.1(eslint@9.18.0) + eslint-config-prettier: 10.1.5(eslint@9.31.0) - eslint-plugin-turbo@2.3.3(eslint@9.18.0): + eslint-plugin-turbo@2.5.4(eslint@9.31.0)(turbo@2.5.4): dependencies: dotenv: 16.0.3 - eslint: 9.18.0 + eslint: 9.31.0 + turbo: 2.5.4 - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.18.0: + eslint@9.31.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.31.0 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3600,11 +3739,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -3620,7 +3759,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -3638,7 +3777,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expect-type@1.1.0: {} + expect-type@1.2.2: {} extendable-error@0.1.7: {} @@ -3664,13 +3803,13 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 file-entry-cache@8.0.0: dependencies: @@ -3690,18 +3829,24 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.45.1 + flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -3726,7 +3871,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -3738,9 +3883,9 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -3760,9 +3905,9 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 glob-parent@5.1.2: dependencies: @@ -3774,18 +3919,18 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.1: + glob@11.0.3: dependencies: - foreground-child: 3.3.0 - jackspeak: 4.0.2 - minimatch: 10.0.1 + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -3814,7 +3959,7 @@ snapshots: graphemer@1.4.0: {} - graphql@16.10.0: {} + graphql@16.11.0: {} has-bigints@1.1.0: {} @@ -3842,7 +3987,7 @@ snapshots: html-escaper@2.0.2: {} - human-id@1.0.2: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -3854,7 +3999,9 @@ snapshots: ignore@5.3.2: {} - import-fresh@3.3.0: + ignore@7.0.5: {} + + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -3870,12 +4017,13 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - is-async-function@2.1.0: + is-async-function@2.1.1: dependencies: - call-bound: 1.0.3 + async-function: 1.0.0 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -3884,9 +4032,9 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -3897,20 +4045,20 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -3922,7 +4070,7 @@ snapshots: is-generator-function@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -3933,18 +4081,20 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-node-process@1.2.0: {} is-number-object@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -3953,13 +4103,13 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-stream@3.0.0: {} is-string@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-subdir@1.2.0: @@ -3968,24 +4118,24 @@ snapshots: is-symbol@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-weakset@2.0.4: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} @@ -4003,8 +4153,8 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + '@jridgewell/trace-mapping': 0.3.29 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -4020,12 +4170,14 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.2: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 joycon@3.1.1: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4062,22 +4214,22 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.4.0: + lint-staged@15.5.2: dependencies: chalk: 5.4.1 - commander: 12.1.0 - debug: 4.4.0 + commander: 13.1.0 + debug: 4.4.1 execa: 8.0.1 lilconfig: 3.1.3 - listr2: 8.2.5 + listr2: 8.3.3 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.6.1 + yaml: 2.8.0 transitivePeerDependencies: - supports-color - listr2@8.2.5: + listr2@8.3.3: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -4110,25 +4262,25 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - loupe@3.1.2: {} + loupe@3.1.4: {} lru-cache@10.4.3: {} - lru-cache@11.0.2: {} + lru-cache@11.1.0: {} magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 magicast@0.3.5: dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 math-intrinsics@1.1.0: {} @@ -4145,48 +4297,55 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} minipass@7.1.2: {} + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mri@1.2.0: {} ms@2.1.3: {} - msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3): + msw@2.10.4(typescript@5.8.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.3(@types/node@12.20.55) - '@mswjs/interceptors': 0.37.5 + '@inquirer/confirm': 5.1.13 + '@mswjs/interceptors': 0.39.2 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 - '@types/statuses': 2.0.5 - graphql: 16.10.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 picocolors: 1.1.1 strict-event-emitter: 0.5.1 - type-fest: 4.32.0 + type-fest: 4.41.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - '@types/node' @@ -4198,7 +4357,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.8: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -4208,14 +4367,14 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -4225,19 +4384,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -4266,7 +4425,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -4296,7 +4455,9 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.8: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 parent-module@1.0.1: dependencies: @@ -4317,41 +4478,47 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.0.2 + lru-cache: 11.1.0 minipass: 7.1.2 path-to-regexp@6.3.0: {} path-type@4.0.0: {} - pathe@2.0.1: {} + pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} pify@4.0.1: {} - pirates@4.0.6: {} + pirates@4.0.7: {} - possible-typed-array-names@1.0.0: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 - postcss-load-config@6.0.1(postcss@8.5.1)(yaml@2.6.1): + possible-typed-array-names@1.1.0: {} + + postcss-load-config@6.0.1(postcss@8.5.6)(yaml@2.8.0): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.5.1 - yaml: 2.6.1 + postcss: 8.5.6 + yaml: 2.8.0 - postcss@8.5.1: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4363,7 +4530,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.4.2: {} + prettier@3.6.2: {} psl@1.15.0: dependencies: @@ -4371,6 +4538,8 @@ snapshots: punycode@2.3.1: {} + quansync@0.2.10: {} + querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -4382,21 +4551,19 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@4.1.1: {} + readdirp@4.1.2: {} reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -4425,38 +4592,39 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} rimraf@6.0.1: dependencies: - glob: 11.0.1 + glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup@4.30.1: + rollup@4.45.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.30.1 - '@rollup/rollup-android-arm64': 4.30.1 - '@rollup/rollup-darwin-arm64': 4.30.1 - '@rollup/rollup-darwin-x64': 4.30.1 - '@rollup/rollup-freebsd-arm64': 4.30.1 - '@rollup/rollup-freebsd-x64': 4.30.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 - '@rollup/rollup-linux-arm-musleabihf': 4.30.1 - '@rollup/rollup-linux-arm64-gnu': 4.30.1 - '@rollup/rollup-linux-arm64-musl': 4.30.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 - '@rollup/rollup-linux-riscv64-gnu': 4.30.1 - '@rollup/rollup-linux-s390x-gnu': 4.30.1 - '@rollup/rollup-linux-x64-gnu': 4.30.1 - '@rollup/rollup-linux-x64-musl': 4.30.1 - '@rollup/rollup-win32-arm64-msvc': 4.30.1 - '@rollup/rollup-win32-ia32-msvc': 4.30.1 - '@rollup/rollup-win32-x64-msvc': 4.30.1 + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4466,8 +4634,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -4478,7 +4646,7 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 @@ -4486,14 +4654,14 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.2: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -4519,27 +4687,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -4575,9 +4743,14 @@ snapshots: stackback@0.0.2: {} - statuses@2.0.1: {} + statuses@2.0.2: {} + + std-env@3.9.0: {} - std-env@3.8.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 strict-event-emitter@0.5.1: {} @@ -4604,17 +4777,17 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -4638,14 +4811,18 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 ts-interface-checker: 0.1.13 supports-color@7.2.0: @@ -4654,10 +4831,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.2: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 term-size@2.2.1: {} @@ -4679,16 +4855,16 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.2(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} tmp@0.0.33: dependencies: @@ -4711,17 +4887,17 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 ts-expect@1.3.0: {} ts-interface-checker@0.1.13: {} - tsconfck@3.1.4(typescript@5.7.3): + tsconfck@3.1.6(typescript@5.8.3): optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 tsconfig-paths@3.15.0: dependencies: @@ -4730,61 +4906,60 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.8.1: {} - - tsup@8.3.5(postcss@8.5.1)(typescript@5.7.3)(yaml@2.6.1): + tsup@8.5.0(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.0): dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) + bundle-require: 5.1.0(esbuild@0.25.6) cac: 6.7.14 chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.24.2 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.6 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.1)(yaml@2.6.1) + postcss-load-config: 6.0.1(postcss@8.5.6)(yaml@2.8.0) resolve-from: 5.0.0 - rollup: 4.30.1 + rollup: 4.45.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.10 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.1 - typescript: 5.7.3 + postcss: 8.5.6 + typescript: 5.8.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - turbo-darwin-64@2.3.3: + turbo-darwin-64@2.5.4: optional: true - turbo-darwin-arm64@2.3.3: + turbo-darwin-arm64@2.5.4: optional: true - turbo-linux-64@2.3.3: + turbo-linux-64@2.5.4: optional: true - turbo-linux-arm64@2.3.3: + turbo-linux-arm64@2.5.4: optional: true - turbo-windows-64@2.3.3: + turbo-windows-64@2.5.4: optional: true - turbo-windows-arm64@2.3.3: + turbo-windows-arm64@2.5.4: optional: true - turbo@2.3.3: + turbo@2.5.4: optionalDependencies: - turbo-darwin-64: 2.3.3 - turbo-darwin-arm64: 2.3.3 - turbo-linux-64: 2.3.3 - turbo-linux-arm64: 2.3.3 - turbo-windows-64: 2.3.3 - turbo-windows-arm64: 2.3.3 + turbo-darwin-64: 2.5.4 + turbo-darwin-arm64: 2.5.4 + turbo-linux-64: 2.5.4 + turbo-linux-arm64: 2.5.4 + turbo-windows-64: 2.5.4 + turbo-windows-arm64: 2.5.4 type-check@0.4.0: dependencies: @@ -4792,18 +4967,18 @@ snapshots: type-fest@0.21.3: {} - type-fest@4.32.0: {} + type-fest@4.41.0: {} typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -4812,7 +4987,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -4821,17 +4996,19 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.7.3: {} + typescript@5.8.3: {} + + ufo@1.6.1: {} unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -4849,13 +5026,13 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - vite-node@3.0.0(@types/node@12.20.55)(yaml@2.6.1): + vite-node@3.2.4(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 - pathe: 2.0.1 - vite: 6.0.7(@types/node@12.20.55)(yaml@2.6.1) + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.4(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -4870,51 +5047,54 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@12.20.55)(yaml@2.6.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.4(yaml@2.8.0)): dependencies: - debug: 4.4.0 + debug: 4.4.1 globrex: 0.1.2 - tsconfck: 3.1.4(typescript@5.7.3) + tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.0.7(@types/node@12.20.55)(yaml@2.6.1) + vite: 7.0.4(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.0.7(@types/node@12.20.55)(yaml@2.6.1): + vite@7.0.4(yaml@2.8.0): dependencies: - esbuild: 0.24.2 - postcss: 8.5.1 - rollup: 4.30.1 + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.45.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 12.20.55 fsevents: 2.3.3 - yaml: 2.6.1 - - vitest@3.0.0(@types/node@12.20.55)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(yaml@2.6.1): - dependencies: - '@vitest/expect': 3.0.0 - '@vitest/mocker': 3.0.0(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(vite@6.0.7(@types/node@12.20.55)(yaml@2.6.1)) - '@vitest/pretty-format': 3.0.0 - '@vitest/runner': 3.0.0 - '@vitest/snapshot': 3.0.0 - '@vitest/spy': 3.0.0 - '@vitest/utils': 3.0.0 - chai: 5.1.2 - debug: 4.4.0 - expect-type: 1.1.0 + yaml: 2.8.0 + + vitest@3.2.4(msw@2.10.4(typescript@5.8.3))(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.4(typescript@5.8.3))(vite@7.0.4(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 magic-string: 0.30.17 - pathe: 2.0.1 - std-env: 3.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.0.7(@types/node@12.20.55)(yaml@2.6.1) - vite-node: 3.0.0(@types/node@12.20.55)(yaml@2.6.1) + vite: 7.0.4(yaml@2.8.0) + vite-node: 3.2.4(yaml@2.8.0) why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 12.20.55 transitivePeerDependencies: - jiti - less @@ -4940,26 +5120,26 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.1.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -4968,12 +5148,13 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.3 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -5014,7 +5195,7 @@ snapshots: y18n@5.0.8: {} - yaml@2.6.1: {} + yaml@2.8.0: {} yargs-parser@21.1.1: {}