From e90de633ed65905c49edbeb906a5bf86536736fc Mon Sep 17 00:00:00 2001 From: debabin Date: Thu, 19 Feb 2026 14:03:47 +0700 Subject: [PATCH 1/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20add=20parser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/apicraft/apicraft.config.ts | 9 +- packages/apicraft/bin/generate.ts | 2 +- packages/apicraft/bin/schemas/index.ts | 118 ++++++++----- packages/apicraft/example-apiV1.yaml | 46 +++++ packages/apicraft/example-apiv2.json | 231 +++++++++++++++++++++++++ 5 files changed, 361 insertions(+), 45 deletions(-) create mode 100644 packages/apicraft/example-apiv2.json diff --git a/packages/apicraft/apicraft.config.ts b/packages/apicraft/apicraft.config.ts index 75b9455..ed466f0 100644 --- a/packages/apicraft/apicraft.config.ts +++ b/packages/apicraft/apicraft.config.ts @@ -11,7 +11,14 @@ const apicraftConfig = apicraft([ instance: 'fetches', nameBy: 'path', groupBy: 'tag', - plugins: ['tanstack'] + plugins: ['tanstack'], + parser: { + filters: { + parameters: { + exclude: ['Authorization'] + } + } + } } ]); diff --git a/packages/apicraft/bin/generate.ts b/packages/apicraft/bin/generate.ts index 5941dc9..a8e50de 100644 --- a/packages/apicraft/bin/generate.ts +++ b/packages/apicraft/bin/generate.ts @@ -98,7 +98,7 @@ export const generate = { } await createClient({ - parser: { filters: option.filters }, + ...(option.parser && { parser: option.parser as UserConfig['parser'] }), input: option.input, output: option.output, plugins: plugins as UserConfig['plugins'] diff --git a/packages/apicraft/bin/schemas/index.ts b/packages/apicraft/bin/schemas/index.ts index f3571f1..16eefd3 100644 --- a/packages/apicraft/bin/schemas/index.ts +++ b/packages/apicraft/bin/schemas/index.ts @@ -8,6 +8,80 @@ const instanceSchema = z.object({ const pathSchema = z.string().regex(/^[^/.].*[^/]$/, 'Path must be absolute'); +const includeExcludeSchema = z.object({ + exclude: z.array(z.string()).readonly().optional(), + include: z.array(z.string()).readonly().optional() +}); + +const filtersSchema = z.object({ + deprecated: z.boolean().default(true).optional(), + operations: includeExcludeSchema.optional(), + orphans: z.boolean().default(false).optional(), + parameters: includeExcludeSchema.optional(), + preserveOrder: z.boolean().default(false).optional(), + requestBodies: includeExcludeSchema.optional(), + responses: includeExcludeSchema.optional(), + schemas: includeExcludeSchema.optional(), + tags: includeExcludeSchema.optional() +}); + +const enumsModeSchema = z.enum(['root', 'inline']); +const stringCaseSchema = z.enum(['camelCase', 'PascalCase', 'preserve', 'snake_case']); +const stringNameSchema = z.union([z.string(), z.function()]); + +const parserTransformsSchema = z + .object({ + enums: z + .union([ + z.boolean(), + enumsModeSchema, + z.object({ + case: stringCaseSchema.optional(), + enabled: z.boolean().optional(), + mode: enumsModeSchema.optional(), + name: stringNameSchema.optional() + }) + ]) + .optional(), + readWrite: z + .union([ + z.boolean(), + z.object({ + enabled: z.boolean().optional(), + requests: z + .union([ + stringNameSchema, + z.object({ case: stringCaseSchema.optional(), name: stringNameSchema.optional() }) + ]) + .optional(), + responses: z + .union([ + stringNameSchema, + z.object({ case: stringCaseSchema.optional(), name: stringNameSchema.optional() }) + ]) + .optional() + }) + ]) + .optional() + }) + .optional(); + +const parserSchema = z + .object({ + filters: filtersSchema.optional(), + hooks: z.record(z.string(), z.any()).optional(), + pagination: z + .object({ + keywords: z.array(z.string()).readonly().optional() + }) + .optional(), + patch: z.record(z.string(), z.any()).optional(), + transforms: parserTransformsSchema, + validate_EXPERIMENTAL: z.union([z.boolean(), z.enum(['strict', 'warn'])]).optional() + }) + .strict() + .optional(); + const pluginNameSchema = z.enum([ '@hey-api/client-angular', '@hey-api/client-axios', @@ -78,49 +152,7 @@ export const apicraftOptionSchema = z .optional() }) ), - filters: z - .object({ - deprecated: z.boolean().default(true).optional(), - operations: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional(), - orphans: z.boolean().default(false).optional(), - parameters: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional(), - preserveOrder: z.boolean().default(false).optional(), - requestBodies: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional(), - responses: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional(), - schemas: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional(), - tags: z - .object({ - exclude: z.array(z.string()).readonly().optional(), - include: z.array(z.string()).readonly().optional() - }) - .optional() - }) - .optional(), + parser: parserSchema, instance: z.union([instanceNameSchema, instanceSchema]).optional(), nameBy: z.enum(['path', 'operationId']).default('operationId').optional(), groupBy: z.enum(['path', 'tag']).default('tag').optional(), diff --git a/packages/apicraft/example-apiV1.yaml b/packages/apicraft/example-apiV1.yaml index b36d7a4..54c8d58 100644 --- a/packages/apicraft/example-apiV1.yaml +++ b/packages/apicraft/example-apiV1.yaml @@ -47,6 +47,8 @@ tags: description: Example echo operations - name: User description: Operations about user + - name: countries v3.0 + description: Countries servers: - url: 'http://example.com/api/v1' - url: 'https://example.com/api/v1' @@ -111,6 +113,37 @@ paths: '404': description: User not found + '/api/countries': + get: + tags: + - countries v3.0 + summary: Получить выборку с информацией о странах. + description: Запрос используется для получения списка стран + operationId: getCountries + parameters: + - name: Authorization + in: header + required: true + description: "'Bearer {access_token}'" + schema: + type: string + pattern: '^Bearer .*$' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/GetCountryeV30' + '400': + description: BadRequest + '401': + description: Unauthorized + '403': + description: Forbidden + # An object to hold reusable parts that can be used across the definition components: schemas: @@ -139,6 +172,19 @@ components: example: Smith email: $ref: '#/components/schemas/Email' + GetCountryeV30: + type: object + description: Country (v3.0) + properties: + id: + type: string + example: '1' + name: + type: string + example: Russia + code: + type: string + example: RU headers: ExpiresAfter: description: date in UTC when token expires diff --git a/packages/apicraft/example-apiv2.json b/packages/apicraft/example-apiv2.json new file mode 100644 index 0000000..1a02a0e --- /dev/null +++ b/packages/apicraft/example-apiv2.json @@ -0,0 +1,231 @@ +{ + "openapi": "3.0.0", + "paths": { + "/api/tester/session": { + "get": { + "operationId": "TesterController_session", + "summary": "получить сессию пользователя", + "parameters": [ + { + "name": "authorization", + "in": "header", + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "session", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/SessionResponse" } + } + } + } + }, + "tags": ["🧪 tester"], + "security": [{ "bearer": [] }] + } + }, + "/api/tester/profile": { + "patch": { + "operationId": "TesterController_updateProfile", + "summary": "обновить профиль пользователя", + "parameters": [ + { + "name": "authorization", + "in": "header", + "schema": { "type": "string" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UpdateProfileDto" } + } + } + }, + "responses": { + "200": { + "description": "update profile", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UpdateProfileResponse" } + } + } + } + }, + "tags": ["🧪 tester"], + "security": [{ "bearer": [] }] + } + }, + "/api/tester/auth/otp": { + "post": { + "operationId": "TesterController_createOtp", + "summary": "создание отп кода", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CreateOtpDto" } + } + } + }, + "responses": { + "200": { + "description": "create otp", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/OtpResponse" } + } + } + } + }, + "tags": ["🧪 tester"] + } + }, + "/api/tester/signin": { + "post": { + "operationId": "TesterController_signin", + "summary": "авторизация", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/SignInDto" } + } + } + }, + "responses": { + "200": { + "description": "signin", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/SignInResponse" } + } + } + } + }, + "tags": ["🧪 tester"] + } + } + }, + "info": { + "title": "shift tester 🧪", + "description": "Апи для тестирования", + "version": "1.0", + "contact": {} + }, + "tags": [], + "servers": [{ "url": "https://shift-intensive.ru/" }], + "components": { + "securitySchemes": { + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", + "type": "http" + } + }, + "schemas": { + "User": { + "type": "object", + "properties": { + "_id": { "type": "string", "description": "ID пользователя" }, + "phone": { "type": "string", "example": "89990009999", "description": "Номер телефона" }, + "firstname": { "type": "string", "example": "firstname", "description": "Имя" }, + "middlename": { "type": "string", "example": "middlename", "description": "Отчество" }, + "lastname": { "type": "string", "example": "lastname", "description": "Фамилия" }, + "email": { "type": "string", "example": "email@gmail.com", "description": "Почта" }, + "city": { "type": "string", "example": "city", "description": "Город" } + }, + "required": ["_id", "phone"] + }, + "SessionResponse": { + "type": "object", + "properties": { + "success": { "type": "boolean", "description": "Статус запроса" }, + "reason": { "type": "string", "description": "Причина ошибки" }, + "user": { + "description": "Пользователь", + "allOf": [{ "$ref": "#/components/schemas/User" }] + } + }, + "required": ["success", "user"] + }, + "UpdateProfileProfileDto": { + "type": "object", + "properties": { + "firstname": { "type": "string", "example": "firstname", "description": "Имя" }, + "middlename": { "type": "string", "example": "middlename", "description": "Отчество" }, + "lastname": { "type": "string", "example": "lastname", "description": "Фамилия" }, + "email": { "type": "string", "example": "email@gmail.com", "description": "Почта" }, + "city": { "type": "string", "example": "city", "description": "Город" } + } + }, + "UpdateProfileDto": { + "type": "object", + "properties": { + "profile": { + "description": "Данные пользователя", + "allOf": [{ "$ref": "#/components/schemas/UpdateProfileProfileDto" }] + }, + "phone": { "type": "string", "example": "89990009999", "description": "Номер телефона" } + }, + "required": ["profile", "phone"] + }, + "UpdateProfileResponse": { + "type": "object", + "properties": { + "success": { "type": "boolean", "description": "Статус запроса" }, + "reason": { "type": "string", "description": "Причина ошибки" }, + "user": { + "description": "Пользователь", + "allOf": [{ "$ref": "#/components/schemas/User" }] + } + }, + "required": ["success", "user"] + }, + "CreateOtpDto": { + "type": "object", + "properties": { "phone": { "type": "string", "example": "89990009999" } }, + "required": ["phone"] + }, + "OtpResponse": { + "type": "object", + "properties": { + "success": { "type": "boolean", "description": "Статус запроса" }, + "reason": { "type": "string", "description": "Причина ошибки" }, + "retryDelay": { + "type": "number", + "example": 120000, + "description": "Время запроса повторного отп кода в мс" + } + }, + "required": ["success", "retryDelay"] + }, + "SignInDto": { + "type": "object", + "properties": { + "phone": { "type": "string", "example": "89990009999", "description": "Номер телефона" }, + "code": { "type": "number", "example": 345231, "description": "Отп код" } + }, + "required": ["phone", "code"] + }, + "SignInResponse": { + "type": "object", + "properties": { + "success": { "type": "boolean", "description": "Статус запроса" }, + "reason": { "type": "string", "description": "Причина ошибки" }, + "user": { + "description": "Пользователь", + "allOf": [{ "$ref": "#/components/schemas/User" }] + }, + "token": { "type": "string", "description": "Пользовательский токен" } + }, + "required": ["success", "user", "token"] + } + } + } +} From 52af41e9d6b382bbf94dcb5cd1683b2b4ba9f592 Mon Sep 17 00:00:00 2001 From: vitrivdolkom Date: Thu, 19 Feb 2026 16:45:19 +0700 Subject: [PATCH 2/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=9A=80?= =?UTF-8?q?=20support=20input=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/apicraft/apicraft.config.ts | 23 ++++++++++++++- packages/apicraft/bin/generate.ts | 2 +- packages/apicraft/bin/schemas/index.ts | 39 +++++++++++++++----------- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/packages/apicraft/apicraft.config.ts b/packages/apicraft/apicraft.config.ts index ed466f0..d63fd51 100644 --- a/packages/apicraft/apicraft.config.ts +++ b/packages/apicraft/apicraft.config.ts @@ -1,12 +1,33 @@ // TEST CONFIG +import type { OpenApi, OpenApiOperationObject } from '@hey-api/openapi-ts'; + +import fs from 'node:fs'; + // eslint-disable-next-line antfu/no-import-dist import { apicraft } from './dist/esm/index.mjs'; // import { apicraft } from '@siberiacancode/apicraft'; const apicraftConfig = apicraft([ { - input: 'example-apiV1.yaml', + // input: 'example-apiv2.json', + input: () => { + const content = fs.readFileSync('example-apiv2.json', 'utf8'); + const document: OpenApi.V3_0_X = JSON.parse(content); + + for (const pathItem of Object.values(document.paths)) { + for (const field of Object.values(pathItem)) { + const operation = field as OpenApiOperationObject.V3_0_X; + if (!Array.isArray(operation.parameters)) continue; + + operation.parameters = operation.parameters.filter( + (parameter) => parameter.name.toLowerCase() !== 'authorization' + ); + } + } + + return document; + }, output: 'generated/apiV1', instance: 'fetches', nameBy: 'path', diff --git a/packages/apicraft/bin/generate.ts b/packages/apicraft/bin/generate.ts index a8e50de..7406f90 100644 --- a/packages/apicraft/bin/generate.ts +++ b/packages/apicraft/bin/generate.ts @@ -99,7 +99,7 @@ export const generate = { await createClient({ ...(option.parser && { parser: option.parser as UserConfig['parser'] }), - input: option.input, + input: typeof option.input === 'function' ? await option.input() : option.input, output: option.output, plugins: plugins as UserConfig['plugins'] }); diff --git a/packages/apicraft/bin/schemas/index.ts b/packages/apicraft/bin/schemas/index.ts index 16eefd3..d28e6bc 100644 --- a/packages/apicraft/bin/schemas/index.ts +++ b/packages/apicraft/bin/schemas/index.ts @@ -112,23 +112,28 @@ const pluginNameSchema = z.enum([ export const apicraftOptionSchema = z .object({ - input: pathSchema.or( - z.object({ - path: pathSchema.or(z.record(z.string(), z.unknown())), - fetch: z.record(z.string(), z.any()).optional(), - watch: z - .boolean() - .or(z.number()) - .or( - z.object({ - enabled: z.boolean().optional(), - interval: z.number().optional(), - timeout: z.number().optional() - }) - ) - .optional() - }) - ), + input: z + .function() + .output(z.any()) + .or( + pathSchema.or( + z.object({ + path: pathSchema.or(z.record(z.string(), z.unknown())), + fetch: z.record(z.string(), z.any()).optional(), + watch: z + .boolean() + .or(z.number()) + .or( + z.object({ + enabled: z.boolean().optional(), + interval: z.number().optional(), + timeout: z.number().optional() + }) + ) + .optional() + }) + ) + ), output: pathSchema.or( z.object({ path: pathSchema, From b6f3389f99161be31d524ffc4da0cae458c13cfe Mon Sep 17 00:00:00 2001 From: debabin Date: Thu, 19 Feb 2026 17:45:30 +0700 Subject: [PATCH 3/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20v1.6.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/apicraft/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/apicraft/package.json b/packages/apicraft/package.json index 536b419..84af32d 100644 --- a/packages/apicraft/package.json +++ b/packages/apicraft/package.json @@ -1,7 +1,7 @@ { "name": "@siberiacancode/apicraft", "type": "module", - "version": "1.5.2", + "version": "1.6.0", "description": "Generate rest api for your api with one command", "author": { "name": "SIBERIA CAN CODE 🧊", From 42b802a61e054748098e04610137920bb5a59411 Mon Sep 17 00:00:00 2001 From: debabin Date: Thu, 26 Feb 2026 20:22:06 +0700 Subject: [PATCH 4/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20add=20fetches=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/fetches/README.md | 36 +++ packages/fetches/package.json | 6 +- packages/fetches/src/index.test.ts | 500 +++++++++++++++++++++++++++++ packages/fetches/src/index.ts | 105 +++--- packages/fetches/vitest.config.ts | 9 + 5 files changed, 614 insertions(+), 42 deletions(-) create mode 100644 packages/fetches/src/index.test.ts create mode 100644 packages/fetches/vitest.config.ts diff --git a/packages/fetches/README.md b/packages/fetches/README.md index 597eeaf..267d870 100644 --- a/packages/fetches/README.md +++ b/packages/fetches/README.md @@ -103,3 +103,39 @@ const response = await fetches.get('/users', { context: 'data' }); console.log('response', response.options.context); // 'data' ``` + +## Validate status + +By default, only HTTP status codes in the range 2xx are considered successful. Set `validateStatus` when creating the instance (or with `setValidateStatus`): if it returns `true`, the response is treated as success and no error is thrown. + +```typescript +// Treat 2xx and 3xx as success +const api = fetches.create({ + baseURL: '/api', + validateStatus: (status) => status >= 200 && status < 400 +}); + +// Accept 404 as success (e.g. “not found” as valid empty result) +const api = fetches.create({ + baseURL: '/api', + validateStatus: (status) => (status >= 200 && status < 300) || status === 404 +}); +``` + +## Global error handling + +You can handle errors globally by setting the response interceptors. + +```typescript +const api = fetches.create({ + baseURL: '/api' +}); + +api.interceptors.response.use( + (response) => response, + (error) => { + console.error(error); + return Promise.reject(error); + } +); +``` diff --git a/packages/fetches/package.json b/packages/fetches/package.json index b130be5..33d21d9 100644 --- a/packages/fetches/package.json +++ b/packages/fetches/package.json @@ -42,8 +42,10 @@ "dist" ], "scripts": { + "test": "vitest run", "prepublishOnly": "yarn type && yarn build", "build": "tsdown", + "unit-test": "vitest", "lint": "eslint . --fix", "lint-inspector": "npx @eslint/config-inspector", "type": "tsc --noEmit", @@ -52,7 +54,9 @@ }, "devDependencies": { "@siberiacancode/eslint": "*", - "@siberiacancode/prettier": "*" + "@siberiacancode/prettier": "*", + "@siberiacancode/vitest": "*", + "vitest": "4.0.16" }, "lint-staged": { "*.{js,ts}": [ diff --git a/packages/fetches/src/index.test.ts b/packages/fetches/src/index.test.ts new file mode 100644 index 0000000..79dc3bc --- /dev/null +++ b/packages/fetches/src/index.test.ts @@ -0,0 +1,500 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import fetches, { DEFAULT_VALIDATE_STATUS, ResponseError } from './index'; + +const Fetches = fetches.Fetches; + +function createMockResponse( + data: unknown = {}, + init: { status?: number; statusText?: string; headers?: Record } = {} +) { + const body = typeof data === 'string' ? data : JSON.stringify(data); + return new Response(body, { + status: init.status ?? 200, + statusText: init.statusText ?? 'OK', + headers: new Headers(init.headers ?? {}) + }); +} + +const mockedFetch = vi.fn(); + +beforeEach(() => { + vi.stubGlobal('fetch', mockedFetch); +}); + +describe('Exports and instance', () => { + it('Should export fetches', () => { + expect(fetches).toBeDefined(); + expect(typeof fetches.get).toBe('function'); + expect(Fetches).toBeDefined(); + }); + + it('Should create instance with default options', async () => { + const api = fetches.create(); + mockedFetch.mockResolvedValueOnce(createMockResponse({ ok: true })); + + expect(api.baseURL).toBe(''); + expect(api.headers).toEqual({}); + expect(api.parse).toBeUndefined(); + expect(api.validateStatus).toBe(DEFAULT_VALIDATE_STATUS); + + await api.get('/'); + expect(mockedFetch).toHaveBeenCalledWith('/', expect.any(Object)); + }); + + it('Should create instance with custom options', async () => { + const customValidate = vi.fn(() => true); + const api = fetches.create({ + baseURL: '/api', + headers: { 'x-custom': 'a' }, + parse: 'json', + validateStatus: customValidate + }); + mockedFetch.mockResolvedValueOnce(createMockResponse({ id: 1 })); + + expect(api.baseURL).toBe('/api'); + expect(api.headers).toEqual({ 'x-custom': 'a' }); + expect(api.parse).toBe('json'); + expect(api.validateStatus).toBe(customValidate); + + await api.get('/users'); + expect(mockedFetch).toHaveBeenCalledWith( + '/api/users', + expect.objectContaining({ + headers: expect.objectContaining({ 'x-custom': 'a' }) + }) + ); + expect(customValidate).toHaveBeenCalledWith(200); + }); +}); + +describe('baseURL and request URL', () => { + it('Should combine instance baseURL and path', async () => { + const api = fetches.create({ baseURL: '/api' }); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/users'); + expect(mockedFetch).toHaveBeenCalledWith('/api/users', expect.any(Object)); + }); + + it('Should override instance baseURL with request option baseURL', async () => { + const api = fetches.create({ baseURL: '/api' }); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/users', { baseURL: '/new-api' }); + expect(mockedFetch).toHaveBeenCalledWith('/new-api/users', expect.any(Object)); + }); + + it('Should append query params to URL', async () => { + const api = fetches.create(); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/search', { query: { a: '1', b: 2, c: undefined, d: null } }); + const [[url]] = mockedFetch.mock.calls; + + expect(url).toContain('a=1'); + expect(url).toContain('b=2'); + expect(url).not.toContain('c='); + expect(url).not.toContain('d='); + expect(url).toMatch(/\?.*/); + }); + + it('Should append query array values (multiple same key)', async () => { + const api = fetches.create(); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/', { query: { ids: [1, 2] } }); + const [[url]] = mockedFetch.mock.calls; + expect(url).toContain('ids=1'); + expect(url).toContain('ids=2'); + }); + + it('Should omit query null/undefined from URL', async () => { + const api = fetches.create(); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/', { query: { a: '1', b: null, c: undefined } }); + const [[url]] = mockedFetch.mock.calls; + expect(url).toContain('a=1'); + expect(url).not.toContain('b='); + expect(url).not.toContain('c='); + }); +}); + +describe('Methods and body', () => { + it('Should call fetch with method GET', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.get('/'); + expect(mockedFetch).toHaveBeenCalledWith('/', expect.objectContaining({ method: 'GET' })); + }); + + it('Should call fetch with method HEAD', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.head('/'); + expect(mockedFetch).toHaveBeenCalledWith('/', expect.objectContaining({ method: 'HEAD' })); + }); + + it('Should call fetch with method DELETE', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.delete('/'); + expect(mockedFetch).toHaveBeenCalledWith('/', expect.objectContaining({ method: 'DELETE' })); + }); + + it('Should call fetch with method POST', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.post('/', { foo: 1 }); + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + method: 'POST', + body: '{"foo":1}', + headers: expect.objectContaining({ 'content-type': 'application/json' }) + }) + ); + }); + + it('Should call fetch with method PUT', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.put('/', { bar: 2 }); + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + method: 'PUT', + body: '{"bar":2}', + headers: expect.objectContaining({ 'content-type': 'application/json' }) + }) + ); + }); + + it('Should call fetch with method PATCH', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.patch('/', { baz: 3 }); + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + method: 'PATCH', + body: '{"baz":3}' + }) + ); + }); + + it('Should pass FormData body', async () => { + const formData = new FormData(); + formData.set('foo', 'bar'); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await fetches.post('/', formData); + const [[url, config]] = mockedFetch.mock.calls; + + expect(url).toBe('/'); + expect(config.body).toBeInstanceOf(FormData); + expect(config.headers['content-type']).toBeUndefined(); + }); + + it('Should pass string body through', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.post('/', 'plain'); + const [[url, config]] = mockedFetch.mock.calls; + + expect(url).toBe('/'); + expect(config.body).toBe('plain'); + expect(config.headers['content-type']).toBeUndefined(); + }); + + it('Should call fetch', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await fetches.call('GET', '/custom'); + expect(mockedFetch).toHaveBeenCalledWith('/custom', expect.objectContaining({ method: 'GET' })); + }); +}); + +describe('Headers', () => { + it('Should send instance headers on every request', async () => { + const api = fetches.create({ headers: { 'x-custom': 'a' } }); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/'); + + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + headers: expect.objectContaining({ 'x-custom': 'a' }) + }) + ); + }); + + it('Should merge request headers with instance headers (request overrides)', async () => { + const api = fetches.create({ headers: { 'x-custom': 'instance' } }); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await api.get('/', { headers: { 'x-custom': 'request' } }); + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + headers: expect.objectContaining({ 'x-custom': 'request' }) + }) + ); + }); + + it('Should merge setHeaders into instance headers', async () => { + const api = fetches.create({ headers: { 'x-custom': '1' } }); + api.setHeaders({ 'x-key': '2' }); + + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/'); + expect(mockedFetch).toHaveBeenCalledWith( + '/', + expect.objectContaining({ + headers: expect.objectContaining({ 'x-custom': '1', 'x-key': '2' }) + }) + ); + }); +}); + +describe('Parse', () => { + it('Should use instance parse when request parse is not set', async () => { + const api = fetches.create({ baseURL: '', parse: 'json' }); + const data = { x: 1 }; + mockedFetch.mockResolvedValueOnce(createMockResponse(data)); + const response = await api.get('/'); + expect(response.data).toEqual(data); + }); + + it('Should parse response via response.json() when parse is "json"', async () => { + const data = { id: 1, name: 'test' }; + mockedFetch.mockResolvedValueOnce(createMockResponse(data)); + const response = await fetches.get('/', { parse: 'json' }); + expect(response.data).toEqual(data); + }); + + it('Should use response.text() when parse is "text"', async () => { + const text = 'hello'; + mockedFetch.mockResolvedValueOnce(createMockResponse(text)); + const response = await fetches.get('/', { parse: 'text' }); + expect(response.data).toBe(text); + }); + + it('Should return response.body when parse is "raw"', async () => { + const mockRes = createMockResponse('ignored'); + mockedFetch.mockResolvedValueOnce(mockRes); + const response = await fetches.get('/', { parse: 'raw' }); + expect(response.data).toBe(mockRes.body); + }); + + it('Should call custom parse function and put result in response.data', async () => { + const customParse = vi.fn().mockResolvedValue({ parsed: true }); + mockedFetch.mockResolvedValueOnce(createMockResponse('body')); + const response = await fetches.get('/', { parse: customParse }); + expect(customParse).toHaveBeenCalled(); + expect(response.data).toEqual({ parsed: true }); + }); + + it('Should trigger json parse by Content-Type application/json when parse not set', async () => { + mockedFetch.mockResolvedValueOnce( + createMockResponse({ a: 1 }, { headers: { 'content-type': 'application/json' } }) + ); + const response = await fetches.get('/'); + expect(response.data).toEqual({ a: 1 }); + }); +}); + +describe('validateStatus', () => { + it('Should treat 2xx as success and throw on 4xx/5xx without interceptors', async () => { + mockedFetch.mockResolvedValueOnce( + createMockResponse({}, { status: 404, statusText: 'Not Found' }) + ); + await expect(fetches.get('/')).rejects.toThrow(ResponseError); + }); + + it('Should change behavior for next requests when using setValidateStatus', async () => { + const api = fetches.create(); + api.setValidateStatus((status) => status >= 200 && status < 400); + + mockedFetch.mockResolvedValueOnce(createMockResponse({}, { status: 301, statusText: 'Moved' })); + + const response = await api.get('/'); + expect(response.status).toBe(301); + }); +}); + +describe('ResponseError', () => { + it('Should throw ResponseError with response and request on invalid status without interceptors', async () => { + mockedFetch.mockResolvedValueOnce( + createMockResponse( + { error: 'bad' }, + { status: 500, statusText: 'Server Error', headers: { 'content-type': 'application/json' } } + ) + ); + try { + await fetches.get('/'); + } catch (err: any) { + const error = err as ResponseError; + expect(error).toBeInstanceOf(ResponseError); + expect(error.response).toBeDefined(); + expect(error.response.status).toBe(500); + expect(error.response.data).toEqual({ error: 'bad' }); + expect(error.request).toBeDefined(); + expect(error.request.url).toBe('/'); + expect(error.request.method).toBe('GET'); + expect(error.message).toBe('Server Error'); + } + }); +}); + +describe('Request interceptors', () => { + it('Should use returned config for fetch when onSuccess receives config', async () => { + const api = fetches.create(); + + api.interceptors.request.use((config) => { + config.headers!.authorization = 'Bearer token'; + return config; + }); + + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await api.get('/users'); + + expect(mockedFetch).toHaveBeenCalledWith( + '/users', + expect.objectContaining({ + headers: expect.objectContaining({ authorization: 'Bearer token' }) + }) + ); + }); + + it('Should trigger failure callback', async () => { + const api = fetches.create(); + const onFailure = vi.fn(); + + api.interceptors.request.use(() => { + throw new Error('req err'); + }, onFailure); + + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/'); + + expect(onFailure).toHaveBeenCalled(); + }); + + it('Should remove interceptor when using eject', async () => { + const api = fetches.create(); + + const addHeader = vi.fn((config) => { + config.headers = { ...config.headers, 'x-injected': 'yes' }; + return config; + }); + + const interceptor = api.interceptors.request.use(addHeader); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await api.get('/'); + + expect(addHeader).toHaveBeenCalledTimes(1); + expect(mockedFetch).toHaveBeenLastCalledWith( + '/', + expect.objectContaining({ + headers: expect.objectContaining({ 'x-injected': 'yes' }) + }) + ); + api.interceptors.request.eject(interceptor); + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await api.get('/'); + + expect(addHeader).toHaveBeenCalledTimes(1); + expect(mockedFetch).toHaveBeenLastCalledWith( + '/', + expect.not.objectContaining({ + headers: expect.objectContaining({ 'x-injected': 'yes' }) + }) + ); + }); +}); + +describe('Response interceptors', () => { + it('Should use success return value as request result', async () => { + const api = fetches.create(); + + api.interceptors.response.use( + (response) => ({ ...response, data: { wrapped: response.data } }) as typeof response + ); + + mockedFetch.mockResolvedValueOnce( + createMockResponse({ id: 1 }, { headers: { 'content-type': 'application/json' } }) + ); + + const response = await api.get('/'); + + expect(response.data).toEqual({ wrapped: { id: 1 } }); + }); + + it('Should return data from failure callback', async () => { + const api = fetches.create(); + + api.interceptors.response.use(undefined, (error) => { + return { ...error.response, data: { recovered: true } } as typeof error.response; + }); + + mockedFetch.mockResolvedValueOnce( + createMockResponse({ err: 'x' }, { status: 500, statusText: 'Error' }) + ); + + const response = await api.get('/'); + + expect(response.data).toEqual({ recovered: true }); + expect(response.status).toBe(500); + }); + + it('Should trigger failure callback', async () => { + const api = fetches.create(); + const onFailure = vi.fn(); + + api.interceptors.response.use(() => { + throw new Error('res err'); + }, onFailure); + + mockedFetch.mockResolvedValueOnce(createMockResponse()); + await api.get('/'); + + expect(onFailure).toHaveBeenCalled(); + }); + + it('Should remove response interceptor when using eject', async () => { + const api = fetches.create(); + + const transform = vi.fn((response) => ({ ...response, data: 'transformed' })); + const interceptor = api.interceptors.response.use(transform); + + mockedFetch.mockResolvedValueOnce( + createMockResponse({ original: true }, { headers: { 'content-type': 'application/json' } }) + ); + + await api.get('/'); + + expect(transform).toHaveBeenCalledTimes(1); + + api.interceptors.response.eject(interceptor); + mockedFetch.mockResolvedValueOnce( + createMockResponse({ original: true }, { headers: { 'content-type': 'application/json' } }) + ); + + const response = await api.get('/'); + + expect(transform).toHaveBeenCalledTimes(1); + expect(response.data).toEqual({ original: true }); + }); +}); + +describe('Context', () => { + it('Should match response.options.context with request context', async () => { + mockedFetch.mockResolvedValueOnce(createMockResponse()); + const response = await fetches.get('/', { context: { some: 'data' } }); + expect(response.options.context).toEqual({ some: 'data' }); + }); +}); + +describe('Signal', () => { + it('Should pass options.signal to fetch', async () => { + const abortController = new AbortController(); + const signal = abortController.signal; + + mockedFetch.mockResolvedValueOnce(createMockResponse()); + + await fetches.get('/', { signal: abortController.signal }); + expect(mockedFetch).toHaveBeenCalledWith('/', expect.objectContaining({ signal })); + }); +}); diff --git a/packages/fetches/src/index.ts b/packages/fetches/src/index.ts index adf812a..08cfc77 100644 --- a/packages/fetches/src/index.ts +++ b/packages/fetches/src/index.ts @@ -9,6 +9,11 @@ export type RequestBody = BodyInit | Record | null | undefined; export interface RequestSearchParams { [key: string]: boolean | number | string | number[] | string[] | null | undefined; } + +export type ValidateStatus = (status: number) => boolean; + +export const DEFAULT_VALIDATE_STATUS: ValidateStatus = (status) => status >= 200 && status < 300; + export interface RequestOptions extends Omit { baseURL?: BaseUrl; body?: RequestBody; @@ -32,9 +37,10 @@ export type RequestConfig = RequestInit & { }; export interface FetchesParams { - baseURL: BaseUrl; + baseURL?: BaseUrl; headers?: Record; parse?: ResponseParse; + validateStatus?: ValidateStatus; } export interface FetchesResponse { @@ -102,6 +108,7 @@ class Fetches { public headers: Record; public parse?: ResponseParse; + public validateStatus: ValidateStatus; readonly interceptorHandlers: Interceptors; @@ -123,10 +130,16 @@ class Fetches { }; constructor(params?: FetchesParams) { - const { baseURL = '', headers = {}, parse } = params ?? {}; + const { + baseURL = '', + headers = {}, + parse, + validateStatus = DEFAULT_VALIDATE_STATUS + } = params ?? {}; this.baseURL = baseURL ?? ''; this.headers = headers; this.parse = parse; + this.validateStatus = validateStatus; this.interceptorHandlers = { request: [], response: [] }; this.interceptors = { @@ -165,6 +178,10 @@ class Fetches { this.parse = parse; } + setValidateStatus(validateStatus: ValidateStatus) { + this.validateStatus = validateStatus; + } + private prepareBody(body?: RequestBody) { if (body instanceof FormData || body instanceof Blob || typeof body === 'string') return body; return JSON.stringify(body); @@ -247,24 +264,51 @@ class Fetches { initialConfig: RequestConfig, requestOptions: RequestOptions ) { - const data = await this.parseResponse(initialResponse); + const data = await this.parseResponse(initialResponse, initialConfig.parse); let response = { data, url: initialResponse.url, headers: initialResponse.headers, status: initialResponse.status, statusText: initialResponse.statusText, - config: initialConfig + config: initialConfig, + options: requestOptions } as FetchesResponse; - if (!this.interceptorHandlers.response?.length) return response; + if (!this.interceptorHandlers.response?.length) { + if (!this.validateStatus(initialResponse.status)) { + const errorResponse = { + data, + url: response.url, + headers: response.headers, + status: response.status, + statusText: response.statusText, + config: initialConfig, + options: requestOptions + } as FetchesResponse; + + throw new ResponseError(response.statusText, { + request: initialConfig, + response: errorResponse + }); + } + + return response; + } for (const { onSuccess, onFailure } of [ - { onSuccess: requestOptions.onResponseSuccess, onFailure: requestOptions.onResponseFailure }, - ...this.interceptorHandlers.response + ...this.interceptorHandlers.response, + ...(requestOptions.onResponseSuccess || requestOptions.onResponseFailure + ? [ + { + onSuccess: requestOptions.onResponseSuccess, + onFailure: requestOptions.onResponseFailure + } + ] + : []) ]) { try { - if (!initialResponse.ok) + if (!this.validateStatus(initialResponse.status)) throw new ResponseError(initialResponse.statusText, { request: initialConfig, response @@ -292,8 +336,15 @@ class Fetches { if (!this.interceptorHandlers.request?.length) return config; for (const { onSuccess, onFailure } of [ - { onSuccess: requestOptions.onRequestSuccess, onFailure: requestOptions.onRequestFailure }, - ...this.interceptorHandlers.request + ...this.interceptorHandlers.request, + ...(requestOptions.onRequestSuccess || requestOptions.onRequestFailure + ? [ + { + onSuccess: requestOptions.onRequestSuccess, + onFailure: requestOptions.onRequestFailure + } + ] + : []) ]) { try { if (!onSuccess) continue; @@ -326,7 +377,7 @@ class Fetches { ...(body && { body: this.prepareBody(body) }), url, method, - parse, + parse: parse ?? this.parse, headers: { ...this.headers, ...(body && @@ -341,35 +392,7 @@ class Fetches { const response: Response = await fetch(config.url, config); - if (this.interceptorHandlers.response?.length) { - return this.runResponseInterceptors(response, config, options) as R; - } - - const data = await this.parseResponse(response, config.parse); - - if (response.status >= 400) { - const errorResponse = { - data, - url: response.url, - headers: response.headers, - status: response.status, - statusText: response.statusText, - config, - options - } as FetchesResponse; - - throw new ResponseError(response.statusText, { request: config, response: errorResponse }); - } - - return { - config, - options, - data, - url: response.url, - headers: response.headers, - status: response.status, - statusText: response.statusText - } as R; + return this.runResponseInterceptors(response, config, options) as R; } get>( @@ -423,7 +446,7 @@ class Fetches { call>( method: RequestMethod, url: string, - options: RequestOptions + options?: RequestOptions ) { return this.request(url, method, options); } diff --git a/packages/fetches/vitest.config.ts b/packages/fetches/vitest.config.ts new file mode 100644 index 0000000..f329a9e --- /dev/null +++ b/packages/fetches/vitest.config.ts @@ -0,0 +1,9 @@ +import { vitest } from '@siberiacancode/vitest'; + +export default { + ...vitest, + test: { + ...vitest, + include: ['src/**/*.test.ts'] + } +}; From e9a4f45bd1dd375749baf8d127e091f4d83212e7 Mon Sep 17 00:00:00 2001 From: debabin Date: Thu, 26 Feb 2026 20:22:25 +0700 Subject: [PATCH 5/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20v1.14.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/fetches/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fetches/package.json b/packages/fetches/package.json index 33d21d9..6714d46 100644 --- a/packages/fetches/package.json +++ b/packages/fetches/package.json @@ -1,7 +1,7 @@ { "name": "@siberiacancode/fetches", "type": "module", - "version": "1.13.2", + "version": "1.14.0", "description": "fetch instance", "author": { "name": "SIBERIA CAN CODE 🧊", From bf3d5000986cfb078799c184d389828ba3eefb6e Mon Sep 17 00:00:00 2001 From: debabin Date: Fri, 27 Feb 2026 19:33:28 +0700 Subject: [PATCH 6/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20v1.6.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/prettier/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/prettier/package.json b/tools/prettier/package.json index aa0607a..90f642a 100644 --- a/tools/prettier/package.json +++ b/tools/prettier/package.json @@ -1,7 +1,7 @@ { "name": "@siberiacancode/prettier", "type": "module", - "version": "1.6.0", + "version": "1.6.1", "description": "prettier configs", "author": { "name": "SIBERIA CAN CODE 🧊", From 1f0f5e7769d1de8188822eeb6ec5895b0bc9720a Mon Sep 17 00:00:00 2001 From: debabin Date: Fri, 27 Feb 2026 20:42:18 +0700 Subject: [PATCH 7/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20add=20prettier=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/prettier/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/prettier/src/index.ts b/tools/prettier/src/index.ts index 1775070..d5ec3b9 100644 --- a/tools/prettier/src/index.ts +++ b/tools/prettier/src/index.ts @@ -1,4 +1,6 @@ -import type { Config as Prettier } from 'prettier'; +import type { Config } from 'prettier'; + +export type Prettier = Config; export const prettier: Prettier = { printWidth: 100, From 84598e407c4c11b269fe299ff99545a5e2b07a58 Mon Sep 17 00:00:00 2001 From: debabin Date: Fri, 27 Feb 2026 21:48:04 +0700 Subject: [PATCH 8/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20v2.15.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/eslint/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/eslint/package.json b/tools/eslint/package.json index f10c3d1..630457b 100644 --- a/tools/eslint/package.json +++ b/tools/eslint/package.json @@ -1,7 +1,7 @@ { "name": "@siberiacancode/eslint", "type": "module", - "version": "2.15.2", + "version": "2.15.3", "description": "eslint configs", "author": { "name": "SIBERIA CAN CODE 🧊", @@ -54,17 +54,17 @@ "pretty": "yarn type && yarn lint && yarn format" }, "dependencies": { - "@antfu/eslint-config": "7.3.0", - "@eslint-react/eslint-plugin": "2.12.2", + "@antfu/eslint-config": "7.6.1", + "@eslint-react/eslint-plugin": "2.13.0", "@next/eslint-plugin-next": "16.1.6", "@types/eslint-plugin-jsx-a11y": "^6.10.1", - "@vue/compiler-sfc": "3.5.27", - "eslint": "10.0.0", + "@vue/compiler-sfc": "3.5.29", + "eslint": "10.0.2", "eslint-flat-config-utils": "^3.0.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", - "eslint-plugin-react-refresh": "0.5.0" + "eslint-plugin-react-refresh": "0.5.2" }, "devDependencies": { "@siberiacancode/prettier": "*" From 07a756e774ac4b1e816f15c49021c1f0f31455ed Mon Sep 17 00:00:00 2001 From: debabin Date: Fri, 27 Feb 2026 21:49:09 +0700 Subject: [PATCH 9/9] =?UTF-8?q?teachnical/parser-apicraft=20=F0=9F=A7=8A?= =?UTF-8?q?=20update=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/vitest/package.json | 8 +- yarn.lock | 1292 ++++++++++++++++++++----------------- 2 files changed, 705 insertions(+), 595 deletions(-) diff --git a/tools/vitest/package.json b/tools/vitest/package.json index 9e8b8a9..c7404c7 100644 --- a/tools/vitest/package.json +++ b/tools/vitest/package.json @@ -48,12 +48,12 @@ "pretty": "yarn type && yarn lint && yarn format" }, "peerDependencies": { - "jsdom": "27.3.0", - "vitest": "4.0.16" + "jsdom": "28.1.0", + "vitest": "4.0.18" }, "dependencies": { - "jsdom": "27.3.0", - "vitest": "4.0.16" + "jsdom": "28.1.0", + "vitest": "4.0.18" }, "devDependencies": { "@siberiacancode/eslint": "*", diff --git a/yarn.lock b/yarn.lock index 621be1f..3a2518e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,51 +2,50 @@ # yarn lockfile v1 -"@acemir/cssom@^0.9.28": - version "0.9.29" - resolved "https://registry.yarnpkg.com/@acemir/cssom/-/cssom-0.9.29.tgz#3ae97903c49b388a5ff5d231a7a6d42a32e5b148" - integrity sha512-G90x0VW+9nW4dFajtjCoT+NM0scAfH9Mb08IcjgFHYbfiL/lU04dTF9JuVOi3/OH+DJCQdcIseSXkdCB9Ky6JA== +"@acemir/cssom@^0.9.31": + version "0.9.31" + resolved "https://registry.yarnpkg.com/@acemir/cssom/-/cssom-0.9.31.tgz#bd5337d290fb8be2ac18391f37386bc53778b0bc" + integrity sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA== -"@antfu/eslint-config@7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@antfu/eslint-config/-/eslint-config-7.3.0.tgz#9d2290bbe578d8c307108649b7940cea48a6a9a7" - integrity sha512-a2m38M/9Xn8SCEC8L5izBIRdjxCwPS4P4GZGuDUZI0HzYHe6iJbC+Y1vSOky9BBIYKIyPCae6a9n3bIuQSWkuA== +"@antfu/eslint-config@7.6.1": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@antfu/eslint-config/-/eslint-config-7.6.1.tgz#d7dee51755345bdba7cd9ecd7482eb16cf538583" + integrity sha512-MRiskHFHYPF0R3eWDUkPPiHUM3fWXwAviVv9O8iMH5hVJkgp60oJYBMzbImKdqSGMuuyOMY3GXxWbH60t9rK0g== dependencies: "@antfu/install-pkg" "^1.1.0" - "@clack/prompts" "^1.0.0" + "@clack/prompts" "^1.0.1" "@eslint-community/eslint-plugin-eslint-comments" "^4.6.0" "@eslint/markdown" "^7.5.1" - "@stylistic/eslint-plugin" "^5.7.1" - "@typescript-eslint/eslint-plugin" "^8.54.0" - "@typescript-eslint/parser" "^8.54.0" - "@vitest/eslint-plugin" "^1.6.6" + "@stylistic/eslint-plugin" "^5.9.0" + "@typescript-eslint/eslint-plugin" "^8.56.1" + "@typescript-eslint/parser" "^8.56.1" + "@vitest/eslint-plugin" "^1.6.9" ansis "^4.2.0" cac "^6.7.14" - eslint-config-flat-gitignore "^2.1.0" + eslint-config-flat-gitignore "^2.2.1" eslint-flat-config-utils "^3.0.1" eslint-merge-processors "^2.0.0" - eslint-plugin-antfu "^3.2.0" - eslint-plugin-command "^3.4.0" - eslint-plugin-import-lite "^0.5.0" - eslint-plugin-jsdoc "^62.5.3" - eslint-plugin-jsonc "^2.21.0" - eslint-plugin-n "^17.23.2" + eslint-plugin-antfu "^3.2.2" + eslint-plugin-command "^3.5.2" + eslint-plugin-import-lite "^0.5.2" + eslint-plugin-jsdoc "^62.7.1" + eslint-plugin-jsonc "^3.1.0" + eslint-plugin-n "^17.24.0" eslint-plugin-no-only-tests "^3.3.0" - eslint-plugin-perfectionist "^5.5.0" - eslint-plugin-pnpm "^1.5.0" + eslint-plugin-perfectionist "^5.6.0" + eslint-plugin-pnpm "^1.6.0" eslint-plugin-regexp "^3.0.0" - eslint-plugin-toml "^1.0.3" - eslint-plugin-unicorn "^62.0.0" - eslint-plugin-unused-imports "^4.3.0" - eslint-plugin-vue "^10.7.0" - eslint-plugin-yml "^3.0.0" + eslint-plugin-toml "^1.3.0" + eslint-plugin-unicorn "^63.0.0" + eslint-plugin-unused-imports "^4.4.1" + eslint-plugin-vue "^10.8.0" + eslint-plugin-yml "^3.3.0" eslint-processor-vue-blocks "^2.0.0" globals "^17.3.0" - jsonc-eslint-parser "^2.4.2" local-pkg "^1.1.2" parse-gitignore "^2.0.0" toml-eslint-parser "^1.0.3" - vue-eslint-parser "^10.2.0" + vue-eslint-parser "^10.4.0" yaml-eslint-parser "^2.0.0" "@antfu/install-pkg@^1.1.0": @@ -57,27 +56,27 @@ package-manager-detector "^1.3.0" tinyexec "^1.0.1" -"@asamuzakjp/css-color@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-4.1.1.tgz#e5c662f488367dc74194609179fe6621f2586114" - integrity sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ== +"@asamuzakjp/css-color@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-5.0.1.tgz#3b9462a9b52f3c6680a0945a3d0851881017550f" + integrity sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw== dependencies: - "@csstools/css-calc" "^2.1.4" - "@csstools/css-color-parser" "^3.1.0" - "@csstools/css-parser-algorithms" "^3.0.5" - "@csstools/css-tokenizer" "^3.0.4" - lru-cache "^11.2.4" + "@csstools/css-calc" "^3.1.1" + "@csstools/css-color-parser" "^4.0.2" + "@csstools/css-parser-algorithms" "^4.0.0" + "@csstools/css-tokenizer" "^4.0.0" + lru-cache "^11.2.6" -"@asamuzakjp/dom-selector@^6.7.6": - version "6.7.6" - resolved "https://registry.yarnpkg.com/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz#9cd7671a61a9cb490852ed6a441b3b0950aab945" - integrity sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg== +"@asamuzakjp/dom-selector@^6.8.1": + version "6.8.1" + resolved "https://registry.yarnpkg.com/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz#39b20993672b106f7cd9a3a9a465212e87e0bfd1" + integrity sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ== dependencies: "@asamuzakjp/nwsapi" "^2.3.9" bidi-js "^1.0.3" css-tree "^3.1.0" is-potential-custom-element-name "^1.0.1" - lru-cache "^11.2.4" + lru-cache "^11.2.6" "@asamuzakjp/nwsapi@^2.3.9": version "2.3.9" @@ -222,6 +221,13 @@ dependencies: "@babel/types" "^7.28.5" +"@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== + dependencies: + "@babel/types" "^7.29.0" + "@babel/template@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" @@ -260,6 +266,21 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" +"@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@bramus/specificity@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@bramus/specificity/-/specificity-2.4.2.tgz#aa8db8eb173fdee7324f82284833106adeecc648" + integrity sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw== + dependencies: + css-tree "^3.0.0" + "@cacheable/memory@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.0.6.tgz#de6679d26ffcfa1674c4bb40b97815b0f67839d5" @@ -278,56 +299,71 @@ hashery "^1.2.0" keyv "^5.5.4" -"@clack/core@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@clack/core/-/core-1.0.0.tgz#7ff31271eba8255f8171a5b607bbc9c46cb3cc8c" - integrity sha512-Orf9Ltr5NeiEuVJS8Rk2XTw3IxNC2Bic3ash7GgYeA8LJ/zmSNpSQ/m5UAhe03lA6KFgklzZ5KTHs4OAMA/SAQ== +"@clack/core@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@clack/core/-/core-1.0.1.tgz#23c4520dc9190a3411005ee64fca64a077a347fa" + integrity sha512-WKeyK3NOBwDOzagPR5H08rFk9D/WuN705yEbuZvKqlkmoLM2woKtXb10OO2k1NoSU4SFG947i2/SCYh+2u5e4g== dependencies: picocolors "^1.0.0" sisteransi "^1.0.5" -"@clack/prompts@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@clack/prompts/-/prompts-1.0.0.tgz#18eb9cfce6cd91a63cdea67fde5a384980a3313c" - integrity sha512-rWPXg9UaCFqErJVQ+MecOaWsozjaxol4yjnmYcGNipAWzdaWa2x+VJmKfGq7L0APwBohQOYdHC+9RO4qRXej+A== +"@clack/prompts@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@clack/prompts/-/prompts-1.0.1.tgz#ef9463c4cb3a027da41314dfcac0655a56e3f114" + integrity sha512-/42G73JkuYdyWZ6m8d/CJtBrGl1Hegyc7Fy78m5Ob+jF85TOUmLR5XLce/U3LxYAw0kJ8CT5aI99RIvPHcGp/Q== dependencies: - "@clack/core" "1.0.0" + "@clack/core" "1.0.1" picocolors "^1.0.0" sisteransi "^1.0.5" -"@csstools/color-helpers@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.1.0.tgz#106c54c808cabfd1ab4c602d8505ee584c2996ef" - integrity sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== +"@csstools/color-helpers@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-6.0.2.tgz#82c59fd30649cf0b4d3c82160489748666e6550b" + integrity sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q== -"@csstools/css-calc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" - integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== +"@csstools/css-calc@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-3.1.1.tgz#78b494996dac41a02797dcca18ac3b46d25b3fd7" + integrity sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ== -"@csstools/css-color-parser@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz#4e386af3a99dd36c46fef013cfe4c1c341eed6f0" - integrity sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== +"@csstools/css-color-parser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz#c27e03a3770d0352db92d668d6dde427a37859e5" + integrity sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw== dependencies: - "@csstools/color-helpers" "^5.1.0" - "@csstools/css-calc" "^2.1.4" + "@csstools/color-helpers" "^6.0.2" + "@csstools/css-calc" "^3.1.1" "@csstools/css-parser-algorithms@^3.0.5": version "3.0.5" resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== -"@csstools/css-syntax-patches-for-csstree@^1.0.19", "@csstools/css-syntax-patches-for-csstree@^1.0.21": +"@csstools/css-parser-algorithms@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz#e1c65dc09378b42f26a111fca7f7075fc2c26164" + integrity sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w== + +"@csstools/css-syntax-patches-for-csstree@^1.0.19": version "1.0.21" resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.21.tgz#1671e2d9d7c800c5c5f65f8c7ab6722c5233b0b9" integrity sha512-plP8N8zKfEZ26figX4Nvajx8DuzfuRpLTqglQ5d0chfnt35Qt3X+m6ASZ+rG0D0kxe/upDVNwSIVJP5n4FuNfw== +"@csstools/css-syntax-patches-for-csstree@^1.0.28": + version "1.0.28" + resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.28.tgz#cd239a16f95c0ed7c6d74315da4e38f2e93bbf19" + integrity sha512-1NRf1CUBjnr3K7hu8BLxjQrKCxEe8FP/xmPTenAxCRZWVLbmGotkFvG9mfNpjA6k7Bw1bw4BilZq9cu19RA5pg== + "@csstools/css-tokenizer@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== +"@csstools/css-tokenizer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#798a33950d11226a0ebb6acafa60f5594424967f" + integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== + "@csstools/media-query-list-parser@^4.0.3": version "4.0.3" resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" @@ -365,18 +401,7 @@ dependencies: tslib "^2.4.0" -"@es-joy/jsdoccomment@^0.78.0": - version "0.78.0" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz#d6597f112c19d4aceaf11c6847e795e1dcffd720" - integrity sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw== - dependencies: - "@types/estree" "^1.0.8" - "@typescript-eslint/types" "^8.46.4" - comment-parser "1.4.1" - esquery "^1.6.0" - jsdoc-type-pratt-parser "~7.0.0" - -"@es-joy/jsdoccomment@~0.84.0": +"@es-joy/jsdoccomment@^0.84.0", "@es-joy/jsdoccomment@~0.84.0": version "0.84.0" resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz#4d798d33207825dd1d85babbfbacc3a76c3ba634" integrity sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w== @@ -549,84 +574,84 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint-react/ast@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/ast/-/ast-2.12.2.tgz#06b112952f1244b65e4071bc4fe3c978b12111ff" - integrity sha512-OMpEIJguhDOaMDr6U4/qmoSQCjNcqCteiv4okA6a0p5ACX9s1uulmK2tcm7sep4RR+nPYkZUag3sXOi3R0oFmw== +"@eslint-react/ast@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/ast/-/ast-2.13.0.tgz#31122a9d3574b0031b0e98c75ba6ba6bb06a55a8" + integrity sha512-43+5gmqV3MpatTzKnu/V2i/jXjmepvwhrb9MaGQvnXHQgq9J7/C7VVCCcwp6Rvp2QHAFquAAdvQDSL8IueTpeA== dependencies: - "@eslint-react/eff" "2.12.2" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/typescript-estree" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" + "@eslint-react/eff" "2.13.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/typescript-estree" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" string-ts "^2.3.1" -"@eslint-react/core@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/core/-/core-2.12.2.tgz#63e67f5656a9212147714be4dd357f0acc109735" - integrity sha512-lS2a1I3G7JXjFfdlOWXJoid8kPstcgMyL3rVQFcZVJF569JwF/VRZ7DDdH7JKrnFPAu1CtkLl8Acqy6Q8+mbdA== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +"@eslint-react/core@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/core/-/core-2.13.0.tgz#ab08ede3e2cdf3e9391e0001d2a08f58a18959e9" + integrity sha512-m62XDzkf1hpzW4sBc7uh7CT+8rBG2xz/itSADuEntlsg4YA7Jhb8hjU6VHf3wRFDwyfx5VnbV209sbJ7Azey0Q== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" ts-pattern "^5.9.0" -"@eslint-react/eff@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/eff/-/eff-2.12.2.tgz#2e2550fd7ef8b9335eb348e86b0bc18a82e528a8" - integrity sha512-UWN/mtvu8gPVwZzg77h3zV0GEnKHjN/2yAI++UGGlVQ9x6en4/LFbn/9J2aM61lwyU4CvPUKpQ1KcYTTwJeJ0A== - -"@eslint-react/eslint-plugin@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/eslint-plugin/-/eslint-plugin-2.12.2.tgz#ec43b8cd57bce080a6b85a49250f5ed21779c345" - integrity sha512-7P2cGKwfTABeBnTac6PpLupE30+TmEbF3jTnGaziMwCzpPS1WAJtyvZw27RDSzb7pfx6GjTNBBHGg3dwfK+nhg== - dependencies: - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/type-utils" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" - eslint-plugin-react-dom "2.12.2" - eslint-plugin-react-hooks-extra "2.12.2" - eslint-plugin-react-naming-convention "2.12.2" - eslint-plugin-react-rsc "2.12.2" - eslint-plugin-react-web-api "2.12.2" - eslint-plugin-react-x "2.12.2" +"@eslint-react/eff@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/eff/-/eff-2.13.0.tgz#420930f5676f3769d92593d66ffaa7901c373d7e" + integrity sha512-rEH2R8FQnUAblUW+v3ZHDU1wEhatbL1+U2B1WVuBXwSKqzF7BGaLqCPIU7o9vofumz5MerVfaCtJgI8jYe2Btg== + +"@eslint-react/eslint-plugin@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/eslint-plugin/-/eslint-plugin-2.13.0.tgz#ee398c11eafa6bd42be4a828548a3efb286fe001" + integrity sha512-iaMXpqnJCTW7317hg8L4wx7u5aIiPzZ+d1p59X8wXFgMHzFX4hNu4IfV8oygyjmWKdLsjKE9sEpv/UYWczlb+A== + dependencies: + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/type-utils" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" + eslint-plugin-react-dom "2.13.0" + eslint-plugin-react-hooks-extra "2.13.0" + eslint-plugin-react-naming-convention "2.13.0" + eslint-plugin-react-rsc "2.13.0" + eslint-plugin-react-web-api "2.13.0" + eslint-plugin-react-x "2.13.0" ts-api-utils "^2.4.0" -"@eslint-react/shared@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/shared/-/shared-2.12.2.tgz#b1591df0f232a8dccebbdd9d2c79aa32e6104c9b" - integrity sha512-/40s8neS142nMN9l7SDzwncqh/PNSzeYJ0Gc3h/eacQcUrjLx1NWWvPs1CNA3EbtqJRCvS2gflvzkzM2w6HURA== +"@eslint-react/shared@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/shared/-/shared-2.13.0.tgz#1710ccad9536654470a874048954a4f940a48b7b" + integrity sha512-IOloCqrZ7gGBT4lFf9+0/wn7TfzU7JBRjYwTSyb9SDngsbeRrtW95ZpgUpS8/jen1wUEm6F08duAooTZ2FtsWA== dependencies: - "@eslint-react/eff" "2.12.2" - "@typescript-eslint/utils" "^8.54.0" + "@eslint-react/eff" "2.13.0" + "@typescript-eslint/utils" "^8.55.0" ts-pattern "^5.9.0" zod "^3.25.0 || ^4.0.0" -"@eslint-react/var@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@eslint-react/var/-/var-2.12.2.tgz#7ca6ec061c6cd7ce98f2efcefe2d8ae6b8357a57" - integrity sha512-d+s6G1HAghVA25io3Vtj8237mQZUGozH+3UwEboNl+8XE3oTJMYv0T3X9U96GbxrV2S1BPFSYQEMwl6Z0RYgmA== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +"@eslint-react/var@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@eslint-react/var/-/var-2.13.0.tgz#4822ec827b765799f459e21df6f5c2fab535e009" + integrity sha512-dM+QaeiHR16qPQoJYg205MkdHYSWVa2B7ore5OFpOPlSwqDV3tLW7I+475WjbK7potq5QNPTxRa7VLp9FGeQqA== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" ts-pattern "^5.9.0" -"@eslint/compat@^1.2.5": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.4.1.tgz#81eaabb3e0b080350582c1a8092a2d355fabf03e" - integrity sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w== +"@eslint/compat@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-2.0.2.tgz#fc1495688664861870f5e7ee56999dc252b6dd52" + integrity sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg== dependencies: - "@eslint/core" "^0.17.0" + "@eslint/core" "^1.1.0" "@eslint/config-array@^0.21.1": version "0.21.1" @@ -637,14 +662,14 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/config-array@^0.23.0": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.1.tgz#908223da7b9148f1af5bfb3144b77a9387a89446" - integrity sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA== +"@eslint/config-array@^0.23.2": + version "0.23.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.2.tgz#db85beeff7facc685a5775caacb1c845669b9470" + integrity sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A== dependencies: - "@eslint/object-schema" "^3.0.1" + "@eslint/object-schema" "^3.0.2" debug "^4.3.1" - minimatch "^10.1.1" + minimatch "^10.2.1" "@eslint/config-helpers@^0.4.2": version "0.4.2" @@ -714,12 +739,12 @@ resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== -"@eslint/object-schema@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.1.tgz#9a1dc9af00d790dc79a9bf57a756e3cb2740ddb9" - integrity sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg== +"@eslint/object-schema@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.2.tgz#c59c6a94aa4b428ed7f1615b6a4495c0a21f7a22" + integrity sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw== -"@eslint/plugin-kit@^0.4.0", "@eslint/plugin-kit@^0.4.1": +"@eslint/plugin-kit@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== @@ -735,6 +760,11 @@ "@eslint/core" "^1.1.0" levn "^0.4.1" +"@exodus/bytes@^1.11.0", "@exodus/bytes@^1.6.0": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@exodus/bytes/-/bytes-1.14.1.tgz#9b5c29077162a35f1bd25613e0cd3c239f6e7ad8" + integrity sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ== + "@hey-api/codegen-core@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@hey-api/codegen-core/-/codegen-core-0.0.1.tgz#ad0455b8c3e16de432f6312ca513491788ab2c67" @@ -789,18 +819,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff" - integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" @@ -890,6 +908,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@ota-meshi/ast-token-store@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@ota-meshi/ast-token-store/-/ast-token-store-0.3.0.tgz#c4112dabb53c8bd0c298d94d858849c30f1d3283" + integrity sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg== + "@oxc-project/types@=0.112.0": version "0.112.0" resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.112.0.tgz#8f31ce1930fd6705230f05b52d4689ad6418e0fa" @@ -1099,13 +1122,13 @@ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@stylistic/eslint-plugin@^5.7.1": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.7.1.tgz#bb108186a0133071b38be5fa705cd262260be8a8" - integrity sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg== +"@stylistic/eslint-plugin@^5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.9.0.tgz#b7d23ac17dd8a1868eb7ac142f3ba6d627516e2a" + integrity sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/types" "^8.53.1" + "@typescript-eslint/types" "^8.56.0" eslint-visitor-keys "^4.2.1" espree "^10.4.0" estraverse "^5.3.0" @@ -1213,29 +1236,29 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz#d8899e5c2eccf5c4a20d01c036a193753748454d" - integrity sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ== +"@typescript-eslint/eslint-plugin@^8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz#b1ce606d87221daec571e293009675992f0aae76" + integrity sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A== dependencies: "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.54.0" - "@typescript-eslint/type-utils" "8.54.0" - "@typescript-eslint/utils" "8.54.0" - "@typescript-eslint/visitor-keys" "8.54.0" + "@typescript-eslint/scope-manager" "8.56.1" + "@typescript-eslint/type-utils" "8.56.1" + "@typescript-eslint/utils" "8.56.1" + "@typescript-eslint/visitor-keys" "8.56.1" ignore "^7.0.5" natural-compare "^1.4.0" ts-api-utils "^2.4.0" -"@typescript-eslint/parser@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.54.0.tgz#3d01a6f54ed247deb9982621f70e7abf1810bd97" - integrity sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA== +"@typescript-eslint/parser@^8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.56.1.tgz#21d13b3d456ffb08614c1d68bb9a4f8d9237cdc7" + integrity sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg== dependencies: - "@typescript-eslint/scope-manager" "8.54.0" - "@typescript-eslint/types" "8.54.0" - "@typescript-eslint/typescript-estree" "8.54.0" - "@typescript-eslint/visitor-keys" "8.54.0" + "@typescript-eslint/scope-manager" "8.56.1" + "@typescript-eslint/types" "8.56.1" + "@typescript-eslint/typescript-estree" "8.56.1" + "@typescript-eslint/visitor-keys" "8.56.1" debug "^4.4.3" "@typescript-eslint/project-service@8.50.0": @@ -1247,13 +1270,13 @@ "@typescript-eslint/types" "^8.50.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.54.0.tgz#f582aceb3d752544c8e1b11fea8d95d00cf9adc6" - integrity sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g== +"@typescript-eslint/project-service@8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.1.tgz#65c8d645f028b927bfc4928593b54e2ecd809244" + integrity sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" + "@typescript-eslint/tsconfig-utils" "^8.56.1" + "@typescript-eslint/types" "^8.56.1" debug "^4.4.3" "@typescript-eslint/scope-manager@8.50.0": @@ -1264,32 +1287,32 @@ "@typescript-eslint/types" "8.50.0" "@typescript-eslint/visitor-keys" "8.50.0" -"@typescript-eslint/scope-manager@8.54.0", "@typescript-eslint/scope-manager@^8.51.0", "@typescript-eslint/scope-manager@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz#307dc8cbd80157e2772c2d36216857415a71ab33" - integrity sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg== +"@typescript-eslint/scope-manager@8.56.1", "@typescript-eslint/scope-manager@^8.55.0": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz#254df93b5789a871351335dd23e20bc164060f24" + integrity sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w== dependencies: - "@typescript-eslint/types" "8.54.0" - "@typescript-eslint/visitor-keys" "8.54.0" + "@typescript-eslint/types" "8.56.1" + "@typescript-eslint/visitor-keys" "8.56.1" "@typescript-eslint/tsconfig-utils@8.50.0", "@typescript-eslint/tsconfig-utils@^8.50.0": version "8.50.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz#5c17537ad4c8a13bf6d7393035edaf91a1e13191" integrity sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w== -"@typescript-eslint/tsconfig-utils@8.54.0", "@typescript-eslint/tsconfig-utils@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz#71dd7ba1674bd48b172fc4c85b2f734b0eae3dbc" - integrity sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw== +"@typescript-eslint/tsconfig-utils@8.56.1", "@typescript-eslint/tsconfig-utils@^8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz#1afa830b0fada5865ddcabdc993b790114a879b7" + integrity sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ== -"@typescript-eslint/type-utils@8.54.0", "@typescript-eslint/type-utils@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz#64965317dd4118346c2fa5ee94492892200e9fb9" - integrity sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA== +"@typescript-eslint/type-utils@8.56.1", "@typescript-eslint/type-utils@^8.55.0": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz#7a6c4fabf225d674644931e004302cbbdd2f2e24" + integrity sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg== dependencies: - "@typescript-eslint/types" "8.54.0" - "@typescript-eslint/typescript-estree" "8.54.0" - "@typescript-eslint/utils" "8.54.0" + "@typescript-eslint/types" "8.56.1" + "@typescript-eslint/typescript-estree" "8.56.1" + "@typescript-eslint/utils" "8.56.1" debug "^4.4.3" ts-api-utils "^2.4.0" @@ -1304,12 +1327,17 @@ debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@8.50.0", "@typescript-eslint/types@^8.46.4", "@typescript-eslint/types@^8.50.0": +"@typescript-eslint/types@8.50.0", "@typescript-eslint/types@^8.50.0": version "8.50.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.50.0.tgz#ad8f1ad88ae0096f548c9cdf60da9b92832db96e" integrity sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w== -"@typescript-eslint/types@8.54.0", "@typescript-eslint/types@^8.53.1", "@typescript-eslint/types@^8.54.0": +"@typescript-eslint/types@8.56.1", "@typescript-eslint/types@^8.55.0", "@typescript-eslint/types@^8.56.0", "@typescript-eslint/types@^8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9" + integrity sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw== + +"@typescript-eslint/types@^8.54.0": version "8.54.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.54.0.tgz#c12d41f67a2e15a8a96fbc5f2d07b17331130889" integrity sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA== @@ -1329,17 +1357,17 @@ tinyglobby "^0.2.15" ts-api-utils "^2.1.0" -"@typescript-eslint/typescript-estree@8.54.0", "@typescript-eslint/typescript-estree@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz#3c7716905b2b811fadbd2114804047d1bfc86527" - integrity sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA== +"@typescript-eslint/typescript-estree@8.56.1", "@typescript-eslint/typescript-estree@^8.55.0": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz#3b9e57d8129a860c50864c42188f761bdef3eab0" + integrity sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg== dependencies: - "@typescript-eslint/project-service" "8.54.0" - "@typescript-eslint/tsconfig-utils" "8.54.0" - "@typescript-eslint/types" "8.54.0" - "@typescript-eslint/visitor-keys" "8.54.0" + "@typescript-eslint/project-service" "8.56.1" + "@typescript-eslint/tsconfig-utils" "8.56.1" + "@typescript-eslint/types" "8.56.1" + "@typescript-eslint/visitor-keys" "8.56.1" debug "^4.4.3" - minimatch "^9.0.5" + minimatch "^10.2.2" semver "^7.7.3" tinyglobby "^0.2.15" ts-api-utils "^2.4.0" @@ -1354,15 +1382,15 @@ "@typescript-eslint/types" "8.50.0" "@typescript-eslint/typescript-estree" "8.50.0" -"@typescript-eslint/utils@8.54.0", "@typescript-eslint/utils@^8.51.0", "@typescript-eslint/utils@^8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.54.0.tgz#c79a4bcbeebb4f571278c0183ed1cb601d84c6c8" - integrity sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA== +"@typescript-eslint/utils@8.56.1", "@typescript-eslint/utils@^8.55.0", "@typescript-eslint/utils@^8.56.0": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.1.tgz#5a86acaf9f1b4c4a85a42effb217f73059f6deb7" + integrity sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.54.0" - "@typescript-eslint/types" "8.54.0" - "@typescript-eslint/typescript-estree" "8.54.0" + "@typescript-eslint/scope-manager" "8.56.1" + "@typescript-eslint/types" "8.56.1" + "@typescript-eslint/typescript-estree" "8.56.1" "@typescript-eslint/visitor-keys@8.50.0": version "8.50.0" @@ -1372,21 +1400,21 @@ "@typescript-eslint/types" "8.50.0" eslint-visitor-keys "^4.2.1" -"@typescript-eslint/visitor-keys@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz#0e4b50124b210b8600b245dd66cbad52deb15590" - integrity sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA== +"@typescript-eslint/visitor-keys@8.56.1": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz#50e03475c33a42d123dc99e63acf1841c0231f87" + integrity sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw== dependencies: - "@typescript-eslint/types" "8.54.0" - eslint-visitor-keys "^4.2.1" + "@typescript-eslint/types" "8.56.1" + eslint-visitor-keys "^5.0.0" -"@vitest/eslint-plugin@^1.6.6": - version "1.6.6" - resolved "https://registry.yarnpkg.com/@vitest/eslint-plugin/-/eslint-plugin-1.6.6.tgz#8e7202397f7dd6d9e4c9c1b297f93610d9a96784" - integrity sha512-bwgQxQWRtnTVzsUHK824tBmHzjV0iTx3tZaiQIYDjX3SA7TsQS8CuDVqxXrRY3FaOUMgbGavesCxI9MOfFLm7Q== +"@vitest/eslint-plugin@^1.6.9": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@vitest/eslint-plugin/-/eslint-plugin-1.6.9.tgz#ba00bd9bcf42ba901ea95c2c05e0049a0f930abd" + integrity sha512-9WfPx1OwJ19QLCSRLkqVO7//1WcWnK3fE/3fJhKMAmDe8+9G4rB47xCNIIeCq3FdEzkIoLTfDlwDlPBaUTMhow== dependencies: - "@typescript-eslint/scope-manager" "^8.51.0" - "@typescript-eslint/utils" "^8.51.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" "@vitest/expect@4.0.16": version "4.0.16" @@ -1400,6 +1428,18 @@ chai "^6.2.1" tinyrainbow "^3.0.3" +"@vitest/expect@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.18.tgz#361510d99fbf20eb814222e4afcb8539d79dc94d" + integrity sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + chai "^6.2.1" + tinyrainbow "^3.0.3" + "@vitest/mocker@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.16.tgz#0351f17f5843b226f237f86cad7fc6dd7fd5b36d" @@ -1409,6 +1449,15 @@ estree-walker "^3.0.3" magic-string "^0.30.21" +"@vitest/mocker@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.18.tgz#b9735da114ef65ea95652c5bdf13159c6fab4865" + integrity sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ== + dependencies: + "@vitest/spy" "4.0.18" + estree-walker "^3.0.3" + magic-string "^0.30.21" + "@vitest/pretty-format@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.16.tgz#91893e0337dbdd6f80a89bcc9710c0d03650f090" @@ -1416,6 +1465,13 @@ dependencies: tinyrainbow "^3.0.3" +"@vitest/pretty-format@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.18.tgz#fbccd4d910774072ec15463553edb8ca5ce53218" + integrity sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw== + dependencies: + tinyrainbow "^3.0.3" + "@vitest/runner@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.16.tgz#a9eb6786545727436e53eb51308abd6af8154323" @@ -1424,6 +1480,14 @@ "@vitest/utils" "4.0.16" pathe "^2.0.3" +"@vitest/runner@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.18.tgz#c2c0a3ed226ec85e9312f9cc8c43c5b3a893a8b1" + integrity sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw== + dependencies: + "@vitest/utils" "4.0.18" + pathe "^2.0.3" + "@vitest/snapshot@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.16.tgz#6a7e41bdd3a60206c167720042c836c30dc50f3a" @@ -1433,11 +1497,25 @@ magic-string "^0.30.21" pathe "^2.0.3" +"@vitest/snapshot@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.18.tgz#bcb40fd6d742679c2ac927ba295b66af1c6c34c5" + integrity sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA== + dependencies: + "@vitest/pretty-format" "4.0.18" + magic-string "^0.30.21" + pathe "^2.0.3" + "@vitest/spy@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.16.tgz#3ac2e63e3e0cf304f1a84ec086d8e36cd185fbbd" integrity sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw== +"@vitest/spy@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.18.tgz#ba0f20503fb6d08baf3309d690b3efabdfa88762" + integrity sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw== + "@vitest/utils@4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.16.tgz#f789a4ef5c5b2e8eef90a4c3304678dbc6c92599" @@ -1446,63 +1524,76 @@ "@vitest/pretty-format" "4.0.16" tinyrainbow "^3.0.3" -"@vue/compiler-core@3.5.27": - version "3.5.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz#ce4402428e26095586eb889c41f6e172eb3960bd" - integrity sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ== +"@vitest/utils@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.18.tgz#9636b16d86a4152ec68a8d6859cff702896433d4" + integrity sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA== dependencies: - "@babel/parser" "^7.28.5" - "@vue/shared" "3.5.27" - entities "^7.0.0" + "@vitest/pretty-format" "4.0.18" + tinyrainbow "^3.0.3" + +"@vue/compiler-core@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.29.tgz#3fb70630c62a2e715eeddc3c2a48f46aa4507adc" + integrity sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw== + dependencies: + "@babel/parser" "^7.29.0" + "@vue/shared" "3.5.29" + entities "^7.0.1" estree-walker "^2.0.2" source-map-js "^1.2.1" -"@vue/compiler-dom@3.5.27": - version "3.5.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz#32b2bc87f0a652c253986796ace0ed6213093af8" - integrity sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w== +"@vue/compiler-dom@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz#055cf5492005249591c7fb45868a874468e4ffb3" + integrity sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg== dependencies: - "@vue/compiler-core" "3.5.27" - "@vue/shared" "3.5.27" + "@vue/compiler-core" "3.5.29" + "@vue/shared" "3.5.29" -"@vue/compiler-sfc@3.5.27": - version "3.5.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz#84651b8816bf8e7d6e62fddd14db86efd6d6f1b6" - integrity sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ== +"@vue/compiler-sfc@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz#8b1b0707fb53c122fedd566244a564eaf40ee71f" + integrity sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA== dependencies: - "@babel/parser" "^7.28.5" - "@vue/compiler-core" "3.5.27" - "@vue/compiler-dom" "3.5.27" - "@vue/compiler-ssr" "3.5.27" - "@vue/shared" "3.5.27" + "@babel/parser" "^7.29.0" + "@vue/compiler-core" "3.5.29" + "@vue/compiler-dom" "3.5.29" + "@vue/compiler-ssr" "3.5.29" + "@vue/shared" "3.5.29" estree-walker "^2.0.2" magic-string "^0.30.21" postcss "^8.5.6" source-map-js "^1.2.1" -"@vue/compiler-ssr@3.5.27": - version "3.5.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz#b480cad09dacf8f3d9c82b9843402f1a803baee7" - integrity sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw== +"@vue/compiler-ssr@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz#83ac28c860271bd1c9822d135ac78c388403f949" + integrity sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw== dependencies: - "@vue/compiler-dom" "3.5.27" - "@vue/shared" "3.5.27" + "@vue/compiler-dom" "3.5.29" + "@vue/shared" "3.5.29" -"@vue/shared@3.5.27": - version "3.5.27" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.27.tgz#33a63143d8fb9ca1b3efbc7ecf9bd0ab05f7e06e" - integrity sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ== +"@vue/shared@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.29.tgz#0fe0d7637b05599d56ca58d83a77c637a1774110" + integrity sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg== acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0, acorn@^8.5.0, acorn@^8.9.0: +acorn@^8.15.0, acorn@^8.5.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.4" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" @@ -1518,6 +1609,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.0.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" @@ -1735,6 +1836,11 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + baseline-browser-mapping@^2.9.0: version "2.9.11" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz#53724708c8db5f97206517ecfe362dbe5181deea" @@ -1777,6 +1883,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +brace-expansion@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" + integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + dependencies: + balanced-match "^4.0.2" + braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -2004,16 +2117,16 @@ commander@^14.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.2.tgz#b71fd37fe4069e4c3c7c13925252ada4eba14e8e" integrity sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ== -comment-parser@1.4.1, comment-parser@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" - integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== - comment-parser@1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.5.tgz#6c595cd090737a1010fe5ff40d86e1d21b7bd6ce" integrity sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw== +comment-parser@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== + compare-versions@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" @@ -2086,7 +2199,7 @@ css-functions-list@^3.2.3: resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== -css-tree@^3.0.1, css-tree@^3.1.0: +css-tree@^3.0.0, css-tree@^3.0.1, css-tree@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== @@ -2099,27 +2212,28 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssstyle@^5.3.4: - version "5.3.5" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-5.3.5.tgz#00bd24f150773bef3b1d7530366e413b74d06394" - integrity sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag== +cssstyle@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-6.1.0.tgz#07ae112dd2fbc590d11f6e11c73699bd50f27d51" + integrity sha512-Ml4fP2UT2K3CUBQnVlbdV/8aFDdlY69E+YnwJM+3VUWl08S3J8c8aRuJqCkD9Py8DHZ7zNNvsfKl8psocHZEFg== dependencies: - "@asamuzakjp/css-color" "^4.1.1" - "@csstools/css-syntax-patches-for-csstree" "^1.0.21" + "@asamuzakjp/css-color" "^5.0.0" + "@csstools/css-syntax-patches-for-csstree" "^1.0.28" css-tree "^3.1.0" + lru-cache "^11.2.6" damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-urls@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-6.0.0.tgz#95a7943c8ac14c1d563b771f2621cc50e8ec7744" - integrity sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA== +data-urls@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-7.0.0.tgz#6dce8b63226a1ecfdd907ce18a8ccfb1eee506d3" + integrity sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA== dependencies: - whatwg-mimetype "^4.0.0" - whatwg-url "^15.0.0" + whatwg-mimetype "^5.0.0" + whatwg-url "^16.0.0" data-view-buffer@^1.0.2: version "1.0.2" @@ -2235,12 +2349,7 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff-sequences@^29.0.0: +diff-sequences@^29.0.0, diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== @@ -2323,10 +2432,10 @@ entities@^6.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== -entities@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.0.tgz#2ae4e443f3f17d152d3f5b0f79b932c1e59deb7a" - integrity sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ== +entities@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b" + integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== env-paths@^2.2.1: version "2.2.1" @@ -2534,19 +2643,12 @@ eslint-compat-utils@^0.5.1: dependencies: semver "^7.5.4" -eslint-compat-utils@^0.6.4: - version "0.6.5" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz#6b06350a1c947c4514cfa64a170a6bfdbadc7ec2" - integrity sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ== - dependencies: - semver "^7.5.4" - -eslint-config-flat-gitignore@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.1.0.tgz#8b93caa703977f04dee11e4c3c8303432462921c" - integrity sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA== +eslint-config-flat-gitignore@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.2.1.tgz#16466d1eba5f5dd33232e9005c74f7623d0b6b7b" + integrity sha512-wA5EqN0era7/7Gt5Botlsfin/UNY0etJSEeBgbUlFLFrBi47rAN//+39fI7fpYcl8RENutlFtvp/zRa/M/pZNg== dependencies: - "@eslint/compat" "^1.2.5" + "@eslint/compat" "^2.0.2" eslint-flat-config-utils@^3.0.1: version "3.0.1" @@ -2568,17 +2670,17 @@ eslint-merge-processors@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-merge-processors/-/eslint-merge-processors-2.0.0.tgz#f1e02bd863962fab7fd038c293979283e61b473c" integrity sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA== -eslint-plugin-antfu@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-antfu/-/eslint-plugin-antfu-3.2.0.tgz#00114602330d034be45245db128312b48c6149fa" - integrity sha512-JTvBcA+gc2hf1wz418dLYtt0GCE3ltrZuriA4KhP/nPbL8W6vZtcDlWUlUfghUTAAFpHh7gp+qN8BbK+jNifgg== +eslint-plugin-antfu@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-antfu/-/eslint-plugin-antfu-3.2.2.tgz#9515f624eefdec9e637feb098b5e3f510c885e7b" + integrity sha512-Qzixht2Dmd/pMbb5EnKqw2V8TiWHbotPlsORO8a+IzCLFwE0RxK8a9k4DCTFPzBwyxJzH+0m2Mn8IUGeGQkyUw== -eslint-plugin-command@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-command/-/eslint-plugin-command-3.4.0.tgz#5542579a2e01b37bf8bd5f78eb6096ce6d7170ff" - integrity sha512-EW4eg/a7TKEhG0s5IEti72kh3YOTlnhfFNuctq5WnB1fst37/IHTd5OkD+vnlRf3opTvUcSRihAateP6bT5ZcA== +eslint-plugin-command@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-command/-/eslint-plugin-command-3.5.2.tgz#f2d7299be7d8d5b04f8d88c84920cf0b4ade058d" + integrity sha512-PA59QAkQDwvcCMEt5lYLJLI3zDGVKJeC4id/pcRY2XdRYhSGW7iyYT1VC1N3bmpuvu6Qb/9QptiS3GJMjeGTJg== dependencies: - "@es-joy/jsdoccomment" "^0.78.0" + "@es-joy/jsdoccomment" "^0.84.0" eslint-plugin-es-x@^7.8.0: version "7.8.0" @@ -2589,15 +2691,15 @@ eslint-plugin-es-x@^7.8.0: "@eslint-community/regexpp" "^4.11.0" eslint-compat-utils "^0.5.1" -eslint-plugin-import-lite@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import-lite/-/eslint-plugin-import-lite-0.5.0.tgz#ded8f3613bfcdb17e83c766057872e8ed454a980" - integrity sha512-7uBvxuQj+VlYmZSYSHcm33QgmZnvMLP2nQiWaLtjhJ5x1zKcskOqjolL+dJC13XY+ktQqBgidAnnQMELfRaXQg== +eslint-plugin-import-lite@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import-lite/-/eslint-plugin-import-lite-0.5.2.tgz#ae386647938151400e744a29a5424062f500f6d3" + integrity sha512-XvfdWOC5dSLEI9krIPRlNmKSI2ViIE9pVylzfV9fCq0ZpDaNeUk6o0wZv0OzN83QdadgXp1NsY0qjLINxwYCsw== -eslint-plugin-jsdoc@^62.5.3: - version "62.5.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.5.4.tgz#2f8bcb3260fcd59b4d5a424e6c761f105e0eacab" - integrity sha512-U+Q5ppErmC17VFQl542eBIaXcuq975BzoIHBXyx7UQx/i4gyHXxPiBkonkuxWyFA98hGLALLUuD+NJcXqSGKxg== +eslint-plugin-jsdoc@^62.7.1: + version "62.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.7.1.tgz#e1ef76d4a7c3b5f7e69acb031feb1571be8ae343" + integrity sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ== dependencies: "@es-joy/jsdoccomment" "~0.84.0" "@es-joy/resolve.exports" "1.2.0" @@ -2610,24 +2712,24 @@ eslint-plugin-jsdoc@^62.5.3: html-entities "^2.6.0" object-deep-merge "^2.0.0" parse-imports-exports "^0.2.4" - semver "^7.7.3" + semver "^7.7.4" spdx-expression-parse "^4.0.0" to-valid-identifier "^1.0.0" -eslint-plugin-jsonc@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.0.tgz#c398b20e9abee4a3bd1931cabb937eefef31b690" - integrity sha512-HttlxdNG5ly3YjP1cFMP62R4qKLxJURfBZo2gnMY+yQojZxkLyOpY1H1KRTKBmvQeSG9pIpSGEhDjE17vvYosg== +eslint-plugin-jsonc@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsonc/-/eslint-plugin-jsonc-3.1.1.tgz#1e7ee260943038a67c79d65d73ea76ca4ba1a115" + integrity sha512-7TSQO8ZyvOuXWb0sYke3KUSh0DJA4/QviKfuzD3/Cy3XDjtrIrTWQbjb7j/Yy2l/DgwuM+lCS2c/jqJifv5jhg== dependencies: "@eslint-community/eslint-utils" "^4.5.1" - diff-sequences "^27.5.1" - eslint-compat-utils "^0.6.4" + "@eslint/core" "^1.0.1" + "@eslint/plugin-kit" "^0.6.0" + "@ota-meshi/ast-token-store" "^0.3.0" + diff-sequences "^29.6.3" eslint-json-compat-utils "^0.2.1" - espree "^9.6.1 || ^10.3.0" - graphemer "^1.4.0" - jsonc-eslint-parser "^2.4.0" + jsonc-eslint-parser "^3.1.0" natural-compare "^1.4.0" - synckit "^0.6.2 || ^0.7.3 || ^0.11.5" + synckit "^0.11.12" eslint-plugin-jsx-a11y@6.10.2: version "6.10.2" @@ -2650,10 +2752,10 @@ eslint-plugin-jsx-a11y@6.10.2: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" -eslint-plugin-n@^17.23.2: - version "17.23.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz#cd1be342b56771385028d8039d67f11fb9cca5f3" - integrity sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw== +eslint-plugin-n@^17.24.0: + version "17.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz#b66fa05f7a6c1ba16768f0921b8974147dddd060" + integrity sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw== dependencies: "@eslint-community/eslint-utils" "^4.5.0" enhanced-resolve "^5.17.1" @@ -2670,57 +2772,57 @@ eslint-plugin-no-only-tests@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz#d9d42ccd4b5d099b4872fb5046cf95441188cfb5" integrity sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q== -eslint-plugin-perfectionist@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.5.0.tgz#90f7806e52bf035fc8e1cb99f64762fd5608bb72" - integrity sha512-lZX2KUpwOQf7J27gAg/6vt8ugdPULOLmelM8oDJPMbaN7P2zNNeyS9yxGSmJcKX0SF9qR/962l9RWM2Z5jpPzg== +eslint-plugin-perfectionist@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.6.0.tgz#825ece14ee7d713ed9767c0dca50334d620dad2f" + integrity sha512-pxrLrfRp5wl1Vol1fAEa/G5yTXxefTPJjz07qC7a8iWFXcOZNuWBItMQ2OtTzfQIvMq6bMyYcrzc3Wz++na55Q== dependencies: - "@typescript-eslint/utils" "^8.54.0" + "@typescript-eslint/utils" "^8.56.0" natural-orderby "^5.0.0" -eslint-plugin-pnpm@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-pnpm/-/eslint-plugin-pnpm-1.5.0.tgz#7469bd46bd75d57e96b696d052bb6c0e93b47656" - integrity sha512-ayMo1GvrQ/sF/bz1aOAiH0jv9eAqU2Z+a1ycoWz/uFFK5NxQDq49BDKQtBumcOUBf2VHyiTW4a8u+6KVqoIWzQ== +eslint-plugin-pnpm@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-pnpm/-/eslint-plugin-pnpm-1.6.0.tgz#062dc0d52785112a74b7c865d6134e751053d754" + integrity sha512-dxmt9r3zvPaft6IugS4i0k16xag3fTbOvm/road5uV9Y8qUCQT0xzheSh3gMlYAlC6vXRpfArBDsTZ7H7JKCbg== dependencies: empathic "^2.0.0" - jsonc-eslint-parser "^2.4.2" + jsonc-eslint-parser "^3.1.0" pathe "^2.0.3" - pnpm-workspace-yaml "1.5.0" + pnpm-workspace-yaml "1.6.0" tinyglobby "^0.2.15" yaml "^2.8.2" yaml-eslint-parser "^2.0.0" -eslint-plugin-react-dom@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-dom/-/eslint-plugin-react-dom-2.12.2.tgz#b39315e76b1fdb94341464c42c84a8a163185b9c" - integrity sha512-Tvz+YETB0MQiPHR3KYhkwCioGfXQ6aUXpNOFpgZ70wx5/QuU1lemTWdmXuxgAPifsl150OOZmM2MJ0ElkwBUOw== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/core" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-dom@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-dom/-/eslint-plugin-react-dom-2.13.0.tgz#52350a097cb65a5f759c86d9fb657afedfac1e6b" + integrity sha512-+2IZzQ1WEFYOWatW+xvNUqmZn55YBCufzKA7hX3XQ/8eu85Mp4vnlOyNvdVHEOGhUnGuC6+9+zLK+IlEHKdKLQ== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/core" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" compare-versions "^6.1.1" ts-pattern "^5.9.0" -eslint-plugin-react-hooks-extra@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-2.12.2.tgz#4e3f13d4fbbe367d59a88265a11a67ea0dcfb8dd" - integrity sha512-I3L/iVgyMRbbmMxRZNIxlxMrXUnV74ZHOsmSfzB/ue9hivdd5yN8JhMe+I5PNOw9L0gJHUCo2mgkKV6lMEE5DA== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/core" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/type-utils" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-hooks-extra@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-2.13.0.tgz#0407266ef1792d876938a526fe73896b9b8d72b7" + integrity sha512-qIbha1nzuyhXM9SbEfrcGVqmyvQu7GAOB2sy9Y4Qo5S8nCqw4fSBxq+8lSce5Tk5Y7XzIkgHOhNyXEvUHRWFMQ== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/core" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/type-utils" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" ts-pattern "^5.9.0" eslint-plugin-react-hooks@7.0.1: @@ -2734,71 +2836,71 @@ eslint-plugin-react-hooks@7.0.1: zod "^3.25.0 || ^4.0.0" zod-validation-error "^3.5.0 || ^4.0.0" -eslint-plugin-react-naming-convention@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-2.12.2.tgz#ae7299ed059df293b5aa5ea51a0fc9977cf6da58" - integrity sha512-IsPmSs+AZo11uR47UoSRv9tVntUDL9Ah5F8Zj4HVC4HTxJlFZHC0gbm43q36Xw6c65J0LqA75oDA2h6jvhqSQQ== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/core" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/type-utils" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-naming-convention@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-2.13.0.tgz#7abb0111117a716348623299069e0a2315355619" + integrity sha512-uSd25JzSg2R4p81s3Wqck0AdwRlO9Yc+cZqTEXv7vW8exGGAM3mWnF6hgrgdqVJqBEGJIbS/Vx1r5BdKcY/MHA== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/core" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/type-utils" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" compare-versions "^6.1.1" string-ts "^2.3.1" ts-pattern "^5.9.0" -eslint-plugin-react-refresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.0.tgz#9a9671b32871923ae8b45a30b752401a63168fef" - integrity sha512-ZYvmh7VfVgqR/7wR71I3Zl6hK/C5CcxdWYKZSpHawS5JCNgE4efhQWg/+/WPpgGAp9Ngp/rRZYyaIwmPQBq/lA== - -eslint-plugin-react-rsc@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-2.12.2.tgz#03ef376dd7fd6b84ff72033fed795ee942fb53aa" - integrity sha512-37Z4u6bBddO2wz8wrelYapOoDHhdEyF2pt8pbzFs0nW2USOxoA34/Gv73Dos0Kb6Ul4fFuwEHH2Tu8hZoki5jQ== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-refresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz#39e11021be10e1cd9adab2bdeabc65b17222409f" + integrity sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA== + +eslint-plugin-react-rsc@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-2.13.0.tgz#067b540efe254dc461c978b1d592d0da3629efbe" + integrity sha512-RaftgITDLQm1zIgYyvR51sBdy4FlVaXFts5VISBaKbSUB0oqXyzOPxMHasfr9BCSjPLKus9zYe+G/Hr6rjFLXQ== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" ts-pattern "^5.9.0" -eslint-plugin-react-web-api@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-2.12.2.tgz#4e450798198b63ee5dda0115438bcbdafb20058d" - integrity sha512-bnpobQ6pjGdo4sJpd/PDlVM/wTqHt29fsW3uExuB+9ta6LSJjJo0/nXhV/o7q/MU/04QZB8WOw+k9ws8HU1sPQ== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/core" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-web-api@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-2.13.0.tgz#803a51b2f38cf4eb7a1026d7e28b86a6b0dfa7f7" + integrity sha512-nmJbzIAte7PeAkp22CwcKEASkKi49MshSdiDGO1XuN3f4N4/8sBfDcWbQuLPde6JiuzDT/0+l7Gi8wwTHtR1kg== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/core" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" birecord "^0.1.1" ts-pattern "^5.9.0" -eslint-plugin-react-x@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-x/-/eslint-plugin-react-x-2.12.2.tgz#0a986472b07497a53b0fd2ce8aaa38f43b6ed89c" - integrity sha512-0zA48OyHKHePa3mhV/tRxT26LvEhRC7ROQ02sdwoyv/JOYgLX+5Z9o85sneFB7SmkZul4TubxUf+EvHTXdUmVg== - dependencies: - "@eslint-react/ast" "2.12.2" - "@eslint-react/core" "2.12.2" - "@eslint-react/eff" "2.12.2" - "@eslint-react/shared" "2.12.2" - "@eslint-react/var" "2.12.2" - "@typescript-eslint/scope-manager" "^8.54.0" - "@typescript-eslint/type-utils" "^8.54.0" - "@typescript-eslint/types" "^8.54.0" - "@typescript-eslint/utils" "^8.54.0" +eslint-plugin-react-x@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-x/-/eslint-plugin-react-x-2.13.0.tgz#05557162f37a17b278d71a9692327cb34e503834" + integrity sha512-cMNX0+ws/fWTgVxn52qAQbaFF2rqvaDAtjrPUzY6XOzPjY0rJQdR2tSlWJttz43r2yBfqu+LGvHlGpWL2wfpTQ== + dependencies: + "@eslint-react/ast" "2.13.0" + "@eslint-react/core" "2.13.0" + "@eslint-react/eff" "2.13.0" + "@eslint-react/shared" "2.13.0" + "@eslint-react/var" "2.13.0" + "@typescript-eslint/scope-manager" "^8.55.0" + "@typescript-eslint/type-utils" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + "@typescript-eslint/utils" "^8.55.0" compare-versions "^6.1.1" is-immutable-type "^5.0.1" ts-api-utils "^2.4.0" @@ -2841,29 +2943,28 @@ eslint-plugin-regexp@^3.0.0: regexp-ast-analysis "^0.7.1" scslre "^0.3.0" -eslint-plugin-toml@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-toml/-/eslint-plugin-toml-1.0.4.tgz#f37c7fa3f3284593a7d3bd6f7e9b98ab0bdb2264" - integrity sha512-oGjx1+rwN2YCS3xPCpnKX3Ei5vJngU+8LpdzovfIhWr+CoLIOpl7T2+/E00zaDHNMhCnuENlBqRCmXVvzUePjQ== +eslint-plugin-toml@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-toml/-/eslint-plugin-toml-1.3.0.tgz#1f39051adfeba7e826cb81f22372f89734604ad5" + integrity sha512-+jjKAs2WRNom9PU1APlrL1kNexy1RHoKB7SHw7FLZBlqOCYXUKyG3Quiv1XUICdWDJ6oGVgW/mSm+BDuQrcc3w== dependencies: "@eslint/core" "^1.0.1" "@eslint/plugin-kit" "^0.6.0" + "@ota-meshi/ast-token-store" "^0.3.0" debug "^4.1.1" toml-eslint-parser "^1.0.1" -eslint-plugin-unicorn@^62.0.0: - version "62.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz#7027feb2ffde9c25df3d2067e0f4e579a9ec5019" - integrity sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g== +eslint-plugin-unicorn@^63.0.0: + version "63.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-63.0.0.tgz#db210b87bb66f0f15ab675ba13d9f1fb61016b22" + integrity sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA== dependencies: "@babel/helper-validator-identifier" "^7.28.5" "@eslint-community/eslint-utils" "^4.9.0" - "@eslint/plugin-kit" "^0.4.0" change-case "^5.4.4" ci-info "^4.3.1" clean-regexp "^1.0.0" core-js-compat "^3.46.0" - esquery "^1.6.0" find-up-simple "^1.0.1" globals "^16.4.0" indent-string "^5.0.0" @@ -2875,15 +2976,15 @@ eslint-plugin-unicorn@^62.0.0: semver "^7.7.3" strip-indent "^4.1.1" -eslint-plugin-unused-imports@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz#69ff9c4f83f02f7789808bbbab77636cb742af50" - integrity sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA== +eslint-plugin-unused-imports@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz#a831f0a2937d7631eba30cb87091ab7d3a5da0e1" + integrity sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ== -eslint-plugin-vue@^10.7.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.7.0.tgz#108264d16a4b03b49fe7b4d446661d15aab85bd3" - integrity sha512-r2XFCK4qlo1sxEoAMIoTTX0PZAdla0JJDt1fmYiworZUX67WeEGqm+JbyAg3M+pGiJ5U6Mp5WQbontXWtIW7TA== +eslint-plugin-vue@^10.8.0: + version "10.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz#a856d73b53ba5f4b2b4bb6cd8051ca7ac65cb21d" + integrity sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" @@ -2892,13 +2993,14 @@ eslint-plugin-vue@^10.7.0: semver "^7.6.3" xml-name-validator "^4.0.0" -eslint-plugin-yml@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-yml/-/eslint-plugin-yml-3.1.2.tgz#9a0b7f565c6885b78b9ce36fb33e00d35a69ceb9" - integrity sha512-n9lxbFrNlGDLOSyIrEYkkYr7icbULMh66wwkIEluisq0lXSu1qVEEXM0g8MM8UQbtd9t1HMgN6bC+DaOe5dWdQ== +eslint-plugin-yml@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-yml/-/eslint-plugin-yml-3.3.0.tgz#c9eef8e19553de89418c69d47c03161d31317b34" + integrity sha512-kRja5paNrMfZnbNqDbZSFrSHz5x7jmGBQq7d6z/+wRvWD4Y0yb1fbjojBg3ReMewFhBB7nD2nPC86+m3HmILJA== dependencies: "@eslint/core" "^1.0.1" "@eslint/plugin-kit" "^0.6.0" + "@ota-meshi/ast-token-store" "^0.3.0" debug "^4.3.2" diff-sequences "^29.0.0" escape-string-regexp "5.0.0" @@ -2910,30 +3012,35 @@ eslint-processor-vue-blocks@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-2.0.0.tgz#b06a2e2bdefda75792e9fc9f00a9de305e657472" integrity sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q== -eslint-scope@^8.2.0, eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== +"eslint-scope@^8.2.0 || ^9.0.0", eslint-scope@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.1.tgz#f6a209486e38bd28356b5feb07d445cc99c89967" + integrity sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw== dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.0.tgz#dfcb41d6c0d73df6b977a50cf3e91c41ddb4154e" - integrity sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ== +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: - "@types/esrecurse" "^4.3.1" - "@types/estree" "^1.0.8" esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.2.0, eslint-visitor-keys@^4.2.1: +"eslint-visitor-keys@^4.2.0 || ^5.0.0", eslint-visitor-keys@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint-visitor-keys@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== @@ -2943,14 +3050,14 @@ eslint-visitor-keys@^5.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz#b9aa1a74aa48c44b3ae46c1597ce7171246a94a9" integrity sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q== -eslint@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.0.tgz#c93c36a96d91621d0fbb680db848ea11af56ab1e" - integrity sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg== +eslint@10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.2.tgz#1009263467591810320f2e1ad52b8a750d1acbab" + integrity sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.0" + "@eslint/config-array" "^0.23.2" "@eslint/config-helpers" "^0.5.2" "@eslint/core" "^1.1.0" "@eslint/plugin-kit" "^0.6.0" @@ -2958,13 +3065,13 @@ eslint@10.0.0: "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" "@types/estree" "^1.0.6" - ajv "^6.12.4" + ajv "^6.14.0" cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^9.1.0" - eslint-visitor-keys "^5.0.0" - espree "^11.1.0" + eslint-scope "^9.1.1" + eslint-visitor-keys "^5.0.1" + espree "^11.1.1" esquery "^1.7.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -2975,7 +3082,7 @@ eslint@10.0.0: imurmurhash "^0.1.4" is-glob "^4.0.0" json-stable-stringify-without-jsonify "^1.0.1" - minimatch "^10.1.1" + minimatch "^10.2.1" natural-compare "^1.4.0" optionator "^0.9.3" @@ -3019,7 +3126,7 @@ eslint@^9: natural-compare "^1.4.0" optionator "^0.9.3" -espree@^10.0.1, espree@^10.3.0, espree@^10.4.0, "espree@^9.6.1 || ^10.3.0": +espree@^10.0.1, espree@^10.4.0: version "10.4.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== @@ -3028,6 +3135,15 @@ espree@^10.0.1, espree@^10.3.0, espree@^10.4.0, "espree@^9.6.1 || ^10.3.0": acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" +"espree@^10.3.0 || ^11.0.0", espree@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.1.tgz#866f6bc9ccccd6f28876b7a6463abb281b9cb847" + integrity sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ== + dependencies: + acorn "^8.16.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^5.0.1" + espree@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.0.tgz#7d0c82a69f8df670728dba256264b383fbf73e8f" @@ -3037,15 +3153,6 @@ espree@^11.1.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^5.0.0" -espree@^9.0.0: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - esquery@^1.5.0, esquery@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" @@ -3483,11 +3590,6 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - handlebars@4.7.8: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -3572,12 +3674,12 @@ hookified@^1.13.0, hookified@^1.14.0: resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.14.0.tgz#815ca3b9f3e77c782f583bf3974e966df7a9fd7b" integrity sha512-pi1ynXIMFx/uIIwpWJ/5CEtOHLGtnUB0WhGeeYT+fKcQ+WCQbm3/rrkAXnpfph++PgepNqPdTC2WTj8A6k6zoQ== -html-encoding-sniffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" - integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== +html-encoding-sniffer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz#f8d9390b3b348b50d4f61c16dd2ef5c05980a882" + integrity sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== dependencies: - whatwg-encoding "^3.1.1" + "@exodus/bytes" "^1.6.0" html-entities@^2.6.0: version "2.6.0" @@ -3610,13 +3712,6 @@ husky@^9.1.7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ignore@^5.2.0, ignore@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -3970,22 +4065,19 @@ jsdoc-type-pratt-parser@^7.0.0, jsdoc-type-pratt-parser@~7.1.1: resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz#c67be3c812aaf1405bef3e965e8c3db50a5cad1b" integrity sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA== -jsdoc-type-pratt-parser@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz#b0381514e79aa6326185078059ca5915bb8ede3b" - integrity sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA== - -jsdom@27.3.0: - version "27.3.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-27.3.0.tgz#7f08340b047ab3555ac7d8128fcf1feeca4d8587" - integrity sha512-GtldT42B8+jefDUC4yUKAvsaOrH7PDHmZxZXNgF2xMmymjUbRYJvpAybZAKEmXDGTM0mCsz8duOa4vTm5AY2Kg== - dependencies: - "@acemir/cssom" "^0.9.28" - "@asamuzakjp/dom-selector" "^6.7.6" - cssstyle "^5.3.4" - data-urls "^6.0.0" +jsdom@28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-28.1.0.tgz#ac4203e58fd24d7b0f34359ab00d6d9caebd4b62" + integrity sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug== + dependencies: + "@acemir/cssom" "^0.9.31" + "@asamuzakjp/dom-selector" "^6.8.1" + "@bramus/specificity" "^2.4.2" + "@exodus/bytes" "^1.11.0" + cssstyle "^6.0.1" + data-urls "^7.0.0" decimal.js "^10.6.0" - html-encoding-sniffer "^4.0.0" + html-encoding-sniffer "^6.0.0" http-proxy-agent "^7.0.2" https-proxy-agent "^7.0.6" is-potential-custom-element-name "^1.0.1" @@ -3993,12 +4085,11 @@ jsdom@27.3.0: saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^6.0.0" + undici "^7.21.0" w3c-xmlserializer "^5.0.0" - webidl-conversions "^8.0.0" - whatwg-encoding "^3.1.1" - whatwg-mimetype "^4.0.0" - whatwg-url "^15.1.0" - ws "^8.18.3" + webidl-conversions "^8.0.1" + whatwg-mimetype "^5.0.0" + whatwg-url "^16.0.0" xml-name-validator "^5.0.0" jsesc@^3.0.2, jsesc@^3.1.0, jsesc@~3.1.0: @@ -4036,14 +4127,13 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-eslint-parser@^2.4.0, jsonc-eslint-parser@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz#f135454fd35784ecc1b848908f0d3e98a5be9433" - integrity sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA== +jsonc-eslint-parser@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz#ecbd62bdfe8acc299812d0610bff938377987626" + integrity sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng== dependencies: acorn "^8.5.0" - eslint-visitor-keys "^3.0.0" - espree "^9.0.0" + eslint-visitor-keys "^5.0.0" semver "^7.3.5" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: @@ -4184,10 +4274,10 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^11.2.4: - version "11.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.4.tgz#ecb523ebb0e6f4d837c807ad1abaea8e0619770d" - integrity sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg== +lru-cache@^11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" + integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== lru-cache@^5.1.1: version "5.1.1" @@ -4681,12 +4771,12 @@ mimic-function@^5.0.0: resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -minimatch@^10.1.1: - version "10.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.2.tgz#6c3f289f9de66d628fa3feb1842804396a43d81c" - integrity sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw== +minimatch@^10.2.1, minimatch@^10.2.2: + version "10.2.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== dependencies: - "@isaacs/brace-expansion" "^5.0.1" + brace-expansion "^5.0.2" minimatch@^3.1.2: version "3.1.2" @@ -4695,7 +4785,7 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.4, minimatch@^9.0.5: +minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -5083,10 +5173,10 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pnpm-workspace-yaml@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.5.0.tgz#8e55dc71ad0ae3e9de6f2c72609d88b85ad51e66" - integrity sha512-PxdyJuFvq5B0qm3s9PaH/xOtSxrcvpBRr+BblhucpWjs8c79d4b7/cXhyY4AyHOHCnqklCYZTjfl0bT/mFVTRw== +pnpm-workspace-yaml@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.6.0.tgz#8d070014c08cdb2291a11b64bb631843b1e19316" + integrity sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw== dependencies: yaml "^2.8.2" @@ -5453,11 +5543,6 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: es-errors "^1.3.0" is-regex "^1.2.1" -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -5494,6 +5579,11 @@ semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +semver@^7.7.4: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -5969,10 +6059,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -"synckit@^0.6.2 || ^0.7.3 || ^0.11.5": - version "0.11.11" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.11.tgz#c0b619cf258a97faa209155d9cd1699b5c998cb0" - integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== +synckit@^0.11.12: + version "0.11.12" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" + integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== dependencies: "@pkgr/core" "^0.2.9" @@ -6224,6 +6314,11 @@ undici-types@~7.16.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici@^7.21.0: + version "7.22.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.22.0.tgz#7a82590a5908e504a47d85c60b0f89ca14240e60" + integrity sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg== + unist-util-is@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" @@ -6322,15 +6417,41 @@ vitest@4.0.16: vite "^6.0.0 || ^7.0.0" why-is-node-running "^2.3.0" -vue-eslint-parser@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz#cb53f89b14c7f5bf6a95c9532e3b2961ab619d61" - integrity sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw== +vitest@4.0.18: + version "4.0.18" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.18.tgz#56f966353eca0b50f4df7540cd4350ca6d454a05" + integrity sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ== + dependencies: + "@vitest/expect" "4.0.18" + "@vitest/mocker" "4.0.18" + "@vitest/pretty-format" "4.0.18" + "@vitest/runner" "4.0.18" + "@vitest/snapshot" "4.0.18" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + es-module-lexer "^1.7.0" + expect-type "^1.2.2" + magic-string "^0.30.21" + obug "^2.1.1" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^3.10.0" + tinybench "^2.9.0" + tinyexec "^1.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.0.3" + vite "^6.0.0 || ^7.0.0" + why-is-node-running "^2.3.0" + +vue-eslint-parser@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz#fd7251d0e710a88a6618f50e8a27973bc3c8d69c" + integrity sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg== dependencies: debug "^4.4.0" - eslint-scope "^8.2.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" + eslint-scope "^8.2.0 || ^9.0.0" + eslint-visitor-keys "^4.2.0 || ^5.0.0" + espree "^10.3.0 || ^11.0.0" esquery "^1.6.0" semver "^7.6.3" @@ -6341,30 +6462,24 @@ w3c-xmlserializer@^5.0.0: dependencies: xml-name-validator "^5.0.0" -webidl-conversions@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-8.0.0.tgz#821c92aa4f88d88a31264d887e244cb9655690c6" - integrity sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA== +webidl-conversions@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-8.0.1.tgz#0657e571fe6f06fcb15ca50ed1fdbcb495cd1686" + integrity sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== -whatwg-encoding@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" - integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" - integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== +whatwg-mimetype@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz#d8232895dbd527ceaee74efd4162008fb8a8cf48" + integrity sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw== -whatwg-url@^15.0.0, whatwg-url@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-15.1.0.tgz#5c433439b9a5789eeb3806bbd0da89a8bd40b8d7" - integrity sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g== +whatwg-url@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-16.0.1.tgz#047f7f4bd36ef76b7198c172d1b1cebc66f764dd" + integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== dependencies: + "@exodus/bytes" "^1.11.0" tr46 "^6.0.0" - webidl-conversions "^8.0.0" + webidl-conversions "^8.0.1" which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" @@ -6473,11 +6588,6 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@^8.18.3: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== - xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"