From 8d1f68a4ba48f5d7c29d97c2be4d72d8361c4bbb Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:07:49 +0300 Subject: [PATCH 01/20] [v0.3.0-beta.1] New release --- .gitignore | 4 + .npmignore | 25 ++ bun.lockb | Bin 0 -> 119532 bytes dist/esm/main.d.ts | 39 ++++ dist/esm/main.js | 111 +++++++++ dist/esm/request.d.ts | 9 + dist/esm/request.js | 1 + dist/esm/types.d.ts | 5 + dist/esm/types.js | 1 + dist/esm/utils/http.d.ts | 14 ++ dist/esm/utils/http.js | 23 ++ dist/esm/utils/hyperapi-error.d.ts | 9 + dist/esm/utils/hyperapi-error.js | 31 +++ dist/esm/utils/is-record.d.ts | 6 + dist/esm/utils/is-record.js | 12 + dist/esm/utils/parse.d.ts | 11 + dist/esm/utils/parse.js | 97 ++++++++ dist/esm/utils/parse/form-data.d.ts | 8 + dist/esm/utils/parse/form-data.js | 33 +++ dist/esm/utils/parse/text.d.ts | 7 + dist/esm/utils/parse/text.js | 12 + dist/main.cjs | 348 ++++++++++++++++++++++++++++ eslint.config.js | 1 + package.json | 64 +++++ src/main.test.ts | 243 +++++++++++++++++++ src/main.ts | 176 ++++++++++++++ src/request.ts | 9 + src/types.ts | 5 + src/utils/http.ts | 26 +++ src/utils/hyperapi-error.ts | 41 ++++ src/utils/is-record.ts | 12 + src/utils/parse.ts | 129 +++++++++++ src/utils/parse/form-data.ts | 58 +++++ src/utils/parse/text.ts | 15 ++ test/hyper-api/echo-file.ts | 14 ++ test/hyper-api/echo.ts | 11 + test/hyper-api/error.ts | 16 ++ test/setup.ts | 18 ++ test/tsconfig.json | 18 ++ tsconfig.json | 28 +++ tsconfig.test.json | 25 ++ vitest.config.ts | 13 ++ 42 files changed, 1728 insertions(+) create mode 100644 .gitignore create mode 100644 .npmignore create mode 100755 bun.lockb create mode 100644 dist/esm/main.d.ts create mode 100644 dist/esm/main.js create mode 100644 dist/esm/request.d.ts create mode 100644 dist/esm/request.js create mode 100644 dist/esm/types.d.ts create mode 100644 dist/esm/types.js create mode 100644 dist/esm/utils/http.d.ts create mode 100644 dist/esm/utils/http.js create mode 100644 dist/esm/utils/hyperapi-error.d.ts create mode 100644 dist/esm/utils/hyperapi-error.js create mode 100644 dist/esm/utils/is-record.d.ts create mode 100644 dist/esm/utils/is-record.js create mode 100644 dist/esm/utils/parse.d.ts create mode 100644 dist/esm/utils/parse.js create mode 100644 dist/esm/utils/parse/form-data.d.ts create mode 100644 dist/esm/utils/parse/form-data.js create mode 100644 dist/esm/utils/parse/text.d.ts create mode 100644 dist/esm/utils/parse/text.js create mode 100644 dist/main.cjs create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 src/main.test.ts create mode 100644 src/main.ts create mode 100644 src/request.ts create mode 100644 src/types.ts create mode 100644 src/utils/http.ts create mode 100644 src/utils/hyperapi-error.ts create mode 100644 src/utils/is-record.ts create mode 100644 src/utils/parse.ts create mode 100644 src/utils/parse/form-data.ts create mode 100644 src/utils/parse/text.ts create mode 100644 test/hyper-api/echo-file.ts create mode 100644 test/hyper-api/echo.ts create mode 100644 test/hyper-api/error.ts create mode 100644 test/setup.ts create mode 100644 test/tsconfig.json create mode 100644 tsconfig.json create mode 100644 tsconfig.test.json create mode 100644 vitest.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87ab41f --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +.DS_Store +dist/vitest +node_modules* diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..ee2885d --- /dev/null +++ b/.npmignore @@ -0,0 +1,25 @@ +# ignore tests +**/*.test.* +**/*.test.d.ts +test/ + +# ignore source files of the Typescript project +src/ + +# ignore configs +.luarc.json +biome.json +# these names cannot be declared using {js,mjs,cjs} syntax +# is this case rule n/no-unpublished-import screams at me +eslint.config.js +eslint.config.mjs +eslint.config.cjs +tsconfig.json + +# ignore repo configs +.github/ +.gitea/ + +# ignore IDE files +.idea +.nova diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..380f62a3413cebe70874b88909698007a28399df GIT binary patch literal 119532 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ⅈZSb2f_2Mz)F1h+82 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 ZBV>sMZ|;ZMhjjpHqw5b2{6GBX{{WdH@Jj#y literal 0 HcmV?d00001 diff --git a/dist/esm/main.d.ts b/dist/esm/main.d.ts new file mode 100644 index 0000000..90056dd --- /dev/null +++ b/dist/esm/main.d.ts @@ -0,0 +1,39 @@ +import { type ServerOptions } from 'node:http'; +import { type HyperAPIDriver, type HyperAPIDriverHandler } from '@hyperapi/core'; +import { type HyperAPINodeRequest } from './request.js'; +interface Config { + port: number; + path?: string; + multipart_formdata_enabled?: boolean; + options?: ServerOptions; +} +export declare class HyperAPINodeDriver implements HyperAPIDriver> { + private handler; + private port; + private path; + private multipart_formdata_enabled; + private server; + private server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ port, path, multipart_formdata_enabled, options, }: Config); + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler: HyperAPIDriverHandler): void; + /** Stops the server. */ + stop(): void; + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + private processRequest; +} +export { type HyperAPINodeRequest } from './request.js'; diff --git a/dist/esm/main.js b/dist/esm/main.js new file mode 100644 index 0000000..f896bd8 --- /dev/null +++ b/dist/esm/main.js @@ -0,0 +1,111 @@ +import { createServer, } from 'node:http'; +import { HyperAPIError, } from '@hyperapi/core'; +import { IP } from '@kirick/ip'; +import { parseArguments } from './utils/parse.js'; +import { hyperApiErrorToResponse } from './utils/hyperapi-error.js'; +import { isHttpMethodSupported, isResponseBodyRequired, } from './utils/http.js'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export class HyperAPINodeDriver { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + handler = null; + port; + path; + multipart_formdata_enabled; + server = null; + server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ port, path = '/api/', multipart_formdata_enabled = false, options = {}, }) { + this.port = port; + this.path = path; + this.multipart_formdata_enabled = multipart_formdata_enabled; + this.server_options = options; + } + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler) { + this.handler = handler; + this.server = createServer(this.server_options, async (req, res) => { + let response; + try { + response = await this.processRequest(req); + } + catch (error) { + if (error instanceof HyperAPIError) { + response = hyperApiErrorToResponse(error, isResponseBodyRequired(req.method)); + } + else { + // eslint-disable-next-line no-console + console.error('Unhandled error in @hyperapi/driver-node:'); + // eslint-disable-next-line no-console + console.error(error); + response = { status: 500 }; + } + } + res.writeHead(response.status, response.headers ?? {}); + if (response.body !== undefined) { + res.write(response.body); + } + res.end(); + }); + this.server.listen(this.port); + } + /** Stops the server. */ + stop() { + this.server?.close(); + } + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + async processRequest(req) { + if (!this.handler) { + throw new Error('No handler available.'); + } + const http_method = req.method; + if (isHttpMethodSupported(http_method) !== true) { + return { status: 405 }; + } + if (typeof req.url !== 'string') { + throw new TypeError('Request URL is not a string.'); + } + const url = new URL(req.url, `http://${req.headers.host ?? 'unknown'}`); + if (url.pathname.startsWith(this.path) !== true) { + return { status: 404 }; + } + const hyperapi_method = url.pathname.slice(this.path.length); + const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); + const ip_string = req.socket.remoteAddress; + if (typeof ip_string !== 'string') { + throw new TypeError('Remote address is not a string.'); + } + const hyperapi_response = await this.handler({ + method: http_method, + path: hyperapi_method, + args: hyperapi_args, + url: url, + headers: req.headers, + ip: new IP(ip_string), + }); + if (hyperapi_response instanceof HyperAPIError) { + throw hyperapi_response; + } + return { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + body: isResponseBodyRequired(http_method) + ? JSON.stringify(hyperapi_response) + : undefined, + }; + } +} diff --git a/dist/esm/request.d.ts b/dist/esm/request.d.ts new file mode 100644 index 0000000..b75ac43 --- /dev/null +++ b/dist/esm/request.d.ts @@ -0,0 +1,9 @@ +import type { HyperAPIRequest } from '@hyperapi/core'; +import type { IP } from '@kirick/ip'; +export interface HyperAPINodeRequest = Omit<{ + p: unknown; +}, 'p'>> extends HyperAPIRequest { + url: URL; + headers: Record; + ip: IP; +} diff --git a/dist/esm/request.js b/dist/esm/request.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/dist/esm/request.js @@ -0,0 +1 @@ +export {}; diff --git a/dist/esm/types.d.ts b/dist/esm/types.d.ts new file mode 100644 index 0000000..b68ec90 --- /dev/null +++ b/dist/esm/types.d.ts @@ -0,0 +1,5 @@ +export interface ResponseSchema { + status: number; + headers?: Record; + body?: string | undefined; +} diff --git a/dist/esm/types.js b/dist/esm/types.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/dist/esm/types.js @@ -0,0 +1 @@ +export {}; diff --git a/dist/esm/utils/http.d.ts b/dist/esm/utils/http.d.ts new file mode 100644 index 0000000..4b5d691 --- /dev/null +++ b/dist/esm/utils/http.d.ts @@ -0,0 +1,14 @@ +type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'; +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export declare function isHttpMethodSupported(http_method: unknown): http_method is HttpMethod; +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export declare function isResponseBodyRequired(http_method: unknown): http_method is Exclude; +export {}; diff --git a/dist/esm/utils/http.js b/dist/esm/utils/http.js new file mode 100644 index 0000000..39b90b1 --- /dev/null +++ b/dist/esm/utils/http.js @@ -0,0 +1,23 @@ +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export function isHttpMethodSupported(http_method) { + return http_method === 'GET' + || http_method === 'POST' + || http_method === 'PUT' + || http_method === 'PATCH' + || http_method === 'DELETE' + || http_method === 'HEAD' + || http_method === 'OPTIONS'; +} +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export function isResponseBodyRequired(http_method) { + return http_method !== 'HEAD' + && http_method !== 'OPTIONS'; +} diff --git a/dist/esm/utils/hyperapi-error.d.ts b/dist/esm/utils/hyperapi-error.d.ts new file mode 100644 index 0000000..618b9b0 --- /dev/null +++ b/dist/esm/utils/hyperapi-error.d.ts @@ -0,0 +1,9 @@ +import { HyperAPIError } from '@hyperapi/core'; +import { ResponseSchema } from '../types.js'; +/** + * Converts a HyperAPIError to a Response. + * @param error - The error to convert. + * @param add_body - Whether to add the response body. + * @returns - + */ +export declare function hyperApiErrorToResponse(error: HyperAPIError, add_body: boolean): ResponseSchema; diff --git a/dist/esm/utils/hyperapi-error.js b/dist/esm/utils/hyperapi-error.js new file mode 100644 index 0000000..4061d48 --- /dev/null +++ b/dist/esm/utils/hyperapi-error.js @@ -0,0 +1,31 @@ +/** + * Converts a HyperAPIError to a Response. + * @param error - The error to convert. + * @param add_body - Whether to add the response body. + * @returns - + */ +export function hyperApiErrorToResponse( +// eslint-disable-next-line @typescript-eslint/no-explicit-any +error, add_body) { + if (typeof error.httpStatus !== 'number') { + // eslint-disable-next-line no-console + console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + } + const headers = { + 'Content-Type': 'application/json', + }; + if (error.httpHeaders) { + for (const [header, value] of Object.entries(error.httpHeaders)) { + headers[header] = value; + } + } + let body; + if (add_body) { + body = JSON.stringify(error.getResponse()); + } + return { + status: error.httpStatus ?? 500, + headers, + body, + }; +} diff --git a/dist/esm/utils/is-record.d.ts b/dist/esm/utils/is-record.d.ts new file mode 100644 index 0000000..b3e9d51 --- /dev/null +++ b/dist/esm/utils/is-record.d.ts @@ -0,0 +1,6 @@ +/** + * Check if a value is a record. + * @param value - + * @returns - + */ +export declare function isRecord(value: unknown): value is Record; diff --git a/dist/esm/utils/is-record.js b/dist/esm/utils/is-record.js new file mode 100644 index 0000000..350e9df --- /dev/null +++ b/dist/esm/utils/is-record.js @@ -0,0 +1,12 @@ +/** + * Check if a value is a record. + * @param value - + * @returns - + */ +export function isRecord(value) { + return typeof value === 'object' + && value !== null + && !Array.isArray(value) + && value.constructor === Object + && Object.prototype.toString.call(value) === '[object Object]'; +} diff --git a/dist/esm/utils/parse.d.ts b/dist/esm/utils/parse.d.ts new file mode 100644 index 0000000..bb6f685 --- /dev/null +++ b/dist/esm/utils/parse.d.ts @@ -0,0 +1,11 @@ +import { IncomingMessage } from 'node:http'; +type RequestArgs = Record; +/** + * Parses arguments from request. + * @param req - NodeJS request object. + * @param url - URL object. + * @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. + * @returns - Arguments. + */ +export declare function parseArguments(req: IncomingMessage, url: URL, multipart_formdata_enabled: boolean): Promise; +export {}; diff --git a/dist/esm/utils/parse.js b/dist/esm/utils/parse.js new file mode 100644 index 0000000..b482720 --- /dev/null +++ b/dist/esm/utils/parse.js @@ -0,0 +1,97 @@ +import { HyperAPIInvalidParametersError } from '@hyperapi/core'; +import { isRecord } from './is-record.js'; +import { parseFormData } from './parse/form-data.js'; +import { parseText } from './parse/text.js'; +/** + * Gets only MIME type from Content-Type header, stripping parameters. + * @param type - MIME type. + * @returns - MIME type. + */ +function getMIME(type) { + const index = type.indexOf(';'); + if (index !== -1) { + return type.slice(0, index).trim(); + } + return type.trim(); +} +class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError { + data = { + message: 'Could not parse body', + }; + httpStatus = 400; + constructor(message) { + super(); + if (message) { + this.data.message = message; + } + } +} +class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError { + data = { + message: 'Unsupported body type', + }; + httpStatus = 415; + constructor(mime) { + super(); + this.data.message = `Unsupported body type: ${mime}`; + } +} +/** + * Parses arguments from request. + * @param req - NodeJS request object. + * @param url - URL object. + * @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. + * @returns - Arguments. + */ +export async function parseArguments(req, url, multipart_formdata_enabled) { + let args = {}; + if (req.method === 'GET' + || req.method === 'HEAD') { + args = Object.fromEntries(url.searchParams.entries()); + } + else { + const type_header = req.headers['content-type']; + const type_mime = typeof type_header === 'string' + ? getMIME(type_header) + : ''; + switch (type_mime) { + case 'application/json': + { + let args_json; + try { + args_json = JSON.parse(await parseText(req)); + } + catch { + throw new HyperAPIBodyInvalidError(); + } + if (isRecord(args_json) !== true) { + throw new HyperAPIBodyInvalidError('JSON body must be an object'); + } + args = args_json; + } + break; + case 'multipart/form-data': + if (multipart_formdata_enabled !== true) { + throw new HyperAPIBodyUnknownError(type_mime); + } + try { + args = await parseFormData(req); + } + catch { + throw new HyperAPIInvalidParametersError(); + } + break; + case 'application/x-www-form-urlencoded': + try { + args = Object.fromEntries(new URLSearchParams(await parseText(req))); + } + catch { + throw new HyperAPIInvalidParametersError(); + } + break; + default: + throw new HyperAPIBodyUnknownError(type_mime); + } + } + return args; +} diff --git a/dist/esm/utils/parse/form-data.d.ts b/dist/esm/utils/parse/form-data.d.ts new file mode 100644 index 0000000..f1f33bd --- /dev/null +++ b/dist/esm/utils/parse/form-data.d.ts @@ -0,0 +1,8 @@ +import { Blob } from 'node:buffer'; +import { IncomingMessage } from 'node:http'; +/** + * Parses request body as multipart/form-data. + * @param req - NodeJS request object. + * @returns - JSON object. + */ +export declare function parseFormData(req: IncomingMessage): Promise>; diff --git a/dist/esm/utils/parse/form-data.js b/dist/esm/utils/parse/form-data.js new file mode 100644 index 0000000..c043540 --- /dev/null +++ b/dist/esm/utils/parse/form-data.js @@ -0,0 +1,33 @@ +import busboy from 'busboy'; +import { Blob } from 'node:buffer'; +/** + * Parses request body as multipart/form-data. + * @param req - NodeJS request object. + * @returns - JSON object. + */ +export function parseFormData(req) { + return new Promise((resolve) => { + const bb = busboy({ + headers: req.headers, + }); + const form_data = {}; + bb.on('file', (name, file, info) => { + const file_parts = []; + file.on('data', (chunk) => { + file_parts.push(chunk); + }); + file.on('end', () => { + form_data[name] = new Blob(file_parts, { + type: info.mimeType, + }); + }); + }); + bb.on('field', (name, value) => { + form_data[name] = value; + }); + bb.on('close', () => { + resolve(form_data); + }); + req.pipe(bb); + }); +} diff --git a/dist/esm/utils/parse/text.d.ts b/dist/esm/utils/parse/text.d.ts new file mode 100644 index 0000000..4126311 --- /dev/null +++ b/dist/esm/utils/parse/text.d.ts @@ -0,0 +1,7 @@ +import { IncomingMessage } from 'node:http'; +/** + * Parses request body into text. + * @param req - NodeJS request object. + * @returns - + */ +export declare function parseText(req: IncomingMessage): Promise; diff --git a/dist/esm/utils/parse/text.js b/dist/esm/utils/parse/text.js new file mode 100644 index 0000000..94ce160 --- /dev/null +++ b/dist/esm/utils/parse/text.js @@ -0,0 +1,12 @@ +/** + * Parses request body into text. + * @param req - NodeJS request object. + * @returns - + */ +export async function parseText(req) { + const body_parts = []; + for await (const chunk of req) { + body_parts.push(chunk); + } + return Buffer.concat(body_parts).toString(); +} diff --git a/dist/main.cjs b/dist/main.cjs new file mode 100644 index 0000000..61fb3e2 --- /dev/null +++ b/dist/main.cjs @@ -0,0 +1,348 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + HyperAPINodeDriver: () => HyperAPINodeDriver +}); +module.exports = __toCommonJS(main_exports); +var import_node_http = require("node:http"); +var import_core2 = require("@hyperapi/core"); +var import_ip = require("@kirick/ip"); + +// src/utils/parse.ts +var import_core = require("@hyperapi/core"); + +// src/utils/is-record.ts +function isRecord(value) { + return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; +} + +// src/utils/parse/form-data.ts +var import_busboy = __toESM(require("busboy"), 1); +var import_node_buffer = require("node:buffer"); +function parseFormData(req) { + return new Promise((resolve) => { + const bb = (0, import_busboy.default)({ + headers: req.headers + }); + const form_data = {}; + bb.on( + "file", + (name, file, info) => { + const file_parts = []; + file.on( + "data", + (chunk) => { + file_parts.push(chunk); + } + ); + file.on( + "end", + () => { + form_data[name] = new import_node_buffer.Blob( + file_parts, + { + type: info.mimeType + } + ); + } + ); + } + ); + bb.on( + "field", + (name, value) => { + form_data[name] = value; + } + ); + bb.on( + "close", + () => { + resolve(form_data); + } + ); + req.pipe(bb); + }); +} + +// src/utils/parse/text.ts +async function parseText(req) { + const body_parts = []; + for await (const chunk of req) { + body_parts.push(chunk); + } + return Buffer.concat(body_parts).toString(); +} + +// src/utils/parse.ts +function getMIME(type) { + const index = type.indexOf(";"); + if (index !== -1) { + return type.slice(0, index).trim(); + } + return type.trim(); +} +var HyperAPIBodyInvalidError = class extends import_core.HyperAPIInvalidParametersError { + data = { + message: "Could not parse body" + }; + httpStatus = 400; + constructor(message) { + super(); + if (message) { + this.data.message = message; + } + } +}; +var HyperAPIBodyUnknownError = class extends import_core.HyperAPIInvalidParametersError { + data = { + message: "Unsupported body type" + }; + httpStatus = 415; + constructor(mime) { + super(); + this.data.message = `Unsupported body type: ${mime}`; + } +}; +async function parseArguments(req, url, multipart_formdata_enabled) { + let args = {}; + if (req.method === "GET" || req.method === "HEAD") { + args = Object.fromEntries( + url.searchParams.entries() + ); + } else { + const type_header = req.headers["content-type"]; + const type_mime = typeof type_header === "string" ? getMIME(type_header) : ""; + switch (type_mime) { + case "application/json": + { + let args_json; + try { + args_json = JSON.parse( + await parseText(req) + ); + } catch { + throw new HyperAPIBodyInvalidError(); + } + if (isRecord(args_json) !== true) { + throw new HyperAPIBodyInvalidError("JSON body must be an object"); + } + args = args_json; + } + break; + case "multipart/form-data": + if (multipart_formdata_enabled !== true) { + throw new HyperAPIBodyUnknownError(type_mime); + } + try { + args = await parseFormData(req); + } catch { + throw new import_core.HyperAPIInvalidParametersError(); + } + break; + case "application/x-www-form-urlencoded": + try { + args = Object.fromEntries( + new URLSearchParams( + await parseText(req) + ) + ); + } catch { + throw new import_core.HyperAPIInvalidParametersError(); + } + break; + default: + throw new HyperAPIBodyUnknownError(type_mime); + } + } + return args; +} + +// src/utils/hyperapi-error.ts +function hyperApiErrorToResponse(error, add_body) { + if (typeof error.httpStatus !== "number") { + console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + } + const headers = { + "Content-Type": "application/json" + }; + if (error.httpHeaders) { + for (const [header, value] of Object.entries(error.httpHeaders)) { + headers[header] = value; + } + } + let body; + if (add_body) { + body = JSON.stringify( + error.getResponse() + ); + } + return { + status: error.httpStatus ?? 500, + headers, + body + }; +} + +// src/utils/http.ts +function isHttpMethodSupported(http_method) { + return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; +} +function isResponseBodyRequired(http_method) { + return http_method !== "HEAD" && http_method !== "OPTIONS"; +} + +// src/main.ts +var HyperAPINodeDriver = class { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + handler = null; + port; + path; + multipart_formdata_enabled; + server = null; + server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ + port, + path = "/api/", + multipart_formdata_enabled = false, + options = {} + }) { + this.port = port; + this.path = path; + this.multipart_formdata_enabled = multipart_formdata_enabled; + this.server_options = options; + } + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler) { + this.handler = handler; + this.server = (0, import_node_http.createServer)( + this.server_options, + async (req, res) => { + let response; + try { + response = await this.processRequest(req); + } catch (error) { + if (error instanceof import_core2.HyperAPIError) { + response = hyperApiErrorToResponse( + error, + isResponseBodyRequired(req.method) + ); + } else { + console.error("Unhandled error in @hyperapi/driver-node:"); + console.error(error); + response = { status: 500 }; + } + } + res.writeHead( + response.status, + response.headers ?? {} + ); + if (response.body !== void 0) { + res.write(response.body); + } + res.end(); + } + ); + this.server.listen(this.port); + } + /** Stops the server. */ + stop() { + this.server?.close(); + } + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + async processRequest(req) { + if (!this.handler) { + throw new Error("No handler available."); + } + const http_method = req.method; + if (isHttpMethodSupported(http_method) !== true) { + return { status: 405 }; + } + if (typeof req.url !== "string") { + throw new TypeError("Request URL is not a string."); + } + const url = new URL( + req.url, + `http://${req.headers.host ?? "unknown"}` + ); + if (url.pathname.startsWith(this.path) !== true) { + return { status: 404 }; + } + const hyperapi_method = url.pathname.slice( + this.path.length + ); + const hyperapi_args = await parseArguments( + req, + url, + this.multipart_formdata_enabled + ); + const ip_string = req.socket.remoteAddress; + if (typeof ip_string !== "string") { + throw new TypeError("Remote address is not a string."); + } + const hyperapi_response = await this.handler({ + method: http_method, + path: hyperapi_method, + args: hyperapi_args, + url, + headers: req.headers, + ip: new import_ip.IP(ip_string) + }); + if (hyperapi_response instanceof import_core2.HyperAPIError) { + throw hyperapi_response; + } + return { + status: 200, + headers: { + "Content-Type": "application/json" + }, + body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 + }; + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + HyperAPINodeDriver +}); diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..59ec8dc --- /dev/null +++ b/eslint.config.js @@ -0,0 +1 @@ +export { config as default } from '@kirick/eslint-config'; diff --git a/package.json b/package.json new file mode 100644 index 0000000..c31e6fe --- /dev/null +++ b/package.json @@ -0,0 +1,64 @@ +{ + "name": "@hyperapi/driver-node", + "version": "0.3.0-beta.1", + "description": "HyperAPI HTTP driver for Node.JS.", + "publishConfig": { + "access": "public" + }, + "type": "module", + "main": "dist/esm/main.js", + "types": "dist/esm/main.d.ts", + "exports": { + ".": { + "import": "./dist/esm/main.js", + "require": "./dist/main.cjs" + } + }, + "engines": { + "node": "^16.17.0 || >=18.0" + }, + "dependencies": { + "@hyperapi/core": "^0.3.0-beta.3", + "@kirick/ip": "^0.1.1", + "busboy": "^1.6.0" + }, + "devDependencies": { + "@kirick/eslint-config": "^0.1.30", + "@types/busboy": "^1.5.4", + "@types/node": "16.18", + "eslint": "9.10.0", + "formdata-node": "^6.0.3", + "node-fetch": "^3.3.2", + "typescript": "5.5.4", + "vitest": "2.1.1" + }, + "scripts": { + "build": "bun run build:ts && bun run build:cjs", + "build:cjs": "bunx esbuild --bundle --platform=node --format=cjs --packages=external --outfile=dist/main.cjs src/main.ts", + "build:ts": "rm -r dist/esm dist/types ; tsc", + "lint": "eslint . && tsc --skipLibCheck --noemit", + "publish:npm": "bun run build && bun run lint && bun run test && npm publish", + "test": "tsc -p tsconfig.test.json && bun run test:install && npm run test:run", + "test:install": "docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./bun.lockb:/app/bun.lockb:ro -v ./node_modules+bun:/app/node_modules oven/bun:1.1.26-slim bun install --frozen-lockfile", + "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules node:$VERSION-slim npx vitest run --no-file-parallelism ; done" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hyperapi/driver-http-node.git" + }, + "keywords": [ + "hyperapi", + "api", + "driver", + "hyperapi-driver", + "http", + "node", + "nodejs" + ], + "author": "Daniil Kirichenko (https://twitter.com/kirickme)", + "license": "MIT", + "bugs": { + "url": "https://github.com/hyperapi/driver-http-node/issues" + }, + "homepage": "https://github.com/hyperapi/driver-http-node#readme" +} diff --git a/src/main.test.ts b/src/main.test.ts new file mode 100644 index 0000000..f0d6929 --- /dev/null +++ b/src/main.test.ts @@ -0,0 +1,243 @@ +/* eslint-disable n/no-unsupported-features/node-builtins */ + +import { + FormData as FormDataPolyfill, + Blob as BlobPolyfill, +} from 'formdata-node'; +import fetchPolyfill from 'node-fetch'; +// import { Blob } from 'node:buffer'; +import { + describe, + expect, + test, +} from 'vitest'; +import '../test/setup.js'; + +const fetch = globalThis.fetch ?? fetchPolyfill; +const FormData = globalThis.FormData ?? FormDataPolyfill; +const Blob = globalThis.Blob ?? BlobPolyfill; + +describe('args', () => { + test('GET', async () => { + const response = await fetch('http://localhost:18001/api/echo?name=world'); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + method: 'ALL', + message: 'Hello, world!', + }); + }); + + test('HEAD', async () => { + const response = await fetch( + 'http://localhost:18001/api/echo?name=world', + { + method: 'HEAD', + }, + ); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.text(); + expect(body).toStrictEqual(''); + }); + + describe('POST', () => { + test('JSON', async () => { + const response = await fetch( + 'http://localhost:18001/api/echo', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: 'foo', + }), + }, + ); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + method: 'ALL', + message: 'Hello, foo!', + }); + }); + + test('form', async () => { + const response = await fetch( + 'http://localhost:18001/api/echo', + { + method: 'POST', + body: new URLSearchParams({ + name: 'bar bar', + }), + }, + ); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + method: 'ALL', + message: 'Hello, bar bar!', + }); + }); + + test('multipart', async () => { + const form_data = new FormData(); + form_data.append( + 'name', + new Blob( + [ 'baz' ], + { type: 'text/plain' }, + ), + ); + + const response = await fetch( + 'http://localhost:18002/api/echo-file', + { + method: 'POST', + body: form_data, + }, + ); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + method: 'ALL', + message: 'Hello, baz!', + }); + }); + }); +}); + +test('HyperAPIError with HTTP headers', async () => { + const response = await fetch('http://localhost:18001/api/error'); + + expect(response.status).toBe(429); + expect(response.headers.get('Content-Type')).toBe('application/json'); + expect(response.headers.get('Retry-After')).toBe('3600'); + + const body = await response.json(); + expect(body).toStrictEqual({ + code: 7, + description: 'Rate limit exceeded', + }); +}); + +describe('errors', () => { + // not fetch nor axios support custom HTTP methods + // and HyperAPI supports all common HTTP methods + // test('unsupported HTTP method', async () => { + // const response = await fetch( + // 'http://localhost:18001/api/echo?name=world', + // { + // method: 'CONNECT', // need to be existing HTTP method, otherwise fetch will set it to GET + // }, + // ); + + // expect(response.status).toBe(405); + // }); + + test('invalid path', async () => { + const response = await fetch('http://localhost:18001/echo'); + + expect(response.status).toBe(404); + }); + + describe('invalid body', () => { + test('malformed JSON', async () => { + const response = await fetch( + 'http://localhost:18001/api/echo', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: '{', + }, + ); + + expect(response.status).toBe(400); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + code: 2, + description: 'One of the parameters specified was missing or invalid', + data: { + message: 'Could not parse body', + }, + }); + }); + + test('JSON array', async () => { + const response = await fetch( + 'http://localhost:18001/api/echo', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: '[1]', + }, + ); + + expect(response.status).toBe(400); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + code: 2, + description: 'One of the parameters specified was missing or invalid', + data: { + message: 'JSON body must be an object', + }, + }); + }); + + // malformed forms isn't a thing with URLSearchParams + + test('multipart disabled', async () => { + const form_data = new FormData(); + form_data.append( + 'name', + new Blob( + [ 'baz' ], + { type: 'text/plain' }, + ), + ); + + const response = await fetch( + 'http://localhost:18001/api/echo-file', + { + method: 'POST', + body: form_data, + }, + ); + + expect(response.status).toBe(415); + expect(response.headers.get('Content-Type')).toBe('application/json'); + + const body = await response.json(); + expect(body).toStrictEqual({ + code: 2, + description: 'One of the parameters specified was missing or invalid', + data: { + message: 'Unsupported body type: multipart/form-data', + }, + }); + }); + }); +}); diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..5cb3e52 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,176 @@ +import { + createServer, + type IncomingMessage, + type Server, + type ServerOptions, +} from 'node:http'; +import { + HyperAPIError, + type HyperAPIDriver, + type HyperAPIDriverHandler, +} from '@hyperapi/core'; +import { IP } from '@kirick/ip'; +import { parseArguments } from './utils/parse.js'; +import { type HyperAPINodeRequest } from './request.js'; +import { ResponseSchema } from './types.js'; +import { hyperApiErrorToResponse } from './utils/hyperapi-error.js'; +import { + isHttpMethodSupported, + isResponseBodyRequired, +} from './utils/http.js'; + +interface Config { + port: number; + path?: string; + multipart_formdata_enabled?: boolean; + options?: ServerOptions; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export class HyperAPINodeDriver implements HyperAPIDriver> { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private handler: HyperAPIDriverHandler> | null = null; + private port: number; + private path: string; + private multipart_formdata_enabled: boolean; + private server: Server | null = null; + private server_options: ServerOptions; + + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ + port, + path = '/api/', + multipart_formdata_enabled = false, + options = {}, + }: Config) { + this.port = port; + this.path = path; + this.multipart_formdata_enabled = multipart_formdata_enabled; + this.server_options = options; + } + + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler: HyperAPIDriverHandler) { + this.handler = handler; + this.server = createServer( + this.server_options, + async (req, res) => { + let response: ResponseSchema; + + try { + response = await this.processRequest(req); + } + catch (error) { + if (error instanceof HyperAPIError) { + response = hyperApiErrorToResponse( + error, + isResponseBodyRequired(req.method), + ); + } + else { + // eslint-disable-next-line no-console + console.error('Unhandled error in @hyperapi/driver-node:'); + // eslint-disable-next-line no-console + console.error(error); + + response = { status: 500 }; + } + } + + res.writeHead( + response.status, + response.headers ?? {}, + ); + + if (response.body !== undefined) { + res.write(response.body); + } + + res.end(); + }, + ); + this.server.listen(this.port); + } + + /** Stops the server. */ + stop() { + this.server?.close(); + } + + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + private async processRequest(req: IncomingMessage): Promise { + if (!this.handler) { + throw new Error('No handler available.'); + } + + const http_method = req.method; + if (isHttpMethodSupported(http_method) !== true) { + return { status: 405 }; + } + + if (typeof req.url !== 'string') { + throw new TypeError('Request URL is not a string.'); + } + + const url = new URL( + req.url, + `http://${req.headers.host ?? 'unknown'}`, + ); + if (url.pathname.startsWith(this.path) !== true) { + return { status: 404 }; + } + + const hyperapi_method = url.pathname.slice( + this.path.length, + ); + + const hyperapi_args = await parseArguments( + req, + url as URL, + this.multipart_formdata_enabled, + ); + + const ip_string = req.socket.remoteAddress; + if (typeof ip_string !== 'string') { + throw new TypeError('Remote address is not a string.'); + } + + const hyperapi_response = await this.handler({ + method: http_method, + path: hyperapi_method, + args: hyperapi_args, + url: url as URL, + headers: req.headers, + ip: new IP(ip_string), + }); + + if (hyperapi_response instanceof HyperAPIError) { + throw hyperapi_response; + } + + return { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + body: isResponseBodyRequired(http_method) + ? JSON.stringify(hyperapi_response) + : undefined, + }; + } +} + +export { type HyperAPINodeRequest } from './request.js'; diff --git a/src/request.ts b/src/request.ts new file mode 100644 index 0000000..67a403c --- /dev/null +++ b/src/request.ts @@ -0,0 +1,9 @@ +import type { HyperAPIRequest } from '@hyperapi/core'; +import type { IP } from '@kirick/ip'; + +export interface HyperAPINodeRequest = Omit<{ p: unknown }, 'p'>> extends HyperAPIRequest { + // request: Request; + url: URL; + headers: Record; + ip: IP; +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..7708ee9 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,5 @@ +export interface ResponseSchema { + status: number; + headers?: Record; + body?: string | undefined; +} diff --git a/src/utils/http.ts b/src/utils/http.ts new file mode 100644 index 0000000..5067119 --- /dev/null +++ b/src/utils/http.ts @@ -0,0 +1,26 @@ +type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'; + +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export function isHttpMethodSupported(http_method: unknown): http_method is HttpMethod { + return http_method === 'GET' + || http_method === 'POST' + || http_method === 'PUT' + || http_method === 'PATCH' + || http_method === 'DELETE' + || http_method === 'HEAD' + || http_method === 'OPTIONS'; +} + +/** + * Checks if the response body is required for the given HTTP method. + * @param http_method The HTTP method to check. + * @returns - + */ +export function isResponseBodyRequired(http_method: unknown): http_method is Exclude { + return http_method !== 'HEAD' + && http_method !== 'OPTIONS'; +} diff --git a/src/utils/hyperapi-error.ts b/src/utils/hyperapi-error.ts new file mode 100644 index 0000000..5da8499 --- /dev/null +++ b/src/utils/hyperapi-error.ts @@ -0,0 +1,41 @@ +import { HyperAPIError } from '@hyperapi/core'; +import { ResponseSchema } from '../types.js'; + +/** + * Converts a HyperAPIError to a Response. + * @param error - The error to convert. + * @param add_body - Whether to add the response body. + * @returns - + */ +export function hyperApiErrorToResponse( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + error: HyperAPIError, + add_body: boolean, +): ResponseSchema { + if (typeof error.httpStatus !== 'number') { + // eslint-disable-next-line no-console + console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + } + + const headers: ResponseSchema['headers'] = { + 'Content-Type': 'application/json', + }; + if (error.httpHeaders) { + for (const [ header, value ] of Object.entries(error.httpHeaders)) { + headers[header] = value; + } + } + + let body; + if (add_body) { + body = JSON.stringify( + error.getResponse(), + ); + } + + return { + status: error.httpStatus ?? 500, + headers, + body, + }; +} diff --git a/src/utils/is-record.ts b/src/utils/is-record.ts new file mode 100644 index 0000000..a7e9ae0 --- /dev/null +++ b/src/utils/is-record.ts @@ -0,0 +1,12 @@ +/** + * Check if a value is a record. + * @param value - + * @returns - + */ +export function isRecord(value: unknown): value is Record { + return typeof value === 'object' + && value !== null + && !Array.isArray(value) + && value.constructor === Object + && Object.prototype.toString.call(value) === '[object Object]'; +} diff --git a/src/utils/parse.ts b/src/utils/parse.ts new file mode 100644 index 0000000..5b979d7 --- /dev/null +++ b/src/utils/parse.ts @@ -0,0 +1,129 @@ +import { HyperAPIInvalidParametersError } from '@hyperapi/core'; +import { IncomingMessage } from 'node:http'; +import { isRecord } from './is-record.js'; +import { parseFormData } from './parse/form-data.js'; +import { parseText } from './parse/text.js'; + +/** + * Gets only MIME type from Content-Type header, stripping parameters. + * @param type - MIME type. + * @returns - MIME type. + */ +function getMIME(type: string): string { + const index = type.indexOf(';'); + if (index !== -1) { + return type.slice(0, index).trim(); + } + + return type.trim(); +} + +type RequestArgs = Record; + +class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ message: string }> { + data = { + message: 'Could not parse body', + }; + httpStatus = 400; + + constructor(message?: string) { + super(); + + if (message) { + this.data.message = message; + } + } +} + +class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError<{ message: string }> { + data = { + message: 'Unsupported body type', + }; + httpStatus = 415; + + constructor(mime: string) { + super(); + this.data.message = `Unsupported body type: ${mime}`; + } +} + +/** + * Parses arguments from request. + * @param req - NodeJS request object. + * @param url - URL object. + * @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. + * @returns - Arguments. + */ +export async function parseArguments( + req: IncomingMessage, + url: URL, + multipart_formdata_enabled: boolean, +): Promise { + let args: RequestArgs = {}; + + if ( + req.method === 'GET' + || req.method === 'HEAD' + ) { + args = Object.fromEntries( + url.searchParams.entries(), + ); + } + else { + const type_header = req.headers['content-type']; + const type_mime = typeof type_header === 'string' + ? getMIME(type_header) + : ''; + + switch (type_mime) { + case 'application/json': { + let args_json: unknown; + try { + args_json = JSON.parse( + await parseText(req), + ); + } + catch { + throw new HyperAPIBodyInvalidError(); + } + + if (isRecord(args_json) !== true) { + throw new HyperAPIBodyInvalidError('JSON body must be an object'); + } + + args = args_json; + } break; + + case 'multipart/form-data': + if (multipart_formdata_enabled !== true) { + throw new HyperAPIBodyUnknownError(type_mime); + } + + try { + args = await parseFormData(req); + } + catch { + throw new HyperAPIInvalidParametersError(); + } + break; + + case 'application/x-www-form-urlencoded': + try { + args = Object.fromEntries( + new URLSearchParams( + await parseText(req), + ), + ); + } + catch { + throw new HyperAPIInvalidParametersError(); + } + break; + + default: + throw new HyperAPIBodyUnknownError(type_mime); + } + } + + return args; +} diff --git a/src/utils/parse/form-data.ts b/src/utils/parse/form-data.ts new file mode 100644 index 0000000..8226d79 --- /dev/null +++ b/src/utils/parse/form-data.ts @@ -0,0 +1,58 @@ +import busboy from 'busboy'; +import { Blob } from 'node:buffer'; +import { IncomingMessage } from 'node:http'; + +/** + * Parses request body as multipart/form-data. + * @param req - NodeJS request object. + * @returns - JSON object. + */ +export function parseFormData(req: IncomingMessage) { + return new Promise>((resolve) => { + const bb = busboy({ + headers: req.headers, + }); + + const form_data: Record = {}; + + bb.on( + 'file', + (name, file, info) => { + const file_parts: Buffer[] = []; + file.on( + 'data', + (chunk) => { + file_parts.push(chunk); + }, + ); + file.on( + 'end', + () => { + form_data[name] = new Blob( + file_parts, + { + type: info.mimeType, + }, + ); + }, + ); + }, + ); + + bb.on( + 'field', + (name, value) => { + form_data[name] = value; + }, + ); + + bb.on( + 'close', + () => { + resolve(form_data); + }, + ); + + req.pipe(bb); + }); +} diff --git a/src/utils/parse/text.ts b/src/utils/parse/text.ts new file mode 100644 index 0000000..3f1ca8b --- /dev/null +++ b/src/utils/parse/text.ts @@ -0,0 +1,15 @@ +import { IncomingMessage } from 'node:http'; + +/** + * Parses request body into text. + * @param req - NodeJS request object. + * @returns - + */ +export async function parseText(req: IncomingMessage) { + const body_parts: Buffer[] = []; + for await (const chunk of req) { + body_parts.push(chunk); + } + + return Buffer.concat(body_parts).toString(); +} diff --git a/test/hyper-api/echo-file.ts b/test/hyper-api/echo-file.ts new file mode 100644 index 0000000..a4b00c2 --- /dev/null +++ b/test/hyper-api/echo-file.ts @@ -0,0 +1,14 @@ +/* eslint-disable jsdoc/require-jsdoc */ + +import { type HyperAPIResponse } from '@hyperapi/core'; +import { Blob } from 'node:buffer'; +import { type HyperAPINodeRequest } from '../../src/main.js'; + +export default async function (request: HyperAPINodeRequest<{ name: Blob }>): Promise { + const name = await request.args.name.text(); + + return { + method: 'ALL', + message: `Hello, ${name}!`, + }; +} diff --git a/test/hyper-api/echo.ts b/test/hyper-api/echo.ts new file mode 100644 index 0000000..e66a418 --- /dev/null +++ b/test/hyper-api/echo.ts @@ -0,0 +1,11 @@ +/* eslint-disable jsdoc/require-jsdoc */ + +import { type HyperAPIResponse } from '@hyperapi/core'; +import { type HyperAPINodeRequest } from '../../src/main.js'; + +export default function (request: HyperAPINodeRequest<{ name: string }>): HyperAPIResponse { + return { + method: 'ALL', + message: `Hello, ${request.args.name}!`, + }; +} diff --git a/test/hyper-api/error.ts b/test/hyper-api/error.ts new file mode 100644 index 0000000..9bfc5e3 --- /dev/null +++ b/test/hyper-api/error.ts @@ -0,0 +1,16 @@ +/* eslint-disable jsdoc/require-jsdoc */ + +import { + HyperAPIRateLimitError, + type HyperAPIResponse, +} from '@hyperapi/core'; + +class HyperAPILocalRateLimitError extends HyperAPIRateLimitError { + httpHeaders = { + 'Retry-After': '3600', + }; +} + +export default function (): HyperAPIResponse { + throw new HyperAPILocalRateLimitError(); +} diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000..dd6b0c4 --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,18 @@ +import { HyperAPI } from '@hyperapi/core'; +import { HyperAPINodeDriver } from '../src/main.js'; + +export const hyperApi = new HyperAPI({ + driver: new HyperAPINodeDriver({ + port: 18001, + // multipart_formdata_enabled: true, + }), + root: new URL('hyper-api', import.meta.url).pathname, +}); + +export const hyperApiMultipart = new HyperAPI({ + driver: new HyperAPINodeDriver({ + port: 18002, + multipart_formdata_enabled: true, + }), + root: new URL('hyper-api', import.meta.url).pathname, +}); diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..4efefea --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "/dev/null", + "declaration": false, + "target": "esnext", + "module": "esnext", + "lib": [ + "ESNext", + "ES2021.String" + ], + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "strict": true, + "removeComments": false + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..83cd553 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compileOnSave": false, + "include": [ + "src/" + ], + "exclude": [ + "dist/", + "node_modules/", + "test/", + "**/*.test.*" + ], + "compilerOptions": { + "outDir": "dist/esm", + "declaration": true, + "declarationDir": "dist/esm", + "target": "esnext", + "module": "nodenext", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "lib": [ + "ESNext", + "ES2021.String" + ], + "skipLibCheck": true, + "strict": true, + "removeComments": false + } +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..201aa47 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,25 @@ +{ + "compileOnSave": false, + "include": [ + "src/", + "test/" + ], + "exclude": [ + "dist/", + "node_modules/" + ], + "compilerOptions": { + "outDir": "dist/vitest", + "target": "esnext", + "module": "nodenext", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "lib": [ + "ESNext", + "ES2021.String" + ], + "skipLibCheck": true, + "strict": true, + "removeComments": false + } +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..b2a9b1c --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,13 @@ +/* eslint-disable n/no-unpublished-import */ +/* eslint-disable no-restricted-exports */ + +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: [ + 'dist/vitest/**/*.test.js', + ], + exclude: [], + }, +}); From 1adef6faae098edbd837357b4ed5707cf84e167b Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:08:31 +0300 Subject: [PATCH 02/20] Create npm-publish.yml --- .github/workflows/npm-publish.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/npm-publish.yml diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml new file mode 100644 index 0000000..62c83d0 --- /dev/null +++ b/.github/workflows/npm-publish.yml @@ -0,0 +1,21 @@ +name: Publish NPM package + +on: + - push + +jobs: + + publish-npm: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - uses: kirick13/build-npm-package-action@v1 + with: + npm-token: ${{ secrets.NPM_TOKEN }} + - uses: kirick13/notify-action@v1 + with: + telegram-bot-token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + telegram-chat-id: ${{ secrets.TELEGRAM_CHAT_ID }} From 68a7be70e584ee6bc89e6e86eaf636897e3a113b Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:21:08 +0300 Subject: [PATCH 03/20] Updated types --- bun.lockb | Bin 119532 -> 119900 bytes package.json | 6 +++--- test/tsconfig.json | 6 +++--- tsconfig.test.json | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/bun.lockb b/bun.lockb index 380f62a3413cebe70874b88909698007a28399df..4f74692c1e6579a90480ce7676fbe879e4fa9720 100755 GIT binary patch delta 8842 zcmeHMd0bS-mab}T;i?@_AZ#jP5*L(K)&>z8ToUoR2PGh=h|MOOfJR6Vc$oyvXkx77 zmA=Fm^ODSHqAv?Ehz1oEcNF)PxI~{C;~I^@M4j*Sy`9G|^JaeY$NZW5fEYx zPMx}4-S>x&ozARsT4L^(lljJ#k4}B?{;|$QqKH2{k{b4-aob&4UGSmvg7t?-JhksI zXLLopmFQLOu;?i58!9=uvSohA{=SZ!BXSA@d=L&nQYuw-qyXN!Ry}W9$j&%OR;h z&sLOa3ubJKzvj*%eOfbyr~U!pG~FG@?vRU#XKh7A1x10jd2XZaFi(eSWl571vkLS*rr6ym$xCwcVs&)H*Kb^8l3EkA>AP}b-SIok9<$h4$RKaC}4lqm!cXHu~bxM zBx?p=LQ>EPkX<1sPhrdra=5N9Nh?g7k!xctMO(8H3_$&kq&GUlY{vtkGF17_#I0 z34hsGU}rCu&6p4iam(B*I6|f zV%FJpuvjoI8v0rcgRP=$M2s=t%GhA>&^^kq$|^Q^#Takc74-p8hTvFH_H2yuBJQEs z41$MQj9-9-is-&k%1yN3SEZ9^fQyj`68o^yC>p#h%4=YBkCUkKwkTV`LczG;W{Ywc z44%M}_qHg(L)(T{4Mz8I5eLf#uzv>A0s9)&t_L#-%mU^jI5N0M)Wuts7&w4kRoUJ? z>+4{YLPf+4weTaNbd=T5afH|~D#j2qLOd81qs+(PsOicMc26#VQ3Objr$rg`tmbn& z`&cuZ^Ze+7%MTOvAsOq7nc8a$s98%D<{6R|L~8W#I)VR&dz#1;n3h{)f`2Sp z6Ri9v5jn|foQWIZc*+n_H_2+~@Vt01DaNQ`RYFC*XOwXfT0_OdXQKECQ8(FY=$s%P zOpZ}9;Yv70N03gY!)z7x>mM)m#9lZiW0?xq!{BTcw{Dsa`!03=>)U)DI$nrh{hB66x#al-?L zCeb#b4U7r}C5Ba6Ct6|QF;&}kn#C-z;r1!%;qVz4C&E- z<)U=DRjG$gPklf{dl0M$()0{U2(?LxNwx5zn$omR9mJwc=L&}F9>9U0ba@|=E|Si` zW1t;ifKew%6J!TSH%J4d2i>eovhNN~svf$YBsKkX*%Q(T{tU-wF%8g%dPUQ0&kAY; z(7)eFQuW6_vJTYyNzyREknJJEbv;R(kC;{GB+0GkbWW1O83jq>jn?H@PE_O-`E?=7 z@$^rZUBrqa&AD`4+g8$G8M>Y%Ig_JvlEm|M-d2*TK-ZHbXJ$i^{TyB2MjBW>U((G<((RN;8m>y0uju`4CH23m>q$}=3v}LAl4>FTk$jyq9|(Knze$5= zDfSczIbNb$iEAWvFVTl1NzJ$LkKB6)lBQcm%HKm6++P1K<4+e+FHJ8RNroi_fl zum0Fqf9$LO-+kphr*mw@j)i-EJ~C^Nd)|`zw1hqu-)r*gh&hI-eLw2@-Rh*jeS9N{ zuY4gX|GiM>s!1#2Hf8fyzc0JL=RnIaOSWtGk%k+uVb^l@$mJ2_M!4s=+V>v6DC+VD zB||%YGGVs(o8RP0_sLly*BhhuS#@1~~**8khGq*7zbzy&XV zxzzvu`OT_F#`k3(iTZV3qI{jo>&5PMiDKT@CK33x$~TMBuMs8(;7Oqbe5p^bU9c-tFtV#xVwBq zq8Pc+Bp!k_iTI6);%Bh68&!Tlw1Tbr#w1d|QTai!`kO@YLcK|t>Q$VAlIjzM^Cpw1 z2Rka1O^ISXSl%X;9~X6CS({Cw`(~A&6xo{-h1V97XaYMeytgEZU0~%~RNf+XgUxF| zd<`l;D@q#>-&Vv2c3$+`iuk}5Z&mqs;w0FDZHRB1$}fq9+YsM�Pd+L~ciXU@Nw( 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 J8lKeqzW@U)dkg>o delta 8856 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 diff --git a/package.json b/package.json index c31e6fe..e962393 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@kirick/eslint-config": "^0.1.30", "@types/busboy": "^1.5.4", - "@types/node": "16.18", + "@types/node": "18", "eslint": "9.10.0", "formdata-node": "^6.0.3", "node-fetch": "^3.3.2", @@ -38,9 +38,9 @@ "build:ts": "rm -r dist/esm dist/types ; tsc", "lint": "eslint . && tsc --skipLibCheck --noemit", "publish:npm": "bun run build && bun run lint && bun run test && npm publish", - "test": "tsc -p tsconfig.test.json && bun run test:install && npm run test:run", + "test": "tsc -p tsconfig.test.json && bun run test:install && bun run test:run", "test:install": "docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./bun.lockb:/app/bun.lockb:ro -v ./node_modules+bun:/app/node_modules oven/bun:1.1.26-slim bun install --frozen-lockfile", - "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules node:$VERSION-slim npx vitest run --no-file-parallelism ; done" + "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules --entrypoint 'npx' node:$VERSION-slim vitest run --no-file-parallelism ; done" }, "repository": { "type": "git", diff --git a/test/tsconfig.json b/test/tsconfig.json index 4efefea..0f6df3a 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -4,13 +4,13 @@ "outDir": "/dev/null", "declaration": false, "target": "esnext", - "module": "esnext", + "module": "nodenext", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, "lib": [ "ESNext", "ES2021.String" ], - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, "skipLibCheck": true, "strict": true, "removeComments": false diff --git a/tsconfig.test.json b/tsconfig.test.json index 201aa47..c17cffe 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -10,6 +10,7 @@ ], "compilerOptions": { "outDir": "dist/vitest", + "declaration": false, "target": "esnext", "module": "nodenext", "esModuleInterop": true, From 18cf2c5ca340efd924e0902ed05af35045978a5a Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:30:03 +0300 Subject: [PATCH 04/20] Removed `-it` from scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e962393..d369a71 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,8 @@ "lint": "eslint . && tsc --skipLibCheck --noemit", "publish:npm": "bun run build && bun run lint && bun run test && npm publish", "test": "tsc -p tsconfig.test.json && bun run test:install && bun run test:run", - "test:install": "docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./bun.lockb:/app/bun.lockb:ro -v ./node_modules+bun:/app/node_modules oven/bun:1.1.26-slim bun install --frozen-lockfile", - "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -it -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules --entrypoint 'npx' node:$VERSION-slim vitest run --no-file-parallelism ; done" + "test:install": "docker run --rm -w /app -v ./package.json:/app/package.json:ro -v ./bun.lockb:/app/bun.lockb:ro -v ./node_modules+bun:/app/node_modules oven/bun:1.1.26-slim bun install --frozen-lockfile", + "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules --entrypoint 'npx' node:$VERSION-slim vitest run --no-file-parallelism ; done" }, "repository": { "type": "git", From 4df775ebb310caca1784894b21fd0dceb83992b6 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:32:49 +0300 Subject: [PATCH 05/20] Updated `.npmignore` --- .npmignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.npmignore b/.npmignore index ee2885d..d2385f8 100644 --- a/.npmignore +++ b/.npmignore @@ -23,3 +23,6 @@ tsconfig.json # ignore IDE files .idea .nova + +# ignore additional node_modules +node_modules* From 42d8dba145d75e9ee071252719699fa4cc03c2a4 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 19 Sep 2024 01:35:06 +0300 Subject: [PATCH 06/20] [v0.3.0-beta.2] Updated `.npmignore` --- .npmignore | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index d2385f8..0dfc696 100644 --- a/.npmignore +++ b/.npmignore @@ -15,6 +15,8 @@ eslint.config.js eslint.config.mjs eslint.config.cjs tsconfig.json +vitest.config.js +vitest.config.ts # ignore repo configs .github/ diff --git a/package.json b/package.json index d369a71..e33b2a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hyperapi/driver-node", - "version": "0.3.0-beta.1", + "version": "0.3.0-beta.2", "description": "HyperAPI HTTP driver for Node.JS.", "publishConfig": { "access": "public" From c8647098cc7f5ac8289442a73a54911f32d21370 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Fri, 23 May 2025 22:34:22 +0200 Subject: [PATCH 07/20] Update npm-publish.yml --- .github/workflows/npm-publish.yml | 109 ++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 62c83d0..f23335f 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -1,20 +1,119 @@ -name: Publish NPM package +name: Publish NPM Package on: - - push + push: + branches: + - main + - beta + - 'dev-*' + pull_request: + branches: + - main + - beta + - 'dev-*' + +env: + BUN_VERSION: 1.2.2 + NODE_VERSION: 22 jobs: + version: + runs-on: ubuntu-latest + outputs: + npm_tag: ${{ steps.set-tag.outputs.npm_tag }} + steps: + - uses: actions/checkout@v4 + + - name: Determine NPM tag + id: set-tag + run: | + VERSION=$(node -p "require('./package.json').version") + + if [[ $VERSION == *"-beta."* ]]; then + NPM_TAG="beta" + elif [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + NPM_TAG="latest" + else + NPM_TAG="dev" + fi + + echo "Detected version: $VERSION" + echo "NPM tag: $NPM_TAG" + echo "npm_tag=$NPM_TAG" >> $GITHUB_OUTPUT + + - name: Validate branch and tag + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta')) + || (github.event_name == 'pull_request' && (github.base_ref == 'main' || github.base_ref == 'beta')) + run: | + if [[ "${{ github.event_name }}" == "push" ]]; then + BRANCH=${GITHUB_REF#refs/heads/} + else + BRANCH=${{ github.base_ref }} + fi + + NPM_TAG=${{ steps.set-tag.outputs.npm_tag }} - publish-npm: + if [[ $BRANCH == "main" && $NPM_TAG != "latest" ]] || \ + [[ $BRANCH == "beta" && $NPM_TAG != "beta" ]]; then + echo "Error: Version tag $NPM_TAG doesn't match branch $BRANCH" + exit 1 + fi + + check: + needs: [version] runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Lint code + run: bun run lint + + - name: Test code + run: bun run test + + publish: + needs: [version, check] + if: | + github.event_name == 'push' && + (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta') permissions: contents: read id-token: write + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: kirick13/build-npm-package-action@v1 + + - name: Set up Node.js + uses: actions/setup-node@v4 with: - npm-token: ${{ secrets.NPM_TOKEN }} + node-version: ${{ env.NODE_VERSION }} + registry-url: https://registry.npmjs.org/ + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build code + run: bun run build + + - name: Publish to NPM + run: npm publish --access public --provenance --tag ${{ needs.version.outputs.npm_tag }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + - uses: kirick13/notify-action@v1 with: telegram-bot-token: ${{ secrets.TELEGRAM_BOT_TOKEN }} From 07b2878cab3590ddf27c52e57397a8e38176ee4f Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sat, 24 May 2025 13:39:46 +0200 Subject: [PATCH 08/20] New configs, add `tsdown` --- .gitignore | 7 +- .npmignore | 21 +- bun.lock | 846 ++++++++++++++++++++++++++++ bun.lockb | Bin 119900 -> 0 bytes dist/esm/main.d.ts | 39 -- dist/esm/main.js | 111 ---- dist/esm/request.d.ts | 9 - dist/esm/request.js | 1 - dist/esm/types.d.ts | 5 - dist/esm/types.js | 1 - dist/esm/utils/http.d.ts | 14 - dist/esm/utils/http.js | 23 - dist/esm/utils/hyperapi-error.d.ts | 9 - dist/esm/utils/hyperapi-error.js | 31 - dist/esm/utils/is-record.d.ts | 6 - dist/esm/utils/is-record.js | 12 - dist/esm/utils/parse.d.ts | 11 - dist/esm/utils/parse.js | 97 ---- dist/esm/utils/parse/form-data.d.ts | 8 - dist/esm/utils/parse/form-data.js | 33 -- dist/esm/utils/parse/text.d.ts | 7 - dist/esm/utils/parse/text.js | 12 - dist/main.cjs | 569 +++++++++---------- dist/main.d.ts | 59 ++ dist/main.js | 268 +++++++++ package.json | 43 +- src/main.ts | 8 +- src/utils/hyperapi-error.ts | 2 +- src/utils/parse.ts | 8 +- src/utils/parse/form-data.ts | 34 +- src/utils/parse/text.ts | 42 +- test/hyper-api/error.ts | 2 +- test/tsconfig.json | 24 +- tsconfig.json | 44 +- tsconfig.test.json | 25 +- 35 files changed, 1568 insertions(+), 863 deletions(-) create mode 100644 bun.lock delete mode 100755 bun.lockb delete mode 100644 dist/esm/main.d.ts delete mode 100644 dist/esm/main.js delete mode 100644 dist/esm/request.d.ts delete mode 100644 dist/esm/request.js delete mode 100644 dist/esm/types.d.ts delete mode 100644 dist/esm/types.js delete mode 100644 dist/esm/utils/http.d.ts delete mode 100644 dist/esm/utils/http.js delete mode 100644 dist/esm/utils/hyperapi-error.d.ts delete mode 100644 dist/esm/utils/hyperapi-error.js delete mode 100644 dist/esm/utils/is-record.d.ts delete mode 100644 dist/esm/utils/is-record.js delete mode 100644 dist/esm/utils/parse.d.ts delete mode 100644 dist/esm/utils/parse.js delete mode 100644 dist/esm/utils/parse/form-data.d.ts delete mode 100644 dist/esm/utils/parse/form-data.js delete mode 100644 dist/esm/utils/parse/text.d.ts delete mode 100644 dist/esm/utils/parse/text.js create mode 100644 dist/main.d.ts create mode 100644 dist/main.js diff --git a/.gitignore b/.gitignore index 87ab41f..47b8532 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ - -.DS_Store dist/vitest -node_modules* +node_modules +.DS_Store +.env +*.env diff --git a/.npmignore b/.npmignore index 0dfc696..70a469e 100644 --- a/.npmignore +++ b/.npmignore @@ -1,23 +1,33 @@ +# ignore source files of the Typescript project +src/ + # ignore tests **/*.test.* **/*.test.d.ts +dist/vitest/ test/ - -# ignore source files of the Typescript project -src/ +test-d/ # ignore configs .luarc.json biome.json # these names cannot be declared using {js,mjs,cjs} syntax -# is this case rule n/no-unpublished-import screams at me +# is this case rule n/no-unpublished-import yells at me eslint.config.js eslint.config.mjs eslint.config.cjs tsconfig.json +tsconfig.*.json vitest.config.js vitest.config.ts +# ignore lockfiles +bun.lock +bun.lockb +package-lock.json +pnpm-lock.yaml +yarn.lock + # ignore repo configs .github/ .gitea/ @@ -25,6 +35,3 @@ vitest.config.ts # ignore IDE files .idea .nova - -# ignore additional node_modules -node_modules* diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..6a4e85c --- /dev/null +++ b/bun.lock @@ -0,0 +1,846 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "@hyperapi/driver-node", + "dependencies": { + "busboy": "1.6.0", + }, + "devDependencies": { + "@kirick/eslint-config": "^0.1.30", + "@types/busboy": "^1.5.4", + "@types/node": "^20", + "eslint": "9.10.0", + "formdata-node": "6.0.3", + "node-fetch": "^3.3.2", + "oxc-parser": "0.71.0", + "publint": "0.3.12", + "tsdown": "0.12.2", + "typescript": "5.8.3", + "unplugin-unused": "0.5.0", + "vitest": "3.1.4", + }, + "peerDependencies": { + "@hyperapi/core": "github:hyperapi/core#8894dcfe65392c9a4111c4494945817bff9f1f52", + "@kirick/ip": "^0.1.1", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.24.7", "", { "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" } }, "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA=="], + + "@babel/generator": ["@babel/generator@7.27.1", "", { "dependencies": { "@babel/parser": "^7.27.1", "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.24.7", "", {}, "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="], + + "@babel/highlight": ["@babel/highlight@7.24.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw=="], + + "@babel/parser": ["@babel/parser@7.27.2", "", { "dependencies": { "@babel/types": "^7.27.1" }, "bin": "./bin/babel-parser.js" }, "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw=="], + + "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], + + "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.46.0", "", { "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.0.0" } }, "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.1", "", {}, "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q=="], + + "@eslint/config-array": ["@eslint/config-array@0.18.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.1.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ=="], + + "@eslint/js": ["@eslint/js@9.10.0", "", {}, "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.4", "", {}, "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.1.0", "", { "dependencies": { "levn": "^0.4.1" } }, "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], + + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#8894dcf", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-8894dcf"], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@kirick/eslint-config": ["@kirick/eslint-config@0.1.30", "", { "dependencies": { "@stylistic/eslint-plugin": "^2.6.1", "eslint-plugin-jsdoc": "^48.11.0", "eslint-plugin-n": "^17.10.2", "eslint-plugin-promise": "^7.1.0", "eslint-plugin-unicorn": "^55.0.0", "eslint-plugin-vue": "^9.27.0", "globals": "^15.9.0", "typescript-eslint": "^8.0.0" } }, "sha512-RjmSG2380JS/MCh80hnLpVKBI0V5+ggGugTXVK+2Gf0sTq54R5KzX9rKkE1FFIqedG7ZkGyDuipJc7zDYVBQ4g=="], + + "@kirick/ip": ["@kirick/ip@0.1.1", "", { "dependencies": { "ip-address": "9.0.5" } }, "sha512-i65LRnc33KnE9cPBt0QzT2z/+/lg8351Ao6A2xCQ27GqgNjdjoFh20xrXPu3FkpX8p5W4TbRj10xEiQS6MjZZw=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.71.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7R7TuHWL2hZ8BbRdxXlVJTE0os7TM6LL2EX2OkIz41B3421JeIU+2YH+IV55spIUy5E5ynesLk0IdpSSPVZ25Q=="], + + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.71.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Q7QshRy7cDvpvWAH+qy2U8O9PKo5yEKFqPruD2OSOM8igy/GLIC21dAd6iCcqXRZxaqzN9c4DaXFtEZfq4NWsw=="], + + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.71.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-z8NNBBseLriz2p+eJ8HWC+A8P+MsO8HCtXie9zaVlVcXSiUuBroRWeXopvHN4r+tLzmN2iLXlXprJdNhXNgobQ=="], + + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-QZQcWMduFRWddqvjgLvsWoeellFjvWqvdI0O1m5hoMEykv2/Ag8d7IZbBwRwFqKBuK4UzpBNt4jZaYzRsv1irg=="], + + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-lTDc2WCzllVFXugUHQGR904CksA5BiHc35mcH6nJm6h0FCdoyn9zefW8Pelku5ET39JgO1OENEm/AyNvf/FzIw=="], + + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-mAA6JGS+MB+gbN5y/KuQ095EHYGF7a/FaznM7klk5CaCap/UdiRWCVinVV6xXmejOPZMnrkr6R5Kqi6dHRsm2g=="], + + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-PaPmIEM0yldXSrO1Icrx6/DwnMXpEOv0bDVa0LFtwy2I+aiTiX7OVRB3pJCg8FEV9P+L48s9XW0Oaz+Dz3o3sQ=="], + + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.71.0", "", { "os": "linux", "cpu": "none" }, "sha512-+AEGO6gOSSEqWTrCCYayNMMPe/qi83o1czQ5bytEFQtyvWdgLwliqqShpJtgSLj1SNWi94HiA/VOfqqZnGE1AQ=="], + + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.71.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-zqFnheBACFzrRl401ylXufNl1YsOdVa8jwS2iSCwJFx4/JdQhE6Y4YWoEjQ/pzeRZXwI5FX4C607rQe2YdhggQ=="], + + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-steSQTwv3W+/hpES4/9E3vNohou1FXJLNWLDbYHDaBI9gZdYJp6zwALC8EShCz0NoQvCu4THD3IBsTBHvFBNyw=="], + + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mV8j/haQBZRU2QnwZe0UIpnhpPBL9dFk1tgNVSH9tV7cV4xUZPn7pFDqMriAmpD7GLfmxbZMInDkujokd63M7Q=="], + + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.71.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.10" }, "cpu": "none" }, "sha512-P8ScINpuihkkBX8BrN/4x4ka2+izncHh7/hHxxuPZDZTVMyNNnL1uSoI80tN9yN7NUtUKoi9aQUaF4h22RQcIA=="], + + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.71.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-4jrJSdBXHmLYaghi1jvbuJmWu117wxqCpzHHgpEV9xFiRSngtClqZkNqyvcD4907e/VriEwluZ3PO3Mlp0y9cw=="], + + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.71.0", "", { "os": "win32", "cpu": "x64" }, "sha512-zF7xF19DOoANym/xwVClYH1tiW3S70W8ZDrMHdrEB7gZiTYLCIKIRMrpLVKaRia6LwEo7X0eduwdBa5QFawxOw=="], + + "@oxc-project/types": ["@oxc-project/types@0.71.0", "", {}, "sha512-5CwQ4MI+P4MQbjLWXgNurA+igGwu/opNetIE13LBs9+V93R64MLvDKOOLZIXSzEfovU3Zef3q3GjPnMTgJTn2w=="], + + "@pkgr/core": ["@pkgr/core@0.1.1", "", {}, "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA=="], + + "@publint/pack": ["@publint/pack@0.1.2", "", {}, "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw=="], + + "@quansync/fs": ["@quansync/fs@0.1.3", "", { "dependencies": { "quansync": "^0.2.10" } }, "sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.51df2b7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ho2xtXwIXiSIlI0C4G9TKxeRC0BOlML1JMNILpxvdjJiN/M6zV/MYIys6ZyqIlIlLzilr0Wu4KIpb+mnR2E7tQ=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.51df2b7", "", { "os": "darwin", "cpu": "x64" }, "sha512-f9llkFu7gAL/uvbU9JQtMgrPXE70HZ8VXHMD6ENvdzmM+Z/Bh8WnquwbgpSSnj9M111Tg4gyZe3R31CTYlcQow=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.51df2b7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZP3+8qmcUkxzXMvGVyaPKKUswhyRfBo4EGEo4FOxQ6+D+XjTaL4rSGOs979CBpfk7f3HIxyKEXvWokv6fsdTdw=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm" }, "sha512-lb4TCuCGimXdImS1fiZqfZBObgxZr32P8u1T8FeifdwGCieXnz5CjoywDyrhZuZMoLU3UU3PJV7WcD8721jK/g=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm64" }, "sha512-07FhoEJsku912alIEfTf1QmEMWxjuQxkPD6ewWtyyhEZHDF5XhpKpat/GFEDic/doXVRggRvxIZccyS5Kyu45A=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm64" }, "sha512-QUHSOXq6F+Z4eBud86nGq2C/KhdNs980LLQcAFDIr6tPw5fN8Z2Zqy61XeWGB01Y30G5esiMzsJqsHHQDqSvsg=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "x64" }, "sha512-VdsjRgP2VlAJqbuHdY3Xh37+yU7H+KYy3fA2+falRGlhko20/Ch8V7+7SizTu2LfKgvd1LVhQek8InnmojX0tA=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "x64" }, "sha512-zbilaXq6n+FerHarckH20bh5QgSPO9dCC4BfAzXidaji/eMRO0gfjFjKJpVx0gxwc+LVBjdHDKB0DplGZiPMEw=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.51df2b7", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.4" }, "cpu": "none" }, "sha512-iqvvLmCl9n3TzE6QLZ1ZRYigavEoOVr33Q6qoLbDHnnXZqp1V9APLckbv8E9qaukDmbVP3dOCr/dD7AT+GsE3w=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "arm64" }, "sha512-ey1jfhd5BFn4bIJjQAVNclkDCl9mg9b96LyDHVETkZZrmAV8zSaE0kazXe5eWn8n7p0RH2t1cOiQWVcXrFVh0g=="], + + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "ia32" }, "sha512-RBWTjyturLAPInDJH+945twk31bkEw4t0wcWZFXzGFGN6fjeF0Jlj9fPQ3+TO3GhqAgeLymraFztJJdLVc7hSg=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "x64" }, "sha512-umDrroMuEfK3xYcRvr6p7u1AUwv3IoY2Sl6LlBZ5ncOAZ/OQo/41wHwUHtN+PRE02/BI8f84HMZrMR+rJgkmog=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.9-commit.51df2b7", "", {}, "sha512-A+2WuD4O5309iooTWXMS0vMfb44bKJUOCwJj2oBYvOpaNT3VHFmgLdx++NTlKh/3hJ8Xa+Zy8c34z0EBQSU+mw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.21.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA=="], + + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@2.8.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.4.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@types/busboy": ["@types/busboy@1.5.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/node": ["@types/node@20.16.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA=="], + + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.6.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/type-utils": "8.6.0", "@typescript-eslint/utils": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.6.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/types": "8.6.0", "@typescript-eslint/typescript-estree": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0" } }, "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.6.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.6.0", "@typescript-eslint/utils": "8.6.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" } }, "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.6.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/types": "8.6.0", "@typescript-eslint/typescript-estree": "8.6.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg=="], + + "@vitest/expect": ["@vitest/expect@3.1.4", "", { "dependencies": { "@vitest/spy": "3.1.4", "@vitest/utils": "3.1.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA=="], + + "@vitest/mocker": ["@vitest/mocker@3.1.4", "", { "dependencies": { "@vitest/spy": "3.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@3.1.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg=="], + + "@vitest/runner": ["@vitest/runner@3.1.4", "", { "dependencies": { "@vitest/utils": "3.1.4", "pathe": "^2.0.3" } }, "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ=="], + + "@vitest/snapshot": ["@vitest/snapshot@3.1.4", "", { "dependencies": { "@vitest/pretty-format": "3.1.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg=="], + + "@vitest/spy": ["@vitest/spy@3.1.4", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg=="], + + "@vitest/utils": ["@vitest/utils@3.1.4", "", { "dependencies": { "@vitest/pretty-format": "3.1.4", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg=="], + + "acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@4.0.0", "", {}, "sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw=="], + + "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "ast-kit": ["ast-kit@2.0.0", "", { "dependencies": { "@babel/parser": "^7.27.2", "pathe": "^2.0.3" } }, "sha512-P63jzlYNz96MF9mCcprU+a7I5/ZQ5QAn3y+mZcPWEcGV3CHF/GWnkFPj3oCrWLUjL47+PD9PNiCUdXxw0cWdsg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "birpc": ["birpc@2.3.0", "", {}, "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.23.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA=="], + + "builtin-modules": ["builtin-modules@3.3.0", "", {}, "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="], + + "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001660", "", {}, "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg=="], + + "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "ci-info": ["ci-info@4.0.0", "", {}, "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg=="], + + "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "comment-parser": ["comment-parser@1.4.1", "", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "core-js-compat": ["core-js-compat@3.38.1", "", { "dependencies": { "browserslist": "^4.23.3" } }, "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], + + "dts-resolver": ["dts-resolver@2.0.1", "", { "peerDependencies": { "oxc-resolver": "^9.0.2" }, "optionalPeers": ["oxc-resolver"] }, "sha512-Pe2kqaQTNVxleYpt9Q9658fn6rEpoZbMbDpEBbcU6pnuGM3Q0IdM+Rv67kN6qcyp8Bv2Uv9NYy5Y1rG1LSgfoQ=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.25", "", {}, "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g=="], + + "empathic": ["empathic@1.1.0", "", {}, "sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA=="], + + "enhanced-resolve": ["enhanced-resolve@5.17.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.10.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "9.10.0", "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw=="], + + "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], + + "eslint-plugin-es-x": ["eslint-plugin-es-x@7.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ=="], + + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@48.11.0", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.46.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.5", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports": "^2.1.1", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", "synckit": "^0.9.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA=="], + + "eslint-plugin-n": ["eslint-plugin-n@17.10.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "enhanced-resolve": "^5.17.0", "eslint-plugin-es-x": "^7.5.0", "get-tsconfig": "^4.7.0", "globals": "^15.8.0", "ignore": "^5.2.4", "minimatch": "^9.0.5", "semver": "^7.5.3" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw=="], + + "eslint-plugin-promise": ["eslint-plugin-promise@7.1.0", "", { "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ=="], + + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@55.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.5", "@eslint-community/eslint-utils": "^4.4.0", "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.37.0", "esquery": "^1.5.0", "globals": "^15.7.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", "regjsparser": "^0.10.0", "semver": "^7.6.1", "strip-indent": "^3.0.0" }, "peerDependencies": { "eslint": ">=8.56.0" } }, "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA=="], + + "eslint-plugin-vue": ["eslint-plugin-vue@9.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g=="], + + "eslint-scope": ["eslint-scope@8.0.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.0.0", "", {}, "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw=="], + + "espree": ["espree@10.1.0", "", { "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" } }, "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + + "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], + + "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], + + "formdata-node": ["formdata-node@6.0.3", "", {}, "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-tsconfig": ["get-tsconfig@4.8.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@15.9.0", "", {}, "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-builtin-module": ["is-builtin-module@3.2.1", "", { "dependencies": { "builtin-modules": "^3.3.0" } }, "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A=="], + + "is-core-module": ["is-core-module@2.15.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "itty-router": ["itty-router@5.0.18", "", {}, "sha512-mK3ReOt4ARAGy0V0J7uHmArG2USN2x0zprZ+u+YgmeRjXTDbaowDy3kPcsmQY6tH+uHhDgpWit9Vqmv/4rTXwA=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], + + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.0.0", "", {}, "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ=="], + + "jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "node-releases": ["node-releases@2.0.18", "", {}, "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="], + + "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "oxc-parser": ["oxc-parser@0.71.0", "", { "dependencies": { "@oxc-project/types": "^0.71.0" }, "optionalDependencies": { "@oxc-parser/binding-darwin-arm64": "0.71.0", "@oxc-parser/binding-darwin-x64": "0.71.0", "@oxc-parser/binding-freebsd-x64": "0.71.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.71.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.71.0", "@oxc-parser/binding-linux-arm64-gnu": "0.71.0", "@oxc-parser/binding-linux-arm64-musl": "0.71.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.71.0", "@oxc-parser/binding-linux-s390x-gnu": "0.71.0", "@oxc-parser/binding-linux-x64-gnu": "0.71.0", "@oxc-parser/binding-linux-x64-musl": "0.71.0", "@oxc-parser/binding-wasm32-wasi": "0.71.0", "@oxc-parser/binding-win32-arm64-msvc": "0.71.0", "@oxc-parser/binding-win32-x64-msvc": "0.71.0" } }, "sha512-RXmu7qi+67RJ8E5UhKZJdliTI+AqD3gncsJecjujcYvjsCZV9KNIfu42fQAnAfLaYZuzOMRdUYh7LzV3F1C0Gw=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-imports": ["parse-imports@2.1.1", "", { "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" } }, "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + + "postcss": ["postcss@8.4.47", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", "source-map-js": "^1.2.1" } }, "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "publint": ["publint@0.3.12", "", { "dependencies": { "@publint/pack": "^0.1.2", "package-manager-detector": "^1.1.0", "picocolors": "^1.1.1", "sade": "^1.8.1" }, "bin": { "publint": "src/cli.js" } }, "sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "read-pkg": ["read-pkg@5.2.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" } }, "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="], + + "read-pkg-up": ["read-pkg-up@7.0.1", "", { "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" } }, "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], + + "regjsparser": ["regjsparser@0.10.0", "", { "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA=="], + + "resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rolldown": ["rolldown@1.0.0-beta.9-commit.51df2b7", "", { "dependencies": { "@oxc-project/types": "0.71.0", "@rolldown/pluginutils": "1.0.0-beta.9-commit.51df2b7", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-darwin-arm64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-darwin-x64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-freebsd-x64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.9-commit.51df2b7" }, "peerDependencies": { "@oxc-project/runtime": "0.71.0" }, "optionalPeers": ["@oxc-project/runtime"], "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-jsHj8vikf9qezv+Ct2sL1gHgIXVq+3NATCcY24lnJNdHvmc2t9aRjuMp5nUCzZ4aFTpRFJmucSOgqfvruo4/ew=="], + + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.13.4", "", { "dependencies": { "@babel/generator": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1", "ast-kit": "^2.0.0", "birpc": "^2.3.0", "debug": "^4.4.1", "dts-resolver": "^2.0.1", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~2.2.0" }, "optionalPeers": ["typescript", "vue-tsc"] }, "sha512-2+3GnKj6A3wKfyomUKfONRHjgKE85X4PcgW1b84KkHvuN3mUuUiOMseLKafFLMF6NkqQPAJ3FErwtC4HuwIswg=="], + + "rollup": ["rollup@4.21.3", "", { "dependencies": { "@types/estree": "1.0.5" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.21.3", "@rollup/rollup-android-arm64": "4.21.3", "@rollup/rollup-darwin-arm64": "4.21.3", "@rollup/rollup-darwin-x64": "4.21.3", "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", "@rollup/rollup-linux-arm-musleabihf": "4.21.3", "@rollup/rollup-linux-arm64-gnu": "4.21.3", "@rollup/rollup-linux-arm64-musl": "4.21.3", "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", "@rollup/rollup-linux-riscv64-gnu": "4.21.3", "@rollup/rollup-linux-s390x-gnu": "4.21.3", "@rollup/rollup-linux-x64-gnu": "4.21.3", "@rollup/rollup-linux-x64-musl": "4.21.3", "@rollup/rollup-win32-arm64-msvc": "4.21.3", "@rollup/rollup-win32-ia32-msvc": "4.21.3", "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "slashes": ["slashes@3.0.12", "", {}, "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.20", "", {}, "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "synckit": ["synckit@0.9.1", "", { "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" } }, "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A=="], + + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + + "tinypool": ["tinypool@1.0.2", "", {}, "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA=="], + + "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], + + "tsdown": ["tsdown@0.12.2", "", { "dependencies": { "ansis": "^4.0.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.1", "empathic": "^1.1.0", "hookable": "^5.5.3", "rolldown": "1.0.0-beta.9-commit.51df2b7", "rolldown-plugin-dts": "^0.13.4", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.13", "unconfig": "^7.3.2" }, "peerDependencies": { "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.js" } }, "sha512-JbBhVW799a1aOt1g8tNw5MGRuYm+xZWBkj9jMOdJJ6zSFT/pAewdQytgtgBemz4Wv3pmRLZNPK9YqUu1IVuIqA=="], + + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typescript-eslint": ["typescript-eslint@8.6.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.6.0", "@typescript-eslint/parser": "8.6.0", "@typescript-eslint/utils": "8.6.0" } }, "sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA=="], + + "unconfig": ["unconfig@7.3.2", "", { "dependencies": { "@quansync/fs": "^0.1.1", "defu": "^6.1.4", "jiti": "^2.4.2", "quansync": "^0.2.8" } }, "sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg=="], + + "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + + "unplugin": ["unplugin@2.3.4", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg=="], + + "unplugin-unused": ["unplugin-unused@0.5.0", "", { "dependencies": { "js-tokens": "^9.0.1", "picocolors": "^1.1.1", "pkg-types": "^2.1.0", "unplugin": "^2.3.2" } }, "sha512-czXny3h/P/Tl5ZOnV5tSf6kswAniHjgJF0slpzBPLkq0zGGKDYa1jgWMAdbWJNu7B1YSmBJY4zf3Q/v9w0+/cg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.0", "", { "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "vite": ["vite@5.4.6", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q=="], + + "vite-node": ["vite-node@3.1.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA=="], + + "vitest": ["vitest@3.1.4", "", { "dependencies": { "@vitest/expect": "3.1.4", "@vitest/mocker": "3.1.4", "@vitest/pretty-format": "^3.1.4", "@vitest/runner": "3.1.4", "@vitest/snapshot": "3.1.4", "@vitest/spy": "3.1.4", "@vitest/utils": "3.1.4", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.13", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.1.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.1.4", "@vitest/ui": "3.1.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ=="], + + "vue-eslint-parser": ["vue-eslint-parser@9.4.3", "", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@babel/code-frame/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@babel/highlight/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@babel/highlight/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + + "@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "eslint-compat-utils/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "eslint-plugin-jsdoc/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "eslint-plugin-n/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "eslint-plugin-n/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "eslint-plugin-unicorn/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "eslint-plugin-vue/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + + "eslint-plugin-vue/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "parse-imports/es-module-lexer": ["es-module-lexer@1.5.4", "", {}, "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="], + + "postcss/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + + "read-pkg/type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], + + "read-pkg-up/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "regjsparser/jsesc": ["jsesc@0.5.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="], + + "rolldown-plugin-dts/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "rolldown-plugin-dts/get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "rollup/@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], + + "spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "tsdown/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "unplugin/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "update-browserslist-db/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + + "validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "vite-node/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "vitest/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "vue-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + + "vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "vue-eslint-parser/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "vue-eslint-parser/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "eslint-plugin-n/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "eslint-plugin-vue/globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "read-pkg-up/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "read-pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 4f74692c1e6579a90480ce7676fbe879e4fa9720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119900 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

q#m(j2l&YT31he3_}v72`22z| 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≈EpT{kX1MEhsu462cKYw)5t@;<0-L=w; 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�e6v52lm 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 BDS`k1 diff --git a/dist/esm/main.d.ts b/dist/esm/main.d.ts deleted file mode 100644 index 90056dd..0000000 --- a/dist/esm/main.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { type ServerOptions } from 'node:http'; -import { type HyperAPIDriver, type HyperAPIDriverHandler } from '@hyperapi/core'; -import { type HyperAPINodeRequest } from './request.js'; -interface Config { - port: number; - path?: string; - multipart_formdata_enabled?: boolean; - options?: ServerOptions; -} -export declare class HyperAPINodeDriver implements HyperAPIDriver> { - private handler; - private port; - private path; - private multipart_formdata_enabled; - private server; - private server_options; - /** - * @param options - - * @param options.port - HTTP server port. Default: `8001`. - * @param [options.path] - Path to serve. Default: `/api/`. - * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. - * @param [options.options] - NodeJS server options. - */ - constructor({ port, path, multipart_formdata_enabled, options, }: Config); - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler: HyperAPIDriverHandler): void; - /** Stops the server. */ - stop(): void; - /** - * Handles the HTTP request. - * @param req - NodeJS request. - * @returns - - */ - private processRequest; -} -export { type HyperAPINodeRequest } from './request.js'; diff --git a/dist/esm/main.js b/dist/esm/main.js deleted file mode 100644 index f896bd8..0000000 --- a/dist/esm/main.js +++ /dev/null @@ -1,111 +0,0 @@ -import { createServer, } from 'node:http'; -import { HyperAPIError, } from '@hyperapi/core'; -import { IP } from '@kirick/ip'; -import { parseArguments } from './utils/parse.js'; -import { hyperApiErrorToResponse } from './utils/hyperapi-error.js'; -import { isHttpMethodSupported, isResponseBodyRequired, } from './utils/http.js'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export class HyperAPINodeDriver { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - handler = null; - port; - path; - multipart_formdata_enabled; - server = null; - server_options; - /** - * @param options - - * @param options.port - HTTP server port. Default: `8001`. - * @param [options.path] - Path to serve. Default: `/api/`. - * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. - * @param [options.options] - NodeJS server options. - */ - constructor({ port, path = '/api/', multipart_formdata_enabled = false, options = {}, }) { - this.port = port; - this.path = path; - this.multipart_formdata_enabled = multipart_formdata_enabled; - this.server_options = options; - } - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler) { - this.handler = handler; - this.server = createServer(this.server_options, async (req, res) => { - let response; - try { - response = await this.processRequest(req); - } - catch (error) { - if (error instanceof HyperAPIError) { - response = hyperApiErrorToResponse(error, isResponseBodyRequired(req.method)); - } - else { - // eslint-disable-next-line no-console - console.error('Unhandled error in @hyperapi/driver-node:'); - // eslint-disable-next-line no-console - console.error(error); - response = { status: 500 }; - } - } - res.writeHead(response.status, response.headers ?? {}); - if (response.body !== undefined) { - res.write(response.body); - } - res.end(); - }); - this.server.listen(this.port); - } - /** Stops the server. */ - stop() { - this.server?.close(); - } - /** - * Handles the HTTP request. - * @param req - NodeJS request. - * @returns - - */ - async processRequest(req) { - if (!this.handler) { - throw new Error('No handler available.'); - } - const http_method = req.method; - if (isHttpMethodSupported(http_method) !== true) { - return { status: 405 }; - } - if (typeof req.url !== 'string') { - throw new TypeError('Request URL is not a string.'); - } - const url = new URL(req.url, `http://${req.headers.host ?? 'unknown'}`); - if (url.pathname.startsWith(this.path) !== true) { - return { status: 404 }; - } - const hyperapi_method = url.pathname.slice(this.path.length); - const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); - const ip_string = req.socket.remoteAddress; - if (typeof ip_string !== 'string') { - throw new TypeError('Remote address is not a string.'); - } - const hyperapi_response = await this.handler({ - method: http_method, - path: hyperapi_method, - args: hyperapi_args, - url: url, - headers: req.headers, - ip: new IP(ip_string), - }); - if (hyperapi_response instanceof HyperAPIError) { - throw hyperapi_response; - } - return { - status: 200, - headers: { - 'Content-Type': 'application/json', - }, - body: isResponseBodyRequired(http_method) - ? JSON.stringify(hyperapi_response) - : undefined, - }; - } -} diff --git a/dist/esm/request.d.ts b/dist/esm/request.d.ts deleted file mode 100644 index b75ac43..0000000 --- a/dist/esm/request.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { HyperAPIRequest } from '@hyperapi/core'; -import type { IP } from '@kirick/ip'; -export interface HyperAPINodeRequest = Omit<{ - p: unknown; -}, 'p'>> extends HyperAPIRequest { - url: URL; - headers: Record; - ip: IP; -} diff --git a/dist/esm/request.js b/dist/esm/request.js deleted file mode 100644 index cb0ff5c..0000000 --- a/dist/esm/request.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/dist/esm/types.d.ts b/dist/esm/types.d.ts deleted file mode 100644 index b68ec90..0000000 --- a/dist/esm/types.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ResponseSchema { - status: number; - headers?: Record; - body?: string | undefined; -} diff --git a/dist/esm/types.js b/dist/esm/types.js deleted file mode 100644 index cb0ff5c..0000000 --- a/dist/esm/types.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/dist/esm/utils/http.d.ts b/dist/esm/utils/http.d.ts deleted file mode 100644 index 4b5d691..0000000 --- a/dist/esm/utils/http.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'; -/** - * Checks if the response body is required for the given HTTP method. - * @param http_method The HTTP method to check. - * @returns - - */ -export declare function isHttpMethodSupported(http_method: unknown): http_method is HttpMethod; -/** - * Checks if the response body is required for the given HTTP method. - * @param http_method The HTTP method to check. - * @returns - - */ -export declare function isResponseBodyRequired(http_method: unknown): http_method is Exclude; -export {}; diff --git a/dist/esm/utils/http.js b/dist/esm/utils/http.js deleted file mode 100644 index 39b90b1..0000000 --- a/dist/esm/utils/http.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Checks if the response body is required for the given HTTP method. - * @param http_method The HTTP method to check. - * @returns - - */ -export function isHttpMethodSupported(http_method) { - return http_method === 'GET' - || http_method === 'POST' - || http_method === 'PUT' - || http_method === 'PATCH' - || http_method === 'DELETE' - || http_method === 'HEAD' - || http_method === 'OPTIONS'; -} -/** - * Checks if the response body is required for the given HTTP method. - * @param http_method The HTTP method to check. - * @returns - - */ -export function isResponseBodyRequired(http_method) { - return http_method !== 'HEAD' - && http_method !== 'OPTIONS'; -} diff --git a/dist/esm/utils/hyperapi-error.d.ts b/dist/esm/utils/hyperapi-error.d.ts deleted file mode 100644 index 618b9b0..0000000 --- a/dist/esm/utils/hyperapi-error.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { HyperAPIError } from '@hyperapi/core'; -import { ResponseSchema } from '../types.js'; -/** - * Converts a HyperAPIError to a Response. - * @param error - The error to convert. - * @param add_body - Whether to add the response body. - * @returns - - */ -export declare function hyperApiErrorToResponse(error: HyperAPIError, add_body: boolean): ResponseSchema; diff --git a/dist/esm/utils/hyperapi-error.js b/dist/esm/utils/hyperapi-error.js deleted file mode 100644 index 4061d48..0000000 --- a/dist/esm/utils/hyperapi-error.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Converts a HyperAPIError to a Response. - * @param error - The error to convert. - * @param add_body - Whether to add the response body. - * @returns - - */ -export function hyperApiErrorToResponse( -// eslint-disable-next-line @typescript-eslint/no-explicit-any -error, add_body) { - if (typeof error.httpStatus !== 'number') { - // eslint-disable-next-line no-console - console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); - } - const headers = { - 'Content-Type': 'application/json', - }; - if (error.httpHeaders) { - for (const [header, value] of Object.entries(error.httpHeaders)) { - headers[header] = value; - } - } - let body; - if (add_body) { - body = JSON.stringify(error.getResponse()); - } - return { - status: error.httpStatus ?? 500, - headers, - body, - }; -} diff --git a/dist/esm/utils/is-record.d.ts b/dist/esm/utils/is-record.d.ts deleted file mode 100644 index b3e9d51..0000000 --- a/dist/esm/utils/is-record.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Check if a value is a record. - * @param value - - * @returns - - */ -export declare function isRecord(value: unknown): value is Record; diff --git a/dist/esm/utils/is-record.js b/dist/esm/utils/is-record.js deleted file mode 100644 index 350e9df..0000000 --- a/dist/esm/utils/is-record.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Check if a value is a record. - * @param value - - * @returns - - */ -export function isRecord(value) { - return typeof value === 'object' - && value !== null - && !Array.isArray(value) - && value.constructor === Object - && Object.prototype.toString.call(value) === '[object Object]'; -} diff --git a/dist/esm/utils/parse.d.ts b/dist/esm/utils/parse.d.ts deleted file mode 100644 index bb6f685..0000000 --- a/dist/esm/utils/parse.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IncomingMessage } from 'node:http'; -type RequestArgs = Record; -/** - * Parses arguments from request. - * @param req - NodeJS request object. - * @param url - URL object. - * @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. - * @returns - Arguments. - */ -export declare function parseArguments(req: IncomingMessage, url: URL, multipart_formdata_enabled: boolean): Promise; -export {}; diff --git a/dist/esm/utils/parse.js b/dist/esm/utils/parse.js deleted file mode 100644 index b482720..0000000 --- a/dist/esm/utils/parse.js +++ /dev/null @@ -1,97 +0,0 @@ -import { HyperAPIInvalidParametersError } from '@hyperapi/core'; -import { isRecord } from './is-record.js'; -import { parseFormData } from './parse/form-data.js'; -import { parseText } from './parse/text.js'; -/** - * Gets only MIME type from Content-Type header, stripping parameters. - * @param type - MIME type. - * @returns - MIME type. - */ -function getMIME(type) { - const index = type.indexOf(';'); - if (index !== -1) { - return type.slice(0, index).trim(); - } - return type.trim(); -} -class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError { - data = { - message: 'Could not parse body', - }; - httpStatus = 400; - constructor(message) { - super(); - if (message) { - this.data.message = message; - } - } -} -class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError { - data = { - message: 'Unsupported body type', - }; - httpStatus = 415; - constructor(mime) { - super(); - this.data.message = `Unsupported body type: ${mime}`; - } -} -/** - * Parses arguments from request. - * @param req - NodeJS request object. - * @param url - URL object. - * @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. - * @returns - Arguments. - */ -export async function parseArguments(req, url, multipart_formdata_enabled) { - let args = {}; - if (req.method === 'GET' - || req.method === 'HEAD') { - args = Object.fromEntries(url.searchParams.entries()); - } - else { - const type_header = req.headers['content-type']; - const type_mime = typeof type_header === 'string' - ? getMIME(type_header) - : ''; - switch (type_mime) { - case 'application/json': - { - let args_json; - try { - args_json = JSON.parse(await parseText(req)); - } - catch { - throw new HyperAPIBodyInvalidError(); - } - if (isRecord(args_json) !== true) { - throw new HyperAPIBodyInvalidError('JSON body must be an object'); - } - args = args_json; - } - break; - case 'multipart/form-data': - if (multipart_formdata_enabled !== true) { - throw new HyperAPIBodyUnknownError(type_mime); - } - try { - args = await parseFormData(req); - } - catch { - throw new HyperAPIInvalidParametersError(); - } - break; - case 'application/x-www-form-urlencoded': - try { - args = Object.fromEntries(new URLSearchParams(await parseText(req))); - } - catch { - throw new HyperAPIInvalidParametersError(); - } - break; - default: - throw new HyperAPIBodyUnknownError(type_mime); - } - } - return args; -} diff --git a/dist/esm/utils/parse/form-data.d.ts b/dist/esm/utils/parse/form-data.d.ts deleted file mode 100644 index f1f33bd..0000000 --- a/dist/esm/utils/parse/form-data.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Blob } from 'node:buffer'; -import { IncomingMessage } from 'node:http'; -/** - * Parses request body as multipart/form-data. - * @param req - NodeJS request object. - * @returns - JSON object. - */ -export declare function parseFormData(req: IncomingMessage): Promise>; diff --git a/dist/esm/utils/parse/form-data.js b/dist/esm/utils/parse/form-data.js deleted file mode 100644 index c043540..0000000 --- a/dist/esm/utils/parse/form-data.js +++ /dev/null @@ -1,33 +0,0 @@ -import busboy from 'busboy'; -import { Blob } from 'node:buffer'; -/** - * Parses request body as multipart/form-data. - * @param req - NodeJS request object. - * @returns - JSON object. - */ -export function parseFormData(req) { - return new Promise((resolve) => { - const bb = busboy({ - headers: req.headers, - }); - const form_data = {}; - bb.on('file', (name, file, info) => { - const file_parts = []; - file.on('data', (chunk) => { - file_parts.push(chunk); - }); - file.on('end', () => { - form_data[name] = new Blob(file_parts, { - type: info.mimeType, - }); - }); - }); - bb.on('field', (name, value) => { - form_data[name] = value; - }); - bb.on('close', () => { - resolve(form_data); - }); - req.pipe(bb); - }); -} diff --git a/dist/esm/utils/parse/text.d.ts b/dist/esm/utils/parse/text.d.ts deleted file mode 100644 index 4126311..0000000 --- a/dist/esm/utils/parse/text.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IncomingMessage } from 'node:http'; -/** - * Parses request body into text. - * @param req - NodeJS request object. - * @returns - - */ -export declare function parseText(req: IncomingMessage): Promise; diff --git a/dist/esm/utils/parse/text.js b/dist/esm/utils/parse/text.js deleted file mode 100644 index 94ce160..0000000 --- a/dist/esm/utils/parse/text.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Parses request body into text. - * @param req - NodeJS request object. - * @returns - - */ -export async function parseText(req) { - const body_parts = []; - for await (const chunk of req) { - body_parts.push(chunk); - } - return Buffer.concat(body_parts).toString(); -} diff --git a/dist/main.cjs b/dist/main.cjs index 61fb3e2..3823053 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -1,348 +1,291 @@ -"use strict"; +//#region rolldown:runtime var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; + if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { + key = keys[i]; + if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { + get: ((k) => from[k]).bind(null, key), + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } + return to; }; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/main.ts -var main_exports = {}; -__export(main_exports, { - HyperAPINodeDriver: () => HyperAPINodeDriver -}); -module.exports = __toCommonJS(main_exports); -var import_node_http = require("node:http"); -var import_core2 = require("@hyperapi/core"); -var import_ip = require("@kirick/ip"); +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { + value: mod, + enumerable: true +}) : target, mod)); -// src/utils/parse.ts -var import_core = require("@hyperapi/core"); +//#endregion +const node_http = __toESM(require("node:http")); +const __hyperapi_core = __toESM(require("@hyperapi/core")); +const __kirick_ip = __toESM(require("@kirick/ip")); +const busboy = __toESM(require("busboy")); +const node_buffer = __toESM(require("node:buffer")); -// src/utils/is-record.ts +//#region src/utils/is-record.ts +/** +* Check if a value is a record. +* @param value - +* @returns - +*/ function isRecord(value) { - return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; + return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; } -// src/utils/parse/form-data.ts -var import_busboy = __toESM(require("busboy"), 1); -var import_node_buffer = require("node:buffer"); +//#endregion +//#region src/utils/parse/form-data.ts +/** +* Parses request body as multipart/form-data. +* @param req - NodeJS request object. +* @returns - JSON object. +*/ function parseFormData(req) { - return new Promise((resolve) => { - const bb = (0, import_busboy.default)({ - headers: req.headers - }); - const form_data = {}; - bb.on( - "file", - (name, file, info) => { - const file_parts = []; - file.on( - "data", - (chunk) => { - file_parts.push(chunk); - } - ); - file.on( - "end", - () => { - form_data[name] = new import_node_buffer.Blob( - file_parts, - { - type: info.mimeType - } - ); - } - ); - } - ); - bb.on( - "field", - (name, value) => { - form_data[name] = value; - } - ); - bb.on( - "close", - () => { - resolve(form_data); - } - ); - req.pipe(bb); - }); + return new Promise((resolve) => { + const bb = (0, busboy.default)({ headers: req.headers }); + const form_data = {}; + bb.on("file", (name, file, info) => { + const file_parts = []; + file.on("data", (chunk) => { + file_parts.push(chunk); + }); + file.on("end", () => { + form_data[name] = new node_buffer.Blob(file_parts, { type: info.mimeType }); + }); + }); + bb.on("field", (name, value) => { + form_data[name] = value; + }); + bb.on("close", () => { + resolve(form_data); + }); + req.pipe(bb); + }); } -// src/utils/parse/text.ts -async function parseText(req) { - const body_parts = []; - for await (const chunk of req) { - body_parts.push(chunk); - } - return Buffer.concat(body_parts).toString(); +//#endregion +//#region src/utils/parse/text.ts +/** +* Parses request body into text. +* @param req - NodeJS request object. +* @returns - +*/ +function parseText(req) { + return new Promise((resolve, reject) => { + const body_parts = []; + req.on("error", (err) => { + reject(err); + }); + req.on("data", (chunk) => { + body_parts.push(chunk); + }); + req.on("end", () => { + resolve(Buffer.concat(body_parts).toString()); + }); + }); } -// src/utils/parse.ts +//#endregion +//#region src/utils/parse.ts +/** +* Gets only MIME type from Content-Type header, stripping parameters. +* @param type - MIME type. +* @returns - MIME type. +*/ function getMIME(type) { - const index = type.indexOf(";"); - if (index !== -1) { - return type.slice(0, index).trim(); - } - return type.trim(); + const index = type.indexOf(";"); + if (index !== -1) return type.slice(0, index).trim(); + return type.trim(); } -var HyperAPIBodyInvalidError = class extends import_core.HyperAPIInvalidParametersError { - data = { - message: "Could not parse body" - }; - httpStatus = 400; - constructor(message) { - super(); - if (message) { - this.data.message = message; - } - } +var HyperAPIBodyInvalidError = class extends __hyperapi_core.HyperAPIInvalidParametersError { + data = { message: "Could not parse body" }; + httpStatus = 400; + constructor(message) { + super(); + if (message) this.data.message = message; + } }; -var HyperAPIBodyUnknownError = class extends import_core.HyperAPIInvalidParametersError { - data = { - message: "Unsupported body type" - }; - httpStatus = 415; - constructor(mime) { - super(); - this.data.message = `Unsupported body type: ${mime}`; - } +var HyperAPIBodyUnknownError = class extends __hyperapi_core.HyperAPIInvalidParametersError { + data = { message: "Unsupported body type" }; + httpStatus = 415; + constructor(mime) { + super(); + this.data.message = `Unsupported body type: ${mime}`; + } }; +/** +* Parses arguments from request. +* @param req - NodeJS request object. +* @param url - URL object. +* @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. +* @returns - Arguments. +*/ async function parseArguments(req, url, multipart_formdata_enabled) { - let args = {}; - if (req.method === "GET" || req.method === "HEAD") { - args = Object.fromEntries( - url.searchParams.entries() - ); - } else { - const type_header = req.headers["content-type"]; - const type_mime = typeof type_header === "string" ? getMIME(type_header) : ""; - switch (type_mime) { - case "application/json": - { - let args_json; - try { - args_json = JSON.parse( - await parseText(req) - ); - } catch { - throw new HyperAPIBodyInvalidError(); - } - if (isRecord(args_json) !== true) { - throw new HyperAPIBodyInvalidError("JSON body must be an object"); - } - args = args_json; - } - break; - case "multipart/form-data": - if (multipart_formdata_enabled !== true) { - throw new HyperAPIBodyUnknownError(type_mime); - } - try { - args = await parseFormData(req); - } catch { - throw new import_core.HyperAPIInvalidParametersError(); - } - break; - case "application/x-www-form-urlencoded": - try { - args = Object.fromEntries( - new URLSearchParams( - await parseText(req) - ) - ); - } catch { - throw new import_core.HyperAPIInvalidParametersError(); - } - break; - default: - throw new HyperAPIBodyUnknownError(type_mime); - } - } - return args; + let args = {}; + if (req.method === "GET" || req.method === "HEAD") args = Object.fromEntries(url.searchParams.entries()); + else { + const type_header = req.headers["content-type"]; + const type_mime = typeof type_header === "string" ? getMIME(type_header) : ""; + switch (type_mime) { + case "application/json": + { + let args_json; + try { + args_json = JSON.parse(await parseText(req)); + } catch { + throw new HyperAPIBodyInvalidError(); + } + if (isRecord(args_json) !== true) throw new HyperAPIBodyInvalidError("JSON body must be an object"); + args = args_json; + } + break; + case "multipart/form-data": + if (multipart_formdata_enabled !== true) throw new HyperAPIBodyUnknownError(type_mime); + try { + args = await parseFormData(req); + } catch { + throw new __hyperapi_core.HyperAPIInvalidParametersError(); + } + break; + case "application/x-www-form-urlencoded": + try { + args = Object.fromEntries(new URLSearchParams(await parseText(req))); + } catch { + throw new __hyperapi_core.HyperAPIInvalidParametersError(); + } + break; + default: throw new HyperAPIBodyUnknownError(type_mime); + } + } + return args; } -// src/utils/hyperapi-error.ts +//#endregion +//#region src/utils/hyperapi-error.ts +/** +* Converts a HyperAPIError to a Response. +* @param error - The error to convert. +* @param add_body - Whether to add the response body. +* @returns - +*/ function hyperApiErrorToResponse(error, add_body) { - if (typeof error.httpStatus !== "number") { - console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); - } - const headers = { - "Content-Type": "application/json" - }; - if (error.httpHeaders) { - for (const [header, value] of Object.entries(error.httpHeaders)) { - headers[header] = value; - } - } - let body; - if (add_body) { - body = JSON.stringify( - error.getResponse() - ); - } - return { - status: error.httpStatus ?? 500, - headers, - body - }; + if (typeof error.httpStatus !== "number") console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + const headers = { "Content-Type": "application/json" }; + if (error.httpHeaders) for (const [header, value] of Object.entries(error.httpHeaders)) headers[header] = value; + let body; + if (add_body) body = JSON.stringify(error.getResponse()); + return { + status: error.httpStatus ?? 500, + headers, + body + }; } -// src/utils/http.ts +//#endregion +//#region src/utils/http.ts +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ function isHttpMethodSupported(http_method) { - return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; + return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; } +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ function isResponseBodyRequired(http_method) { - return http_method !== "HEAD" && http_method !== "OPTIONS"; + return http_method !== "HEAD" && http_method !== "OPTIONS"; } -// src/main.ts +//#endregion +//#region src/main.ts var HyperAPINodeDriver = class { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - handler = null; - port; - path; - multipart_formdata_enabled; - server = null; - server_options; - /** - * @param options - - * @param options.port - HTTP server port. Default: `8001`. - * @param [options.path] - Path to serve. Default: `/api/`. - * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. - * @param [options.options] - NodeJS server options. - */ - constructor({ - port, - path = "/api/", - multipart_formdata_enabled = false, - options = {} - }) { - this.port = port; - this.path = path; - this.multipart_formdata_enabled = multipart_formdata_enabled; - this.server_options = options; - } - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler) { - this.handler = handler; - this.server = (0, import_node_http.createServer)( - this.server_options, - async (req, res) => { - let response; - try { - response = await this.processRequest(req); - } catch (error) { - if (error instanceof import_core2.HyperAPIError) { - response = hyperApiErrorToResponse( - error, - isResponseBodyRequired(req.method) - ); - } else { - console.error("Unhandled error in @hyperapi/driver-node:"); - console.error(error); - response = { status: 500 }; - } - } - res.writeHead( - response.status, - response.headers ?? {} - ); - if (response.body !== void 0) { - res.write(response.body); - } - res.end(); - } - ); - this.server.listen(this.port); - } - /** Stops the server. */ - stop() { - this.server?.close(); - } - /** - * Handles the HTTP request. - * @param req - NodeJS request. - * @returns - - */ - async processRequest(req) { - if (!this.handler) { - throw new Error("No handler available."); - } - const http_method = req.method; - if (isHttpMethodSupported(http_method) !== true) { - return { status: 405 }; - } - if (typeof req.url !== "string") { - throw new TypeError("Request URL is not a string."); - } - const url = new URL( - req.url, - `http://${req.headers.host ?? "unknown"}` - ); - if (url.pathname.startsWith(this.path) !== true) { - return { status: 404 }; - } - const hyperapi_method = url.pathname.slice( - this.path.length - ); - const hyperapi_args = await parseArguments( - req, - url, - this.multipart_formdata_enabled - ); - const ip_string = req.socket.remoteAddress; - if (typeof ip_string !== "string") { - throw new TypeError("Remote address is not a string."); - } - const hyperapi_response = await this.handler({ - method: http_method, - path: hyperapi_method, - args: hyperapi_args, - url, - headers: req.headers, - ip: new import_ip.IP(ip_string) - }); - if (hyperapi_response instanceof import_core2.HyperAPIError) { - throw hyperapi_response; - } - return { - status: 200, - headers: { - "Content-Type": "application/json" - }, - body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 - }; - } + handler = null; + port; + path; + multipart_formdata_enabled; + server = null; + server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ port, path = "/api/", multipart_formdata_enabled = false, options = {} }) { + this.port = port; + this.path = path; + this.multipart_formdata_enabled = multipart_formdata_enabled; + this.server_options = options; + } + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler) { + this.handler = handler; + this.server = (0, node_http.createServer)(this.server_options, async (req, res) => { + let response; + try { + response = await this.processRequest(req); + } catch (error) { + if (error instanceof __hyperapi_core.HyperAPIError) response = hyperApiErrorToResponse(error, isResponseBodyRequired(req.method)); + else { + console.error("Unhandled error in @hyperapi/driver-node:"); + console.error(error); + response = { status: 500 }; + } + } + res.writeHead(response.status, response.headers ?? {}); + if (response.body !== void 0) res.write(response.body); + res.end(); + }); + this.server.listen(this.port); + } + /** Stops the server. */ + stop() { + this.server?.close(); + } + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + async processRequest(req) { + if (!this.handler) throw new Error("No handler available."); + const http_method = req.method; + if (isHttpMethodSupported(http_method) !== true) return { status: 405 }; + if (typeof req.url !== "string") throw new TypeError("Request URL is not a string."); + const url = new URL(req.url, `http://${req.headers.host ?? "unknown"}`); + if (url.pathname.startsWith(this.path) !== true) return { status: 404 }; + const hyperapi_method = url.pathname.slice(this.path.length); + const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); + const ip_string = req.socket.remoteAddress; + if (typeof ip_string !== "string") throw new TypeError("Remote address is not a string."); + const hyperapi_response = await this.handler({ + method: http_method, + path: hyperapi_method, + args: hyperapi_args, + url, + headers: req.headers, + ip: new __kirick_ip.IP(ip_string) + }); + if (hyperapi_response instanceof __hyperapi_core.HyperAPIError) throw hyperapi_response; + return { + status: 200, + headers: { "Content-Type": "application/json" }, + body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 + }; + } }; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - HyperAPINodeDriver -}); + +//#endregion +exports.HyperAPINodeDriver = HyperAPINodeDriver; \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts new file mode 100644 index 0000000..535d83a --- /dev/null +++ b/dist/main.d.ts @@ -0,0 +1,59 @@ +import { ServerOptions } from "node:http"; +import { HyperAPIDriver, HyperAPIDriverHandler, HyperAPIRequest } from "@hyperapi/core"; +import { IP } from "@kirick/ip"; + +//#region src/request.d.ts +interface HyperAPINodeRequest = Omit<{ + p: unknown; +}, "p">> extends HyperAPIRequest { + // request: Request; + url: URL; + headers: Record; + ip: IP; +} + +//#endregion +//#region src/main.d.ts +interface Config { + port: number; + path?: string; + multipart_formdata_enabled?: boolean; + options?: ServerOptions; +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare class HyperAPINodeDriver implements HyperAPIDriver> { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private handler; + private port; + private path; + private multipart_formdata_enabled; + private server; + private server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ + port, + path, + multipart_formdata_enabled, + options + }: Config); + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler: HyperAPIDriverHandler): void; + /** Stops the server. */ + stop(): void; + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + private processRequest; +} //#endregion +export { HyperAPINodeDriver, HyperAPINodeRequest }; \ No newline at end of file diff --git a/dist/main.js b/dist/main.js new file mode 100644 index 0000000..bd6b56f --- /dev/null +++ b/dist/main.js @@ -0,0 +1,268 @@ +import { createServer } from "node:http"; +import { HyperAPIError, HyperAPIInvalidParametersError } from "@hyperapi/core"; +import { IP } from "@kirick/ip"; +import busboy from "busboy"; +import { Blob } from "node:buffer"; + +//#region src/utils/is-record.ts +/** +* Check if a value is a record. +* @param value - +* @returns - +*/ +function isRecord(value) { + return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; +} + +//#endregion +//#region src/utils/parse/form-data.ts +/** +* Parses request body as multipart/form-data. +* @param req - NodeJS request object. +* @returns - JSON object. +*/ +function parseFormData(req) { + return new Promise((resolve) => { + const bb = busboy({ headers: req.headers }); + const form_data = {}; + bb.on("file", (name, file, info) => { + const file_parts = []; + file.on("data", (chunk) => { + file_parts.push(chunk); + }); + file.on("end", () => { + form_data[name] = new Blob(file_parts, { type: info.mimeType }); + }); + }); + bb.on("field", (name, value) => { + form_data[name] = value; + }); + bb.on("close", () => { + resolve(form_data); + }); + req.pipe(bb); + }); +} + +//#endregion +//#region src/utils/parse/text.ts +/** +* Parses request body into text. +* @param req - NodeJS request object. +* @returns - +*/ +function parseText(req) { + return new Promise((resolve, reject) => { + const body_parts = []; + req.on("error", (err) => { + reject(err); + }); + req.on("data", (chunk) => { + body_parts.push(chunk); + }); + req.on("end", () => { + resolve(Buffer.concat(body_parts).toString()); + }); + }); +} + +//#endregion +//#region src/utils/parse.ts +/** +* Gets only MIME type from Content-Type header, stripping parameters. +* @param type - MIME type. +* @returns - MIME type. +*/ +function getMIME(type) { + const index = type.indexOf(";"); + if (index !== -1) return type.slice(0, index).trim(); + return type.trim(); +} +var HyperAPIBodyInvalidError = class extends HyperAPIInvalidParametersError { + data = { message: "Could not parse body" }; + httpStatus = 400; + constructor(message) { + super(); + if (message) this.data.message = message; + } +}; +var HyperAPIBodyUnknownError = class extends HyperAPIInvalidParametersError { + data = { message: "Unsupported body type" }; + httpStatus = 415; + constructor(mime) { + super(); + this.data.message = `Unsupported body type: ${mime}`; + } +}; +/** +* Parses arguments from request. +* @param req - NodeJS request object. +* @param url - URL object. +* @param multipart_formdata_enabled - Whether to enable multipart/form-data parsing. +* @returns - Arguments. +*/ +async function parseArguments(req, url, multipart_formdata_enabled) { + let args = {}; + if (req.method === "GET" || req.method === "HEAD") args = Object.fromEntries(url.searchParams.entries()); + else { + const type_header = req.headers["content-type"]; + const type_mime = typeof type_header === "string" ? getMIME(type_header) : ""; + switch (type_mime) { + case "application/json": + { + let args_json; + try { + args_json = JSON.parse(await parseText(req)); + } catch { + throw new HyperAPIBodyInvalidError(); + } + if (isRecord(args_json) !== true) throw new HyperAPIBodyInvalidError("JSON body must be an object"); + args = args_json; + } + break; + case "multipart/form-data": + if (multipart_formdata_enabled !== true) throw new HyperAPIBodyUnknownError(type_mime); + try { + args = await parseFormData(req); + } catch { + throw new HyperAPIInvalidParametersError(); + } + break; + case "application/x-www-form-urlencoded": + try { + args = Object.fromEntries(new URLSearchParams(await parseText(req))); + } catch { + throw new HyperAPIInvalidParametersError(); + } + break; + default: throw new HyperAPIBodyUnknownError(type_mime); + } + } + return args; +} + +//#endregion +//#region src/utils/hyperapi-error.ts +/** +* Converts a HyperAPIError to a Response. +* @param error - The error to convert. +* @param add_body - Whether to add the response body. +* @returns - +*/ +function hyperApiErrorToResponse(error, add_body) { + if (typeof error.httpStatus !== "number") console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + const headers = { "Content-Type": "application/json" }; + if (error.httpHeaders) for (const [header, value] of Object.entries(error.httpHeaders)) headers[header] = value; + let body; + if (add_body) body = JSON.stringify(error.getResponse()); + return { + status: error.httpStatus ?? 500, + headers, + body + }; +} + +//#endregion +//#region src/utils/http.ts +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ +function isHttpMethodSupported(http_method) { + return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; +} +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ +function isResponseBodyRequired(http_method) { + return http_method !== "HEAD" && http_method !== "OPTIONS"; +} + +//#endregion +//#region src/main.ts +var HyperAPINodeDriver = class { + handler = null; + port; + path; + multipart_formdata_enabled; + server = null; + server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ port, path = "/api/", multipart_formdata_enabled = false, options = {} }) { + this.port = port; + this.path = path; + this.multipart_formdata_enabled = multipart_formdata_enabled; + this.server_options = options; + } + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler) { + this.handler = handler; + this.server = createServer(this.server_options, async (req, res) => { + let response; + try { + response = await this.processRequest(req); + } catch (error) { + if (error instanceof HyperAPIError) response = hyperApiErrorToResponse(error, isResponseBodyRequired(req.method)); + else { + console.error("Unhandled error in @hyperapi/driver-node:"); + console.error(error); + response = { status: 500 }; + } + } + res.writeHead(response.status, response.headers ?? {}); + if (response.body !== void 0) res.write(response.body); + res.end(); + }); + this.server.listen(this.port); + } + /** Stops the server. */ + stop() { + this.server?.close(); + } + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + async processRequest(req) { + if (!this.handler) throw new Error("No handler available."); + const http_method = req.method; + if (isHttpMethodSupported(http_method) !== true) return { status: 405 }; + if (typeof req.url !== "string") throw new TypeError("Request URL is not a string."); + const url = new URL(req.url, `http://${req.headers.host ?? "unknown"}`); + if (url.pathname.startsWith(this.path) !== true) return { status: 404 }; + const hyperapi_method = url.pathname.slice(this.path.length); + const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); + const ip_string = req.socket.remoteAddress; + if (typeof ip_string !== "string") throw new TypeError("Remote address is not a string."); + const hyperapi_response = await this.handler({ + method: http_method, + path: hyperapi_method, + args: hyperapi_args, + url, + headers: req.headers, + ip: new IP(ip_string) + }); + if (hyperapi_response instanceof HyperAPIError) throw hyperapi_response; + return { + status: 200, + headers: { "Content-Type": "application/json" }, + body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 + }; + } +}; + +//#endregion +export { HyperAPINodeDriver }; \ No newline at end of file diff --git a/package.json b/package.json index e33b2a6..7b6c27c 100644 --- a/package.json +++ b/package.json @@ -1,46 +1,49 @@ { "name": "@hyperapi/driver-node", - "version": "0.3.0-beta.2", + "version": "0.3.0-dev", "description": "HyperAPI HTTP driver for Node.JS.", "publishConfig": { "access": "public" }, "type": "module", - "main": "dist/esm/main.js", - "types": "dist/esm/main.d.ts", + "main": "dist/main.js", + "types": "dist/main.d.ts", "exports": { ".": { - "import": "./dist/esm/main.js", + "import": "./dist/main.js", "require": "./dist/main.cjs" } }, "engines": { - "node": "^16.17.0 || >=18.0" + "node": ">=21" }, "dependencies": { - "@hyperapi/core": "^0.3.0-beta.3", - "@kirick/ip": "^0.1.1", - "busboy": "^1.6.0" + "busboy": "1.6.0" + }, + "peerDependencies": { + "@hyperapi/core": "github:hyperapi/core#8894dcfe65392c9a4111c4494945817bff9f1f52", + "@kirick/ip": "^0.1.1" }, "devDependencies": { "@kirick/eslint-config": "^0.1.30", "@types/busboy": "^1.5.4", - "@types/node": "18", + "@types/node": "^20", "eslint": "9.10.0", - "formdata-node": "^6.0.3", + "formdata-node": "6.0.3", "node-fetch": "^3.3.2", - "typescript": "5.5.4", - "vitest": "2.1.1" + "oxc-parser": "0.71.0", + "publint": "0.3.12", + "tsdown": "0.12.2", + "typescript": "5.8.3", + "unplugin-unused": "0.5.0", + "vitest": "3.1.4" }, "scripts": { - "build": "bun run build:ts && bun run build:cjs", - "build:cjs": "bunx esbuild --bundle --platform=node --format=cjs --packages=external --outfile=dist/main.cjs src/main.ts", - "build:ts": "rm -r dist/esm dist/types ; tsc", - "lint": "eslint . && tsc --skipLibCheck --noemit", - "publish:npm": "bun run build && bun run lint && bun run test && npm publish", - "test": "tsc -p tsconfig.test.json && bun run test:install && bun run test:run", - "test:install": "docker run --rm -w /app -v ./package.json:/app/package.json:ro -v ./bun.lockb:/app/bun.lockb:ro -v ./node_modules+bun:/app/node_modules oven/bun:1.1.26-slim bun install --frozen-lockfile", - "test:run": "set -e ; for VERSION in '16.17' '18' '22'; do docker run --rm -w /app -v ./package.json:/app/package.json:ro -v ./dist/vitest:/app/vitest:ro -v ./node_modules+bun:/app/node_modules --entrypoint 'npx' node:$VERSION-slim vitest run --no-file-parallelism ; done" + "build": "tsdown src/main.ts --publint --unused --dts --format esm --format cjs && rm dist/main.d.cts", + "check": "bun run build && bun run lint && bun run test", + "lint": "eslint . && tsc && (cd test && tsc)", + "test": "rm -r dist/vitest ; tsc -p tsconfig.test.json && npm run test:vitest ; rm -r dist/vitest", + "test:vitest": "vitest run --no-file-parallelism" }, "repository": { "type": "git", diff --git a/src/main.ts b/src/main.ts index 5cb3e52..2be80c7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,8 +11,8 @@ import { } from '@hyperapi/core'; import { IP } from '@kirick/ip'; import { parseArguments } from './utils/parse.js'; -import { type HyperAPINodeRequest } from './request.js'; -import { ResponseSchema } from './types.js'; +import type { HyperAPINodeRequest } from './request.js'; +import type { ResponseSchema } from './types.js'; import { hyperApiErrorToResponse } from './utils/hyperapi-error.js'; import { isHttpMethodSupported, @@ -59,7 +59,7 @@ export class HyperAPINodeDriver implements HyperAPIDriver) { + start(handler: HyperAPIDriverHandler): void { this.handler = handler; this.server = createServer( this.server_options, @@ -102,7 +102,7 @@ export class HyperAPINodeDriver implements HyperAPIDriver; class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ message: string }> { - data = { + override data = { message: 'Could not parse body', }; - httpStatus = 400; + override httpStatus = 400; constructor(message?: string) { super(); @@ -36,10 +36,10 @@ class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ message: } class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError<{ message: string }> { - data = { + override data = { message: 'Unsupported body type', }; - httpStatus = 415; + override httpStatus = 415; constructor(mime: string) { super(); diff --git a/src/utils/parse/form-data.ts b/src/utils/parse/form-data.ts index 8226d79..41ade2b 100644 --- a/src/utils/parse/form-data.ts +++ b/src/utils/parse/form-data.ts @@ -2,12 +2,14 @@ import busboy from 'busboy'; import { Blob } from 'node:buffer'; import { IncomingMessage } from 'node:http'; +// FIXME: implement limiting of body size and read timeout + /** * Parses request body as multipart/form-data. * @param req - NodeJS request object. * @returns - JSON object. */ -export function parseFormData(req: IncomingMessage) { +export function parseFormData(req: IncomingMessage): Promise> { return new Promise>((resolve) => { const bb = busboy({ headers: req.headers, @@ -18,24 +20,18 @@ export function parseFormData(req: IncomingMessage) { bb.on( 'file', (name, file, info) => { - const file_parts: Buffer[] = []; - file.on( - 'data', - (chunk) => { - file_parts.push(chunk); - }, - ); - file.on( - 'end', - () => { - form_data[name] = new Blob( - file_parts, - { - type: info.mimeType, - }, - ); - }, - ); + const file_parts: Uint8Array[] = []; + + file.on('data', (chunk: Buffer) => { + file_parts.push(chunk as Uint8Array); + }); + + file.on('end', () => { + form_data[name] = new Blob( + file_parts, + { type: info.mimeType }, + ); + }); }, ); diff --git a/src/utils/parse/text.ts b/src/utils/parse/text.ts index 3f1ca8b..4d7eb89 100644 --- a/src/utils/parse/text.ts +++ b/src/utils/parse/text.ts @@ -1,15 +1,45 @@ import { IncomingMessage } from 'node:http'; +// FIXME: implement limiting of body size and read timeout + /** * Parses request body into text. * @param req - NodeJS request object. * @returns - */ -export async function parseText(req: IncomingMessage) { - const body_parts: Buffer[] = []; - for await (const chunk of req) { - body_parts.push(chunk); - } +export function parseText(req: IncomingMessage): Promise { + // const body_parts: Buffer[] = []; + // for await (const chunk of req) { + // body_parts.push(chunk); + // } + + // return Buffer.concat(body_parts).toString(); + + return new Promise((resolve, reject) => { + const body_parts: Uint8Array[] = []; + // Set timeout for the entire operation + // const timeout_id = setTimeout(() => reject(new Error('Request body parsing timed out')), timeout); + + req.on('error', (err) => { + // clearTimeout(timeout_id); + reject(err); + }); + + req.on('data', (chunk: Buffer) => { + // totalSize += chunk.length; + // if (totalSize > maxSize) { + // clearTimeout(timeoutId); + // reject(new Error(`Request body too large, exceeded ${maxSize} bytes`)); + // req.destroy(); // Terminate the connection + // return; + // } + + body_parts.push(chunk as Uint8Array); + }); - return Buffer.concat(body_parts).toString(); + req.on('end', () => { + // clearTimeout(timeoutId); + resolve(Buffer.concat(body_parts).toString()); + }); + }); } diff --git a/test/hyper-api/error.ts b/test/hyper-api/error.ts index 9bfc5e3..9fb8579 100644 --- a/test/hyper-api/error.ts +++ b/test/hyper-api/error.ts @@ -6,7 +6,7 @@ import { } from '@hyperapi/core'; class HyperAPILocalRateLimitError extends HyperAPIRateLimitError { - httpHeaders = { + override httpHeaders = { 'Retry-After': '3600', }; } diff --git a/test/tsconfig.json b/test/tsconfig.json index 0f6df3a..059d1f5 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,18 +1,10 @@ { - "compileOnSave": false, + "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "/dev/null", - "declaration": false, - "target": "esnext", - "module": "nodenext", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "lib": [ - "ESNext", - "ES2021.String" - ], - "skipLibCheck": true, - "strict": true, - "removeComments": false - } -} + "isolatedDeclarations": false + }, + "include": [ + "./**/*.ts", + "../src/**/*.test.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 83cd553..6efe70c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,26 @@ { - "compileOnSave": false, - "include": [ - "src/" - ], - "exclude": [ - "dist/", - "node_modules/", - "test/", - "**/*.test.*" - ], "compilerOptions": { - "outDir": "dist/esm", - "declaration": true, - "declarationDir": "dist/esm", - "target": "esnext", - "module": "nodenext", "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "lib": [ - "ESNext", - "ES2021.String" - ], "skipLibCheck": true, + "target": "es2022", + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, "strict": true, - "removeComments": false - } -} + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "module": "preserve", + "noEmit": true, + "lib": [ + "es2022" + ], + "declaration": true, + "isolatedDeclarations": true + }, + "include": [ + "src/" + ], + "exclude": [ + "**/*.test.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.test.json b/tsconfig.test.json index c17cffe..da6f84d 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -1,5 +1,11 @@ { - "compileOnSave": false, + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist/vitest", + "declaration": false, + "isolatedDeclarations": false + }, "include": [ "src/", "test/" @@ -7,20 +13,5 @@ "exclude": [ "dist/", "node_modules/" - ], - "compilerOptions": { - "outDir": "dist/vitest", - "declaration": false, - "target": "esnext", - "module": "nodenext", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "lib": [ - "ESNext", - "ES2021.String" - ], - "skipLibCheck": true, - "strict": true, - "removeComments": false - } + ] } From b4ca7540a0f735aa954611dad77272e333abd628 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sat, 24 May 2025 17:44:21 +0200 Subject: [PATCH 09/20] Update README.md, bump `@hyperapi/core` version, headers as Headers --- README.md | 171 ++++++++++++++++++++++++++++++++++++++++- bun.lock | 9 ++- dist/main.cjs | 7 +- dist/main.d.ts | 7 +- dist/main.js | 7 +- package.json | 3 +- src/main.test.ts | 13 +++- src/main.ts | 14 +++- src/request.ts | 7 +- src/utils/parse.ts | 2 +- test/hyper-api/echo.ts | 1 + 11 files changed, 221 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 95d5731..668cfc2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,169 @@ -# driver-http-node -HyperAPI HTTP driver for Node.JS +# HyperAPI HTTP Driver for Node.js + +[![npm version](https://img.shields.io/npm/v/@hyperapi/driver-node.svg)](https://www.npmjs.com/package/@hyperapi/driver-node) +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) + +HyperAPI HTTP driver for [Node.js](https://nodejs.org) built on the native `http` module. + +This driver connects your HyperAPI application to HTTP clients using Node.js's built-in server capabilities, providing reliable and efficient request handling. + +## Features + +- 🔄 **Content Type Support** - Handles JSON, form data, and multipart requests +- 🛡️ **Error Handling** - Seamless integration with HyperAPI error system +- 🧩 **Comprehensive Typing** - Full TypeScript support with HyperAPI Core +- ⚙️ **Configurable** - Customizable server options and multipart handling + +## Installation + +```bash +bun i @hyperapi/core @hyperapi/driver-node @kirick/ip +# or with pnpm +pnpm add @hyperapi/core @hyperapi/driver-node @kirick/ip +# or with npm +npm install @hyperapi/core @hyperapi/driver-node @kirick/ip +``` + +## Quick Start + +### 1. Create your HTTP server + +```typescript +import { HyperAPI } from '@hyperapi/core'; +import { HyperAPINodeDriver } from '@hyperapi/driver-node'; + +// Create a driver instance +const driver = new HyperAPINodeDriver({ + port: 3000, // HTTP server port + path: '/api/', // Base path for API endpoints (default: '/api/') + multipart_formdata_enabled: false, // Enable multipart/form-data parsing (default: false) + options: {} // Optional Node.js server options +}); + +// Initialize HyperAPI with the driver +const hyperApiCore = new HyperAPI({ + driver, + // Optional: custom root path for API methods (default: 'hyper-api' in project root) + // root: path.join(__dirname, 'api') +}); + +console.log('API server running on http://localhost:3000'); +``` + +### 2. Create your API handlers + +Example endpoint (`hyper-api/hello.[get].ts`): + +```typescript +import type { HyperAPIResponse } from '@hyperapi/core'; +import type { HyperAPINodeRequest } from '@hyperapi/driver-node'; +import * as v from 'valibot'; + +// Define your handler function +export default function(request: HyperAPINodeRequest): HyperAPIResponse { + return { + message: `Hello, ${request.args.name}!`, + timestamp: new Date().toISOString(), + clientIP: request.ip.toString(), + }; +} + +// Define input validation +export const argsValidator = v.parser( + v.strictObject({ + name: v.string('Name is required'), + }) +); +``` + +## Request Properties + +The `HyperAPINodeRequest` interface extends the base `HyperAPIRequest` from [HyperAPI Core](https://github.com/hyperapi/core) and adds HTTP-specific properties: + +```typescript +interface HyperAPINodeRequest> extends HyperAPIRequest { + url: URL; // Full URL object of the request + headers: Headers; // HTTP headers + ip: IP; // Client IP address (using @kirick/ip) +} +``` + +## Advanced Usage + +### Accessing Request Details + +```typescript +export default function(request: HyperAPINodeRequest): HyperAPIResponse { + const userAgent = request.headers['user-agent']; + const clientIP = request.ip.toString(); + const fullUrl = request.url.toString(); + + return { + userAgent, + clientIP, + fullUrl, + data: request.args + }; +} +``` + +### Handling File Uploads + +To enable `multipart/form-data` processing for file uploads: + +```typescript +const driver = new HyperAPINodeDriver({ + port: 3000, + multipart_formdata_enabled: true +}); +``` + +Then in your handler: + +```typescript +export default async function(request: HyperAPINodeRequest): Promise { + const file = request.args.myFile; // If a file was uploaded with name 'myFile', it will contain the Blob + const file_contents = await file.text(); // Read file contents as text + + return { file_contents }; +} +``` + +## Error Handling + +This driver automatically translates HyperAPI errors into appropriate HTTP responses. For example: + +```typescript +import { HyperAPIRateLimitError } from '@hyperapi/core'; + +export default function(request: HyperAPINodeRequest): HyperAPIResponse { + // Check some condition + if (isRateLimited(request.ip)) { + throw new HyperAPIRateLimitError(); + // Will return HTTP 429 with JSON {"code":7,"description":"Rate limit exceeded"} + } + + // Normal processing + return { + message: "Success" + }; +} +``` + +## TypeScript Support + +For complete type safety, specify your argument types: + +```typescript +export default function( + request: HyperAPINodeRequest<{ + id: number; + name: string; + }> +): HyperAPIResponse { + // request.args.id and request.args.name are now properly typed + return { + message: `Hello, ${request.args.name} (ID: ${request.args.id})!` + }; +} +``` diff --git a/bun.lock b/bun.lock index 6a4e85c..526b786 100644 --- a/bun.lock +++ b/bun.lock @@ -16,12 +16,13 @@ "oxc-parser": "0.71.0", "publint": "0.3.12", "tsdown": "0.12.2", + "type-fest": "^4.41.0", "typescript": "5.8.3", "unplugin-unused": "0.5.0", "vitest": "3.1.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#8894dcfe65392c9a4111c4494945817bff9f1f52", + "@hyperapi/core": "github:hyperapi/core#200cfe5c666ee72caad8208a4c954de6cc83de19", "@kirick/ip": "^0.1.1", }, }, @@ -113,7 +114,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#8894dcf", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-8894dcf"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#200cfe5", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-200cfe5"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], @@ -693,7 +694,7 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], @@ -787,6 +788,8 @@ "read-pkg-up/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "read-pkg-up/type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + "regjsparser/jsesc": ["jsesc@0.5.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="], "rolldown-plugin-dts/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], diff --git a/dist/main.cjs b/dist/main.cjs index 3823053..c57dda3 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -125,7 +125,7 @@ var HyperAPIBodyUnknownError = class extends __hyperapi_core.HyperAPIInvalidPara * @returns - Arguments. */ async function parseArguments(req, url, multipart_formdata_enabled) { - let args = {}; + let args; if (req.method === "GET" || req.method === "HEAD") args = Object.fromEntries(url.searchParams.entries()); else { const type_header = req.headers["content-type"]; @@ -270,12 +270,15 @@ var HyperAPINodeDriver = class { const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); const ip_string = req.socket.remoteAddress; if (typeof ip_string !== "string") throw new TypeError("Remote address is not a string."); + const headers = new Headers(); + for (const [key, value] of Object.entries(req.headers)) if (typeof value === "string") headers.set(key, value); + else if (Array.isArray(value)) for (const item of value) headers.append(key, item); const hyperapi_response = await this.handler({ method: http_method, path: hyperapi_method, args: hyperapi_args, url, - headers: req.headers, + headers, ip: new __kirick_ip.IP(ip_string) }); if (hyperapi_response instanceof __hyperapi_core.HyperAPIError) throw hyperapi_response; diff --git a/dist/main.d.ts b/dist/main.d.ts index 535d83a..a4feccf 100644 --- a/dist/main.d.ts +++ b/dist/main.d.ts @@ -1,14 +1,13 @@ import { ServerOptions } from "node:http"; import { HyperAPIDriver, HyperAPIDriverHandler, HyperAPIRequest } from "@hyperapi/core"; import { IP } from "@kirick/ip"; +import { EmptyObject } from "type-fest"; //#region src/request.d.ts -interface HyperAPINodeRequest = Omit<{ - p: unknown; -}, "p">> extends HyperAPIRequest { +interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { // request: Request; url: URL; - headers: Record; + headers: Headers; ip: IP; } diff --git a/dist/main.js b/dist/main.js index bd6b56f..fcfba96 100644 --- a/dist/main.js +++ b/dist/main.js @@ -102,7 +102,7 @@ var HyperAPIBodyUnknownError = class extends HyperAPIInvalidParametersError { * @returns - Arguments. */ async function parseArguments(req, url, multipart_formdata_enabled) { - let args = {}; + let args; if (req.method === "GET" || req.method === "HEAD") args = Object.fromEntries(url.searchParams.entries()); else { const type_header = req.headers["content-type"]; @@ -247,12 +247,15 @@ var HyperAPINodeDriver = class { const hyperapi_args = await parseArguments(req, url, this.multipart_formdata_enabled); const ip_string = req.socket.remoteAddress; if (typeof ip_string !== "string") throw new TypeError("Remote address is not a string."); + const headers = new Headers(); + for (const [key, value] of Object.entries(req.headers)) if (typeof value === "string") headers.set(key, value); + else if (Array.isArray(value)) for (const item of value) headers.append(key, item); const hyperapi_response = await this.handler({ method: http_method, path: hyperapi_method, args: hyperapi_args, url, - headers: req.headers, + headers, ip: new IP(ip_string) }); if (hyperapi_response instanceof HyperAPIError) throw hyperapi_response; diff --git a/package.json b/package.json index 7b6c27c..993508b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#8894dcfe65392c9a4111c4494945817bff9f1f52", + "@hyperapi/core": "github:hyperapi/core#200cfe5c666ee72caad8208a4c954de6cc83de19", "@kirick/ip": "^0.1.1" }, "devDependencies": { @@ -34,6 +34,7 @@ "oxc-parser": "0.71.0", "publint": "0.3.12", "tsdown": "0.12.2", + "type-fest": "^4.41.0", "typescript": "5.8.3", "unplugin-unused": "0.5.0", "vitest": "3.1.4" diff --git a/src/main.test.ts b/src/main.test.ts index f0d6929..1282014 100644 --- a/src/main.test.ts +++ b/src/main.test.ts @@ -19,7 +19,15 @@ const Blob = globalThis.Blob ?? BlobPolyfill; describe('args', () => { test('GET', async () => { - const response = await fetch('http://localhost:18001/api/echo?name=world'); + const response = await fetch( + 'http://localhost:18001/api/echo?name=world', + { + method: 'GET', + headers: { + 'x-test-header': 'test-value', + }, + }, + ); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -28,6 +36,7 @@ describe('args', () => { expect(body).toStrictEqual({ method: 'ALL', message: 'Hello, world!', + header_value: 'test-value', }); }); @@ -68,6 +77,7 @@ describe('args', () => { expect(body).toStrictEqual({ method: 'ALL', message: 'Hello, foo!', + header_value: null, }); }); @@ -89,6 +99,7 @@ describe('args', () => { expect(body).toStrictEqual({ method: 'ALL', message: 'Hello, bar bar!', + header_value: null, }); }); diff --git a/src/main.ts b/src/main.ts index 2be80c7..23efb7b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -148,12 +148,24 @@ export class HyperAPINodeDriver implements HyperAPIDriver = Omit<{ p: unknown }, 'p'>> extends HyperAPIRequest { +export interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { // request: Request; url: URL; - headers: Record; + headers: Headers; ip: IP; } diff --git a/src/utils/parse.ts b/src/utils/parse.ts index 2b6c564..7135a88 100644 --- a/src/utils/parse.ts +++ b/src/utils/parse.ts @@ -59,7 +59,7 @@ export async function parseArguments( url: URL, multipart_formdata_enabled: boolean, ): Promise { - let args: RequestArgs = {}; + let args: RequestArgs; if ( req.method === 'GET' diff --git a/test/hyper-api/echo.ts b/test/hyper-api/echo.ts index e66a418..ad46143 100644 --- a/test/hyper-api/echo.ts +++ b/test/hyper-api/echo.ts @@ -7,5 +7,6 @@ export default function (request: HyperAPINodeRequest<{ name: string }>): HyperA return { method: 'ALL', message: `Hello, ${request.args.name}!`, + header_value: request.headers.get('x-test-header'), }; } From f7d1d6e6c5630d083584d84a424c205ac273c6bb Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sun, 25 May 2025 00:54:51 +0200 Subject: [PATCH 10/20] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 668cfc2..719156f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # HyperAPI HTTP Driver for Node.js [![npm version](https://img.shields.io/npm/v/@hyperapi/driver-node.svg)](https://www.npmjs.com/package/@hyperapi/driver-node) -[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) +[![license](https://img.shields.io/npm/l/@hyperapi/driver-node.svg?color=blue)](https://github.com/hyperapi/driver-http-node/blob/main/LICENSE) HyperAPI HTTP driver for [Node.js](https://nodejs.org) built on the native `http` module. @@ -167,3 +167,7 @@ export default function( }; } ``` + +## Contributing + +Issues and pull requests are welcome at [our GitHub repository](https://github.com/hyperapi/driver-http-node). From 706e046cfcccb815139117a6e2495ce61a9ee198 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sun, 25 May 2025 18:15:01 +0200 Subject: [PATCH 11/20] Update package.json --- .gitignore | 4 ++-- bun.lock | 35 ++--------------------------------- package.json | 7 +++---- 3 files changed, 7 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 47b8532..f857142 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -dist/vitest -node_modules .DS_Store .env *.env +dist/vitest +node_modules diff --git a/bun.lock b/bun.lock index 526b786..895052f 100644 --- a/bun.lock +++ b/bun.lock @@ -13,7 +13,6 @@ "eslint": "9.10.0", "formdata-node": "6.0.3", "node-fetch": "^3.3.2", - "oxc-parser": "0.71.0", "publint": "0.3.12", "tsdown": "0.12.2", "type-fest": "^4.41.0", @@ -22,7 +21,7 @@ "vitest": "3.1.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#200cfe5c666ee72caad8208a4c954de6cc83de19", + "@hyperapi/core": "github:hyperapi/core#30dc86f06f4960f43a17b5cb63b6bd57740ad8be", "@kirick/ip": "^0.1.1", }, }, @@ -114,7 +113,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#200cfe5", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-200cfe5"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#30dc86f", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-30dc86f"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], @@ -138,34 +137,6 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.71.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7R7TuHWL2hZ8BbRdxXlVJTE0os7TM6LL2EX2OkIz41B3421JeIU+2YH+IV55spIUy5E5ynesLk0IdpSSPVZ25Q=="], - - "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.71.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Q7QshRy7cDvpvWAH+qy2U8O9PKo5yEKFqPruD2OSOM8igy/GLIC21dAd6iCcqXRZxaqzN9c4DaXFtEZfq4NWsw=="], - - "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.71.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-z8NNBBseLriz2p+eJ8HWC+A8P+MsO8HCtXie9zaVlVcXSiUuBroRWeXopvHN4r+tLzmN2iLXlXprJdNhXNgobQ=="], - - "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-QZQcWMduFRWddqvjgLvsWoeellFjvWqvdI0O1m5hoMEykv2/Ag8d7IZbBwRwFqKBuK4UzpBNt4jZaYzRsv1irg=="], - - "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-lTDc2WCzllVFXugUHQGR904CksA5BiHc35mcH6nJm6h0FCdoyn9zefW8Pelku5ET39JgO1OENEm/AyNvf/FzIw=="], - - "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-mAA6JGS+MB+gbN5y/KuQ095EHYGF7a/FaznM7klk5CaCap/UdiRWCVinVV6xXmejOPZMnrkr6R5Kqi6dHRsm2g=="], - - "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-PaPmIEM0yldXSrO1Icrx6/DwnMXpEOv0bDVa0LFtwy2I+aiTiX7OVRB3pJCg8FEV9P+L48s9XW0Oaz+Dz3o3sQ=="], - - "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.71.0", "", { "os": "linux", "cpu": "none" }, "sha512-+AEGO6gOSSEqWTrCCYayNMMPe/qi83o1czQ5bytEFQtyvWdgLwliqqShpJtgSLj1SNWi94HiA/VOfqqZnGE1AQ=="], - - "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.71.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-zqFnheBACFzrRl401ylXufNl1YsOdVa8jwS2iSCwJFx4/JdQhE6Y4YWoEjQ/pzeRZXwI5FX4C607rQe2YdhggQ=="], - - "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-steSQTwv3W+/hpES4/9E3vNohou1FXJLNWLDbYHDaBI9gZdYJp6zwALC8EShCz0NoQvCu4THD3IBsTBHvFBNyw=="], - - "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mV8j/haQBZRU2QnwZe0UIpnhpPBL9dFk1tgNVSH9tV7cV4xUZPn7pFDqMriAmpD7GLfmxbZMInDkujokd63M7Q=="], - - "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.71.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.10" }, "cpu": "none" }, "sha512-P8ScINpuihkkBX8BrN/4x4ka2+izncHh7/hHxxuPZDZTVMyNNnL1uSoI80tN9yN7NUtUKoi9aQUaF4h22RQcIA=="], - - "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.71.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-4jrJSdBXHmLYaghi1jvbuJmWu117wxqCpzHHgpEV9xFiRSngtClqZkNqyvcD4907e/VriEwluZ3PO3Mlp0y9cw=="], - - "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.71.0", "", { "os": "win32", "cpu": "x64" }, "sha512-zF7xF19DOoANym/xwVClYH1tiW3S70W8ZDrMHdrEB7gZiTYLCIKIRMrpLVKaRia6LwEo7X0eduwdBa5QFawxOw=="], - "@oxc-project/types": ["@oxc-project/types@0.71.0", "", {}, "sha512-5CwQ4MI+P4MQbjLWXgNurA+igGwu/opNetIE13LBs9+V93R64MLvDKOOLZIXSzEfovU3Zef3q3GjPnMTgJTn2w=="], "@pkgr/core": ["@pkgr/core@0.1.1", "", {}, "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA=="], @@ -552,8 +523,6 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "oxc-parser": ["oxc-parser@0.71.0", "", { "dependencies": { "@oxc-project/types": "^0.71.0" }, "optionalDependencies": { "@oxc-parser/binding-darwin-arm64": "0.71.0", "@oxc-parser/binding-darwin-x64": "0.71.0", "@oxc-parser/binding-freebsd-x64": "0.71.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.71.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.71.0", "@oxc-parser/binding-linux-arm64-gnu": "0.71.0", "@oxc-parser/binding-linux-arm64-musl": "0.71.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.71.0", "@oxc-parser/binding-linux-s390x-gnu": "0.71.0", "@oxc-parser/binding-linux-x64-gnu": "0.71.0", "@oxc-parser/binding-linux-x64-musl": "0.71.0", "@oxc-parser/binding-wasm32-wasi": "0.71.0", "@oxc-parser/binding-win32-arm64-msvc": "0.71.0", "@oxc-parser/binding-win32-x64-msvc": "0.71.0" } }, "sha512-RXmu7qi+67RJ8E5UhKZJdliTI+AqD3gncsJecjujcYvjsCZV9KNIfu42fQAnAfLaYZuzOMRdUYh7LzV3F1C0Gw=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], diff --git a/package.json b/package.json index 993508b..6b7bea8 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#200cfe5c666ee72caad8208a4c954de6cc83de19", + "@hyperapi/core": "github:hyperapi/core#30dc86f06f4960f43a17b5cb63b6bd57740ad8be", "@kirick/ip": "^0.1.1" }, "devDependencies": { @@ -31,7 +31,6 @@ "eslint": "9.10.0", "formdata-node": "6.0.3", "node-fetch": "^3.3.2", - "oxc-parser": "0.71.0", "publint": "0.3.12", "tsdown": "0.12.2", "type-fest": "^4.41.0", @@ -43,8 +42,8 @@ "build": "tsdown src/main.ts --publint --unused --dts --format esm --format cjs && rm dist/main.d.cts", "check": "bun run build && bun run lint && bun run test", "lint": "eslint . && tsc && (cd test && tsc)", - "test": "rm -r dist/vitest ; tsc -p tsconfig.test.json && npm run test:vitest ; rm -r dist/vitest", - "test:vitest": "vitest run --no-file-parallelism" + "test": "npm run test:vitest", + "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --no-file-parallelism ; rm -r dist/vitest" }, "repository": { "type": "git", From 720662c165d0b3eb23c77ad6e1e3c2e0a8a3fab8 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sun, 25 May 2025 18:43:09 +0200 Subject: [PATCH 12/20] Update package.json --- bun.lock | 4 ++-- package.json | 4 ++-- vitest.config.ts | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 895052f..bdb5feb 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,7 @@ "vitest": "3.1.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#30dc86f06f4960f43a17b5cb63b6bd57740ad8be", + "@hyperapi/core": "github:hyperapi/core#db67a3835ca465679c93a20c759759ba23535723", "@kirick/ip": "^0.1.1", }, }, @@ -113,7 +113,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#30dc86f", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-30dc86f"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#db67a38", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-db67a38"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], diff --git a/package.json b/package.json index 6b7bea8..c371350 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#30dc86f06f4960f43a17b5cb63b6bd57740ad8be", + "@hyperapi/core": "github:hyperapi/core#db67a3835ca465679c93a20c759759ba23535723", "@kirick/ip": "^0.1.1" }, "devDependencies": { @@ -40,7 +40,7 @@ }, "scripts": { "build": "tsdown src/main.ts --publint --unused --dts --format esm --format cjs && rm dist/main.d.cts", - "check": "bun run build && bun run lint && bun run test", + "check": "bun run lint && bun run build && bun run test", "lint": "eslint . && tsc && (cd test && tsc)", "test": "npm run test:vitest", "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --no-file-parallelism ; rm -r dist/vitest" diff --git a/vitest.config.ts b/vitest.config.ts index b2a9b1c..861826c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable n/no-unpublished-import */ /* eslint-disable no-restricted-exports */ import { defineConfig } from 'vitest/config'; From 23ab4743571e8c7ce6bc8e9a834658d1dd92e3c5 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Wed, 28 May 2025 21:09:10 +0200 Subject: [PATCH 13/20] Update dependencies --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index bdb5feb..fc51ce1 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,7 @@ "vitest": "3.1.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#db67a3835ca465679c93a20c759759ba23535723", + "@hyperapi/core": "github:hyperapi/core#1cd49ca6cd7e875de1a848e9f52be4141f8d55f7", "@kirick/ip": "^0.1.1", }, }, @@ -113,7 +113,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#db67a38", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-db67a38"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#1cd49ca", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-1cd49ca"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], diff --git a/package.json b/package.json index c371350..c7f7c98 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#db67a3835ca465679c93a20c759759ba23535723", + "@hyperapi/core": "github:hyperapi/core#1cd49ca6cd7e875de1a848e9f52be4141f8d55f7", "@kirick/ip": "^0.1.1" }, "devDependencies": { From 7fbf2e7eaca3b12967ee4a720fa66a8fe7413cf4 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Mon, 8 Sep 2025 15:58:44 +0200 Subject: [PATCH 14/20] Add biome, bump dependencies --- .oxlintrc.json | 9 + .vscode/settings.json | 8 + .zed/settings.json | 12 + biome.json | 32 +++ bun.lock | 450 ++++++++++++++++++----------------- dist/main.cjs | 95 ++++---- dist/main.d.cts | 55 +++++ dist/main.d.ts | 9 +- dist/main.js | 82 +++---- eslint.config.js | 5 +- package.json | 29 ++- src/main.test.ts | 139 ++++------- src/main.ts | 90 +++---- src/request.ts | 4 +- src/utils/http.ts | 36 ++- src/utils/hyperapi-error.ts | 12 +- src/utils/is-record.ts | 12 +- src/utils/parse.ts | 72 +++--- src/utils/parse/form-data.ts | 56 ++--- test/hyper-api/echo-file.ts | 6 +- test/hyper-api/echo.ts | 4 +- test/hyper-api/error.ts | 5 +- test/tsconfig.json | 7 +- tsconfig.json | 14 +- tsconfig.test.json | 10 +- vitest.config.ts | 4 +- 26 files changed, 663 insertions(+), 594 deletions(-) create mode 100644 .oxlintrc.json create mode 100644 .vscode/settings.json create mode 100644 .zed/settings.json create mode 100644 biome.json create mode 100644 dist/main.d.cts diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..13b8341 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "extends": [ + "./node_modules/@kirick/lint/configs/oxlint/correctness.json", + "./node_modules/@kirick/lint/configs/oxlint/perf.json", + "./node_modules/@kirick/lint/configs/oxlint/restriction.json" + ], + "ignorePatterns": ["dist"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..99357f2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "biomejs.biome", + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" + } +} diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..24cc794 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,12 @@ +{ + "format_on_save": "on", + "formatter": { + "language_server": { + "name": "biome" + } + }, + "code_actions_on_format": { + "source.fixAll.biome": true, + "source.organizeImports.biome": true + } +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..91c3d81 --- /dev/null +++ b/biome.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": ["**", "!**/dist/**"] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab", + "bracketSpacing": true + }, + "linter": { + "enabled": false + }, + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + } +} diff --git a/bun.lock b/bun.lock index fc51ce1..c359d10 100644 --- a/bun.lock +++ b/bun.lock @@ -7,47 +7,63 @@ "busboy": "1.6.0", }, "devDependencies": { - "@kirick/eslint-config": "^0.1.30", + "@biomejs/biome": "2.1.1", + "@kirick/lint": "0.2.8", "@types/busboy": "^1.5.4", "@types/node": "^20", - "eslint": "9.10.0", + "eslint": "9.27.0", "formdata-node": "6.0.3", - "node-fetch": "^3.3.2", + "node-fetch": "3.3.2", + "oxlint": "1.3.0", "publint": "0.3.12", - "tsdown": "0.12.2", - "type-fest": "^4.41.0", - "typescript": "5.8.3", - "unplugin-unused": "0.5.0", - "vitest": "3.1.4", + "tsdown": "0.14.2", + "type-fest": "4.41.0", + "typescript": "5.9.2", + "unplugin-unused": "0.5.2", + "vitest": "3.2.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#1cd49ca6cd7e875de1a848e9f52be4141f8d55f7", + "@hyperapi/core": "github:hyperapi/core#2b7ad6c0f24ae1f84f31702e349ce3c6b77e475c", "@kirick/ip": "^0.1.1", }, }, }, "packages": { - "@babel/code-frame": ["@babel/code-frame@7.24.7", "", { "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" } }, "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA=="], - - "@babel/generator": ["@babel/generator@7.27.1", "", { "dependencies": { "@babel/parser": "^7.27.1", "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w=="], + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.24.7", "", {}, "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], + + "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], + + "@biomejs/biome": ["@biomejs/biome@2.1.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.1", "@biomejs/cli-darwin-x64": "2.1.1", "@biomejs/cli-linux-arm64": "2.1.1", "@biomejs/cli-linux-arm64-musl": "2.1.1", "@biomejs/cli-linux-x64": "2.1.1", "@biomejs/cli-linux-x64-musl": "2.1.1", "@biomejs/cli-win32-arm64": "2.1.1", "@biomejs/cli-win32-x64": "2.1.1" }, "bin": { "biome": "bin/biome" } }, "sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA=="], - "@babel/highlight": ["@babel/highlight@7.24.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g=="], - "@babel/parser": ["@babel/parser@7.27.2", "", { "dependencies": { "@babel/types": "^7.27.1" }, "bin": "./bin/babel-parser.js" }, "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A=="], - "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q=="], - "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g=="], - "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg=="], - "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.46.0", "", { "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.0.0" } }, "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ=="], + "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.50.2", "", { "dependencies": { "@types/estree": "^1.0.6", "@typescript-eslint/types": "^8.11.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" } }, "sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], @@ -97,25 +113,35 @@ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.1", "", {}, "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], - "@eslint/config-array": ["@eslint/config-array@0.18.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw=="], + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.1.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.10.0", "", {}, "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g=="], + "@eslint/js": ["@eslint/js@9.27.0", "", {}, "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA=="], - "@eslint/object-schema": ["@eslint/object-schema@2.1.4", "", {}, "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ=="], + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.1.0", "", { "dependencies": { "levn": "^0.4.1" } }, "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#2b7ad6c", { "dependencies": { "itty-router": "5.0.22" } }, "hyperapi-core-2b7ad6c"], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#1cd49ca", { "dependencies": { "itty-router": "^5.0.18" } }, "hyperapi-core-1cd49ca"], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -123,13 +149,13 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - - "@kirick/eslint-config": ["@kirick/eslint-config@0.1.30", "", { "dependencies": { "@stylistic/eslint-plugin": "^2.6.1", "eslint-plugin-jsdoc": "^48.11.0", "eslint-plugin-n": "^17.10.2", "eslint-plugin-promise": "^7.1.0", "eslint-plugin-unicorn": "^55.0.0", "eslint-plugin-vue": "^9.27.0", "globals": "^15.9.0", "typescript-eslint": "^8.0.0" } }, "sha512-RjmSG2380JS/MCh80hnLpVKBI0V5+ggGugTXVK+2Gf0sTq54R5KzX9rKkE1FFIqedG7ZkGyDuipJc7zDYVBQ4g=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], "@kirick/ip": ["@kirick/ip@0.1.1", "", { "dependencies": { "ip-address": "9.0.5" } }, "sha512-i65LRnc33KnE9cPBt0QzT2z/+/lg8351Ao6A2xCQ27GqgNjdjoFh20xrXPu3FkpX8p5W4TbRj10xEiQS6MjZZw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="], + "@kirick/lint": ["@kirick/lint@0.2.8", "", { "dependencies": { "@stylistic/eslint-plugin": "^4.4.0", "eslint": "9.27.0", "eslint-plugin-jsdoc": "50.6.17", "eslint-plugin-n": "^17.18.0", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vue": "^10.1.0", "typescript-eslint": "8.32.1" }, "bin": { "lint": "dist/main.js" } }, "sha512-Qwak6XMmuThAwLhkJeuPe13CGTpydN/pLmzsiazARmerssGjQZce7+R3ZFPwhNOZ5wl2NltxvWqqx8NmNCenbA=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.3", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@tybys/wasm-util": "^0.10.0" } }, "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -137,39 +163,59 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@oxc-project/types": ["@oxc-project/types@0.71.0", "", {}, "sha512-5CwQ4MI+P4MQbjLWXgNurA+igGwu/opNetIE13LBs9+V93R64MLvDKOOLZIXSzEfovU3Zef3q3GjPnMTgJTn2w=="], + "@oxc-project/runtime": ["@oxc-project/runtime@0.87.0", "", {}, "sha512-ky2Hqi2q/uGX36UfY79zxMbUqiNIl1RyKKVJfFenG70lbn+/fcaKBVTbhmUwn8a2wPyv2gNtDQxuDytbKX9giQ=="], + + "@oxc-project/types": ["@oxc-project/types@0.87.0", "", {}, "sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g=="], + + "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@1.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TcCaETXYfiEfS+u/gZNND4WwEEtnJJjqg8BIC56WiCQDduYTvmmbQ0vxtqdNXlFzlvmRpZCSs7qaqXNy8/8FLA=="], + + "@oxlint/darwin-x64": ["@oxlint/darwin-x64@1.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-REgq9s1ZWuh++Vi+mUPNddLTp/D+iu+T8nLd3QM1dzQoBD/SZ7wRX3Mdv8QGT/m8dknmDBQuKAP6T47ox9HRSA=="], + + "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QAS8AWKDcDeUe8mJaw/pF2D9+js8FbFTo75AiekZKNm9V6QAAiCkyvesmILD8RrStw9aV2D/apOD71vsfcDoGA=="], + + "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rAbz0KFkk5GPdERoFO4ZUZmVkECnHXjRG0O2MeT5zY7ddlyZUjEk1cWjw+HCtWVdKkqhZJeNFMuEiRLkpzBIIw=="], - "@pkgr/core": ["@pkgr/core@0.1.1", "", {}, "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA=="], + "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-6uLO1WsJwCtVNGHtjXwg2TRvxQYttYJKMjSdv6RUXGWY1AI+/+yHzvu+phU/F40uNC7CFhFnqWDuPaSZ49hdAQ=="], + + "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+vrmJUHgtJmgIo+L9eTP04NI/OQNCOZtQo6I49qGWc9cpr+0MnIh9KMcyAOxmzVTF5g+CF1I/1bUz4pk4I3LDw=="], + + "@oxlint/win32-arm64": ["@oxlint/win32-arm64@1.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-k+ETUVl+O3b8Rcd2PP5V3LqQ2QoN/TOX2f19XXHZEynbVLY3twLYPb3hLdXqoo7CKRq3RJdTfn1upHH48/qrZQ=="], + + "@oxlint/win32-x64": ["@oxlint/win32-x64@1.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-nWSgK0fT02TQ/BiAUCd13BaobtHySkCDcQaL+NOmhgeb0tNWjtYiktuluahaIqFcYJPWczVlbs8DU/Eqo8vsug=="], "@publint/pack": ["@publint/pack@0.1.2", "", {}, "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw=="], - "@quansync/fs": ["@quansync/fs@0.1.3", "", { "dependencies": { "quansync": "^0.2.10" } }, "sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg=="], + "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.36", "", { "os": "android", "cpu": "arm64" }, "sha512-0y4+MDSw9GzX4VZtATiygDv+OtijxsRtNBZW6qA3OUGi0fq6Gq+MnvFHMjdJxz3mv/thIHMmJ0AL7d8urYBCUw=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "arm64" }, "sha512-F/xv0vsxXuwpyecy3GMpXPhRLI4WogQkSYYl6hh61OfmyX4lxsemSoYQ5nlK/MopdVaT111wS1dRO2eXgzBHuA=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.51df2b7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ho2xtXwIXiSIlI0C4G9TKxeRC0BOlML1JMNILpxvdjJiN/M6zV/MYIys6ZyqIlIlLzilr0Wu4KIpb+mnR2E7tQ=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "x64" }, "sha512-FX3x/GSybYRt4/fUljqIMuB7JRJThxnwzjK9Ka4qKwSw92RNmxRtw+NEkpuKq/Tzcq5qpnvSWudKmjcbBSMH1g=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.51df2b7", "", { "os": "darwin", "cpu": "x64" }, "sha512-f9llkFu7gAL/uvbU9JQtMgrPXE70HZ8VXHMD6ENvdzmM+Z/Bh8WnquwbgpSSnj9M111Tg4gyZe3R31CTYlcQow=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.36", "", { "os": "freebsd", "cpu": "x64" }, "sha512-j7Y/OG4XxICRgGMLB7VVbROAzdnvtr0ZTBBYnv53KZESE97Ta4zXfGhEe+EiXLRKW8JWSMeNumOaBrWAXDMiZQ=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.51df2b7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZP3+8qmcUkxzXMvGVyaPKKUswhyRfBo4EGEo4FOxQ6+D+XjTaL4rSGOs979CBpfk7f3HIxyKEXvWokv6fsdTdw=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm" }, "sha512-j3rDknokIJZ+iVGjWw2cVRgKLmk9boUoHtp2k3Ba6p7vWIv+D/YypQKHxAayyzvUkxTBZsw64Ojq5/zrytRODA=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm" }, "sha512-lb4TCuCGimXdImS1fiZqfZBObgxZr32P8u1T8FeifdwGCieXnz5CjoywDyrhZuZMoLU3UU3PJV7WcD8721jK/g=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Ds2nl3ZhC0eaSJnw7dQ5uCK1cmaBKC+EL7IIpjTpzqY10y1xCn5w6gTFKzpqKhD2nSraY4MHOyAnE+zmSAZRA=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm64" }, "sha512-07FhoEJsku912alIEfTf1QmEMWxjuQxkPD6ewWtyyhEZHDF5XhpKpat/GFEDic/doXVRggRvxIZccyS5Kyu45A=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-0Qa4b3gv956iSdJQplV1xdI9ALbEdNo5xsFpcLU4mW2A+CqWNenVHqcHbCvwvKTP07yX6yoUvUqZR1CBxxQShg=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "arm64" }, "sha512-QUHSOXq6F+Z4eBud86nGq2C/KhdNs980LLQcAFDIr6tPw5fN8Z2Zqy61XeWGB01Y30G5esiMzsJqsHHQDqSvsg=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-wUdZljtx9W1V9KlnmwPgF0o2ZPFq2zffr/q+wM+GUrSFIJNmP9w0zgyl1coCt1ESnNyYYyJh8T1bqvx8+16SqA=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "x64" }, "sha512-VdsjRgP2VlAJqbuHdY3Xh37+yU7H+KYy3fA2+falRGlhko20/Ch8V7+7SizTu2LfKgvd1LVhQek8InnmojX0tA=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-Up56sJMDSKYi92/28lq9xB2wonuCwVnqBzjRnKmQauZJ5QOor9h1RtcMeCzSxg4ReMsNvrdYomBogewcZgKEww=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.51df2b7", "", { "os": "linux", "cpu": "x64" }, "sha512-zbilaXq6n+FerHarckH20bh5QgSPO9dCC4BfAzXidaji/eMRO0gfjFjKJpVx0gxwc+LVBjdHDKB0DplGZiPMEw=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.36", "", { "os": "none", "cpu": "arm64" }, "sha512-qX3covX7EX00yrgQl3oi8GuRTS1XFe+YHm+sGsxQvPok+r7Ct2eDFpLmmw7wajZ2SuvAJYSo/9BXLSCGR0ve2w=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.51df2b7", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.4" }, "cpu": "none" }, "sha512-iqvvLmCl9n3TzE6QLZ1ZRYigavEoOVr33Q6qoLbDHnnXZqp1V9APLckbv8E9qaukDmbVP3dOCr/dD7AT+GsE3w=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.36", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-phFsiR97/nbQEtyo5GTPX4h/Ootz0Pdd7P7+gTmkiashePwPUik5aoMAluvzY1tTUAfhdrFR2Y8WiWbnxnsSrQ=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "arm64" }, "sha512-ey1jfhd5BFn4bIJjQAVNclkDCl9mg9b96LyDHVETkZZrmAV8zSaE0kazXe5eWn8n7p0RH2t1cOiQWVcXrFVh0g=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "arm64" }, "sha512-dvvByfl7TRVhD9zY/VJ94hOVJmpN8Cfxl/A77yJ/oKV67IPEXx9hRUIhuL/V9eJ0RphNbLo4VKxdVuZ+wzEWTA=="], - "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "ia32" }, "sha512-RBWTjyturLAPInDJH+945twk31bkEw4t0wcWZFXzGFGN6fjeF0Jlj9fPQ3+TO3GhqAgeLymraFztJJdLVc7hSg=="], + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "ia32" }, "sha512-n7odfY4zatppNGY/EE8wE8B78wIxlQzBaY7Ycyjun+HvYu4dJgz8A4JCKHhyYYoEA8+VXO167Or4EJ9SyBLNnw=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.51df2b7", "", { "os": "win32", "cpu": "x64" }, "sha512-umDrroMuEfK3xYcRvr6p7u1AUwv3IoY2Sl6LlBZ5ncOAZ/OQo/41wHwUHtN+PRE02/BI8f84HMZrMR+rJgkmog=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "x64" }, "sha512-ik9dlOa/bhRk+8NmbqCEZm9BBPy5UfSOg/Y6cAQac29Aw2/uoyoBbFUBFUKMsvfLg8F0dNxUOsT3IcVlfOJu0g=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.9-commit.51df2b7", "", {}, "sha512-A+2WuD4O5309iooTWXMS0vMfb44bKJUOCwJj2oBYvOpaNT3VHFmgLdx++NTlKh/3hJ8Xa+Zy8c34z0EBQSU+mw=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.36", "", {}, "sha512-qa+gfzhv0/Xv52zZInENLu6JbsnSjSExD7kTaNm7Qn5LUIH6IQb7l9pB+NrsU5/Bvt9aqcBTdRGc7x1DYMTiqQ=="], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg=="], @@ -203,59 +249,61 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA=="], - "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@2.8.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.4.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow=="], + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@4.4.1", "", { "dependencies": { "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], "@types/busboy": ["@types/busboy@1.5.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw=="], + "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], - "@types/node": ["@types/node@20.16.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + "@types/node": ["@types/node@20.16.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.6.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/type-utils": "8.6.0", "@typescript-eslint/utils": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.6.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/types": "8.6.0", "@typescript-eslint/typescript-estree": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0" } }, "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.6.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.6.0", "@typescript-eslint/utils": "8.6.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" } }, "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.6.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/types": "8.6.0", "@typescript-eslint/typescript-estree": "8.6.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="], "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg=="], - "@vitest/expect": ["@vitest/expect@3.1.4", "", { "dependencies": { "@vitest/spy": "3.1.4", "@vitest/utils": "3.1.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA=="], + "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], - "@vitest/mocker": ["@vitest/mocker@3.1.4", "", { "dependencies": { "@vitest/spy": "3.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA=="], + "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.1.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg=="], + "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], - "@vitest/runner": ["@vitest/runner@3.1.4", "", { "dependencies": { "@vitest/utils": "3.1.4", "pathe": "^2.0.3" } }, "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ=="], + "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], - "@vitest/snapshot": ["@vitest/snapshot@3.1.4", "", { "dependencies": { "@vitest/pretty-format": "3.1.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg=="], + "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], - "@vitest/spy": ["@vitest/spy@3.1.4", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg=="], + "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], - "@vitest/utils": ["@vitest/utils@3.1.4", "", { "dependencies": { "@vitest/pretty-format": "3.1.4", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg=="], + "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], - "acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@4.0.0", "", {}, "sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw=="], + "ansis": ["ansis@4.1.0", "", {}, "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w=="], "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], @@ -263,11 +311,11 @@ "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - "ast-kit": ["ast-kit@2.0.0", "", { "dependencies": { "@babel/parser": "^7.27.2", "pathe": "^2.0.3" } }, "sha512-P63jzlYNz96MF9mCcprU+a7I5/ZQ5QAn3y+mZcPWEcGV3CHF/GWnkFPj3oCrWLUjL47+PD9PNiCUdXxw0cWdsg=="], + "ast-kit": ["ast-kit@2.1.2", "", { "dependencies": { "@babel/parser": "^7.28.0", "pathe": "^2.0.3" } }, "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "birpc": ["birpc@2.3.0", "", {}, "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g=="], + "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="], "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], @@ -275,9 +323,9 @@ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.23.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA=="], + "browserslist": ["browserslist@4.25.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg=="], - "builtin-modules": ["builtin-modules@3.3.0", "", {}, "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="], + "builtin-modules": ["builtin-modules@5.0.0", "", {}, "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg=="], "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], @@ -285,7 +333,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001660", "", {}, "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001741", "", {}, "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw=="], "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], @@ -295,7 +343,7 @@ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "ci-info": ["ci-info@4.0.0", "", {}, "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg=="], + "ci-info": ["ci-info@4.3.0", "", {}, "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="], "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], @@ -309,15 +357,15 @@ "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "core-js-compat": ["core-js-compat@3.38.1", "", { "dependencies": { "browserslist": "^4.23.3" } }, "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw=="], + "core-js-compat": ["core-js-compat@3.45.1", "", { "dependencies": { "browserslist": "^4.25.3" } }, "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA=="], - "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - "debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], @@ -327,16 +375,14 @@ "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], - "dts-resolver": ["dts-resolver@2.0.1", "", { "peerDependencies": { "oxc-resolver": "^9.0.2" }, "optionalPeers": ["oxc-resolver"] }, "sha512-Pe2kqaQTNVxleYpt9Q9658fn6rEpoZbMbDpEBbcU6pnuGM3Q0IdM+Rv67kN6qcyp8Bv2Uv9NYy5Y1rG1LSgfoQ=="], + "dts-resolver": ["dts-resolver@2.1.2", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg=="], - "electron-to-chromium": ["electron-to-chromium@1.5.25", "", {}, "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g=="], + "electron-to-chromium": ["electron-to-chromium@1.5.214", "", {}, "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q=="], - "empathic": ["empathic@1.1.0", "", {}, "sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA=="], + "empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], "enhanced-resolve": ["enhanced-resolve@5.17.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg=="], - "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], @@ -345,27 +391,27 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.10.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "9.10.0", "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw=="], + "eslint": ["eslint@9.27.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.27.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q=="], "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], "eslint-plugin-es-x": ["eslint-plugin-es-x@7.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ=="], - "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@48.11.0", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.46.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.5", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports": "^2.1.1", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", "synckit": "^0.9.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA=="], + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@50.6.17", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.50.1", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports-exports": "^0.2.4", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ=="], - "eslint-plugin-n": ["eslint-plugin-n@17.10.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "enhanced-resolve": "^5.17.0", "eslint-plugin-es-x": "^7.5.0", "get-tsconfig": "^4.7.0", "globals": "^15.8.0", "ignore": "^5.2.4", "minimatch": "^9.0.5", "semver": "^7.5.3" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw=="], + "eslint-plugin-n": ["eslint-plugin-n@17.21.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3", "ts-declaration-location": "^1.0.6" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw=="], - "eslint-plugin-promise": ["eslint-plugin-promise@7.1.0", "", { "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ=="], + "eslint-plugin-promise": ["eslint-plugin-promise@7.2.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@55.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.5", "@eslint-community/eslint-utils": "^4.4.0", "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.37.0", "esquery": "^1.5.0", "globals": "^15.7.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", "regjsparser": "^0.10.0", "semver": "^7.6.1", "strip-indent": "^3.0.0" }, "peerDependencies": { "eslint": ">=8.56.0" } }, "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@59.0.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "@eslint-community/eslint-utils": "^4.5.1", "@eslint/plugin-kit": "^0.2.7", "ci-info": "^4.2.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.41.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", "globals": "^16.0.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.1", "strip-indent": "^4.0.0" }, "peerDependencies": { "eslint": ">=9.22.0" } }, "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q=="], - "eslint-plugin-vue": ["eslint-plugin-vue@9.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g=="], + "eslint-plugin-vue": ["eslint-plugin-vue@10.4.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "optionalPeers": ["@typescript-eslint/parser"] }, "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw=="], - "eslint-scope": ["eslint-scope@8.0.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], - "eslint-visitor-keys": ["eslint-visitor-keys@4.0.0", "", {}, "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw=="], + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "espree": ["espree@10.1.0", "", { "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" } }, "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], @@ -379,7 +425,7 @@ "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], - "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -391,7 +437,7 @@ "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], - "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], @@ -401,6 +447,8 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], @@ -411,13 +459,13 @@ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "get-tsconfig": ["get-tsconfig@4.8.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg=="], + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@15.9.0", "", {}, "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA=="], + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], @@ -425,27 +473,19 @@ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], - "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - - "is-builtin-module": ["is-builtin-module@3.2.1", "", { "dependencies": { "builtin-modules": "^3.3.0" } }, "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A=="], - - "is-core-module": ["is-core-module@2.15.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ=="], + "is-builtin-module": ["is-builtin-module@5.0.0", "", { "dependencies": { "builtin-modules": "^5.0.0" } }, "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -453,11 +493,9 @@ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "itty-router": ["itty-router@5.0.18", "", {}, "sha512-mK3ReOt4ARAGy0V0J7uHmArG2USN2x0zprZ+u+YgmeRjXTDbaowDy3kPcsmQY6tH+uHhDgpWit9Vqmv/4rTXwA=="], + "itty-router": ["itty-router@5.0.22", "", {}, "sha512-9hmdGErWdYDOurGYxSbqLhy4EFReIwk71hMZTJ5b+zfa2zjMNV1ftFno2b8VjAQvX615gNB8Qxbl9JMRqHnIVA=="], "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], @@ -467,14 +505,12 @@ "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], - "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.0.0", "", {}, "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.1.0", "", {}, "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg=="], - "jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], @@ -483,15 +519,13 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], @@ -515,34 +549,30 @@ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - "node-releases": ["node-releases@2.0.18", "", {}, "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="], - - "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], + "node-releases": ["node-releases@2.0.20", "", {}, "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA=="], "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "oxlint": ["oxlint@1.3.0", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "1.3.0", "@oxlint/darwin-x64": "1.3.0", "@oxlint/linux-arm64-gnu": "1.3.0", "@oxlint/linux-arm64-musl": "1.3.0", "@oxlint/linux-x64-gnu": "1.3.0", "@oxlint/linux-x64-musl": "1.3.0", "@oxlint/win32-arm64": "1.3.0", "@oxlint/win32-x64": "1.3.0" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-PzAOmPxnXYpVF1q6h9pkOPH6uJ/44XrtFWJ8JcEMpoEq9HISNelD3lXhACtOAW8CArjLy/qSlu2KkyPxnXgctA=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-imports": ["parse-imports@2.1.1", "", { "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" } }, "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA=="], + "parse-imports-exports": ["parse-imports-exports@0.2.4", "", { "dependencies": { "parse-statements": "1.0.11" } }, "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ=="], - "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "parse-statements": ["parse-statements@1.0.11", "", {}, "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], @@ -551,7 +581,7 @@ "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], @@ -565,21 +595,15 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "read-pkg": ["read-pkg@5.2.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" } }, "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="], - - "read-pkg-up": ["read-pkg-up@7.0.1", "", { "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" } }, "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="], - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], - "regjsparser": ["regjsparser@0.10.0", "", { "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA=="], - - "resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -587,9 +611,9 @@ "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], - "rolldown": ["rolldown@1.0.0-beta.9-commit.51df2b7", "", { "dependencies": { "@oxc-project/types": "0.71.0", "@rolldown/pluginutils": "1.0.0-beta.9-commit.51df2b7", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-darwin-arm64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-darwin-x64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-freebsd-x64": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.9-commit.51df2b7", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.9-commit.51df2b7" }, "peerDependencies": { "@oxc-project/runtime": "0.71.0" }, "optionalPeers": ["@oxc-project/runtime"], "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-jsHj8vikf9qezv+Ct2sL1gHgIXVq+3NATCcY24lnJNdHvmc2t9aRjuMp5nUCzZ4aFTpRFJmucSOgqfvruo4/ew=="], + "rolldown": ["rolldown@1.0.0-beta.36", "", { "dependencies": { "@oxc-project/runtime": "=0.87.0", "@oxc-project/types": "=0.87.0", "@rolldown/pluginutils": "1.0.0-beta.36", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-x64": "1.0.0-beta.36", "@rolldown/binding-freebsd-x64": "1.0.0-beta.36", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.36", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.36", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.36", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.36", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.36" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-eethnJ/UfQWg2VWBDDMEu7IDvEh4WPbPb1azPWDCHcuOwoPT9C2NT4Y/ecZztCl9OBzXoA+CXXb5MS+qbukAig=="], - "rolldown-plugin-dts": ["rolldown-plugin-dts@0.13.4", "", { "dependencies": { "@babel/generator": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1", "ast-kit": "^2.0.0", "birpc": "^2.3.0", "debug": "^4.4.1", "dts-resolver": "^2.0.1", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~2.2.0" }, "optionalPeers": ["typescript", "vue-tsc"] }, "sha512-2+3GnKj6A3wKfyomUKfONRHjgKE85X4PcgW1b84KkHvuN3mUuUiOMseLKafFLMF6NkqQPAJ3FErwtC4HuwIswg=="], + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="], "rollup": ["rollup@4.21.3", "", { "dependencies": { "@types/estree": "1.0.5" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.21.3", "@rollup/rollup-android-arm64": "4.21.3", "@rollup/rollup-darwin-arm64": "4.21.3", "@rollup/rollup-darwin-x64": "4.21.3", "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", "@rollup/rollup-linux-arm-musleabihf": "4.21.3", "@rollup/rollup-linux-arm64-gnu": "4.21.3", "@rollup/rollup-linux-arm64-musl": "4.21.3", "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", "@rollup/rollup-linux-riscv64-gnu": "4.21.3", "@rollup/rollup-linux-s390x-gnu": "4.21.3", "@rollup/rollup-linux-x64-gnu": "4.21.3", "@rollup/rollup-linux-x64-musl": "4.21.3", "@rollup/rollup-win32-arm64-msvc": "4.21.3", "@rollup/rollup-win32-ia32-msvc": "4.21.3", "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA=="], @@ -605,12 +629,8 @@ "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - "slashes": ["slashes@3.0.12", "", {}, "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA=="], - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], @@ -625,39 +645,37 @@ "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "strip-indent": ["strip-indent@4.0.0", "", { "dependencies": { "min-indent": "^1.0.1" } }, "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], - "synckit": ["synckit@0.9.1", "", { "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" } }, "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tinypool": ["tinypool@1.0.2", "", {}, "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA=="], + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], + "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], - "tsdown": ["tsdown@0.12.2", "", { "dependencies": { "ansis": "^4.0.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.1", "empathic": "^1.1.0", "hookable": "^5.5.3", "rolldown": "1.0.0-beta.9-commit.51df2b7", "rolldown-plugin-dts": "^0.13.4", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.13", "unconfig": "^7.3.2" }, "peerDependencies": { "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.js" } }, "sha512-JbBhVW799a1aOt1g8tNw5MGRuYm+xZWBkj9jMOdJJ6zSFT/pAewdQytgtgBemz4Wv3pmRLZNPK9YqUu1IVuIqA=="], + "ts-declaration-location": ["ts-declaration-location@1.0.7", "", { "dependencies": { "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": ">=4.0.0" } }, "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA=="], + + "tsdown": ["tsdown@0.14.2", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.15.8", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A=="], "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], @@ -665,31 +683,29 @@ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], - "typescript-eslint": ["typescript-eslint@8.6.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.6.0", "@typescript-eslint/parser": "8.6.0", "@typescript-eslint/utils": "8.6.0" } }, "sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA=="], + "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], - "unconfig": ["unconfig@7.3.2", "", { "dependencies": { "@quansync/fs": "^0.1.1", "defu": "^6.1.4", "jiti": "^2.4.2", "quansync": "^0.2.8" } }, "sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg=="], + "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "unplugin": ["unplugin@2.3.4", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg=="], + "unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], - "unplugin-unused": ["unplugin-unused@0.5.0", "", { "dependencies": { "js-tokens": "^9.0.1", "picocolors": "^1.1.1", "pkg-types": "^2.1.0", "unplugin": "^2.3.2" } }, "sha512-czXny3h/P/Tl5ZOnV5tSf6kswAniHjgJF0slpzBPLkq0zGGKDYa1jgWMAdbWJNu7B1YSmBJY4zf3Q/v9w0+/cg=="], + "unplugin-unused": ["unplugin-unused@0.5.2", "", { "dependencies": { "js-tokens": "^9.0.1", "picocolors": "^1.1.1", "pkg-types": "^2.2.0", "unplugin": "^2.3.6" } }, "sha512-fn0DZrp96+NYo4U5UbLp1ZmZpBk/Z1RhjG2LvXfQxxw82dzciBxmx04ZgATxLZDD4HcGhdWlLIm2Gz1SVIBhDQ=="], - "update-browserslist-db": ["update-browserslist-db@1.1.0", "", { "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - "vite": ["vite@5.4.6", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q=="], - "vite-node": ["vite-node@3.1.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA=="], + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], - "vitest": ["vitest@3.1.4", "", { "dependencies": { "@vitest/expect": "3.1.4", "@vitest/mocker": "3.1.4", "@vitest/pretty-format": "^3.1.4", "@vitest/runner": "3.1.4", "@vitest/snapshot": "3.1.4", "@vitest/spy": "3.1.4", "@vitest/utils": "3.1.4", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.13", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.1.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.1.4", "@vitest/ui": "3.1.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ=="], + "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], "vue-eslint-parser": ["vue-eslint-parser@9.4.3", "", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg=="], @@ -707,82 +723,82 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "@babel/code-frame/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@babel/highlight/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], - "@babel/highlight/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + "@jridgewell/remapping/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], - "@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + "@jridgewell/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0" } }, "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw=="], - "@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g=="], - "eslint-compat-utils/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "eslint-plugin-jsdoc/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], - "eslint-plugin-n/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], - "eslint-plugin-n/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "eslint-plugin-unicorn/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "eslint-plugin-vue/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], - "eslint-plugin-vue/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "chai/loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + "eslint-compat-utils/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "parse-imports/es-module-lexer": ["es-module-lexer@1.5.4", "", {}, "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="], + "eslint-plugin-es-x/@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.1", "", {}, "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q=="], - "postcss/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + "eslint-plugin-n/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "read-pkg/type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], + "eslint-plugin-promise/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "read-pkg-up/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "eslint-plugin-unicorn/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "read-pkg-up/type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + "eslint-plugin-unicorn/@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], - "regjsparser/jsesc": ["jsesc@0.5.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="], + "eslint-plugin-unicorn/globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], - "rolldown-plugin-dts/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "eslint-plugin-vue/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "rolldown-plugin-dts/get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "rollup/@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + "postcss/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], - "tsdown/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], - "unplugin/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "rollup/@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], - "update-browserslist-db/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="], - "vite-node/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "unconfig/jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], - "vitest/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "unplugin/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "vue-eslint-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "vue-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], @@ -791,28 +807,30 @@ "vue-eslint-parser/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "eslint-plugin-n/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "eslint-plugin-n/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "eslint-plugin-vue/globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + "eslint-plugin-promise/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "read-pkg-up/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "eslint-plugin-unicorn/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + "eslint-plugin-unicorn/@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], - "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "eslint-plugin-vue/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], - "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "vue-eslint-parser/espree/acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], - "read-pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], } } diff --git a/dist/main.cjs b/dist/main.cjs index c57dda3..80bbaa2 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -21,12 +21,57 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge }) : target, mod)); //#endregion -const node_http = __toESM(require("node:http")); -const __hyperapi_core = __toESM(require("@hyperapi/core")); -const __kirick_ip = __toESM(require("@kirick/ip")); -const busboy = __toESM(require("busboy")); -const node_buffer = __toESM(require("node:buffer")); +let node_http = require("node:http"); +node_http = __toESM(node_http); +let __hyperapi_core = require("@hyperapi/core"); +__hyperapi_core = __toESM(__hyperapi_core); +let __kirick_ip = require("@kirick/ip"); +__kirick_ip = __toESM(__kirick_ip); +let node_buffer = require("node:buffer"); +node_buffer = __toESM(node_buffer); +let busboy = require("busboy"); +busboy = __toESM(busboy); +//#region src/utils/http.ts +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ +function isHttpMethodSupported(http_method) { + return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; +} +/** +* Checks if the response body is required for the given HTTP method. +* @param http_method The HTTP method to check. +* @returns - +*/ +function isResponseBodyRequired(http_method) { + return http_method !== "HEAD" && http_method !== "OPTIONS"; +} + +//#endregion +//#region src/utils/hyperapi-error.ts +/** +* Converts a HyperAPIError to a Response. +* @param error - The error to convert. +* @param add_body - Whether to add the response body. +* @returns - +*/ +function hyperApiErrorToResponse(error, add_body) { + if (typeof error.httpStatus !== "number") console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + const headers = { "Content-Type": "application/json" }; + if (error.httpHeaders) for (const [header, value] of Object.entries(error.httpHeaders)) headers[header] = value; + let body; + if (add_body) body = JSON.stringify(error.getResponse()); + return { + status: error.httpStatus ?? 500, + headers, + body + }; +} + +//#endregion //#region src/utils/is-record.ts /** * Check if a value is a record. @@ -164,46 +209,6 @@ async function parseArguments(req, url, multipart_formdata_enabled) { return args; } -//#endregion -//#region src/utils/hyperapi-error.ts -/** -* Converts a HyperAPIError to a Response. -* @param error - The error to convert. -* @param add_body - Whether to add the response body. -* @returns - -*/ -function hyperApiErrorToResponse(error, add_body) { - if (typeof error.httpStatus !== "number") console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); - const headers = { "Content-Type": "application/json" }; - if (error.httpHeaders) for (const [header, value] of Object.entries(error.httpHeaders)) headers[header] = value; - let body; - if (add_body) body = JSON.stringify(error.getResponse()); - return { - status: error.httpStatus ?? 500, - headers, - body - }; -} - -//#endregion -//#region src/utils/http.ts -/** -* Checks if the response body is required for the given HTTP method. -* @param http_method The HTTP method to check. -* @returns - -*/ -function isHttpMethodSupported(http_method) { - return http_method === "GET" || http_method === "POST" || http_method === "PUT" || http_method === "PATCH" || http_method === "DELETE" || http_method === "HEAD" || http_method === "OPTIONS"; -} -/** -* Checks if the response body is required for the given HTTP method. -* @param http_method The HTTP method to check. -* @returns - -*/ -function isResponseBodyRequired(http_method) { - return http_method !== "HEAD" && http_method !== "OPTIONS"; -} - //#endregion //#region src/main.ts var HyperAPINodeDriver = class { diff --git a/dist/main.d.cts b/dist/main.d.cts new file mode 100644 index 0000000..236f56a --- /dev/null +++ b/dist/main.d.cts @@ -0,0 +1,55 @@ +import { ServerOptions } from "node:http"; +import { HyperAPIDriver, HyperAPIDriverHandler, HyperAPIRequest } from "@hyperapi/core"; +import { IP } from "@kirick/ip"; +import { EmptyObject } from "type-fest"; + +//#region src/request.d.ts +interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { + url: URL; + headers: Headers; + ip: IP; +} +//#endregion +//#region src/main.d.ts +interface Config { + port: number; + path?: string; + multipart_formdata_enabled?: boolean; + options?: ServerOptions; +} +declare class HyperAPINodeDriver implements HyperAPIDriver> { + private handler; + private port; + private path; + private multipart_formdata_enabled; + private server; + private server_options; + /** + * @param options - + * @param options.port - HTTP server port. Default: `8001`. + * @param [options.path] - Path to serve. Default: `/api/`. + * @param [options.multipart_formdata_enabled] - If `true`, server would parse `multipart/form-data` requests. Default: `false`. + * @param [options.options] - NodeJS server options. + */ + constructor({ + port, + path, + multipart_formdata_enabled, + options + }: Config); + /** + * Starts the server. + * @param handler - The handler to use. + */ + start(handler: HyperAPIDriverHandler): void; + /** Stops the server. */ + stop(): void; + /** + * Handles the HTTP request. + * @param req - NodeJS request. + * @returns - + */ + private processRequest; +} +//#endregion +export { HyperAPINodeDriver, type HyperAPINodeRequest }; \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts index a4feccf..236f56a 100644 --- a/dist/main.d.ts +++ b/dist/main.d.ts @@ -5,12 +5,10 @@ import { EmptyObject } from "type-fest"; //#region src/request.d.ts interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { - // request: Request; url: URL; headers: Headers; ip: IP; } - //#endregion //#region src/main.d.ts interface Config { @@ -19,9 +17,7 @@ interface Config { multipart_formdata_enabled?: boolean; options?: ServerOptions; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any declare class HyperAPINodeDriver implements HyperAPIDriver> { - // eslint-disable-next-line @typescript-eslint/no-explicit-any private handler; private port; private path; @@ -54,5 +50,6 @@ declare class HyperAPINodeDriver implements HyperAPIDriver { test('GET', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo?name=world', - { - method: 'GET', - headers: { - 'x-test-header': 'test-value', - }, + const response = await fetch('http://localhost:18001/api/echo?name=world', { + method: 'GET', + headers: { + 'x-test-header': 'test-value', }, - ); + }); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -41,12 +31,9 @@ describe('args', () => { }); test('HEAD', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo?name=world', - { - method: 'HEAD', - }, - ); + const response = await fetch('http://localhost:18001/api/echo?name=world', { + method: 'HEAD', + }); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -57,18 +44,15 @@ describe('args', () => { describe('POST', () => { test('JSON', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - name: 'foo', - }), + const response = await fetch('http://localhost:18001/api/echo', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ + name: 'foo', + }), + }); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -82,15 +66,12 @@ describe('args', () => { }); test('form', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo', - { - method: 'POST', - body: new URLSearchParams({ - name: 'bar bar', - }), - }, - ); + const response = await fetch('http://localhost:18001/api/echo', { + method: 'POST', + body: new URLSearchParams({ + name: 'bar bar', + }), + }); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -105,21 +86,12 @@ describe('args', () => { test('multipart', async () => { const form_data = new FormData(); - form_data.append( - 'name', - new Blob( - [ 'baz' ], - { type: 'text/plain' }, - ), - ); - - const response = await fetch( - 'http://localhost:18002/api/echo-file', - { - method: 'POST', - body: form_data, - }, - ); + form_data.append('name', new Blob(['baz'], { type: 'text/plain' })); + + const response = await fetch('http://localhost:18002/api/echo-file', { + method: 'POST', + body: form_data, + }); expect(response.status).toBe(200); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -169,16 +141,13 @@ describe('errors', () => { describe('invalid body', () => { test('malformed JSON', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: '{', + const response = await fetch('http://localhost:18001/api/echo', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: '{', + }); expect(response.status).toBe(400); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -194,16 +163,13 @@ describe('errors', () => { }); test('JSON array', async () => { - const response = await fetch( - 'http://localhost:18001/api/echo', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: '[1]', + const response = await fetch('http://localhost:18001/api/echo', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: '[1]', + }); expect(response.status).toBe(400); expect(response.headers.get('Content-Type')).toBe('application/json'); @@ -222,21 +188,12 @@ describe('errors', () => { test('multipart disabled', async () => { const form_data = new FormData(); - form_data.append( - 'name', - new Blob( - [ 'baz' ], - { type: 'text/plain' }, - ), - ); - - const response = await fetch( - 'http://localhost:18001/api/echo-file', - { - method: 'POST', - body: form_data, - }, - ); + form_data.append('name', new Blob(['baz'], { type: 'text/plain' })); + + const response = await fetch('http://localhost:18001/api/echo-file', { + method: 'POST', + body: form_data, + }); expect(response.status).toBe(415); expect(response.headers.get('Content-Type')).toBe('application/json'); diff --git a/src/main.ts b/src/main.ts index 23efb7b..aec978c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,19 +5,16 @@ import { type ServerOptions, } from 'node:http'; import { - HyperAPIError, type HyperAPIDriver, type HyperAPIDriverHandler, + HyperAPIError, } from '@hyperapi/core'; import { IP } from '@kirick/ip'; -import { parseArguments } from './utils/parse.js'; import type { HyperAPINodeRequest } from './request.js'; import type { ResponseSchema } from './types.js'; +import { isHttpMethodSupported, isResponseBodyRequired } from './utils/http.js'; import { hyperApiErrorToResponse } from './utils/hyperapi-error.js'; -import { - isHttpMethodSupported, - isResponseBodyRequired, -} from './utils/http.js'; +import { parseArguments } from './utils/parse.js'; interface Config { port: number; @@ -26,10 +23,13 @@ interface Config { options?: ServerOptions; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export class HyperAPINodeDriver implements HyperAPIDriver> { +export class HyperAPINodeDriver // eslint-disable-next-line @typescript-eslint/no-explicit-any - private handler: HyperAPIDriverHandler> | null = null; + implements HyperAPIDriver> +{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private handler: HyperAPIDriverHandler> | null = + null; private port: number; private path: string; private multipart_formdata_enabled: boolean; @@ -61,43 +61,35 @@ export class HyperAPINodeDriver implements HyperAPIDriver): void { this.handler = handler; - this.server = createServer( - this.server_options, - async (req, res) => { - let response: ResponseSchema; - - try { - response = await this.processRequest(req); - } - catch (error) { - if (error instanceof HyperAPIError) { - response = hyperApiErrorToResponse( - error, - isResponseBodyRequired(req.method), - ); - } - else { - // eslint-disable-next-line no-console - console.error('Unhandled error in @hyperapi/driver-node:'); - // eslint-disable-next-line no-console - console.error(error); - - response = { status: 500 }; - } + this.server = createServer(this.server_options, async (req, res) => { + let response: ResponseSchema; + + try { + response = await this.processRequest(req); + } catch (error) { + if (error instanceof HyperAPIError) { + response = hyperApiErrorToResponse( + error, + isResponseBodyRequired(req.method), + ); + } else { + // oxlint-disable-next-line no-console + console.error('Unhandled error in @hyperapi/driver-node:'); + // oxlint-disable-next-line no-console + console.error(error); + + response = { status: 500 }; } + } - res.writeHead( - response.status, - response.headers ?? {}, - ); + res.writeHead(response.status, response.headers ?? {}); - if (response.body !== undefined) { - res.write(response.body); - } + if (response.body !== undefined) { + res.write(response.body); + } - res.end(); - }, - ); + res.end(); + }); this.server.listen(this.port); } @@ -125,17 +117,12 @@ export class HyperAPINodeDriver implements HyperAPIDriver = EmptyObject> extends HyperAPIRequest { +export interface HyperAPINodeRequest< + A extends Record = EmptyObject, +> extends HyperAPIRequest { // request: Request; url: URL; headers: Headers; diff --git a/src/utils/http.ts b/src/utils/http.ts index 5067119..1b58df1 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -1,18 +1,29 @@ -type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'; +type HttpMethod = + | 'GET' + | 'POST' + | 'PUT' + | 'PATCH' + | 'DELETE' + | 'HEAD' + | 'OPTIONS'; /** * Checks if the response body is required for the given HTTP method. * @param http_method The HTTP method to check. * @returns - */ -export function isHttpMethodSupported(http_method: unknown): http_method is HttpMethod { - return http_method === 'GET' - || http_method === 'POST' - || http_method === 'PUT' - || http_method === 'PATCH' - || http_method === 'DELETE' - || http_method === 'HEAD' - || http_method === 'OPTIONS'; +export function isHttpMethodSupported( + http_method: unknown, +): http_method is HttpMethod { + return ( + http_method === 'GET' || + http_method === 'POST' || + http_method === 'PUT' || + http_method === 'PATCH' || + http_method === 'DELETE' || + http_method === 'HEAD' || + http_method === 'OPTIONS' + ); } /** @@ -20,7 +31,8 @@ export function isHttpMethodSupported(http_method: unknown): http_method is Http * @param http_method The HTTP method to check. * @returns - */ -export function isResponseBodyRequired(http_method: unknown): http_method is Exclude { - return http_method !== 'HEAD' - && http_method !== 'OPTIONS'; +export function isResponseBodyRequired( + http_method: unknown, +): http_method is Exclude { + return http_method !== 'HEAD' && http_method !== 'OPTIONS'; } diff --git a/src/utils/hyperapi-error.ts b/src/utils/hyperapi-error.ts index 7791f6c..2ca711b 100644 --- a/src/utils/hyperapi-error.ts +++ b/src/utils/hyperapi-error.ts @@ -13,24 +13,24 @@ export function hyperApiErrorToResponse( add_body: boolean, ): ResponseSchema { if (typeof error.httpStatus !== 'number') { - // eslint-disable-next-line no-console - console.warn(`No HTTP status code provided for error ${error.name}, using 500.`); + // oxlint-disable-next-line no-console + console.warn( + `No HTTP status code provided for error ${error.name}, using 500.`, + ); } const headers: ResponseSchema['headers'] = { 'Content-Type': 'application/json', }; if (error.httpHeaders) { - for (const [ header, value ] of Object.entries(error.httpHeaders)) { + for (const [header, value] of Object.entries(error.httpHeaders)) { headers[header] = value; } } let body; if (add_body) { - body = JSON.stringify( - error.getResponse(), - ); + body = JSON.stringify(error.getResponse()); } return { diff --git a/src/utils/is-record.ts b/src/utils/is-record.ts index a7e9ae0..c5b9253 100644 --- a/src/utils/is-record.ts +++ b/src/utils/is-record.ts @@ -4,9 +4,11 @@ * @returns - */ export function isRecord(value: unknown): value is Record { - return typeof value === 'object' - && value !== null - && !Array.isArray(value) - && value.constructor === Object - && Object.prototype.toString.call(value) === '[object Object]'; + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + value.constructor === Object && + Object.prototype.toString.call(value) === '[object Object]' + ); } diff --git a/src/utils/parse.ts b/src/utils/parse.ts index 7135a88..c4d8373 100644 --- a/src/utils/parse.ts +++ b/src/utils/parse.ts @@ -1,5 +1,5 @@ -import { HyperAPIInvalidParametersError } from '@hyperapi/core'; import { IncomingMessage } from 'node:http'; +import { HyperAPIInvalidParametersError } from '@hyperapi/core'; import { isRecord } from './is-record.js'; import { parseFormData } from './parse/form-data.js'; import { parseText } from './parse/text.js'; @@ -20,7 +20,9 @@ function getMIME(type: string): string { type RequestArgs = Record; -class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ message: string }> { +class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ + message: string; +}> { override data = { message: 'Could not parse body', }; @@ -35,7 +37,9 @@ class HyperAPIBodyInvalidError extends HyperAPIInvalidParametersError<{ message: } } -class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError<{ message: string }> { +class HyperAPIBodyUnknownError extends HyperAPIInvalidParametersError<{ + message: string; +}> { override data = { message: 'Unsupported body type', }; @@ -61,38 +65,32 @@ export async function parseArguments( ): Promise { let args: RequestArgs; - if ( - req.method === 'GET' - || req.method === 'HEAD' - ) { - args = Object.fromEntries( - url.searchParams.entries(), - ); - } - else { + if (req.method === 'GET' || req.method === 'HEAD') { + args = Object.fromEntries(url.searchParams.entries()); + } else { const type_header = req.headers['content-type']; - const type_mime = typeof type_header === 'string' - ? getMIME(type_header) - : ''; + const type_mime = + typeof type_header === 'string' + ? getMIME(type_header) + : ''; switch (type_mime) { - case 'application/json': { - let args_json: unknown; - try { - args_json = JSON.parse( - await parseText(req), - ); - } - catch { - throw new HyperAPIBodyInvalidError(); + case 'application/json': + { + let args_json: unknown; + try { + args_json = JSON.parse(await parseText(req)); + } catch { + throw new HyperAPIBodyInvalidError(); + } + + if (isRecord(args_json) !== true) { + throw new HyperAPIBodyInvalidError('JSON body must be an object'); + } + + args = args_json; } - - if (isRecord(args_json) !== true) { - throw new HyperAPIBodyInvalidError('JSON body must be an object'); - } - - args = args_json; - } break; + break; case 'multipart/form-data': if (multipart_formdata_enabled !== true) { @@ -101,21 +99,15 @@ export async function parseArguments( try { args = await parseFormData(req); - } - catch { + } catch { throw new HyperAPIInvalidParametersError(); } break; case 'application/x-www-form-urlencoded': try { - args = Object.fromEntries( - new URLSearchParams( - await parseText(req), - ), - ); - } - catch { + args = Object.fromEntries(new URLSearchParams(await parseText(req))); + } catch { throw new HyperAPIInvalidParametersError(); } break; diff --git a/src/utils/parse/form-data.ts b/src/utils/parse/form-data.ts index 41ade2b..5d9033c 100644 --- a/src/utils/parse/form-data.ts +++ b/src/utils/parse/form-data.ts @@ -1,6 +1,6 @@ -import busboy from 'busboy'; import { Blob } from 'node:buffer'; import { IncomingMessage } from 'node:http'; +import busboy from 'busboy'; // FIXME: implement limiting of body size and read timeout @@ -9,7 +9,9 @@ import { IncomingMessage } from 'node:http'; * @param req - NodeJS request object. * @returns - JSON object. */ -export function parseFormData(req: IncomingMessage): Promise> { +export function parseFormData( + req: IncomingMessage, +): Promise> { return new Promise>((resolve) => { const bb = busboy({ headers: req.headers, @@ -17,37 +19,25 @@ export function parseFormData(req: IncomingMessage): Promise = {}; - bb.on( - 'file', - (name, file, info) => { - const file_parts: Uint8Array[] = []; - - file.on('data', (chunk: Buffer) => { - file_parts.push(chunk as Uint8Array); - }); - - file.on('end', () => { - form_data[name] = new Blob( - file_parts, - { type: info.mimeType }, - ); - }); - }, - ); - - bb.on( - 'field', - (name, value) => { - form_data[name] = value; - }, - ); - - bb.on( - 'close', - () => { - resolve(form_data); - }, - ); + bb.on('file', (name, file, info) => { + const file_parts: Uint8Array[] = []; + + file.on('data', (chunk: Buffer) => { + file_parts.push(chunk as Uint8Array); + }); + + file.on('end', () => { + form_data[name] = new Blob(file_parts, { type: info.mimeType }); + }); + }); + + bb.on('field', (name, value) => { + form_data[name] = value; + }); + + bb.on('close', () => { + resolve(form_data); + }); req.pipe(bb); }); diff --git a/test/hyper-api/echo-file.ts b/test/hyper-api/echo-file.ts index a4b00c2..a5e4bba 100644 --- a/test/hyper-api/echo-file.ts +++ b/test/hyper-api/echo-file.ts @@ -1,10 +1,12 @@ /* eslint-disable jsdoc/require-jsdoc */ -import { type HyperAPIResponse } from '@hyperapi/core'; import { Blob } from 'node:buffer'; +import { type HyperAPIResponse } from '@hyperapi/core'; import { type HyperAPINodeRequest } from '../../src/main.js'; -export default async function (request: HyperAPINodeRequest<{ name: Blob }>): Promise { +export default async function ( + request: HyperAPINodeRequest<{ name: Blob }>, +): Promise { const name = await request.args.name.text(); return { diff --git a/test/hyper-api/echo.ts b/test/hyper-api/echo.ts index ad46143..e81b413 100644 --- a/test/hyper-api/echo.ts +++ b/test/hyper-api/echo.ts @@ -3,7 +3,9 @@ import { type HyperAPIResponse } from '@hyperapi/core'; import { type HyperAPINodeRequest } from '../../src/main.js'; -export default function (request: HyperAPINodeRequest<{ name: string }>): HyperAPIResponse { +export default function ( + request: HyperAPINodeRequest<{ name: string }>, +): HyperAPIResponse { return { method: 'ALL', message: `Hello, ${request.args.name}!`, diff --git a/test/hyper-api/error.ts b/test/hyper-api/error.ts index 9fb8579..2c51686 100644 --- a/test/hyper-api/error.ts +++ b/test/hyper-api/error.ts @@ -1,9 +1,6 @@ /* eslint-disable jsdoc/require-jsdoc */ -import { - HyperAPIRateLimitError, - type HyperAPIResponse, -} from '@hyperapi/core'; +import { HyperAPIRateLimitError, type HyperAPIResponse } from '@hyperapi/core'; class HyperAPILocalRateLimitError extends HyperAPIRateLimitError { override httpHeaders = { diff --git a/test/tsconfig.json b/test/tsconfig.json index 059d1f5..a1ca658 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -3,8 +3,5 @@ "compilerOptions": { "isolatedDeclarations": false }, - "include": [ - "./**/*.ts", - "../src/**/*.test.ts" - ] -} \ No newline at end of file + "include": ["./**/*.ts", "../src/**/*.test.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index 6efe70c..9e0fdab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,16 +11,10 @@ "noImplicitOverride": true, "module": "preserve", "noEmit": true, - "lib": [ - "es2022" - ], + "lib": ["es2022"], "declaration": true, "isolatedDeclarations": true }, - "include": [ - "src/" - ], - "exclude": [ - "**/*.test.ts" - ] -} \ No newline at end of file + "include": ["src/"], + "exclude": ["**/*.test.ts"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json index da6f84d..c623439 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -6,12 +6,6 @@ "declaration": false, "isolatedDeclarations": false }, - "include": [ - "src/", - "test/" - ], - "exclude": [ - "dist/", - "node_modules/" - ] + "include": ["src/", "test/"], + "exclude": ["dist/", "node_modules/"] } diff --git a/vitest.config.ts b/vitest.config.ts index 861826c..b45f660 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,9 +4,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - include: [ - 'dist/vitest/**/*.test.js', - ], + include: ['dist/vitest/**/*.test.js'], exclude: [], }, }); From 3fbbab15e3fceb3f1442892ec1abe53d52ced509 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Tue, 9 Sep 2025 15:34:04 +0200 Subject: [PATCH 15/20] Bump core --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index c359d10..22c6657 100644 --- a/bun.lock +++ b/bun.lock @@ -23,7 +23,7 @@ "vitest": "3.2.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#2b7ad6c0f24ae1f84f31702e349ce3c6b77e475c", + "@hyperapi/core": "github:hyperapi/core#3d1898caa28e0cbc55c978f33bd9edf5a836337a", "@kirick/ip": "^0.1.1", }, }, @@ -137,7 +137,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#2b7ad6c", { "dependencies": { "itty-router": "5.0.22" } }, "hyperapi-core-2b7ad6c"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#3d1898c", { "dependencies": { "itty-router": "5.0.22" } }, "hyperapi-core-3d1898c"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], diff --git a/package.json b/package.json index 0ca2b99..28fa432 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#2b7ad6c0f24ae1f84f31702e349ce3c6b77e475c", + "@hyperapi/core": "github:hyperapi/core#3d1898caa28e0cbc55c978f33bd9edf5a836337a", "@kirick/ip": "^0.1.1" }, "devDependencies": { From 7c58f401892441f7f4636b7d348802ccde5fd522 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Sun, 14 Sep 2025 18:02:11 +0200 Subject: [PATCH 16/20] Update for core@0.5.0-dev --- bun.lock | 34 ++++++++----------------- dist/main.cjs | 40 +++++++++-------------------- dist/main.d.cts | 17 ++++--------- dist/main.d.ts | 17 ++++--------- dist/main.js | 37 ++++++++------------------- package.json | 11 ++++---- src/main.test.ts | 29 +++++++++++++-------- src/main.ts | 45 +++++++++++---------------------- src/request.ts | 12 +++++---- src/utils/is-record.ts | 14 ---------- src/utils/parse.ts | 2 +- test/hyper-api/echo-file.ts | 26 +++++++++---------- test/hyper-api/echo-response.ts | 15 +++++++++++ test/hyper-api/echo.ts | 25 +++++++++--------- test/hyper-api/error.ts | 9 +++---- test/setup.ts | 35 +++++++++++++++++-------- 16 files changed, 157 insertions(+), 211 deletions(-) delete mode 100644 src/utils/is-record.ts create mode 100644 test/hyper-api/echo-response.ts diff --git a/bun.lock b/bun.lock index 22c6657..6e553ba 100644 --- a/bun.lock +++ b/bun.lock @@ -12,18 +12,16 @@ "@types/busboy": "^1.5.4", "@types/node": "^20", "eslint": "9.27.0", - "formdata-node": "6.0.3", - "node-fetch": "3.3.2", "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", - "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", + "valibot": "1.1.0", "vitest": "3.2.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#3d1898caa28e0cbc55c978f33bd9edf5a836337a", + "@hyperapi/core": "github:hyperapi/core#5b3d7425be5b8526055aceeb4475a48f430d1736", "@kirick/ip": "^0.1.1", }, }, @@ -137,7 +135,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#3d1898c", { "dependencies": { "itty-router": "5.0.22" } }, "hyperapi-core-3d1898c"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#5b3d742", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0" } }, "hyperapi-core-5b3d742"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -363,8 +361,6 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], @@ -439,8 +435,6 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -453,10 +447,6 @@ "flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], - "formdata-node": ["formdata-node@6.0.3", "", {}, "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg=="], - - "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], @@ -545,9 +535,7 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - - "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + "neoevents": ["neoevents@0.3.0", "", {}, "sha512-et9vcJ8ElRUbgxeJXAw++1noXVY302fxRvwEoIDll9KiQAeySjTQBdLtATvtE17MgbitLjjixI5UcFOS92EI+w=="], "node-releases": ["node-releases@2.0.20", "", {}, "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA=="], @@ -579,7 +567,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], @@ -681,8 +669,6 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], @@ -701,6 +687,8 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], + "vite": ["vite@5.4.6", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q=="], "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], @@ -709,8 +697,6 @@ "vue-eslint-parser": ["vue-eslint-parser@9.4.3", "", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg=="], - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -733,6 +719,8 @@ "@jridgewell/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@stylistic/eslint-plugin/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], @@ -787,14 +775,12 @@ "rollup/@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], - "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "ts-declaration-location/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="], "unconfig/jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], - "unplugin/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "vue-eslint-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], diff --git a/dist/main.cjs b/dist/main.cjs index 80bbaa2..6f0e3b0 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -25,6 +25,8 @@ let node_http = require("node:http"); node_http = __toESM(node_http); let __hyperapi_core = require("@hyperapi/core"); __hyperapi_core = __toESM(__hyperapi_core); +let __hyperapi_core_dev = require("@hyperapi/core/dev"); +__hyperapi_core_dev = __toESM(__hyperapi_core_dev); let __kirick_ip = require("@kirick/ip"); __kirick_ip = __toESM(__kirick_ip); let node_buffer = require("node:buffer"); @@ -71,17 +73,6 @@ function hyperApiErrorToResponse(error, add_body) { }; } -//#endregion -//#region src/utils/is-record.ts -/** -* Check if a value is a record. -* @param value - -* @returns - -*/ -function isRecord(value) { - return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; -} - //#endregion //#region src/utils/parse/form-data.ts /** @@ -184,7 +175,7 @@ async function parseArguments(req, url, multipart_formdata_enabled) { } catch { throw new HyperAPIBodyInvalidError(); } - if (isRecord(args_json) !== true) throw new HyperAPIBodyInvalidError("JSON body must be an object"); + if ((0, __hyperapi_core_dev.isRecord)(args_json) !== true) throw new HyperAPIBodyInvalidError("JSON body must be an object"); args = args_json; } break; @@ -211,12 +202,11 @@ async function parseArguments(req, url, multipart_formdata_enabled) { //#endregion //#region src/main.ts -var HyperAPINodeDriver = class { - handler = null; +var HyperAPINodeDriver = class extends __hyperapi_core_dev.HyperAPIDriver { port; path; multipart_formdata_enabled; - server = null; + server; server_options; /** * @param options - @@ -226,17 +216,11 @@ var HyperAPINodeDriver = class { * @param [options.options] - NodeJS server options. */ constructor({ port, path = "/api/", multipart_formdata_enabled = false, options = {} }) { + super(); this.port = port; this.path = path; this.multipart_formdata_enabled = multipart_formdata_enabled; this.server_options = options; - } - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler) { - this.handler = handler; this.server = (0, node_http.createServer)(this.server_options, async (req, res) => { let response; try { @@ -255,17 +239,12 @@ var HyperAPINodeDriver = class { }); this.server.listen(this.port); } - /** Stops the server. */ - stop() { - this.server?.close(); - } /** * Handles the HTTP request. * @param req - NodeJS request. * @returns - */ async processRequest(req) { - if (!this.handler) throw new Error("No handler available."); const http_method = req.method; if (isHttpMethodSupported(http_method) !== true) return { status: 405 }; if (typeof req.url !== "string") throw new TypeError("Request URL is not a string."); @@ -278,7 +257,7 @@ var HyperAPINodeDriver = class { const headers = new Headers(); for (const [key, value] of Object.entries(req.headers)) if (typeof value === "string") headers.set(key, value); else if (Array.isArray(value)) for (const item of value) headers.append(key, item); - const hyperapi_response = await this.handler({ + const hyperapi_response = await this.emitRequest({ method: http_method, path: hyperapi_method, args: hyperapi_args, @@ -293,6 +272,11 @@ var HyperAPINodeDriver = class { body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 }; } + /** Stops the server. */ + destroy() { + this.server?.close(); + super.destroy(); + } }; //#endregion diff --git a/dist/main.d.cts b/dist/main.d.cts index 236f56a..e2f35d4 100644 --- a/dist/main.d.cts +++ b/dist/main.d.cts @@ -1,10 +1,9 @@ import { ServerOptions } from "node:http"; -import { HyperAPIDriver, HyperAPIDriverHandler, HyperAPIRequest } from "@hyperapi/core"; +import { BaseRecord, EmptyObject, HyperAPIDriver, HyperAPIRequest } from "@hyperapi/core/dev"; import { IP } from "@kirick/ip"; -import { EmptyObject } from "type-fest"; //#region src/request.d.ts -interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { +interface HyperAPINodeRequest extends HyperAPIRequest { url: URL; headers: Headers; ip: IP; @@ -17,8 +16,7 @@ interface Config { multipart_formdata_enabled?: boolean; options?: ServerOptions; } -declare class HyperAPINodeDriver implements HyperAPIDriver> { - private handler; +declare class HyperAPINodeDriver extends HyperAPIDriver { private port; private path; private multipart_formdata_enabled; @@ -38,18 +36,13 @@ declare class HyperAPINodeDriver implements HyperAPIDriver): void; - /** Stops the server. */ - stop(): void; - /** * Handles the HTTP request. * @param req - NodeJS request. * @returns - */ private processRequest; + /** Stops the server. */ + destroy(): void; } //#endregion export { HyperAPINodeDriver, type HyperAPINodeRequest }; \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts index 236f56a..e2f35d4 100644 --- a/dist/main.d.ts +++ b/dist/main.d.ts @@ -1,10 +1,9 @@ import { ServerOptions } from "node:http"; -import { HyperAPIDriver, HyperAPIDriverHandler, HyperAPIRequest } from "@hyperapi/core"; +import { BaseRecord, EmptyObject, HyperAPIDriver, HyperAPIRequest } from "@hyperapi/core/dev"; import { IP } from "@kirick/ip"; -import { EmptyObject } from "type-fest"; //#region src/request.d.ts -interface HyperAPINodeRequest = EmptyObject> extends HyperAPIRequest { +interface HyperAPINodeRequest extends HyperAPIRequest { url: URL; headers: Headers; ip: IP; @@ -17,8 +16,7 @@ interface Config { multipart_formdata_enabled?: boolean; options?: ServerOptions; } -declare class HyperAPINodeDriver implements HyperAPIDriver> { - private handler; +declare class HyperAPINodeDriver extends HyperAPIDriver { private port; private path; private multipart_formdata_enabled; @@ -38,18 +36,13 @@ declare class HyperAPINodeDriver implements HyperAPIDriver): void; - /** Stops the server. */ - stop(): void; - /** * Handles the HTTP request. * @param req - NodeJS request. * @returns - */ private processRequest; + /** Stops the server. */ + destroy(): void; } //#endregion export { HyperAPINodeDriver, type HyperAPINodeRequest }; \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index ce38707..81972de 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,5 +1,6 @@ import { createServer } from "node:http"; import { HyperAPIError, HyperAPIInvalidParametersError } from "@hyperapi/core"; +import { HyperAPIDriver, isRecord } from "@hyperapi/core/dev"; import { IP } from "@kirick/ip"; import { Blob } from "node:buffer"; import busboy from "busboy"; @@ -43,17 +44,6 @@ function hyperApiErrorToResponse(error, add_body) { }; } -//#endregion -//#region src/utils/is-record.ts -/** -* Check if a value is a record. -* @param value - -* @returns - -*/ -function isRecord(value) { - return typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor === Object && Object.prototype.toString.call(value) === "[object Object]"; -} - //#endregion //#region src/utils/parse/form-data.ts /** @@ -183,12 +173,11 @@ async function parseArguments(req, url, multipart_formdata_enabled) { //#endregion //#region src/main.ts -var HyperAPINodeDriver = class { - handler = null; +var HyperAPINodeDriver = class extends HyperAPIDriver { port; path; multipart_formdata_enabled; - server = null; + server; server_options; /** * @param options - @@ -198,17 +187,11 @@ var HyperAPINodeDriver = class { * @param [options.options] - NodeJS server options. */ constructor({ port, path = "/api/", multipart_formdata_enabled = false, options = {} }) { + super(); this.port = port; this.path = path; this.multipart_formdata_enabled = multipart_formdata_enabled; this.server_options = options; - } - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler) { - this.handler = handler; this.server = createServer(this.server_options, async (req, res) => { let response; try { @@ -227,17 +210,12 @@ var HyperAPINodeDriver = class { }); this.server.listen(this.port); } - /** Stops the server. */ - stop() { - this.server?.close(); - } /** * Handles the HTTP request. * @param req - NodeJS request. * @returns - */ async processRequest(req) { - if (!this.handler) throw new Error("No handler available."); const http_method = req.method; if (isHttpMethodSupported(http_method) !== true) return { status: 405 }; if (typeof req.url !== "string") throw new TypeError("Request URL is not a string."); @@ -250,7 +228,7 @@ var HyperAPINodeDriver = class { const headers = new Headers(); for (const [key, value] of Object.entries(req.headers)) if (typeof value === "string") headers.set(key, value); else if (Array.isArray(value)) for (const item of value) headers.append(key, item); - const hyperapi_response = await this.handler({ + const hyperapi_response = await this.emitRequest({ method: http_method, path: hyperapi_method, args: hyperapi_args, @@ -265,6 +243,11 @@ var HyperAPINodeDriver = class { body: isResponseBodyRequired(http_method) ? JSON.stringify(hyperapi_response) : void 0 }; } + /** Stops the server. */ + destroy() { + this.server?.close(); + super.destroy(); + } }; //#endregion diff --git a/package.json b/package.json index 28fa432..a8506f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hyperapi/driver-node", - "version": "0.3.0-dev", + "version": "0.5.0-dev", "description": "HyperAPI HTTP driver for Node.JS.", "publishConfig": { "access": "public" @@ -24,7 +24,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#3d1898caa28e0cbc55c978f33bd9edf5a836337a", + "@hyperapi/core": "github:hyperapi/core#5b3d7425be5b8526055aceeb4475a48f430d1736", "@kirick/ip": "^0.1.1" }, "devDependencies": { @@ -33,14 +33,12 @@ "@types/busboy": "^1.5.4", "@types/node": "^20", "eslint": "9.27.0", - "formdata-node": "6.0.3", - "node-fetch": "3.3.2", "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", - "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", + "valibot": "1.1.0", "vitest": "3.2.4" }, "scripts": { @@ -48,7 +46,8 @@ "check": "bun run lint && bun run build && bun run test", "lint": "biome format && oxlint && eslint . && tsc && (cd test && tsc)", "test": "npm run test:vitest", - "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --no-file-parallelism ; rm -r dist/vitest" + "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --no-file-parallelism ; rm -r dist/vitest", + "# test:vitest": "vitest run --no-file-parallelism" }, "repository": { "type": "git", diff --git a/src/main.test.ts b/src/main.test.ts index bd2b045..8417aaa 100644 --- a/src/main.test.ts +++ b/src/main.test.ts @@ -1,15 +1,6 @@ -import { - Blob as BlobPolyfill, - FormData as FormDataPolyfill, -} from 'formdata-node'; -import fetchPolyfill from 'node-fetch'; import { describe, expect, test } from 'vitest'; import '../test/setup.js'; -const fetch = globalThis.fetch ?? fetchPolyfill; -const FormData = globalThis.FormData ?? FormDataPolyfill; -const Blob = globalThis.Blob ?? BlobPolyfill; - describe('args', () => { test('GET', async () => { const response = await fetch('http://localhost:18001/api/echo?name=world', { @@ -86,7 +77,7 @@ describe('args', () => { test('multipart', async () => { const form_data = new FormData(); - form_data.append('name', new Blob(['baz'], { type: 'text/plain' })); + form_data.append('file', new Blob(['baz'], { type: 'text/plain' })); const response = await fetch('http://localhost:18002/api/echo-file', { method: 'POST', @@ -102,6 +93,24 @@ describe('args', () => { message: 'Hello, baz!', }); }); + + // test('response', async () => { + // const response = await fetch('http://localhost:18002/api/echo-response', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // }, + // body: JSON.stringify({ + // name: 'foo', + // }), + // }); + + // expect(response.status).toBe(200); + // expect(response.headers.get('Content-Type')).toBe('text/plain'); + + // const body = await response.text(); + // expect(body).toEqual('Hello, foo!'); + // }); }); }); diff --git a/src/main.ts b/src/main.ts index aec978c..40ea125 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,8 @@ import { type Server, type ServerOptions, } from 'node:http'; -import { - type HyperAPIDriver, - type HyperAPIDriverHandler, - HyperAPIError, -} from '@hyperapi/core'; +import { HyperAPIError } from '@hyperapi/core'; +import { HyperAPIDriver } from '@hyperapi/core/dev'; import { IP } from '@kirick/ip'; import type { HyperAPINodeRequest } from './request.js'; import type { ResponseSchema } from './types.js'; @@ -23,17 +20,11 @@ interface Config { options?: ServerOptions; } -export class HyperAPINodeDriver - // eslint-disable-next-line @typescript-eslint/no-explicit-any - implements HyperAPIDriver> -{ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private handler: HyperAPIDriverHandler> | null = - null; +export class HyperAPINodeDriver extends HyperAPIDriver { private port: number; private path: string; private multipart_formdata_enabled: boolean; - private server: Server | null = null; + private server: Server; private server_options: ServerOptions; /** @@ -49,18 +40,13 @@ export class HyperAPINodeDriver multipart_formdata_enabled = false, options = {}, }: Config) { + super(); + this.port = port; this.path = path; this.multipart_formdata_enabled = multipart_formdata_enabled; this.server_options = options; - } - /** - * Starts the server. - * @param handler - The handler to use. - */ - start(handler: HyperAPIDriverHandler): void { - this.handler = handler; this.server = createServer(this.server_options, async (req, res) => { let response: ResponseSchema; @@ -90,12 +76,8 @@ export class HyperAPINodeDriver res.end(); }); - this.server.listen(this.port); - } - /** Stops the server. */ - stop(): void { - this.server?.close(); + this.server.listen(this.port); } /** @@ -104,10 +86,6 @@ export class HyperAPINodeDriver * @returns - */ private async processRequest(req: IncomingMessage): Promise { - if (!this.handler) { - throw new Error('No handler available.'); - } - const http_method = req.method; if (isHttpMethodSupported(http_method) !== true) { return { status: 405 }; @@ -146,7 +124,7 @@ export class HyperAPINodeDriver } } - const hyperapi_response = await this.handler({ + const hyperapi_response = await this.emitRequest({ method: http_method, path: hyperapi_method, args: hyperapi_args, @@ -169,6 +147,13 @@ export class HyperAPINodeDriver : undefined, }; } + + /** Stops the server. */ + override destroy(): void { + this.server?.close(); + + super.destroy(); + } } export { type HyperAPINodeRequest } from './request.js'; diff --git a/src/request.ts b/src/request.ts index b11adb3..3a4a5a4 100644 --- a/src/request.ts +++ b/src/request.ts @@ -1,10 +1,12 @@ -import type { HyperAPIRequest } from '@hyperapi/core'; +import type { + BaseRecord, + EmptyObject, + HyperAPIRequest, +} from '@hyperapi/core/dev'; import type { IP } from '@kirick/ip'; -import type { EmptyObject } from 'type-fest'; -export interface HyperAPINodeRequest< - A extends Record = EmptyObject, -> extends HyperAPIRequest { +export interface HyperAPINodeRequest + extends HyperAPIRequest { // request: Request; url: URL; headers: Headers; diff --git a/src/utils/is-record.ts b/src/utils/is-record.ts deleted file mode 100644 index c5b9253..0000000 --- a/src/utils/is-record.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Check if a value is a record. - * @param value - - * @returns - - */ -export function isRecord(value: unknown): value is Record { - return ( - typeof value === 'object' && - value !== null && - !Array.isArray(value) && - value.constructor === Object && - Object.prototype.toString.call(value) === '[object Object]' - ); -} diff --git a/src/utils/parse.ts b/src/utils/parse.ts index c4d8373..e747f68 100644 --- a/src/utils/parse.ts +++ b/src/utils/parse.ts @@ -1,6 +1,6 @@ import { IncomingMessage } from 'node:http'; import { HyperAPIInvalidParametersError } from '@hyperapi/core'; -import { isRecord } from './is-record.js'; +import { isRecord } from '@hyperapi/core/dev'; import { parseFormData } from './parse/form-data.js'; import { parseText } from './parse/text.js'; diff --git a/test/hyper-api/echo-file.ts b/test/hyper-api/echo-file.ts index a5e4bba..44e96d4 100644 --- a/test/hyper-api/echo-file.ts +++ b/test/hyper-api/echo-file.ts @@ -1,16 +1,14 @@ -/* eslint-disable jsdoc/require-jsdoc */ +import * as v from 'valibot'; +import { hyperApi, valibot } from '../setup.js'; -import { Blob } from 'node:buffer'; -import { type HyperAPIResponse } from '@hyperapi/core'; -import { type HyperAPINodeRequest } from '../../src/main.js'; +export default hyperApi + .module() + .use(valibot(v.object({ file: v.blob() }))) + .action(async (request) => { + const name = await request.args.file.text(); -export default async function ( - request: HyperAPINodeRequest<{ name: Blob }>, -): Promise { - const name = await request.args.name.text(); - - return { - method: 'ALL', - message: `Hello, ${name}!`, - }; -} + return { + method: 'ALL', + message: `Hello, ${name}!`, + }; + }); diff --git a/test/hyper-api/echo-response.ts b/test/hyper-api/echo-response.ts new file mode 100644 index 0000000..2779c6b --- /dev/null +++ b/test/hyper-api/echo-response.ts @@ -0,0 +1,15 @@ +import * as v from 'valibot'; +import { hyperApi, valibot } from '../setup.js'; + +export default hyperApi + .module() + .use(valibot(v.object({ name: v.string() }))) + .action( + (request) => + new Response(`Hello, ${request.args.name}!`, { + status: 200, + headers: { + 'Content-Type': 'text/plain', + }, + }), + ); diff --git a/test/hyper-api/echo.ts b/test/hyper-api/echo.ts index e81b413..ce8c458 100644 --- a/test/hyper-api/echo.ts +++ b/test/hyper-api/echo.ts @@ -1,14 +1,13 @@ -/* eslint-disable jsdoc/require-jsdoc */ +import * as v from 'valibot'; +import { hyperApi, valibot } from '../setup.js'; -import { type HyperAPIResponse } from '@hyperapi/core'; -import { type HyperAPINodeRequest } from '../../src/main.js'; - -export default function ( - request: HyperAPINodeRequest<{ name: string }>, -): HyperAPIResponse { - return { - method: 'ALL', - message: `Hello, ${request.args.name}!`, - header_value: request.headers.get('x-test-header'), - }; -} +export default hyperApi + .module() + .use(valibot(v.object({ name: v.string() }))) + .action((request) => { + return { + method: 'ALL', + message: `Hello, ${request.args.name}!`, + header_value: request.headers.get('x-test-header'), + }; + }); diff --git a/test/hyper-api/error.ts b/test/hyper-api/error.ts index 2c51686..87d6897 100644 --- a/test/hyper-api/error.ts +++ b/test/hyper-api/error.ts @@ -1,6 +1,5 @@ -/* eslint-disable jsdoc/require-jsdoc */ - -import { HyperAPIRateLimitError, type HyperAPIResponse } from '@hyperapi/core'; +import { HyperAPIRateLimitError } from '@hyperapi/core'; +import { hyperApi } from '../setup.js'; class HyperAPILocalRateLimitError extends HyperAPIRateLimitError { override httpHeaders = { @@ -8,6 +7,6 @@ class HyperAPILocalRateLimitError extends HyperAPIRateLimitError { }; } -export default function (): HyperAPIResponse { +export default hyperApi.module().action(() => { throw new HyperAPILocalRateLimitError(); -} +}); diff --git a/test/setup.ts b/test/setup.ts index dd6b0c4..e262246 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1,18 +1,33 @@ -import { HyperAPI } from '@hyperapi/core'; +import { HyperAPI, HyperAPIInvalidParametersError } from '@hyperapi/core'; +import type { HyperAPIRequest } from '@hyperapi/core/dev'; +import * as v from 'valibot'; import { HyperAPINodeDriver } from '../src/main.js'; -export const hyperApi = new HyperAPI({ - driver: new HyperAPINodeDriver({ +const ROOT = new URL('hyper-api', import.meta.url).pathname; + +export const hyperApi = new HyperAPI( + new HyperAPINodeDriver({ port: 18001, - // multipart_formdata_enabled: true, }), - root: new URL('hyper-api', import.meta.url).pathname, -}); + ROOT, +); -export const hyperApiMultipart = new HyperAPI({ - driver: new HyperAPINodeDriver({ +export const hyperApiMultipart = new HyperAPI( + new HyperAPINodeDriver({ port: 18002, multipart_formdata_enabled: true, }), - root: new URL('hyper-api', import.meta.url).pathname, -}); + ROOT, +); + +// eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/no-explicit-any +export function valibot>(schema: S) { + return (request: HyperAPIRequest) => { + const result = v.safeParse(schema, request.args); + if (result.success) { + return { args: result.output }; + } + + throw new HyperAPIInvalidParametersError(); + }; +} From 42e1ffd8f7ba631f0db98dbf48d6e6869f1f505c Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Mon, 15 Sep 2025 00:53:31 +0200 Subject: [PATCH 17/20] Bump core --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 6e553ba..5b5666a 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,7 @@ "vitest": "3.2.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#5b3d7425be5b8526055aceeb4475a48f430d1736", + "@hyperapi/core": "github:hyperapi/core#fda360853e4fdd986bedc7e275e11241fd62140e", "@kirick/ip": "^0.1.1", }, }, @@ -135,7 +135,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#5b3d742", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0" } }, "hyperapi-core-5b3d742"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#fda3608", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0" } }, "hyperapi-core-fda3608"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], diff --git a/package.json b/package.json index a8506f8..bf4ea20 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#5b3d7425be5b8526055aceeb4475a48f430d1736", + "@hyperapi/core": "github:hyperapi/core#fda360853e4fdd986bedc7e275e11241fd62140e", "@kirick/ip": "^0.1.1" }, "devDependencies": { From fed161c854533b2541c62925b5017ffdf750a483 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Mon, 15 Sep 2025 01:26:24 +0200 Subject: [PATCH 18/20] Add `type-fest` --- bun.lock | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/bun.lock b/bun.lock index 5b5666a..cf06563 100644 --- a/bun.lock +++ b/bun.lock @@ -15,6 +15,7 @@ "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", + "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", "valibot": "1.1.0", @@ -669,6 +670,8 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], diff --git a/package.json b/package.json index bf4ea20..82ecd95 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", + "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", "valibot": "1.1.0", From db937e4eb87d4e3928f9800804da9bd8bd1e47f2 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Wed, 17 Sep 2025 02:28:52 +0200 Subject: [PATCH 19/20] Bump core --- bun.lock | 5 ++--- package.json | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index cf06563..a116054 100644 --- a/bun.lock +++ b/bun.lock @@ -15,14 +15,13 @@ "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", - "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", "valibot": "1.1.0", "vitest": "3.2.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#fda360853e4fdd986bedc7e275e11241fd62140e", + "@hyperapi/core": "github:hyperapi/core#fc3b443a432afc2b6ea381d67e9283f0389d12fb", "@kirick/ip": "^0.1.1", }, }, @@ -136,7 +135,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#fda3608", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0" } }, "hyperapi-core-fda3608"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#fc3b443", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0", "type-fest": "4.41.0" } }, "hyperapi-core-fc3b443"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], diff --git a/package.json b/package.json index 82ecd95..44b08e7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#fda360853e4fdd986bedc7e275e11241fd62140e", + "@hyperapi/core": "github:hyperapi/core#fc3b443a432afc2b6ea381d67e9283f0389d12fb", "@kirick/ip": "^0.1.1" }, "devDependencies": { @@ -36,7 +36,6 @@ "oxlint": "1.3.0", "publint": "0.3.12", "tsdown": "0.14.2", - "type-fest": "4.41.0", "typescript": "5.9.2", "unplugin-unused": "0.5.2", "valibot": "1.1.0", From 0dab9c5972b80ec1b16259e274083b164392d582 Mon Sep 17 00:00:00 2001 From: Daniil Kirichenko Date: Thu, 30 Oct 2025 16:04:09 +0100 Subject: [PATCH 20/20] Update dependencies & linter --- .oxlintrc.json | 9 +- .zed/settings.json | 76 +++++- biome.json | 24 +- bun.lock | 448 ++++++++++++++++++------------------ dist/main.cjs | 3 + dist/main.js | 3 + eslint.config.js | 4 +- package.json | 28 +-- src/main.ts | 11 + src/utils/http.ts | 14 +- src/utils/hyperapi-error.ts | 2 +- test/setup.ts | 10 +- test/tsconfig.json | 7 - tsconfig.base.json | 19 ++ tsconfig.json | 23 +- tsconfig.main.json | 8 + tsconfig.test.json | 8 +- vitest.config.ts | 10 - 18 files changed, 402 insertions(+), 305 deletions(-) delete mode 100644 test/tsconfig.json create mode 100644 tsconfig.base.json create mode 100644 tsconfig.main.json delete mode 100644 vitest.config.ts diff --git a/.oxlintrc.json b/.oxlintrc.json index 13b8341..7c73db6 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,9 +1,12 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", "extends": [ - "./node_modules/@kirick/lint/configs/oxlint/correctness.json", - "./node_modules/@kirick/lint/configs/oxlint/perf.json", - "./node_modules/@kirick/lint/configs/oxlint/restriction.json" + "./node_modules/@kirick/lint/configs/oxlint/correctness.jsonc", + "./node_modules/@kirick/lint/configs/oxlint/pedantic.jsonc", + "./node_modules/@kirick/lint/configs/oxlint/perf.jsonc", + "./node_modules/@kirick/lint/configs/oxlint/restriction.jsonc", + "./node_modules/@kirick/lint/configs/oxlint/style.jsonc", + "./node_modules/@kirick/lint/configs/oxlint/suspicious.jsonc" ], "ignorePatterns": ["dist"] } diff --git a/.zed/settings.json b/.zed/settings.json index 24cc794..66d29b4 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -1,12 +1,72 @@ { - "format_on_save": "on", - "formatter": { - "language_server": { - "name": "biome" + "languages": { + "JavaScript": { + "format_on_save": "on", + "formatter": [ + { "language_server": { "name": "biome" } }, + { "code_action": "source.organizeImports.biome" }, + { "code_action": "source.fixAll.biome" } + ] + }, + "TypeScript": { + "format_on_save": "on", + "formatter": [ + { "language_server": { "name": "biome" } }, + { "code_action": "source.organizeImports.biome" }, + { "code_action": "source.fixAll.biome" } + ] + }, + "TSX": { + "format_on_save": "on", + "formatter": [ + { "language_server": { "name": "biome" } }, + { "code_action": "source.organizeImports.biome" }, + { "code_action": "source.fixAll.biome" } + ] + }, + "JSON": { + "format_on_save": "on", + "formatter": [{ "language_server": { "name": "biome" } }] + }, + "JSONC": { + "format_on_save": "on", + "formatter": [{ "language_server": { "name": "biome" } }] + }, + "CSS": { + "format_on_save": "on", + "formatter": [{ "language_server": { "name": "biome" } }] + }, + "HTML": { + "format_on_save": "on", + "formatter": [ + { + "external": { + "command": "bunx", + "arguments": [ + "--bun", + "prettier", + "--stdin-filepath", + "{buffer_path}" + ] + } + } + ] + }, + "Vue.js": { + "format_on_save": "on", + "formatter": [ + { + "external": { + "command": "bunx", + "arguments": [ + "--bun", + "prettier", + "--stdin-filepath", + "{buffer_path}" + ] + } + } + ] } - }, - "code_actions_on_format": { - "source.fixAll.biome": true, - "source.organizeImports.biome": true } } diff --git a/biome.json b/biome.json index 91c3d81..3340c42 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -7,7 +7,7 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**", "!**/dist/**"] + "includes": ["**", "!**/dist/**", "!**/*.html", "!**/*.ejs", "!**/*.vue"] }, "formatter": { "enabled": true, @@ -26,7 +26,25 @@ }, "javascript": { "formatter": { - "quoteStyle": "single" + "quoteStyle": "single", + "operatorLinebreak": "before" + } + }, + "css": { + "parser": { + "tailwindDirectives": true + }, + "formatter": { + "enabled": true + } + }, + "html": { + "experimentalFullSupportEnabled": true, + "parser": { + "interpolation": true + }, + "formatter": { + "enabled": true } } } diff --git a/bun.lock b/bun.lock index a116054..863b243 100644 --- a/bun.lock +++ b/bun.lock @@ -7,53 +7,53 @@ "busboy": "1.6.0", }, "devDependencies": { - "@biomejs/biome": "2.1.1", - "@kirick/lint": "0.2.8", - "@types/busboy": "^1.5.4", + "@biomejs/biome": "2.3.1", + "@kirick/lint": "0.2.12", + "@types/busboy": "1.5.4", "@types/node": "^20", - "eslint": "9.27.0", - "oxlint": "1.3.0", - "publint": "0.3.12", - "tsdown": "0.14.2", - "typescript": "5.9.2", - "unplugin-unused": "0.5.2", + "eslint": "9.38.0", + "oxlint": "1.24.0", + "publint": "0.3.15", + "tsdown": "0.15.11", + "typescript": "5.9.3", + "unplugin-unused": "0.5.4", "valibot": "1.1.0", - "vitest": "3.2.4", + "vitest": "4.0.4", }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#fc3b443a432afc2b6ea381d67e9283f0389d12fb", + "@hyperapi/core": "github:hyperapi/core#1aa5ffd2e603040e99f80f84b028a386ead5cca5", "@kirick/ip": "^0.1.1", }, }, }, "packages": { - "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - "@biomejs/biome": ["@biomejs/biome@2.1.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.1", "@biomejs/cli-darwin-x64": "2.1.1", "@biomejs/cli-linux-arm64": "2.1.1", "@biomejs/cli-linux-arm64-musl": "2.1.1", "@biomejs/cli-linux-x64": "2.1.1", "@biomejs/cli-linux-x64-musl": "2.1.1", "@biomejs/cli-win32-arm64": "2.1.1", "@biomejs/cli-win32-x64": "2.1.1" }, "bin": { "biome": "bin/biome" } }, "sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng=="], + "@biomejs/biome": ["@biomejs/biome@2.3.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.1", "@biomejs/cli-darwin-x64": "2.3.1", "@biomejs/cli-linux-arm64": "2.3.1", "@biomejs/cli-linux-arm64-musl": "2.3.1", "@biomejs/cli-linux-x64": "2.3.1", "@biomejs/cli-linux-x64-musl": "2.3.1", "@biomejs/cli-win32-arm64": "2.3.1", "@biomejs/cli-win32-x64": "2.3.1" }, "bin": { "biome": "bin/biome" } }, "sha512-A29evf1R72V5bo4o2EPxYMm5mtyGvzp2g+biZvRFx29nWebGyyeOSsDWGx3tuNNMFRepGwxmA9ZQ15mzfabK2w=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ombSf3MnTUueiYGN1SeI9tBCsDUhpWzOwS63Dove42osNh0PfE1cUtHFx6eZ1+MYCCLwXzlFlYFdrJ+U7h6LcA=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pcOfwyoQkrkbGvXxRvZNe5qgD797IowpJPovPX5biPk2FwMEV+INZqfCaz4G5bVq9hYnjwhRMamg11U4QsRXrQ=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-td5O8pFIgLs8H1sAZsD6v+5quODihyEw4nv2R8z7swUfIK1FKk+15e4eiYVLcAE4jUqngvh4j3JCNgg0Y4o4IQ=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+DZYv8l7FlUtTrWs1Tdt1KcNCAmRO87PyOnxKGunbWm5HKg1oZBSbIIPkjrCtDZaeqSG1DiGx7qF+CPsquQRcg=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-PYWgEO7up7XYwSAArOpzsVCiqxBCXy53gsReAb1kKYIyXaoAlhBaBMvxR/k2Rm9aTuZ662locXUmPk/Aj+Xu+Q=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Y3Ob4nqgv38Mh+6EGHltuN+Cq8aj/gyMTJYzkFZV2AEj+9XzoXB9VNljz9pjfFNHUxvLEV4b55VWyxozQTBaUQ=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RHIG/zgo+69idUqVvV3n8+j58dKYABRpMyDmfWu2TITC+jwGPiEaT0Q3RKD+kQHiS80mpBrST0iUGeEXT0bU9A=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-izl30JJ5Dp10mi90Eko47zhxE6pYyWPcnX1NQxKpL/yMhXxf95oLTzfpu4q+MDBh/gemNqyJEwjBpe0MT5iWPA=="], "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], @@ -61,71 +61,79 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.50.2", "", { "dependencies": { "@types/estree": "^1.0.6", "@typescript-eslint/types": "^8.11.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" } }, "sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA=="], + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.76.0", "", { "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.46.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~6.10.0" } }, "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "@es-joy/resolve.exports": ["@es-joy/resolve.exports@1.0.0", "", {}, "sha512-bbrmzsAZ9GA/3oBS6r8PWMtZarEhKHr413hak8ArwMEZ5DtaLErnkcyEWUsXy7urBcmVu/TpDzHPDVM5uIbx9A=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.11", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.11", "", { "os": "android", "cpu": "arm" }, "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.11", "", { "os": "android", "cpu": "arm64" }, "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.11", "", { "os": "android", "cpu": "x64" }, "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.11", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.11", "", { "os": "linux", "cpu": "arm" }, "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.11", "", { "os": "linux", "cpu": "ia32" }, "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.11", "", { "os": "linux", "cpu": "none" }, "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.11", "", { "os": "linux", "cpu": "none" }, "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.11", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.11", "", { "os": "linux", "cpu": "none" }, "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.11", "", { "os": "linux", "cpu": "s390x" }, "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.11", "", { "os": "linux", "cpu": "x64" }, "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.11", "", { "os": "none", "cpu": "arm64" }, "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.11", "", { "os": "none", "cpu": "x64" }, "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.11", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.11", "", { "os": "openbsd", "cpu": "x64" }, "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.11", "", { "os": "none", "cpu": "arm64" }, "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.11", "", { "os": "sunos", "cpu": "x64" }, "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.11", "", { "os": "win32", "cpu": "x64" }, "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], + "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.1", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw=="], - "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + "@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.27.0", "", {}, "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA=="], + "@eslint/js": ["@eslint/js@9.38.0", "", {}, "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A=="], - "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], @@ -135,7 +143,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#fc3b443", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0", "type-fest": "4.41.0" } }, "hyperapi-core-fc3b443"], + "@hyperapi/core": ["@hyperapi/core@github:hyperapi/core#1aa5ffd", { "dependencies": { "itty-router": "5.0.22", "neoevents": "0.3.0", "type-fest": "4.41.0" } }, "hyperapi-core-1aa5ffd"], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -145,15 +153,15 @@ "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], "@kirick/ip": ["@kirick/ip@0.1.1", "", { "dependencies": { "ip-address": "9.0.5" } }, "sha512-i65LRnc33KnE9cPBt0QzT2z/+/lg8351Ao6A2xCQ27GqgNjdjoFh20xrXPu3FkpX8p5W4TbRj10xEiQS6MjZZw=="], - "@kirick/lint": ["@kirick/lint@0.2.8", "", { "dependencies": { "@stylistic/eslint-plugin": "^4.4.0", "eslint": "9.27.0", "eslint-plugin-jsdoc": "50.6.17", "eslint-plugin-n": "^17.18.0", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vue": "^10.1.0", "typescript-eslint": "8.32.1" }, "bin": { "lint": "dist/main.js" } }, "sha512-Qwak6XMmuThAwLhkJeuPe13CGTpydN/pLmzsiazARmerssGjQZce7+R3ZFPwhNOZ5wl2NltxvWqqx8NmNCenbA=="], + "@kirick/lint": ["@kirick/lint@0.2.12", "", { "dependencies": { "@stylistic/eslint-plugin": "5.5.0", "eslint": "9.38.0", "eslint-plugin-jsdoc": "61.1.9", "eslint-plugin-n": "17.23.1", "eslint-plugin-promise": "7.2.1", "eslint-plugin-unicorn": "62.0.0", "eslint-plugin-vue": "10.5.1", "typescript-eslint": "8.46.2" }, "bin": { "lint": "dist/main.js" } }, "sha512-eE//5Z21/Sdb8JjhL2x27ZPDjaVLWmaIJ50zUJC0d08u6VPqCLPMVryYDM3NLJn8G9YrBLqmKDQ9X+0+dsuOWw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.3", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@tybys/wasm-util": "^0.10.0" } }, "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -161,95 +169,113 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@oxc-project/runtime": ["@oxc-project/runtime@0.87.0", "", {}, "sha512-ky2Hqi2q/uGX36UfY79zxMbUqiNIl1RyKKVJfFenG70lbn+/fcaKBVTbhmUwn8a2wPyv2gNtDQxuDytbKX9giQ=="], + "@oxc-project/runtime": ["@oxc-project/runtime@0.95.0", "", {}, "sha512-qJS5pNepwMGnafO9ayKGz7rfPQgUBuunHpnP1//9Qa0zK3oT3t1EhT+I+pV9MUA+ZKez//OFqxCxf1vijCKb2Q=="], - "@oxc-project/types": ["@oxc-project/types@0.87.0", "", {}, "sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g=="], + "@oxc-project/types": ["@oxc-project/types@0.95.0", "", {}, "sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ=="], - "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@1.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TcCaETXYfiEfS+u/gZNND4WwEEtnJJjqg8BIC56WiCQDduYTvmmbQ0vxtqdNXlFzlvmRpZCSs7qaqXNy8/8FLA=="], + "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@1.24.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1Kd2+Ai1ttskhbJR+DNU4Y4YEDyP/cd50nWt2rAe2aE78dMOalaVGps3s8UnJkXpDL9ZqkgOHVDE5Doj2lxatw=="], - "@oxlint/darwin-x64": ["@oxlint/darwin-x64@1.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-REgq9s1ZWuh++Vi+mUPNddLTp/D+iu+T8nLd3QM1dzQoBD/SZ7wRX3Mdv8QGT/m8dknmDBQuKAP6T47ox9HRSA=="], + "@oxlint/darwin-x64": ["@oxlint/darwin-x64@1.24.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-/R9VbnuTp7bLIBh6ucDHjx0po0wLQODLqzy+L/Frn5z4ifMVdE63DB+LHO8QAj+WEQleQq3u/MMms7RFPulCLA=="], - "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QAS8AWKDcDeUe8mJaw/pF2D9+js8FbFTo75AiekZKNm9V6QAAiCkyvesmILD8RrStw9aV2D/apOD71vsfcDoGA=="], + "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@1.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-fA90bIQ1b44eNg0uULlTonqsADVIBnMz169mav6IhfZL9V6DpBCUWrV+8tEQCxbDvYC0WY1guBpPo2QWUnC/Dw=="], - "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rAbz0KFkk5GPdERoFO4ZUZmVkECnHXjRG0O2MeT5zY7ddlyZUjEk1cWjw+HCtWVdKkqhZJeNFMuEiRLkpzBIIw=="], + "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@1.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-p7Bv9FTQ1lf4Z7OiIFwiy+cY2fxN6IJc0+2gJ4z2fpaQ0J2rQQcKdJ5RLQTxf+tAu7hyqjc6bf61EAGa9lb/GA=="], - "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-6uLO1WsJwCtVNGHtjXwg2TRvxQYttYJKMjSdv6RUXGWY1AI+/+yHzvu+phU/F40uNC7CFhFnqWDuPaSZ49hdAQ=="], + "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@1.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wIQOpTONiJ9pYPnLEq7UFuml8mpmSFTfUveNbT2rw9iXfj2nLMf7NIqGnUYQdvnnOi+maag9uei/WImXIm9LQQ=="], - "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+vrmJUHgtJmgIo+L9eTP04NI/OQNCOZtQo6I49qGWc9cpr+0MnIh9KMcyAOxmzVTF5g+CF1I/1bUz4pk4I3LDw=="], + "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@1.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-HxcDX/SpTH7yC/Rn2MinjSHZmNpn79yJkBid792DWjP9bo0CnlNXOXMPXsbm+WqptvqQ9yUPCxf7KascUvxLyQ=="], - "@oxlint/win32-arm64": ["@oxlint/win32-arm64@1.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-k+ETUVl+O3b8Rcd2PP5V3LqQ2QoN/TOX2f19XXHZEynbVLY3twLYPb3hLdXqoo7CKRq3RJdTfn1upHH48/qrZQ=="], + "@oxlint/win32-arm64": ["@oxlint/win32-arm64@1.24.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-P1KtZ/xL+TcNTTmOtEsVrpqAdmpu2UCRAILjoqQyrYvI/CW6SdvoJfMBTntKOZaB52Peq2BHTgsYovON8q4FfQ=="], - "@oxlint/win32-x64": ["@oxlint/win32-x64@1.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-nWSgK0fT02TQ/BiAUCd13BaobtHySkCDcQaL+NOmhgeb0tNWjtYiktuluahaIqFcYJPWczVlbs8DU/Eqo8vsug=="], + "@oxlint/win32-x64": ["@oxlint/win32-x64@1.24.0", "", { "os": "win32", "cpu": "x64" }, "sha512-JMbMm7i1esFl12fRdOQwoeEeufWXxihOme8pZpI6jrwWK1kCIANMb5agI5Lkjf5vToQOP3DLXYc29aDm16fw6g=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], "@publint/pack": ["@publint/pack@0.1.2", "", {}, "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw=="], "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.36", "", { "os": "android", "cpu": "arm64" }, "sha512-0y4+MDSw9GzX4VZtATiygDv+OtijxsRtNBZW6qA3OUGi0fq6Gq+MnvFHMjdJxz3mv/thIHMmJ0AL7d8urYBCUw=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.45", "", { "os": "android", "cpu": "arm64" }, "sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.45", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.45", "", { "os": "darwin", "cpu": "x64" }, "sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "arm64" }, "sha512-F/xv0vsxXuwpyecy3GMpXPhRLI4WogQkSYYl6hh61OfmyX4lxsemSoYQ5nlK/MopdVaT111wS1dRO2eXgzBHuA=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.45", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "x64" }, "sha512-FX3x/GSybYRt4/fUljqIMuB7JRJThxnwzjK9Ka4qKwSw92RNmxRtw+NEkpuKq/Tzcq5qpnvSWudKmjcbBSMH1g=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45", "", { "os": "linux", "cpu": "arm" }, "sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.36", "", { "os": "freebsd", "cpu": "x64" }, "sha512-j7Y/OG4XxICRgGMLB7VVbROAzdnvtr0ZTBBYnv53KZESE97Ta4zXfGhEe+EiXLRKW8JWSMeNumOaBrWAXDMiZQ=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45", "", { "os": "linux", "cpu": "arm64" }, "sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm" }, "sha512-j3rDknokIJZ+iVGjWw2cVRgKLmk9boUoHtp2k3Ba6p7vWIv+D/YypQKHxAayyzvUkxTBZsw64Ojq5/zrytRODA=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.45", "", { "os": "linux", "cpu": "arm64" }, "sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Ds2nl3ZhC0eaSJnw7dQ5uCK1cmaBKC+EL7IIpjTpzqY10y1xCn5w6gTFKzpqKhD2nSraY4MHOyAnE+zmSAZRA=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.45", "", { "os": "linux", "cpu": "x64" }, "sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-0Qa4b3gv956iSdJQplV1xdI9ALbEdNo5xsFpcLU4mW2A+CqWNenVHqcHbCvwvKTP07yX6yoUvUqZR1CBxxQShg=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.45", "", { "os": "linux", "cpu": "x64" }, "sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-wUdZljtx9W1V9KlnmwPgF0o2ZPFq2zffr/q+wM+GUrSFIJNmP9w0zgyl1coCt1ESnNyYYyJh8T1bqvx8+16SqA=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.45", "", { "os": "none", "cpu": "arm64" }, "sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-Up56sJMDSKYi92/28lq9xB2wonuCwVnqBzjRnKmQauZJ5QOor9h1RtcMeCzSxg4ReMsNvrdYomBogewcZgKEww=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.45", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.36", "", { "os": "none", "cpu": "arm64" }, "sha512-qX3covX7EX00yrgQl3oi8GuRTS1XFe+YHm+sGsxQvPok+r7Ct2eDFpLmmw7wajZ2SuvAJYSo/9BXLSCGR0ve2w=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45", "", { "os": "win32", "cpu": "arm64" }, "sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.36", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-phFsiR97/nbQEtyo5GTPX4h/Ootz0Pdd7P7+gTmkiashePwPUik5aoMAluvzY1tTUAfhdrFR2Y8WiWbnxnsSrQ=="], + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45", "", { "os": "win32", "cpu": "ia32" }, "sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "arm64" }, "sha512-dvvByfl7TRVhD9zY/VJ94hOVJmpN8Cfxl/A77yJ/oKV67IPEXx9hRUIhuL/V9eJ0RphNbLo4VKxdVuZ+wzEWTA=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.45", "", { "os": "win32", "cpu": "x64" }, "sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA=="], - "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "ia32" }, "sha512-n7odfY4zatppNGY/EE8wE8B78wIxlQzBaY7Ycyjun+HvYu4dJgz8A4JCKHhyYYoEA8+VXO167Or4EJ9SyBLNnw=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.45", "", {}, "sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "x64" }, "sha512-ik9dlOa/bhRk+8NmbqCEZm9BBPy5UfSOg/Y6cAQac29Aw2/uoyoBbFUBFUKMsvfLg8F0dNxUOsT3IcVlfOJu0g=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.5", "", { "os": "android", "cpu": "arm" }, "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.36", "", {}, "sha512-qa+gfzhv0/Xv52zZInENLu6JbsnSjSExD7kTaNm7Qn5LUIH6IQb7l9pB+NrsU5/Bvt9aqcBTdRGc7x1DYMTiqQ=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.5", "", { "os": "android", "cpu": "arm64" }, "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.21.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.5", "", { "os": "none", "cpu": "arm64" }, "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="], - "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@4.4.1", "", { "dependencies": { "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], + + "@sindresorhus/base62": ["@sindresorhus/base62@1.0.0", "", {}, "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.0", "@typescript-eslint/types": "^8.46.1", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/busboy": ["@types/busboy@1.5.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw=="], @@ -263,35 +289,39 @@ "@types/node": ["@types/node@20.16.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/type-utils": "8.46.2", "@typescript-eslint/utils": "8.46.2", "@typescript-eslint/visitor-keys": "8.46.2", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.2", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", "@typescript-eslint/typescript-estree": "8.46.2", "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.6.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.6.0", "@typescript-eslint/types": "8.6.0", "@typescript-eslint/typescript-estree": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.2", "@typescript-eslint/types": "^8.46.2", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.2", "", { "dependencies": { "@typescript-eslint/types": "8.46.2", "@typescript-eslint/visitor-keys": "8.46.2" } }, "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.2", "", { "dependencies": { "@typescript-eslint/types": "8.46.2", "@typescript-eslint/typescript-estree": "8.46.2", "@typescript-eslint/utils": "8.46.2", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.46.2", "", {}, "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.2", "@typescript-eslint/tsconfig-utils": "8.46.2", "@typescript-eslint/types": "8.46.2", "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", "@typescript-eslint/typescript-estree": "8.46.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.2", "", { "dependencies": { "@typescript-eslint/types": "8.46.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w=="], - "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + "@vitest/expect": ["@vitest/expect@4.0.4", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.4", "@vitest/utils": "4.0.4", "chai": "^6.0.1", "tinyrainbow": "^3.0.3" } }, "sha512-0ioMscWJtfpyH7+P82sGpAi3Si30OVV73jD+tEqXm5+rIx9LgnfdaOn45uaFkKOncABi/PHL00Yn0oW/wK4cXw=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "@vitest/mocker": ["@vitest/mocker@4.0.4", "", { "dependencies": { "@vitest/spy": "4.0.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.19" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-UTtKgpjWj+pvn3lUM55nSg34098obGhSHH+KlJcXesky8b5wCUgg7s60epxrS6yAG8slZ9W8T9jGWg4PisMf5Q=="], - "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.0.4", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-lHI2rbyrLVSd1TiHGJYyEtbOBo2SDndIsN3qY4o4xe2pBxoJLD6IICghNCvD7P+BFin6jeyHXiUICXqgl6vEaQ=="], - "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + "@vitest/runner": ["@vitest/runner@4.0.4", "", { "dependencies": { "@vitest/utils": "4.0.4", "pathe": "^2.0.3" } }, "sha512-99EDqiCkncCmvIZj3qJXBZbyoQ35ghOwVWNnQ5nj0Hnsv4Qm40HmrMJrceewjLVvsxV/JSU4qyx2CGcfMBmXJw=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@vitest/snapshot": ["@vitest/snapshot@4.0.4", "", { "dependencies": { "@vitest/pretty-format": "4.0.4", "magic-string": "^0.30.19", "pathe": "^2.0.3" } }, "sha512-XICqf5Gi4648FGoBIeRgnHWSNDp+7R5tpclGosFaUUFzY6SfcpsfHNMnC7oDu/iOLBxYfxVzaQpylEvpgii3zw=="], - "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + "@vitest/spy": ["@vitest/spy@4.0.4", "", {}, "sha512-G9L13AFyYECo40QG7E07EdYnZZYCKMTSp83p9W8Vwed0IyCG1GnpDLxObkx8uOGPXfDpdeVf24P1Yka8/q1s9g=="], + + "@vitest/utils": ["@vitest/utils@4.0.4", "", { "dependencies": { "@vitest/pretty-format": "4.0.4", "tinyrainbow": "^3.0.3" } }, "sha512-4bJLmSvZLyVbNsYFRpPYdJViG9jZyRvMZ35IF4ymXbRZoS+ycYghmwTGiscTXduUg2lgKK7POWIyXJNute1hjw=="], "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], @@ -301,19 +331,19 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@4.1.0", "", {}, "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w=="], + "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - - "ast-kit": ["ast-kit@2.1.2", "", { "dependencies": { "@babel/parser": "^7.28.0", "pathe": "^2.0.3" } }, "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g=="], + "ast-kit": ["ast-kit@2.1.3", "", { "dependencies": { "@babel/parser": "^7.28.4", "pathe": "^2.0.3" } }, "sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.20", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ=="], + + "birpc": ["birpc@2.6.1", "", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], @@ -321,7 +351,7 @@ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.25.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg=="], + "browserslist": ["browserslist@4.27.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", "electron-to-chromium": "^1.5.238", "node-releases": "^2.0.26", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw=="], "builtin-modules": ["builtin-modules@5.0.0", "", {}, "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg=="], @@ -331,17 +361,17 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001741", "", {}, "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="], - "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + "chai": ["chai@6.2.0", "", {}, "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "ci-info": ["ci-info@4.3.0", "", {}, "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="], + "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], @@ -355,7 +385,7 @@ "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "core-js-compat": ["core-js-compat@3.45.1", "", { "dependencies": { "browserslist": "^4.25.3" } }, "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA=="], + "core-js-compat": ["core-js-compat@3.46.0", "", { "dependencies": { "browserslist": "^4.26.3" } }, "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -363,8 +393,6 @@ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], @@ -373,7 +401,7 @@ "dts-resolver": ["dts-resolver@2.1.2", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg=="], - "electron-to-chromium": ["electron-to-chromium@1.5.214", "", {}, "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q=="], + "electron-to-chromium": ["electron-to-chromium@1.5.243", "", {}, "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g=="], "empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], @@ -381,27 +409,27 @@ "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], - "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + "esbuild": ["esbuild@0.25.11", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.11", "@esbuild/android-arm": "0.25.11", "@esbuild/android-arm64": "0.25.11", "@esbuild/android-x64": "0.25.11", "@esbuild/darwin-arm64": "0.25.11", "@esbuild/darwin-x64": "0.25.11", "@esbuild/freebsd-arm64": "0.25.11", "@esbuild/freebsd-x64": "0.25.11", "@esbuild/linux-arm": "0.25.11", "@esbuild/linux-arm64": "0.25.11", "@esbuild/linux-ia32": "0.25.11", "@esbuild/linux-loong64": "0.25.11", "@esbuild/linux-mips64el": "0.25.11", "@esbuild/linux-ppc64": "0.25.11", "@esbuild/linux-riscv64": "0.25.11", "@esbuild/linux-s390x": "0.25.11", "@esbuild/linux-x64": "0.25.11", "@esbuild/netbsd-arm64": "0.25.11", "@esbuild/netbsd-x64": "0.25.11", "@esbuild/openbsd-arm64": "0.25.11", "@esbuild/openbsd-x64": "0.25.11", "@esbuild/openharmony-arm64": "0.25.11", "@esbuild/sunos-x64": "0.25.11", "@esbuild/win32-arm64": "0.25.11", "@esbuild/win32-ia32": "0.25.11", "@esbuild/win32-x64": "0.25.11" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.27.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.27.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q=="], + "eslint": ["eslint@9.38.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.1", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.38.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw=="], "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], "eslint-plugin-es-x": ["eslint-plugin-es-x@7.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ=="], - "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@50.6.17", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.50.1", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports-exports": "^0.2.4", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ=="], + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@61.1.9", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.76.0", "@es-joy/resolve.exports": "1.0.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", "semver": "^7.7.3", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-X2AzSGbq1CzBRgKcVAu2qzOV9ogqygkUDk5AX6eNK5G+kY3I5Op5E5b99fE+FN0/bGnk2KGcsMIG6ZLF+di69A=="], - "eslint-plugin-n": ["eslint-plugin-n@17.21.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3", "ts-declaration-location": "^1.0.6" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw=="], + "eslint-plugin-n": ["eslint-plugin-n@17.23.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3", "ts-declaration-location": "^1.0.6" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A=="], "eslint-plugin-promise": ["eslint-plugin-promise@7.2.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@59.0.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "@eslint-community/eslint-utils": "^4.5.1", "@eslint/plugin-kit": "^0.2.7", "ci-info": "^4.2.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.41.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", "globals": "^16.0.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.1", "strip-indent": "^4.0.0" }, "peerDependencies": { "eslint": ">=9.22.0" } }, "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@62.0.0", "", { "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", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.13.0", "semver": "^7.7.3", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g=="], - "eslint-plugin-vue": ["eslint-plugin-vue@10.4.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "optionalPeers": ["@typescript-eslint/parser"] }, "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw=="], + "eslint-plugin-vue": ["eslint-plugin-vue@10.5.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "optionalPeers": ["@stylistic/eslint-plugin", "@typescript-eslint/parser"] }, "sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], @@ -419,7 +447,7 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], @@ -465,6 +493,8 @@ "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], @@ -495,7 +525,7 @@ "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], - "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.1.0", "", {}, "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@6.10.0", "", {}, "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], @@ -515,35 +545,33 @@ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], - - "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "neoevents": ["neoevents@0.3.0", "", {}, "sha512-et9vcJ8ElRUbgxeJXAw++1noXVY302fxRvwEoIDll9KiQAeySjTQBdLtATvtE17MgbitLjjixI5UcFOS92EI+w=="], - "node-releases": ["node-releases@2.0.20", "", {}, "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA=="], + "node-releases": ["node-releases@2.0.26", "", {}, "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA=="], "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + "object-deep-merge": ["object-deep-merge@2.0.0", "", {}, "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "oxlint": ["oxlint@1.3.0", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "1.3.0", "@oxlint/darwin-x64": "1.3.0", "@oxlint/linux-arm64-gnu": "1.3.0", "@oxlint/linux-arm64-musl": "1.3.0", "@oxlint/linux-x64-gnu": "1.3.0", "@oxlint/linux-x64-musl": "1.3.0", "@oxlint/win32-arm64": "1.3.0", "@oxlint/win32-x64": "1.3.0" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-PzAOmPxnXYpVF1q6h9pkOPH6uJ/44XrtFWJ8JcEMpoEq9HISNelD3lXhACtOAW8CArjLy/qSlu2KkyPxnXgctA=="], + "oxlint": ["oxlint@1.24.0", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "1.24.0", "@oxlint/darwin-x64": "1.24.0", "@oxlint/linux-arm64-gnu": "1.24.0", "@oxlint/linux-arm64-musl": "1.24.0", "@oxlint/linux-x64-gnu": "1.24.0", "@oxlint/linux-x64-musl": "1.24.0", "@oxlint/win32-arm64": "1.24.0", "@oxlint/win32-x64": "1.24.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.2.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-swXlnHT7ywcCApkctIbgOSjDYHwMa12yMU0iXevfDuHlYkRUcbQrUv6nhM5v6B0+Be3zTBMNDGPAMQv0oznzRQ=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -563,8 +591,6 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -573,13 +599,13 @@ "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], - "postcss": ["postcss@8.4.47", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", "source-map-js": "^1.2.1" } }, "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "publint": ["publint@0.3.12", "", { "dependencies": { "@publint/pack": "^0.1.2", "package-manager-detector": "^1.1.0", "picocolors": "^1.1.1", "sade": "^1.8.1" }, "bin": { "publint": "src/cli.js" } }, "sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w=="], + "publint": ["publint@0.3.15", "", { "dependencies": { "@publint/pack": "^0.1.2", "package-manager-detector": "^1.3.0", "picocolors": "^1.1.1", "sade": "^1.8.1" }, "bin": { "publint": "src/cli.js" } }, "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -591,7 +617,9 @@ "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], - "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], + + "reserved-identifiers": ["reserved-identifiers@1.2.0", "", {}, "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -599,17 +627,17 @@ "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], - "rolldown": ["rolldown@1.0.0-beta.36", "", { "dependencies": { "@oxc-project/runtime": "=0.87.0", "@oxc-project/types": "=0.87.0", "@rolldown/pluginutils": "1.0.0-beta.36", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-x64": "1.0.0-beta.36", "@rolldown/binding-freebsd-x64": "1.0.0-beta.36", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.36", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.36", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.36", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.36", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.36" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-eethnJ/UfQWg2VWBDDMEu7IDvEh4WPbPb1azPWDCHcuOwoPT9C2NT4Y/ecZztCl9OBzXoA+CXXb5MS+qbukAig=="], + "rolldown": ["rolldown@1.0.0-beta.45", "", { "dependencies": { "@oxc-project/types": "=0.95.0", "@rolldown/pluginutils": "1.0.0-beta.45" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.45", "@rolldown/binding-darwin-arm64": "1.0.0-beta.45", "@rolldown/binding-darwin-x64": "1.0.0-beta.45", "@rolldown/binding-freebsd-x64": "1.0.0-beta.45", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.45", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.45", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.45", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.45", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.45", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.45", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.45", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.45", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.45", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.45" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ=="], - "rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="], + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.17.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ast-kit": "^2.1.3", "birpc": "^2.6.1", "debug": "^4.4.3", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.13.0", "magic-string": "^0.30.21" }, "peerDependencies": { "@ts-macro/tsc": "^0.3.6", "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.44", "typescript": "^5.0.0", "vue-tsc": "~3.1.0" }, "optionalPeers": ["@ts-macro/tsc", "@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-tbLm7FoDvZAhAY33wJbq0ACw+srToKZ5xFqwn/K4tayGloZPXQHyOEPEYi7whEfTCaMndZWaho9+oiQTlwIe6Q=="], - "rollup": ["rollup@4.21.3", "", { "dependencies": { "@types/estree": "1.0.5" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.21.3", "@rollup/rollup-android-arm64": "4.21.3", "@rollup/rollup-darwin-arm64": "4.21.3", "@rollup/rollup-darwin-x64": "4.21.3", "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", "@rollup/rollup-linux-arm-musleabihf": "4.21.3", "@rollup/rollup-linux-arm64-gnu": "4.21.3", "@rollup/rollup-linux-arm64-musl": "4.21.3", "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", "@rollup/rollup-linux-riscv64-gnu": "4.21.3", "@rollup/rollup-linux-s390x-gnu": "4.21.3", "@rollup/rollup-linux-x64-gnu": "4.21.3", "@rollup/rollup-linux-x64-musl": "4.21.3", "@rollup/rollup-win32-arm64-msvc": "4.21.3", "@rollup/rollup-win32-ia32-msvc": "4.21.3", "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA=="], + "rollup": ["rollup@4.52.5", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -633,14 +661,14 @@ "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - "strip-indent": ["strip-indent@4.0.0", "", { "dependencies": { "min-indent": "^1.0.1" } }, "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA=="], + "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], @@ -649,21 +677,19 @@ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], - - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - - "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + "tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], "ts-declaration-location": ["ts-declaration-location@1.0.7", "", { "dependencies": { "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": ">=4.0.0" } }, "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA=="], - "tsdown": ["tsdown@0.14.2", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.15.8", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A=="], + "tsdown": ["tsdown@0.15.11", "", { "dependencies": { "ansis": "^4.2.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.3", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "1.0.0-beta.45", "rolldown-plugin-dts": "^0.17.1", "semver": "^7.7.3", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3", "unrun": "^0.2.0" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-7k2OglWWt6LzvJKwEf1izbGvETvVfPYRBr9JgEYVRnz/R9LeJSp+B51FUMO46wUeEGtZ1jA3E3PtWWLlq3iygA=="], "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], @@ -671,9 +697,9 @@ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], + "typescript-eslint": ["typescript-eslint@8.46.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.2", "@typescript-eslint/parser": "8.46.2", "@typescript-eslint/typescript-estree": "8.46.2", "@typescript-eslint/utils": "8.46.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg=="], "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], @@ -681,9 +707,11 @@ "unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], - "unplugin-unused": ["unplugin-unused@0.5.2", "", { "dependencies": { "js-tokens": "^9.0.1", "picocolors": "^1.1.1", "pkg-types": "^2.2.0", "unplugin": "^2.3.6" } }, "sha512-fn0DZrp96+NYo4U5UbLp1ZmZpBk/Z1RhjG2LvXfQxxw82dzciBxmx04ZgATxLZDD4HcGhdWlLIm2Gz1SVIBhDQ=="], + "unplugin-unused": ["unplugin-unused@0.5.4", "", { "dependencies": { "js-tokens": "^9.0.1", "pkg-types": "^2.3.0", "unplugin": "^2.3.10" } }, "sha512-R11StgC5j43CECdjHFbc6Ep4MgM97xuI7rku/nCw7OpIEw9sG4btxvR7Ld4RViwAF+eEQjSebesE+jTJTFFWmQ=="], - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "unrun": ["unrun@0.2.1", "", { "dependencies": { "@oxc-project/runtime": "^0.95.0", "rolldown": "1.0.0-beta.45", "synckit": "^0.11.11" }, "bin": { "unrun": "dist/cli.js" } }, "sha512-1HpwmlCKrAOP3jPxFisPR0sYpPuiNtyYKJbmKu9iugIdvCte3DH1uJ1p1DBxUWkxW2pjvkUguJoK9aduK8ak3Q=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -691,11 +719,9 @@ "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], - "vite": ["vite@5.4.6", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q=="], - - "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + "vite": ["vite@7.1.12", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug=="], - "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + "vitest": ["vitest@4.0.4", "", { "dependencies": { "@vitest/expect": "4.0.4", "@vitest/mocker": "4.0.4", "@vitest/pretty-format": "4.0.4", "@vitest/runner": "4.0.4", "@vitest/snapshot": "4.0.4", "@vitest/spy": "4.0.4", "@vitest/utils": "4.0.4", "debug": "^4.4.3", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.19", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.4", "@vitest/browser-preview": "4.0.4", "@vitest/browser-webdriverio": "4.0.4", "@vitest/ui": "4.0.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-hV31h0/bGbtmDQc0KqaxsTO1v4ZQeF8ojDFuy4sZhFadwAqqvJA0LDw68QUocctI5EDpFMql/jVWKuPYHIf2Ew=="], "vue-eslint-parser": ["vue-eslint-parser@9.4.3", "", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg=="], @@ -711,78 +737,64 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "@es-joy/jsdoccomment/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@eslint/config-array/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], + "@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], "@jridgewell/remapping/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], "@jridgewell/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@stylistic/eslint-plugin/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], + "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0" } }, "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw=="], + "@typescript-eslint/parser/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], + "@typescript-eslint/project-service/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.6.0", "", { "dependencies": { "@typescript-eslint/types": "8.6.0", "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g=="], + "@typescript-eslint/type-utils/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "@typescript-eslint/parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], - - "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], + "@typescript-eslint/typescript-estree/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.6.0", "", {}, "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw=="], - - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "chai/loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], - "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "eslint-compat-utils/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "eslint-plugin-es-x/@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.1", "", {}, "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q=="], + "eslint-plugin-es-x/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], - "eslint-plugin-n/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "eslint-plugin-promise/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "eslint-plugin-unicorn/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "eslint-plugin-unicorn/@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], + "eslint-plugin-es-x/@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.1", "", {}, "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q=="], - "eslint-plugin-unicorn/globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], + "eslint-plugin-jsdoc/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "eslint-plugin-vue/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + "eslint-plugin-unicorn/globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "postcss/picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], + "rolldown-plugin-dts/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + "rolldown-plugin-dts/get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], - "rollup/@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], + "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "ts-declaration-location/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="], + "tsdown/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "unconfig/jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], + "vitest/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "vue-eslint-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], @@ -795,30 +807,14 @@ "vue-eslint-parser/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + "@jridgewell/remapping/@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], + "@jridgewell/remapping/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-plugin-n/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-plugin-promise/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-plugin-unicorn/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-plugin-unicorn/@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], - - "eslint-plugin-vue/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], + "eslint-plugin-es-x/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "vue-eslint-parser/espree/acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], - - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], } } diff --git a/dist/main.cjs b/dist/main.cjs index 6f0e3b0..ff107ed 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -237,6 +237,9 @@ var HyperAPINodeDriver = class extends __hyperapi_core_dev.HyperAPIDriver { if (response.body !== void 0) res.write(response.body); res.end(); }); + if (process.env.NODE_ENV === "test") this.server.on("error", (error) => { + if (error && "code" in error && error.code === "EADDRINUSE") {} else throw error; + }); this.server.listen(this.port); } /** diff --git a/dist/main.js b/dist/main.js index 81972de..5987bf6 100644 --- a/dist/main.js +++ b/dist/main.js @@ -208,6 +208,9 @@ var HyperAPINodeDriver = class extends HyperAPIDriver { if (response.body !== void 0) res.write(response.body); res.end(); }); + if (process.env.NODE_ENV === "test") this.server.on("error", (error) => { + if (error && "code" in error && error.code === "EADDRINUSE") {} else throw error; + }); this.server.listen(this.port); } /** diff --git a/eslint.config.js b/eslint.config.js index 7d4be0e..32edb10 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,4 +1,6 @@ import { configCommon } from '@kirick/lint/eslint/common'; import { configNode } from '@kirick/lint/eslint/node'; +import { configOxlint } from '@kirick/lint/eslint/oxlint'; +import { defineConfig } from 'eslint/config'; -export default [...configCommon, ...configNode]; +export default defineConfig([...configCommon, ...configNode, ...configOxlint]); diff --git a/package.json b/package.json index 44b08e7..dad8b4c 100644 --- a/package.json +++ b/package.json @@ -24,29 +24,29 @@ "busboy": "1.6.0" }, "peerDependencies": { - "@hyperapi/core": "github:hyperapi/core#fc3b443a432afc2b6ea381d67e9283f0389d12fb", + "@hyperapi/core": "github:hyperapi/core#1aa5ffd2e603040e99f80f84b028a386ead5cca5", "@kirick/ip": "^0.1.1" }, "devDependencies": { - "@biomejs/biome": "2.1.1", - "@kirick/lint": "0.2.8", - "@types/busboy": "^1.5.4", + "@biomejs/biome": "2.3.1", + "@kirick/lint": "0.2.12", + "@types/busboy": "1.5.4", "@types/node": "^20", - "eslint": "9.27.0", - "oxlint": "1.3.0", - "publint": "0.3.12", - "tsdown": "0.14.2", - "typescript": "5.9.2", - "unplugin-unused": "0.5.2", + "eslint": "9.38.0", + "oxlint": "1.24.0", + "publint": "0.3.15", + "tsdown": "0.15.11", + "typescript": "5.9.3", + "unplugin-unused": "0.5.4", "valibot": "1.1.0", - "vitest": "3.2.4" + "vitest": "4.0.4" }, "scripts": { - "build": "tsdown src/main.ts --publint --unused --dts --format esm --format cjs", + "build": "tsdown src/main.ts --clean --tsconfig tsconfig.main.json --publint --unused --dts --format esm --format cjs", "check": "bun run lint && bun run build && bun run test", - "lint": "biome format && oxlint && eslint . && tsc && (cd test && tsc)", + "lint": "biome format && oxlint && eslint . && tsc -b", "test": "npm run test:vitest", - "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --no-file-parallelism ; rm -r dist/vitest", + "test:vitest": "rm -r dist/vitest ; tsc -p tsconfig.test.json && vitest run --dir dist/vitest --no-file-parallelism ; rm -r dist/vitest", "# test:vitest": "vitest run --no-file-parallelism" }, "repository": { diff --git a/src/main.ts b/src/main.ts index 40ea125..8a23f87 100644 --- a/src/main.ts +++ b/src/main.ts @@ -77,6 +77,17 @@ export class HyperAPINodeDriver extends HyperAPIDriver { res.end(); }); + // bugged vitest executes file twice, so ignore EADDRINUSE error. + if (process.env.NODE_ENV === 'test') { + this.server.on('error', (error) => { + if (error && 'code' in error && error.code === 'EADDRINUSE') { + // ignore + } else { + throw error; + } + }); + } + this.server.listen(this.port); } diff --git a/src/utils/http.ts b/src/utils/http.ts index 1b58df1..1093b72 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -16,13 +16,13 @@ export function isHttpMethodSupported( http_method: unknown, ): http_method is HttpMethod { return ( - http_method === 'GET' || - http_method === 'POST' || - http_method === 'PUT' || - http_method === 'PATCH' || - http_method === 'DELETE' || - http_method === 'HEAD' || - http_method === 'OPTIONS' + http_method === 'GET' + || http_method === 'POST' + || http_method === 'PUT' + || http_method === 'PATCH' + || http_method === 'DELETE' + || http_method === 'HEAD' + || http_method === 'OPTIONS' ); } diff --git a/src/utils/hyperapi-error.ts b/src/utils/hyperapi-error.ts index 2ca711b..8b2e099 100644 --- a/src/utils/hyperapi-error.ts +++ b/src/utils/hyperapi-error.ts @@ -8,7 +8,7 @@ import type { ResponseSchema } from '../types.js'; * @returns - */ export function hyperApiErrorToResponse( - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any error: HyperAPIError, add_body: boolean, ): ResponseSchema { diff --git a/test/setup.ts b/test/setup.ts index e262246..6706bb7 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -20,8 +20,14 @@ export const hyperApiMultipart = new HyperAPI( ROOT, ); -// eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/no-explicit-any -export function valibot>(schema: S) { +type ValiBaseSchema = Parameters[0]; + +/** + * Valibot validator for HyperAPI requests. + * @param schema - The Valibot schema to validate the request against. + * @returns A middleware function that validates the request arguments using the provided schema. + */ +export function valibot(schema: S) { return (request: HyperAPIRequest) => { const result = v.safeParse(schema, request.args); if (result.success) { diff --git a/test/tsconfig.json b/test/tsconfig.json deleted file mode 100644 index a1ca658..0000000 --- a/test/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "isolatedDeclarations": false - }, - "include": ["./**/*.ts", "../src/**/*.test.ts"] -} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..e666180 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "module": "preserve", + "noEmit": true, + "lib": ["es2022"], + "declaration": true, + "isolatedDeclarations": false, + "tsBuildInfoFile": "/dev/null" + } +} diff --git a/tsconfig.json b/tsconfig.json index 9e0fdab..4e14791 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,7 @@ { - "compilerOptions": { - "esModuleInterop": true, - "skipLibCheck": true, - "target": "es2022", - "moduleDetection": "force", - "isolatedModules": true, - "verbatimModuleSyntax": true, - "strict": true, - "noUncheckedIndexedAccess": true, - "noImplicitOverride": true, - "module": "preserve", - "noEmit": true, - "lib": ["es2022"], - "declaration": true, - "isolatedDeclarations": true - }, - "include": ["src/"], - "exclude": ["**/*.test.ts"] + "files": [], + "references": [ + { "path": "./tsconfig.main.json" }, + { "path": "./tsconfig.test.json" } + ] } diff --git a/tsconfig.main.json b/tsconfig.main.json new file mode 100644 index 0000000..256535f --- /dev/null +++ b/tsconfig.main.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "isolatedDeclarations": true + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json index c623439..ce0cf90 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -1,11 +1,9 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "noEmit": false, "outDir": "dist/vitest", - "declaration": false, - "isolatedDeclarations": false + "declaration": false }, - "include": ["src/", "test/"], - "exclude": ["dist/", "node_modules/"] + "include": ["src/**/*.test.ts", "test/**/*.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index b45f660..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable no-restricted-exports */ - -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - include: ['dist/vitest/**/*.test.js'], - exclude: [], - }, -});