diff --git a/.vscode/settings.json b/.vscode/settings.json index 8281489..0ebdb6b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,7 @@ "picomatch", "proxied", "referer", + "rolldown", "tsdown" ], "typescript.tsdk": "node_modules/typescript/lib", diff --git a/README.md b/README.md index defe34d..299ca9a 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ - ⚡️ Lightweight, Flexible, Fast. - 🧲 Not injection-based, non-intrusive to client code. -- 💡 ESModule/commonjs. +- 💡 Pure ESModule. - 🦾 Typescript. - 🔥 HMR - 🏷 Support `.[cm]?js` / `.ts` / `.json` / `.json5`. @@ -52,6 +52,14 @@ See the [documentation](https://vite-plugin-mock-dev-server.netlify.app/) for mo [![Netlify Status](https://api.netlify.com/api/v1/badges/9ccda610-2c6a-4cd0-aeaa-a8932f2b477c/deploy-status)](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys) +> [!IMPORTANT] +> The plugin no longer supports `CommonJS` imports. Please use `ESModule` to import the plugin. + +---- + +> [!IMPORTANT] +> The current document is for the `v2` version of the plugin. If you are using the `v1` version, please refer to the [Migration Guide](https://vite-plugin-mock-dev-server.netlify.app/guide/migrate-v2). + ## Install ``` sh @@ -100,7 +108,7 @@ By default, write mock data in the `mock` directory of your project's root direc import { defineMock } from 'vite-plugin-mock-dev-server' export default defineMock({ - url: '/api/test', + url: '/api/user/:id', body: { a: 1, b: 2 } }) ``` @@ -205,10 +213,18 @@ export default defineMock({ Configure the matching context for `include` and `exclude`. +### dir + +- **Type:** `string` +- **Default:** `'mock'` +- **Details:** + + Configure the directory to read mock files. + ### include - **Type:** `string | string[]` -- **Default:** `['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}']` (Relative to the root directory) +- **Default:** `['**/*.mock.{js,ts,cjs,mjs,json,json5}']` - **Details:** Configure to read mock files, which can be a directory, glob, or an array. @@ -216,7 +232,7 @@ export default defineMock({ ### exclude - **Type:** `string | string[]` -- **Default:** `['**/node_modules/**','**/.vscode/**','**/.git/**']` +- **Default:** `['**/node_modules/**']` - **Details:** When reading mock files for configuration, the files that need to be excluded can be a directory, glob, or array. diff --git a/README.zh-CN.md b/README.zh-CN.md index 9c909ec..9c63207 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -29,7 +29,7 @@ - ⚡️ 轻量,灵活,快速 - 🧲 非注入式,对客户端代码无侵入 -- 💡 ESModule/commonjs +- 💡 ESModule - 🦾 Typescript - 🔥 热更新 - 🏷 支持 `.[cm]?js` / `.ts` / `.json` / `.json5` 编写 mock 数据 @@ -53,6 +53,14 @@ [![Netlify Status](https://api.netlify.com/api/v1/badges/9ccda610-2c6a-4cd0-aeaa-a8932f2b477c/deploy-status)](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys) +> [!IMPORTANT] +> 插件不再支持 `CommonJS` 导入使用,请使用 `ESModule` 导入插件 + +---- + +> [!IMPORTANT] +> 当前文档为插件的 `v2` 版本,如果您正在使用 `v1` 版本,请参考 [迁移文档](https://vite-plugin-mock-dev-server.netlify.app/zh/guide/migrate-v2) + ## 安装 ```sh @@ -101,7 +109,7 @@ export default defineConfig({ import { defineMock } from 'vite-plugin-mock-dev-server' export default defineMock({ - url: '/api/test', + url: '/api/user/:id', body: { a: 1, b: 2 } }) ``` @@ -205,10 +213,18 @@ export default defineMock({ 配置 `include` 和 `exclude` 的匹配上下文 +### dir + +- **类型:** `string` +- **默认值:** `'mock'` +- **详情:** + + 配置mock数据的目录,相对于 `cwd` + ### include - **类型:** `string | string[]` -- **默认值:** `['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于根目录) +- **默认值:** `['**/*.mock.{js,ts,cjs,mjs,json,json5}']` - **详情:** 配置读取 mock文件,可以是一个 目录,glob,或者一个数组 @@ -216,7 +232,7 @@ export default defineMock({ ### exclude - **类型:** `string | string[]` -- **默认值:** `['**/node_modules/**', '**/.vscode/**', '**/.git/**']` +- **默认值:** `['**/node_modules/**']` - **详情:** 配置读取 mock文件时,需要排除的文件, 可以是一个 目录、glob、或者一个数组 diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 851c63f..48206f8 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -51,7 +51,7 @@ const vitepressConfig: UserConfig = defineConfig({ }, vite: { plugins: [ - groupIconVitePlugin(), + groupIconVitePlugin() as any, prod && llmstxt({ workDir: 'en', ignoreFiles: ['index.md'], diff --git a/docs/config.ts b/docs/config.ts index a6b127f..c57c2ca 100644 --- a/docs/config.ts +++ b/docs/config.ts @@ -57,6 +57,7 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] { { text: 'Introduce', link: 'introduce' }, { text: 'Install', link: 'install' }, { text: 'Usage', link: 'usage' }, + { text: 'Migrate from v1.0', link: 'migrate-v2' }, ], }, { diff --git a/docs/en/examples/static.md b/docs/en/examples/static.md index 1d5d535..ef46e5d 100644 --- a/docs/en/examples/static.md +++ b/docs/en/examples/static.md @@ -1,6 +1,6 @@ # Static resource service -Retrieve the file path from the request through dynamic route matching using `:filepath(.*)`, obtain the file path from the request, return it as a file stream in the body, and set the correct `Content-Type` in the headers. +Retrieve the file path from the request through dynamic route matching using `*filepath`, obtain the file path from the request, return it as a file stream in the body, and set the correct `Content-Type` in the headers. ```ts import { createReadStream } from 'node:fs' @@ -12,10 +12,10 @@ import { defineMock } from 'vite-plugin-mock-dev-server' const __dirname = path.dirname(fileURLToPath(import.meta.url)) export default defineMock({ - url: '/mockData/:filepath(.*)', + url: '/mock-static/*filepath', method: 'GET', headers(request) { - const { filepath } = request.params + const filepath = request.params.filepath.join('/') const filename = path.basename(filepath) return { 'Content-Type': mime.lookup(filename) || 'text/plain', @@ -23,7 +23,7 @@ export default defineMock({ }, body(request) { const { filepath } = request.params - return createReadStream(path.join(__dirname, 'mockData', filepath)) + return createReadStream(path.join(__dirname, 'mock-static', filepath)) }, }) ``` diff --git a/docs/en/guide/migrate-v2.md b/docs/en/guide/migrate-v2.md new file mode 100644 index 0000000..6fb3532 --- /dev/null +++ b/docs/en/guide/migrate-v2.md @@ -0,0 +1,37 @@ +# Migrate from v1.x + +## Pure ESM Support + +The plugin no longer provides `CommonJS` code exports. Please use the ESM mode to import the plugin. + +```ts +import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' // ✔️ +``` + +```js +const { mockDevServerPlugin } = require('vite-plugin-mock-dev-server') // ✖️ // [!code error] +``` + +## Rolldown & Esbuild Support + +The plugin now automatically selects different compilers to process mock files based on different versions of Vite. + +For the `vite@npm:rolldown-vite@latest` version, `rolldown` is used as the compiler. + +## path-to-regexp Upgraded from v6 to v8 + +The plugin now uses [`path-to-regexp@v8`](https://github.com/pillarjs/path-to-regexp#readme) as the path matching engine. + +Please refer to the [official documentation](https://github.com/pillarjs/path-to-regexp#unexpected--or-) for adaptation and upgrade. + +## Plugin Configuration + +Added a new `dir` configuration option to specify the directory for mock files, relative to `cwd`. The matching context for `include` and `exclude` is `cwd + dir`. + +::: details Why was this adjustment made? + +The plugin uses `chokidar` to monitor changes in mock files, starting the matching from the `cwd` directory by default. The search scope may be too large for medium to large projects, + +which could lead to unnecessary performance overhead. Therefore, the `dir` configuration option has been added to further narrow down the search scope. + +::: diff --git a/docs/en/guide/plugin-config.md b/docs/en/guide/plugin-config.md index a15eebf..7f87d46 100644 --- a/docs/en/guide/plugin-config.md +++ b/docs/en/guide/plugin-config.md @@ -3,6 +3,7 @@ `type: MockServerPluginOptions` ``` ts +import process from 'node:process' import { defineConfig } from 'vite' import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' @@ -11,7 +12,9 @@ export default defineConfig({ mockDevServerPlugin({ prefix: [], wsPrefix: [], - include: ['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}'], + cwd: process.cwd(), + dir: 'mock', + include: ['**/*.mock.{js,ts,cjs,mjs,json,json5}'], exclude: '', log: 'info', reload: false, @@ -31,6 +34,8 @@ export default defineConfig({ interface MockServerPluginOptions { prefix?: string | string[] wsPrefix?: string | string[] + cwd?: string + dir?: string include?: string | string[] exclude?: string | string[] reload?: boolean @@ -74,11 +79,18 @@ This conflict is not a problem with Vite or the plugin itself; it is a reasonabl Configure the matching context for `include` and `exclude`. +## dir + +- **Type**: `string` +- **Default**: `'mock'` + +The directory for configuring mock data, relative to `cwd`. + ## include **Type**: `string | string[]` -- **Default**:relative to [`cwd`](#cwd) +- **Default**:relative to [`cwd`](#cwd) + [`dir`](#dir) ```ts ['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}'] @@ -90,10 +102,10 @@ Configure the reading of mock files, which can be a directory, a glob pattern, o - **Type**: `string | string[]` -- **Default**:relative to [`cwd`](#cwd) +- **Default**:relative to [`cwd`](#cwd) + [`dir`](#dir) ```ts - ['**/node_modules/**', '**/test/**', '**/cypress/**', 'src/**', '**/.vscode/**', '**/.git/**', '**/dist/**'] + ['**/node_modules/**'] ``` Specifies the files to be excluded when reading mock files. It can be a directory, glob pattern, or an array. diff --git a/docs/zh/config.ts b/docs/zh/config.ts index 6aecd42..960be64 100644 --- a/docs/zh/config.ts +++ b/docs/zh/config.ts @@ -110,6 +110,7 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] { { text: '介绍', link: 'introduce' }, { text: '安装', link: 'install' }, { text: '使用', link: 'usage' }, + { text: '从 v1.x 迁移', link: 'migrate-v2' }, ], }, { @@ -125,8 +126,8 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] { { text: '配置', items: [ - { text: 'pluginConfig', link: 'plugin-config' }, - { text: 'mockConfig', link: 'mock-config' }, + { text: '插件配置', link: 'plugin-config' }, + { text: 'mock 配置', link: 'mock-config' }, ], }, { diff --git a/docs/zh/examples/static.md b/docs/zh/examples/static.md index 5f7db98..3c21b46 100644 --- a/docs/zh/examples/static.md +++ b/docs/zh/examples/static.md @@ -1,6 +1,6 @@ # 静态资源服务 -通过 动态路由匹配,获取请求的文件路径 `:filepath(.*)`, 获取请求中的文件路径, +通过 动态路由匹配,获取请求的文件路径 `*filepath`, 获取请求中的文件路径, 在 `body` 中以文件流的方式返回,并在 `headers` 中设置正确的 `Content-Type`。 ```ts @@ -13,10 +13,10 @@ import { defineMock } from 'vite-plugin-mock-dev-server' const __dirname = path.dirname(fileURLToPath(import.meta.url)) export default defineMock({ - url: '/mockData/:filepath(.*)', + url: '/mock-static/*filepath', method: 'GET', headers(request) { - const { filepath } = request.params + const filepath = request.params.filepath.join('/') const filename = path.basename(filepath) return { 'Content-Type': mime.lookup(filename) || 'text/plain', @@ -24,7 +24,7 @@ export default defineMock({ }, body(request) { const { filepath } = request.params - return createReadStream(path.join(__dirname, 'mockData', filepath)) + return createReadStream(path.join(__dirname, 'mock-static', filepath)) }, }) ``` diff --git a/docs/zh/guide/migrate-v2.md b/docs/zh/guide/migrate-v2.md new file mode 100644 index 0000000..8bf0ea6 --- /dev/null +++ b/docs/zh/guide/migrate-v2.md @@ -0,0 +1,33 @@ +# 从 v1.x 迁移 + +## 纯 ESM 支持 + +插件不再提供 `CommonJS` 代码导出,请使用 ESM 模式导入插件。 + +```ts +import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' // ✔️ +``` + +```js +const { mockDevServerPlugin } = require('vite-plugin-mock-dev-server') // ✖️ // [!code error] +``` + +## Rolldown & Esbuild 支持 + +插件现在会根据 Vite 不同版本,自动选择不同的编译器处理 mock 文件。 + +对于 `vite@npm:rolldown-vite@latest` 版本,使用 `rolldown` 作为编译器。 + +## path-to-regexp 从 v6 升级到 v8 + +插件现在使用 [`path-to-regexp@v8`](https://github.com/pillarjs/path-to-regexp#readme) 作为路径匹配引擎。 +请参考 [官方文档](https://github.com/pillarjs/path-to-regexp#unexpected--or-) 进行适配升级。 + +## 插件配置 + +新增 `dir` 配置项,用于配置 mock 文件的目录,相对于 `cwd`。`include` 和 `exclude` 的匹配上下文为 `cwd + dir` + +::: details 为什么做出此调整? +插件使用 `chokidar` 监听 mock 文件变更,默认从 `cwd` 目录开始匹配,其查找范围对于中大型项目可能会很大, +这可能带来不必要的性能开销。因此新增 `dir` 配置项进一步缩小查找范围。 +::: diff --git a/docs/zh/guide/mock-config.md b/docs/zh/guide/mock-config.md index 7ae2639..5fd65c3 100644 --- a/docs/zh/guide/mock-config.md +++ b/docs/zh/guide/mock-config.md @@ -1,4 +1,4 @@ -# mockConfig +# mock 配置 `type: MockOptionsItem | MockOptionsItem[]` diff --git a/docs/zh/guide/plugin-config.md b/docs/zh/guide/plugin-config.md index 12375ed..248c762 100644 --- a/docs/zh/guide/plugin-config.md +++ b/docs/zh/guide/plugin-config.md @@ -1,8 +1,9 @@ -# pluginConfig +# 插件配置 `type: MockServerPluginOptions` ``` ts [vite.config.ts] +import process from 'node:process' import { defineConfig } from 'vite' import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' @@ -11,7 +12,9 @@ export default defineConfig({ mockDevServerPlugin({ prefix: [], wsPrefix: [], - include: ['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}'], + cwd: process.cwd(), + dir: 'mock', + include: ['**/*.mock.{js,ts,cjs,mjs,json,json5}'], exclude: '', log: 'info', reload: false, @@ -31,6 +34,8 @@ export default defineConfig({ interface MockServerPluginOptions { prefix?: string | string[] wsPrefix?: string | string[] + cwd?: string + dir?: string include?: string | string[] exclude?: string | string[] reload?: boolean @@ -78,14 +83,21 @@ interface MockServerPluginOptions { 配置 `include` 和 `exclude` 的匹配上下文 +## dir + +- **类型**: `string` +- **默认值**: `'mock'` + +配置mock数据的目录,相对于 `cwd` + ## include - **类型**: `string | string[]` -- **默认值**:相对于 [`cwd`](#cwd) +- **默认值**:相对于 [`cwd`](#cwd) + [`dir`](#dir) ```ts - ['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}'] + ['**/*.mock.{js,ts,cjs,mjs,json,json5}'] ``` 配置读取 mock文件,可以是一个 目录,glob,或者一个数组 @@ -94,10 +106,10 @@ interface MockServerPluginOptions { - **类型**: `string | string[]` -- **默认值**:相对于 [`cwd`](#cwd) +- **默认值**:相对于 [`cwd`](#cwd) + [`dir`](#dir) ```ts - ['**/node_modules/**', '**/test/**', '**/cypress/**', 'src/**', '**/.vscode/**', '**/.git/**', '**/dist/**'] + ['**/node_modules/**'] ``` 配置读取 mock文件时,需要排除的文件, 可以是一个 目录、glob、或者一个数组 diff --git a/eslint.config.js b/eslint.config.js index 32a82e7..c238b01 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,10 +3,6 @@ import config from '@pengzhanbo/eslint-config' export default config({ pnpm: true, vue: false, - globals: { - __PACKAGE_NAME__: 'readonly', - __PACKAGE_VERSION__: 'readonly', - }, }, { files: ['**/*.md/*.ts'], rules: { diff --git a/example/mock/fallback.mock.ts b/example/mock/fallback.mock.ts index 591bbce..5129c7e 100644 --- a/example/mock/fallback.mock.ts +++ b/example/mock/fallback.mock.ts @@ -1,7 +1,7 @@ import { defineMock } from 'vite-plugin-mock-dev-server' export default defineMock({ - url: '/api/(.*)', + url: '/api{/*rest}', body: { message: 'This request fallback', }, diff --git a/example/mock/static.mock.ts b/example/mock/static.mock.ts index 77d5b35..e4b572c 100644 --- a/example/mock/static.mock.ts +++ b/example/mock/static.mock.ts @@ -10,10 +10,10 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)) * 模拟一个 静态资源服务 */ export default defineMock({ - url: '/static/:filepath(.*)', + url: '/static/*filepath', method: 'GET', headers(request) { - const { filepath } = request.params + const filepath = request.params.filepath.join('/') const filename = path.basename(filepath) return { 'Content-Type': mime.lookup(filename) || 'text/plain', diff --git a/package.json b/package.json index d364a91..875c292 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "1.9.3", "private": true, - "packageManager": "pnpm@10.14.0", + "packageManager": "pnpm@10.15.0", "author": "pengzhanbo (https://github.com/pengzhanbo)", "license": "MIT", "scripts": { @@ -15,10 +15,10 @@ "docs:preview": "pnpm -F docs docs:preview", "lint": "eslint .", "test": "vitest", - "release:check": "vitest run && pnpm run build", + "prepublishOnly": "vitest run && pnpm run build", "release:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", "release:version": "bumpp package.json {plugin,docs,example}/package.json --execute=\"pnpm release:changelog\" --commit --all --push --tag", - "release": "pnpm release:check && pnpm release:version && pnpm -r publish" + "release": "pnpm release:version && pnpm -r publish" }, "devDependencies": { "@pengzhanbo/eslint-config": "catalog:dev", @@ -30,6 +30,7 @@ "@types/is-core-module": "catalog:dev", "@types/mime-types": "catalog:dev", "@types/node": "catalog:dev", + "@types/picomatch": "catalog:dev", "@types/ws": "catalog:dev", "bumpp": "catalog:dev", "conventional-changelog-cli": "catalog:dev", diff --git a/plugin/src/core/baseMiddleware.ts b/plugin/src/core/baseMiddleware.ts deleted file mode 100644 index 8621aa8..0000000 --- a/plugin/src/core/baseMiddleware.ts +++ /dev/null @@ -1,392 +0,0 @@ -import type { Connect } from 'vite' -import type { - ExtraRequest, - Method, - MockHttpItem, - MockOptions, - MockRequest, - MockResponse, - MockServerPluginOptions, - ResponseBody, -} from '../types' -import type { Logger } from './logger' -import type { MockCompiler } from './mockCompiler' -import { Buffer } from 'node:buffer' -import { - isArray, - isEmptyObject, - isFunction, - random, - sleep, - timestamp, -} from '@pengzhanbo/utils' -import Cookies from 'cookies' -import HTTP_STATUS from 'http-status' -import * as mime from 'mime-types' -import { pathToRegexp } from 'path-to-regexp' -import colors from 'picocolors' -import { matchingWeight } from './matchingWeight' -import { parseReqBody } from './parseReqBody' -import { collectRequest } from './requestRecovery' -import { - doesProxyContextMatchUrl, - isReadableStream, - parseParams, - urlParse, -} from './utils' -import { validate } from './validator' - -export interface BaseMiddlewareOptions { - formidableOptions: MockServerPluginOptions['formidableOptions'] - cookiesOptions: MockServerPluginOptions['cookiesOptions'] - bodyParserOptions: MockServerPluginOptions['bodyParserOptions'] - proxies: string[] - logger: Logger - priority: MockServerPluginOptions['priority'] -} - -export function baseMiddleware( - compiler: MockCompiler, - { - formidableOptions = {}, - bodyParserOptions = {}, - proxies, - cookiesOptions, - logger, - priority = {}, - }: BaseMiddlewareOptions, -): Connect.NextHandleFunction { - return async function (req, res, next) { - const startTime = timestamp() - const { query, pathname } = urlParse(req.url!) - - // 预先过滤不符合路径前缀的请求 - if ( - !pathname - || proxies.length === 0 - || !proxies.some(context => doesProxyContextMatchUrl(context, req.url!)) - ) { - return next() - } - - const mockData = compiler.mockData - // 对满足匹配规则的配置进行优先级排序 - const mockUrls = matchingWeight(Object.keys(mockData), pathname, priority) - - if (mockUrls.length === 0) { - return next() - } - - // #52 由于请求流被消费,vite http-proxy 无法获取已消费的请求,导致请求流无法继续 - // 记录请求流中被消费的数据,形成备份,当当前请求无法继续时,可以从备份中恢复请求流 - collectRequest(req) - - const { query: refererQuery } = urlParse(req.headers.referer || '') - const reqBody = await parseReqBody(req, formidableOptions, bodyParserOptions) - const cookies = new Cookies(req, res, cookiesOptions) - const getCookie = cookies.get.bind(cookies) - - const method = req.method!.toUpperCase() - let mock: MockHttpItem | undefined - let _mockUrl: string | undefined - // 查找匹配的mock,仅找出首个匹配的配置项后立即结束 - for (const mockUrl of mockUrls) { - mock = fineMock(mockData[mockUrl], logger, { - pathname, - method, - request: { - query, - refererQuery, - body: reqBody, - headers: req.headers, - getCookie, - }, - }) - if (mock) { - _mockUrl = mockUrl - break - } - } - - if (!mock) { - const matched = mockUrls - .map(m => - m === _mockUrl ? colors.underline(colors.bold(m)) : colors.dim(m), - ) - .join(', ') - logger.warn( - `${colors.green( - pathname, - )} matches ${matched} , but mock data is not found.`, - ) - - return next() - } - - const request = req as MockRequest - const response = res as MockResponse - - // provide request 往请求实例中注入额外的请求信息 - request.body = reqBody - request.query = query - request.refererQuery = refererQuery - request.params = parseParams(mock.url, pathname) - request.getCookie = getCookie - - // provide response - response.setCookie = cookies.set.bind(cookies) - - const { - body, - delay, - type = 'json', - response: responseFn, - status = 200, - statusText, - log: logLevel, - __filepath__: filepath, - } = mock as MockHttpItem & { __filepath__: string } - - // provide headers - responseStatus(response, status, statusText) - await provideHeaders(request, response, mock, logger) - await provideCookies(request, response, mock, logger) - - logger.info(requestLog(request, filepath), logLevel) - logger.debug( - `${colors.magenta('DEBUG')} ${colors.underline( - pathname, - )} matches: [ ${mockUrls - .map(m => - m === _mockUrl ? colors.underline(colors.bold(m)) : colors.dim(m), - ) - .join(', ')} ]\n`, - ) - - if (body) { - try { - const content = isFunction(body) ? await body(request) : body - await realDelay(startTime, delay) - sendData(response, content, type) - } - catch (e) { - logger.error( - `${colors.red( - `mock error at ${pathname}`, - )}\n${e}\n at body (${colors.underline(filepath)})`, - logLevel, - ) - responseStatus(response, 500) - res.end('') - } - return - } - - if (responseFn) { - try { - await realDelay(startTime, delay) - await responseFn(request, response, next) - } - catch (e) { - logger.error( - `${colors.red( - `mock error at ${pathname}`, - )}\n${e}\n at response (${colors.underline(filepath)})`, - logLevel, - ) - responseStatus(response, 500) - res.end('') - } - return - } - - res.end('') - } -} - -function fineMock( - mockList: MockOptions, - logger: Logger, - { - pathname, - method, - request, - }: { - pathname: string - method: string - request: Omit - }, -): MockHttpItem | undefined { - return mockList.find((mock) => { - if (!pathname || !mock || !mock.url || mock.ws === true) - return false - const methods: Method[] = mock.method - ? isArray(mock.method) - ? mock.method - : [mock.method] - : ['GET', 'POST'] - // 判断发起的请求方法是否符合当前 mock 允许的方法 - if (!methods.includes(method as Method)) - return false - - const hasMock = pathToRegexp(mock.url).test(pathname) - - if (hasMock && mock.validator) { - const params = parseParams(mock.url, pathname) - if (isFunction(mock.validator)) { - return mock.validator({ params, ...request }) - } - else { - try { - return validate({ params, ...request }, mock.validator) - } - catch (e) { - const file = (mock as any).__filepath__ - logger.error( - `${colors.red( - `mock error at ${pathname}`, - )}\n${e}\n at validator (${colors.underline(file)})`, - mock.log, - ) - return false - } - } - } - return hasMock - }) as MockHttpItem | undefined -} - -function responseStatus( - response: MockResponse, - status = 200, - statusText?: string, -) { - response.statusCode = status - response.statusMessage = statusText || getHTTPStatusText(status) -} - -async function provideHeaders( - req: MockRequest, - res: MockResponse, - mock: MockHttpItem, - logger: Logger, -) { - const { headers, type = 'json' } = mock - const filepath = (mock as any).__filepath__ as string - const contentType - = mime.contentType(type) || mime.contentType(mime.lookup(type) || '') - - if (contentType) - res.setHeader('Content-Type', contentType) - - res.setHeader('Cache-Control', 'no-cache,max-age=0') - res.setHeader('X-Mock-Power-By', 'vite-plugin-mock-dev-server') - - if (filepath) - res.setHeader('X-File-Path', filepath) - - if (!headers) - return - - try { - const raw = isFunction(headers) ? await headers(req) : headers - Object.keys(raw).forEach((key) => { - res.setHeader(key, raw[key]!) - }) - } - catch (e) { - logger.error( - `${colors.red( - `mock error at ${req.url!.split('?')[0]}`, - )}\n${e}\n at headers (${colors.underline(filepath)})`, - mock.log, - ) - } -} - -async function provideCookies( - req: MockRequest, - res: MockResponse, - mock: MockHttpItem, - logger: Logger, -) { - const { cookies } = mock - const filepath = (mock as any).__filepath__ as string - if (!cookies) - return - try { - const raw = isFunction(cookies) ? await cookies(req) : cookies - Object.keys(raw).forEach((key) => { - const cookie = raw[key] - if (isArray(cookie)) { - const [value, options] = cookie - res.setCookie(key, value, options) - } - else { - res.setCookie(key, cookie) - } - }) - } - catch (e) { - logger.error( - `${colors.red( - `mock error at ${req.url!.split('?')[0]}`, - )}\n${e}\n at cookies (${colors.underline(filepath)})`, - mock.log, - ) - } -} - -function sendData(res: MockResponse, raw: ResponseBody, type: string) { - if (isReadableStream(raw)) { - raw.pipe(res) - } - else if (Buffer.isBuffer(raw)) { - res.end(type === 'text' || type === 'json' ? raw.toString('utf-8') : raw) - } - else { - const content = typeof raw === 'string' ? raw : JSON.stringify(raw) - res.end(type === 'buffer' ? Buffer.from(content) : content) - } -} - -async function realDelay(startTime: number, delay?: MockHttpItem['delay']) { - if ( - !delay - || (typeof delay === 'number' && delay <= 0) - || (isArray(delay) && delay.length !== 2) - ) { - return - } - let realDelay = 0 - if (isArray(delay)) { - const [min, max] = delay - realDelay = random(min, max) - } - else { - realDelay = delay - (timestamp() - startTime) - } - if (realDelay > 0) - await sleep(realDelay) -} - -function getHTTPStatusText(status: number): string { - return HTTP_STATUS[status as keyof typeof HTTP_STATUS] as string || 'Unknown' -} - -function requestLog(request: MockRequest, filepath: string): string { - const { url, method, query, params, body } = request - let { pathname } = new URL(url!, 'http://example.com') - pathname = colors.green(decodeURIComponent(pathname)) - const format = (prefix: string, data: any) => { - return !data || isEmptyObject(data) - ? '' - : ` ${colors.gray(`${prefix}:`)}${JSON.stringify(data)}` - } - const ms = colors.magenta(colors.bold(method)) - const qs = format('query', query) - const ps = format('params', params) - const bs = format('body', body) - const file = ` ${colors.dim(colors.underline(`(${filepath})`))}` - return `${ms} ${pathname}${qs}${ps}${bs}${file}` -} diff --git a/plugin/src/core/build.ts b/plugin/src/core/build.ts deleted file mode 100644 index a74d660..0000000 --- a/plugin/src/core/build.ts +++ /dev/null @@ -1,224 +0,0 @@ -import type { Metafile } from 'esbuild' -import type { Plugin } from 'vite' -import type { ServerBuildOption } from '../types' -import type { ResolvedMockServerPluginOptions } from './resolvePluginOptions' -import fs from 'node:fs' -import fsp from 'node:fs/promises' -import path from 'node:path' -import process from 'node:process' -import { toArray } from '@pengzhanbo/utils' -import { createFilter } from '@rollup/pluginutils' -import fg from 'fast-glob' -import isCore from 'is-core-module' -import c from 'picocolors' -import { aliasMatches, transformWithEsbuild } from './compiler' -import { lookupFile, normalizePath } from './utils' - -type PluginContext = T extends ( - this: infer R, - ...args: any[] -) => void - ? R - : never - -export async function generateMockServer( - ctx: PluginContext, - options: ResolvedMockServerPluginOptions, -): Promise { - const include = toArray(options.include) - const exclude = toArray(options.exclude) - const cwd = options.cwd || process.cwd() - - let pkg = {} - try { - const pkgStr = lookupFile(options.context, ['package.json']) - if (pkgStr) - pkg = JSON.parse(pkgStr) - } - catch {} - - const outputDir = (options.build as ServerBuildOption).dist! - - const content = await generateMockEntryCode(cwd, include, exclude) - const mockEntry = path.join(cwd, `mock-data-${Date.now()}.js`) - await fsp.writeFile(mockEntry, content, 'utf-8') - - const { code, deps } = await transformWithEsbuild(mockEntry, options) - const mockDeps = getMockDependencies(deps, options.alias) - await fsp.unlink(mockEntry) - - const outputList = [ - { - filename: path.join(outputDir, 'mock-data.js'), - source: code, - }, - { - filename: path.join(outputDir, 'index.js'), - source: generatorServerEntryCode(options), - }, - { - filename: path.join(outputDir, 'package.json'), - source: generatePackageJson(pkg, mockDeps), - }, - ] - try { - if (path.isAbsolute(outputDir)) { - for (const { filename } of outputList) { - if (fs.existsSync(filename)) - await fsp.rm(filename) - } - options.logger.info(`${c.green('✓')} generate mock server in ${c.cyan(outputDir)}`) - for (const { filename, source } of outputList) { - fs.mkdirSync(path.dirname(filename), { recursive: true }) - await fsp.writeFile(filename, source, 'utf-8') - const sourceSize = (source.length / 1024).toFixed(2) - const name = path.relative(outputDir, filename) - const space = name.length < 30 ? ' '.repeat(30 - name.length) : '' - options.logger.info(` ${c.green(name)}${space}${c.bold(c.dim(`${sourceSize} kB`))}`) - } - } - else { - for (const { filename, source } of outputList) { - ctx.emitFile({ - type: 'asset', - fileName: filename, - source, - }) - } - } - } - catch (e) { - console.error(e) - } -} - -function getMockDependencies( - deps: Metafile['inputs'], - alias: ResolvedMockServerPluginOptions['alias'], -): string[] { - const list = new Set() - const excludeDeps = [__PACKAGE_NAME__, 'connect', 'cors'] - const isAlias = (p: string) => alias.find(({ find }) => aliasMatches(find, p)) - Object.keys(deps).forEach((mPath) => { - const imports = deps[mPath].imports - .filter(_ => _.external && !_.path.startsWith(' _.path) - imports.forEach((dep) => { - const name = normalizePackageName(dep) - if (!excludeDeps.includes(name) && !isCore(name)) - list.add(name) - }) - }) - return Array.from(list) -} - -function normalizePackageName(dep: string): string { - const [scope, name] = dep.split('/') - if (scope[0] === '@') { - return `${scope}/${name}` - } - return scope -} - -function generatePackageJson(pkg: any, mockDeps: string[]) { - const { dependencies = {}, devDependencies = {} } = pkg - const dependents = { ...dependencies, ...devDependencies } - const mockPkg = { - name: 'mock-server', - type: 'module', - scripts: { - start: 'node index.js', - }, - dependencies: { - connect: '^3.7.0', - [__PACKAGE_NAME__]: `^${__PACKAGE_VERSION__}`, - cors: '^2.8.5', - } as Record, - pnpm: { peerDependencyRules: { ignoreMissing: ['vite'] } }, - } - mockDeps.forEach((dep) => { - mockPkg.dependencies[dep] = dependents[dep] || 'latest' - }) - return JSON.stringify(mockPkg, null, 2) -} - -function generatorServerEntryCode({ - proxies, - wsProxies, - cookiesOptions, - bodyParserOptions, - priority, - build, -}: ResolvedMockServerPluginOptions) { - const { serverPort, log } = build as ServerBuildOption - // 生成的 entry code 有一个 潜在的问题: - // formidableOptions 配置在 `vite.config.ts` 中,`formidableOptions` 配置项 - // 支持 function,并不能被 `JSON.stringify` 转换,故会导致生成的 - // 代码中 `formidableOptions` 与 用户配置不一致。 - // 一种解决方式是使用单独的 `vite.mock.config.ts` 之类的插件独立配置文件来处理该问题 - // 但是目前也仅有 需要 build mock server 时有这个 `formidableOptions` 的配置问题, - // 从功能的优先级上看,还没有实现 `mock.config.ts` 的必要性。 - // 当前也还未收到有用户有关于该功能的潜在问题报告,暂时作为一个 待优化的问题。 - return `import { createServer } from 'node:http'; -import connect from 'connect'; -import corsMiddleware from 'cors'; -import { baseMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server'; -import mockData from './mock-data.js'; - -const app = connect(); -const server = createServer(app); -const logger = createLogger('mock-server', '${log}'); -const proxies = ${JSON.stringify(proxies)}; -const wsProxies = ${JSON.stringify(wsProxies)}; -const cookiesOptions = ${JSON.stringify(cookiesOptions)}; -const bodyParserOptions = ${JSON.stringify(bodyParserOptions)}; -const priority = ${JSON.stringify(priority)}; -const compiler = { mockData } - -mockWebSocket(compiler, server, { wsProxies, cookiesOptions, logger }); - -app.use(corsMiddleware()); -app.use(baseMiddleware(compiler, { - formidableOptions: { multiples: true }, - proxies, - priority, - cookiesOptions, - bodyParserOptions, - logger, -})); - -server.listen(${serverPort}); - -console.log('listen: http://localhost:${serverPort}'); -` -} - -async function generateMockEntryCode( - cwd: string, - include: string[], - exclude: string[], -) { - const includePaths = await fg(include, { cwd }) - - const includeFilter = createFilter(include, exclude, { - resolve: false, - }) - const mockFiles = includePaths.filter(includeFilter) - - let importers = '' - const exporters: string[] = [] - mockFiles.forEach((filepath, index) => { - // fix: #21 - const file = normalizePath(path.join(cwd, filepath)) - importers += `import * as m${index} from '${file}';\n` - exporters.push(`[m${index}, '${filepath}']`) - }) - return `import { transformMockData, transformRawData } from 'vite-plugin-mock-dev-server/server'; -${importers} -const exporters = [\n ${exporters.join(',\n ')}\n]; -const mockList = exporters.map(([mod, filepath]) => { - const raw = mod.default || mod; - return transformRawData(raw, filepath); -}); -export default transformMockData(mockList);` -} diff --git a/plugin/src/core/mockCompiler.ts b/plugin/src/core/mockCompiler.ts deleted file mode 100644 index fde99d9..0000000 --- a/plugin/src/core/mockCompiler.ts +++ /dev/null @@ -1,215 +0,0 @@ -import type { FSWatcher } from 'chokidar' -import type { Metafile } from 'esbuild' -import type { MockHttpItem, MockOptions, MockWebsocketItem } from '../types' -import type { ResolvedMockServerPluginOptions } from './resolvePluginOptions' -import EventEmitter from 'node:events' -import process from 'node:process' -import { promiseParallel, toArray } from '@pengzhanbo/utils' -import { createFilter } from '@rollup/pluginutils' -import chokidar from 'chokidar' -import fastGlob from 'fast-glob' -import { loadFromCode, transformWithEsbuild } from './compiler' -import { transformMockData, transformRawData } from './transform' -import { debug, lookupFile, normalizePath } from './utils' - -export function createMockCompiler(options: ResolvedMockServerPluginOptions): MockCompiler { - return new MockCompiler(options) -} - -/** - * mock配置加载器 - */ -export class MockCompiler extends EventEmitter { - moduleCache: Map - = new Map() - - moduleDeps: Map> = new Map() - cwd: string - mockWatcher!: FSWatcher - depsWatcher!: FSWatcher - moduleType: 'cjs' | 'esm' = 'cjs' - - private _mockData: Record = {} - - constructor(public options: ResolvedMockServerPluginOptions) { - super() - this.cwd = options.cwd || process.cwd() - try { - const pkg = lookupFile(this.cwd, ['package.json']) - this.moduleType - = !!pkg && JSON.parse(pkg).type === 'module' ? 'esm' : 'cjs' - } - catch {} - } - - get mockData(): Record { - return this._mockData - } - - run(watch?: boolean): void { - const { include, exclude } = this.options - /** - * 使用 rollup 提供的 include/exclude 规则, - * 过滤包含文件 - */ - const includeFilter = createFilter(include, exclude, { resolve: false }) - - fastGlob(include, { cwd: this.cwd }) - /** - * 控制 文件编译 并发 数量。 - * 当使用 Promise.all 时,可能在一些比较大型的项目中,过多的 mock 文件 - * 可能导致实例化过多的 esbuild 实例而导致带来过多的内存开销,导致额外的 - * 性能开销,从而影响编译速度。 - * 实测在控制并发数的前提下,总编译时间 差异不大,但内存开销更小更加稳定。 - */ - .then(files => - files.filter(includeFilter).map(file => () => this.loadMock(file)), - ) - .then(loadList => promiseParallel(loadList, 10)) - .then(() => this.updateMockList()) - - if (!watch) - return - - this.watchMockEntry() - this.watchDeps() - - let timer: NodeJS.Immediate | null = null - - this.on('mock:update', async (filepath: string) => { - if (!includeFilter(filepath)) - return - await this.loadMock(filepath) - if (timer) - clearImmediate(timer) - - timer = setImmediate(() => { - this.updateMockList() - this.emit('mock:update-end', filepath) - timer = null - }) - }) - this.on('mock:unlink', async (filepath: string) => { - if (!includeFilter(filepath)) - return - this.moduleCache.delete(filepath) - this.updateMockList() - this.emit('mock:update-end', filepath) - }) - } - - private watchMockEntry() { - const { include } = this.options - const [firstGlob, ...otherGlob] = toArray(include) - const watcher = (this.mockWatcher = chokidar.watch(firstGlob, { - ignoreInitial: true, - cwd: this.cwd, - })) - - if (otherGlob.length > 0) - otherGlob.forEach(glob => watcher.add(glob)) - - watcher.on('add', async (filepath: string) => { - filepath = normalizePath(filepath) - this.emit('mock:update', filepath) - debug('watcher:add', filepath) - }) - watcher.on('change', async (filepath: string) => { - filepath = normalizePath(filepath) - this.emit('mock:update', filepath) - debug('watcher:change', filepath) - }) - watcher.on('unlink', async (filepath: string) => { - filepath = normalizePath(filepath) - this.emit('mock:unlink', filepath) - debug('watcher:unlink', filepath) - }) - } - - /** - * 监听 mock文件依赖的本地文件变动, - * mock依赖文件更新,mock文件也一并更新 - */ - private watchDeps() { - const oldDeps: string[] = [] - this.depsWatcher = chokidar.watch([], { - ignoreInitial: true, - cwd: this.cwd, - }) - this.depsWatcher.on('change', (filepath) => { - filepath = normalizePath(filepath) - const mockFiles = this.moduleDeps.get(filepath) - mockFiles?.forEach((file) => { - this.emit('mock:update', file) - }) - }) - this.depsWatcher.on('unlink', (filepath) => { - filepath = normalizePath(filepath) - this.moduleDeps.delete(filepath) - }) - this.on('update:deps', () => { - const deps: string[] = [] - for (const [dep] of this.moduleDeps.entries()) - deps.push(dep) - - const exactDeps = deps.filter(dep => !oldDeps.includes(dep)) - - if (exactDeps.length > 0) - this.depsWatcher.add(exactDeps) - }) - } - - close(): void { - this.mockWatcher?.close() - this.depsWatcher?.close() - } - - private updateMockList() { - this._mockData = transformMockData(this.moduleCache) - } - - private updateModuleDeps(filepath: string, deps: Metafile['inputs']) { - Object.keys(deps).forEach((mPath) => { - const imports = deps[mPath].imports.map(_ => _.path) - imports.forEach((dep) => { - if (!this.moduleDeps.has(dep)) - this.moduleDeps.set(dep, new Set()) - - const cur = this.moduleDeps.get(dep)! - cur.add(filepath) - }) - }) - this.emit('update:deps') - } - - private async loadMock(filepath?: string): Promise { - if (!filepath) - return - - let isESM = false - if (/\.m[jt]s$/.test(filepath)) - isESM = true - - else if (/\.c[jt]s$/.test(filepath)) - isESM = false - - else - isESM = this.moduleType === 'esm' - - const { define, alias } = this.options - const { code, deps } = await transformWithEsbuild( - filepath, - { isESM, define, alias, cwd: this.cwd }, - ) - - try { - const raw = (await loadFromCode({ filepath, code, isESM, cwd: this.cwd })) || {} - - this.moduleCache.set(filepath, transformRawData(raw, filepath)) - this.updateModuleDeps(filepath, deps) - } - catch (e) { - console.error(e) - } - } -} diff --git a/plugin/src/core/parseReqBody.ts b/plugin/src/core/parseReqBody.ts deleted file mode 100644 index f47661e..0000000 --- a/plugin/src/core/parseReqBody.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { Connect } from 'vite' -import type { BodyParserOptions } from '../types' -import bodyParser from 'co-body' -import formidable from 'formidable' - -const DEFAULT_FORMIDABLE_OPTIONS: formidable.Options = { - keepExtensions: true, - filename(name, ext, part) { - return part?.originalFilename || `${name}.${Date.now()}${ext ? `.${ext}` : ''}` - }, -} - -export async function parseReqBody( - req: Connect.IncomingMessage, - formidableOptions: formidable.Options, - bodyParserOptions: BodyParserOptions = {}, -): Promise { - const method = req.method!.toUpperCase() - if (['HEAD', 'OPTIONS'].includes(method)) - return undefined - const type = req.headers['content-type']?.toLocaleLowerCase() || '' - const { limit, formLimit, jsonLimit, textLimit, ...rest } = bodyParserOptions - try { - if (type.startsWith('application/json')) { - return await bodyParser.json(req, { - limit: jsonLimit || limit, - ...rest, - }) - } - - if (type.startsWith('application/x-www-form-urlencoded')) { - return await bodyParser.form(req, { - limit: formLimit || limit, - ...rest, - }) - } - - if (type.startsWith('text/plain')) { - return await bodyParser.text(req, { - limit: textLimit || limit, - ...rest, - }) - } - - if (type.startsWith('multipart/form-data')) - return await parseMultipart(req, formidableOptions) - } - catch (e) { - console.error(e) - } - return undefined -} - -async function parseMultipart( - req: Connect.IncomingMessage, - options: formidable.Options, -): Promise { - const form = formidable({ ...DEFAULT_FORMIDABLE_OPTIONS, ...options }) - - return new Promise((resolve, reject) => { - form.parse(req, (error, fields, files) => { - if (error) { - reject(error) - return - } - resolve({ ...fields, ...files }) - }) - }) -} diff --git a/plugin/src/core/utils.ts b/plugin/src/core/utils.ts deleted file mode 100644 index 5bdee04..0000000 --- a/plugin/src/core/utils.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { ParsedUrlQuery } from 'node:querystring' -import type { Readable, Stream } from 'node:stream' -import type { ResolvedConfig } from 'vite' -import fs from 'node:fs' -import os from 'node:os' -import path from 'node:path' -import { parse as queryParse } from 'node:querystring' -import { fileURLToPath, URL } from 'node:url' -import Debug from 'debug' -import { match } from 'path-to-regexp' - -export function isStream(stream: unknown): stream is Stream { - return stream !== null - && typeof stream === 'object' - && typeof (stream as any).pipe === 'function' -} - -export function isReadableStream(stream: unknown): stream is Readable { - return isStream(stream) - && (stream as any).readable !== false - && typeof (stream as any)._read === 'function' - && typeof (stream as any)._readableState === 'object' -} - -export function getDirname(importMetaUrl: string): string { - return path.dirname(fileURLToPath(importMetaUrl)) -} - -export const debug: Debug.Debugger = Debug('vite:mock-dev-server') - -interface LookupFileOptions { - pathOnly?: boolean - rootDir?: string - predicate?: (file: string) => boolean -} - -export function lookupFile( - dir: string, - formats: string[], - options?: LookupFileOptions, -): string | undefined { - for (const format of formats) { - const fullPath = path.join(dir, format) - if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) { - const result = options?.pathOnly - ? fullPath - : fs.readFileSync(fullPath, 'utf-8') - if (!options?.predicate || options.predicate(result)) - return result - } - } - const parentDir = path.dirname(dir) - if ( - parentDir !== dir - && (!options?.rootDir || parentDir.startsWith(options?.rootDir)) - ) { - return lookupFile(parentDir, formats, options) - } -} - -export function ensureProxies( - serverProxy: ResolvedConfig['server']['proxy'] = {}, -): { httpProxies: string[], wsProxies: string[] } { - const httpProxies: string[] = [] - const wsProxies: string[] = [] - Object.keys(serverProxy).forEach((key) => { - const value = serverProxy[key] - if ( - typeof value === 'string' - || (!value.ws - && !value.target?.toString().startsWith('ws:') - && !value.target?.toString().startsWith('wss:')) - ) { - httpProxies.push(key) - } - else { - wsProxies.push(key) - } - }) - return { httpProxies, wsProxies } -} - -export function doesProxyContextMatchUrl( - context: string, - url: string, -): boolean { - return ( - (context[0] === '^' && new RegExp(context).test(url)) - || url.startsWith(context) - ) -} - -export function parseParams(pattern: string, url: string): Record { - const urlMatch = match(pattern, { decode: decodeURIComponent })(url) || { - params: {}, - } - return urlMatch.params || {} -} - -/** - * nodejs 从 19.0.0 开始 弃用 url.parse,因此使用 url.parse 来解析 可能会报错, - * 使用 URL 来解析 - */ -export function urlParse(input: string): { - pathname: string - query: ParsedUrlQuery -} { - const url = new URL(input, 'http://example.com') - const pathname = decodeURIComponent(url.pathname) - const query = queryParse(url.search.replace(/^\?/, '')) - return { pathname, query } -} - -const windowsSlashRE = /\\/g -const isWindows = os.platform() === 'win32' - -export function slash(p: string): string { - return p.replace(windowsSlashRE, '/') -} -export function normalizePath(id: string): string { - return path.posix.normalize(isWindows ? slash(id) : id) -} diff --git a/plugin/src/helper.ts b/plugin/src/helper.ts deleted file mode 100644 index 1bcf04f..0000000 --- a/plugin/src/helper.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './core/defineMock' -export * from './core/defineMockData' -export * from './core/sse' - -export type { - MockHttpItem, - MockOptions, - MockRequest, - MockWebsocketItem, -} from './types' diff --git a/plugin/src/index.ts b/plugin/src/index.ts deleted file mode 100644 index edcd1d9..0000000 --- a/plugin/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Plugin } from 'vite' -import type { MockServerPluginOptions } from './types' -import pc from 'picocolors' -import { mockDevServerPlugin } from './plugin' - -export * from './helper' - -export * from './server' -export type { - FormidableFile, - MockHttpItem, - MockOptions, - MockRequest, - MockServerPluginOptions, - MockWebsocketItem, -} from './types' - -export { mockDevServerPlugin } - -/** - * @deprecated use named export instead - */ -export default function mockDevServerPluginWithDefaultExportWasDeprecated( - options: MockServerPluginOptions = {}, -): Plugin[] { - console.warn(`${pc.yellow('[vite-plugin-mock-dev-server]')} ${pc.yellow(pc.bold('WARNING:'))} The plugin default export is ${pc.bold('deprecated')}, it will be removed in next major version, use ${pc.bold('named export')} instead:\n\n ${pc.green('import { mockDevServerPlugin } from "vite-plugin-mock-dev-server"')}\n`) - - return mockDevServerPlugin(options) -} diff --git a/plugin/src/server.ts b/plugin/src/server.ts deleted file mode 100644 index 0216c0b..0000000 --- a/plugin/src/server.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './core/baseMiddleware' -export * from './core/logger' -export * from './core/transform' -export * from './core/ws' diff --git a/plugin/src/shim.d.ts b/plugin/src/shim.d.ts deleted file mode 100644 index cd5a36e..0000000 --- a/plugin/src/shim.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const __PACKAGE_NAME__: string -declare const __PACKAGE_VERSION__: string diff --git a/plugin/tsdown.config.ts b/plugin/tsdown.config.ts deleted file mode 100644 index 9059f57..0000000 --- a/plugin/tsdown.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { UserConfig, UserConfigFn } from 'tsdown' -import { defineConfig } from 'tsdown' -import { name, version } from './package.json' - -const tsdownConfig: UserConfig | UserConfigFn = defineConfig({ - entry: ['src/index.ts', 'src/helper.ts', 'src/server.ts'], - shims: true, - sourcemap: false, - dts: true, - define: { - __PACKAGE_NAME__: JSON.stringify(name), - __PACKAGE_VERSION__: JSON.stringify(version), - }, - format: ['esm', 'cjs'], -}) - -export default tsdownConfig diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f10e6b..1f9f555 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: dev: '@pengzhanbo/eslint-config': - specifier: ^1.36.0 - version: 1.36.0 + specifier: ^1.37.0 + version: 1.37.0 '@types/co-body': specifier: ^6.1.3 version: 6.1.3 @@ -34,8 +34,11 @@ catalogs: specifier: ^1.0.10 version: 1.0.10 '@types/node': - specifier: ^24.2.1 - version: 24.2.1 + specifier: ^24.3.0 + version: 24.3.0 + '@types/picomatch': + specifier: ^4.0.2 + version: 4.0.2 '@types/ws': specifier: ^8.18.1 version: 8.18.1 @@ -49,23 +52,26 @@ catalogs: specifier: ^0.25.9 version: 0.25.9 eslint: - specifier: ^9.33.0 - version: 9.33.0 + specifier: ^9.34.0 + version: 9.34.0 mockjs: specifier: ^1.1.0 version: 1.1.0 + rolldown: + specifier: ^1.0.0-beta.34 + version: 1.0.0-beta.34 tsdown: - specifier: ^0.14.1 - version: 0.14.1 + specifier: ^0.14.2 + version: 0.14.2 typescript: specifier: ^5.9.2 version: 5.9.2 vite: - specifier: ^7.1.2 - version: 7.1.2 + specifier: npm:rolldown-vite@latest + version: 7.1.5 vitepress: - specifier: ^2.0.0-alpha.10 - version: 2.0.0-alpha.10 + specifier: ^2.0.0-alpha.12 + version: 2.0.0-alpha.12 vitepress-plugin-group-icons: specifier: ^1.6.3 version: 1.6.3 @@ -79,12 +85,12 @@ catalogs: '@pengzhanbo/utils': specifier: ^2.1.0 version: 2.1.0 - '@rollup/pluginutils': - specifier: ^5.2.0 - version: 5.2.0 + ansis: + specifier: ^4.1.0 + version: 4.1.0 chokidar: - specifier: 3.6.0 - version: 3.6.0 + specifier: ^4.0.3 + version: 4.0.3 co-body: specifier: ^6.2.0 version: 6.2.0 @@ -97,9 +103,6 @@ catalogs: debug: specifier: ^4.4.1 version: 4.4.1 - fast-glob: - specifier: ^3.3.3 - version: 3.3.3 formidable: specifier: 3.5.4 version: 3.5.4 @@ -112,15 +115,21 @@ catalogs: json5: specifier: ^2.2.3 version: 2.2.3 + local-pkg: + specifier: ^1.1.2 + version: 1.1.2 mime-types: specifier: ^3.0.1 version: 3.0.1 path-to-regexp: - specifier: 6.3.0 - version: 6.3.0 - picocolors: - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^8.2.0 + version: 8.2.0 + picomatch: + specifier: ^4.0.3 + version: 4.0.3 + tinyglobby: + specifier: ^0.2.14 + version: 0.2.14 ws: specifier: ^8.18.3 version: 8.18.3 @@ -131,7 +140,7 @@ importers: devDependencies: '@pengzhanbo/eslint-config': specifier: catalog:dev - version: 1.36.0(eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1)) + version: 1.37.0(eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@types/co-body': specifier: catalog:dev version: 6.1.3 @@ -155,7 +164,10 @@ importers: version: 3.0.1 '@types/node': specifier: catalog:dev - version: 24.2.1 + version: 24.3.0 + '@types/picomatch': + specifier: catalog:dev + version: 4.0.2 '@types/ws': specifier: catalog:dev version: 8.18.1 @@ -164,28 +176,28 @@ importers: version: 10.2.3 conventional-changelog-cli: specifier: catalog:dev - version: 5.0.0(conventional-commits-filter@4.0.0) + version: 5.0.0(conventional-commits-filter@5.0.0) eslint: specifier: catalog:dev - version: 9.33.0(jiti@2.5.1) + version: 9.34.0(jiti@2.5.1) tsdown: specifier: catalog:dev - version: 0.14.1(typescript@5.9.2) + version: 0.14.2(typescript@5.9.2) typescript: specifier: catalog:dev version: 5.9.2 vitest: specifier: catalog:dev - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) docs: devDependencies: vitepress: specifier: catalog:dev - version: 2.0.0-alpha.10(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1) + version: 2.0.0-alpha.12(@types/node@24.3.0)(change-case@5.4.4)(jiti@2.5.1)(lightningcss@1.30.1)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1) vitepress-plugin-group-icons: specifier: catalog:dev - version: 1.6.3(markdown-it@14.1.0)(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1)) + version: 1.6.3(markdown-it@14.1.0)(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) vitepress-plugin-llms: specifier: catalog:dev version: 1.7.3 @@ -200,19 +212,22 @@ importers: version: 1.1.0 vite: specifier: catalog:dev - version: 7.1.2(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + version: rolldown-vite@7.1.5(@types/node@24.3.0)(esbuild@0.25.9)(jiti@2.5.1)(yaml@2.8.1) vite-plugin-mock-dev-server: specifier: workspace:* - version: link:../plugin + version: link:../vite-plugin-mock-dev-server - plugin: + vite-plugin-mock-dev-server: dependencies: - '@rollup/pluginutils': + '@pengzhanbo/utils': specifier: catalog:prod - version: 5.2.0(rollup@4.44.2) + version: 2.1.0 + ansis: + specifier: catalog:prod + version: 4.1.0 chokidar: specifier: catalog:prod - version: 3.6.0 + version: 4.0.3 co-body: specifier: catalog:prod version: 6.2.0 @@ -225,9 +240,6 @@ importers: debug: specifier: catalog:prod version: 4.4.1 - fast-glob: - specifier: catalog:prod - version: 3.3.3 formidable: specifier: catalog:prod version: 3.5.4 @@ -240,67 +252,61 @@ importers: json5: specifier: catalog:prod version: 2.2.3 + local-pkg: + specifier: catalog:prod + version: 1.1.2 mime-types: specifier: catalog:prod version: 3.0.1 path-to-regexp: specifier: catalog:prod - version: 6.3.0 - picocolors: + version: 8.2.0 + picomatch: + specifier: catalog:prod + version: 4.0.3 + tinyglobby: specifier: catalog:prod - version: 1.1.1 + version: 0.2.14 ws: specifier: catalog:prod version: 8.18.3 devDependencies: - '@pengzhanbo/utils': - specifier: catalog:prod - version: 2.1.0 esbuild: specifier: catalog:dev version: 0.25.9 + rolldown: + specifier: catalog:dev + version: 1.0.0-beta.34 vite: specifier: catalog:dev - version: 7.1.2(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + version: rolldown-vite@7.1.5(@types/node@24.3.0)(esbuild@0.25.9)(jiti@2.5.1)(yaml@2.8.1) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} '@antfu/utils@9.2.0': resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@babel/code-frame@7.22.13': - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.22.20': - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true @@ -308,347 +314,191 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} - '@conventional-changelog/git-client@1.0.0': - resolution: {integrity: sha512-PkUIv8bcY8/mIJig+3CGneb1hfXvjUotuBcroBHyVO4obIz5WGJpBWTuo17XV4p1sTmbGa8TxAmdMzhlPU+tLA==} + '@conventional-changelog/git-client@1.0.1': + resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} engines: {node: '>=18'} peerDependencies: - conventional-commits-filter: ^4.0.0 - conventional-commits-parser: ^5.0.0 + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.0.0 peerDependenciesMeta: conventional-commits-filter: optional: true conventional-commits-parser: optional: true - '@docsearch/css@4.0.0-beta.6': - resolution: {integrity: sha512-LmUwTbRnj6CJV8RW2FysHEm238X2sC2QjL1AKcKVdstuZ12r85o9PdOgNZgRMUCIgJuZteyMeBGBZo258DH70g==} + '@docsearch/css@4.0.0-beta.8': + resolution: {integrity: sha512-/ZlyvZCjIJM4aaOYoJpVNHPJckX7J5KIbt6IWjnZXvo0QAUI1aH976vKEJUC9olgUbE3LWafB8yuX4qoqahIQg==} - '@docsearch/js@4.0.0-beta.6': - resolution: {integrity: sha512-paUB2D7JryaacNS3HJRc6PvsbZu9x07ZhL1c8p3OSeP/tyJN0jzdG4Wsd6Z8Me563kEM5VTVSrDi/kaUpwWosA==} + '@docsearch/js@4.0.0-beta.8': + resolution: {integrity: sha512-elgqPYpykRQr5MlfqoO8U2uC3BcPgjUQhzmHt/H4lSzP7khJ9Jpv/cCB4tiZreXb6GkdRgWr5csiItNq6jjnhg==} - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@es-joy/jsdoccomment@0.50.2': resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} - '@es-joy/jsdoccomment@0.52.0': - resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} + '@es-joy/jsdoccomment@0.53.0': + resolution: {integrity: sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==} engines: {node: '>=20.11.0'} - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.9': resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.9': resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.9': resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.9': resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.9': resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.9': resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.9': resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.9': resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.9': resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.9': resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.9': resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.9': resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.9': resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.9': resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.9': resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.9': resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.25.9': resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.9': resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.9': resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.9': resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.9': resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} @@ -671,11 +521,11 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.2.6': - resolution: {integrity: sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==} + '@eslint/compat@1.3.2': + resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^9.10.0 + eslint: ^8.40 || 9 peerDependenciesMeta: eslint: optional: true @@ -696,12 +546,12 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.33.0': - resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} + '@eslint/js@9.34.0': + resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/markdown@7.1.0': - resolution: {integrity: sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==} + '@eslint/markdown@7.2.0': + resolution: {integrity: sha512-cmDloByulvKzofM0tIkSGWwxMcrKOLsXZC+EM0FLkRIrxKzW+2RkZAt9TAh37EtQRmx1M4vjBEmlC6R0wiGkog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -731,28 +581,28 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@hutson/parse-repository-url@5.0.0': resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} engines: {node: '>=10.13.0'} - '@iconify-json/logos@1.2.4': - resolution: {integrity: sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==} + '@iconify-json/logos@1.2.9': + resolution: {integrity: sha512-G6VCdFnwZcrT6Eveq3m43oJfLw/CX8plwFcE+2jgv3fiGB64pTmnU7Yd1MNZ/eA+/Re2iEDhuCfSNOWTHwwK8w==} - '@iconify-json/simple-icons@1.2.47': - resolution: {integrity: sha512-wa/2O7G4sBmwSEWWLh5C+HeY00lVOoWYRKJOYQtk7lAbQrHUReD1ijiGOyTynV1YavxtNueL1CBA1UZmYJfOrQ==} + '@iconify-json/simple-icons@1.2.50': + resolution: {integrity: sha512-Z2ggRwKYEBB9eYAEi4NqEgIzyLhu0Buh4+KGzMPD6+xG7mk52wZJwLT/glDPtfslV503VtJbqzWqBUGkCMKOFA==} - '@iconify-json/vscode-icons@1.2.29': - resolution: {integrity: sha512-ByqO3YPYs0n7hakQ/ZUXltJQnYibeOv41H1AdciOs7Pmba5/OsKKK1/oOjcBmvXrYuENO+IvIzORYkl6sFXgqA==} + '@iconify-json/vscode-icons@1.2.30': + resolution: {integrity: sha512-dlTOc8w4a8/QNumZzMve+APJa6xQVXPZwo8qBk/MaYfY42NPrQT83QXkbTWKDkuEu/xgHPXvKZZBL7Yy12vYQw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.0.0': - resolution: {integrity: sha512-Bjf0HTRAB59thKK9QFvyLEXE9S793IqxqJEhNQEboh+IjOXj0nDtOIFh63oz+Y6X/ye4UWpxne5sVQ2W250iSA==} + '@iconify/utils@3.0.1': + resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} @@ -762,18 +612,18 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} '@napi-rs/wasm-runtime@1.0.3': resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} @@ -794,25 +644,25 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/runtime@0.81.0': - resolution: {integrity: sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==} + '@oxc-project/runtime@0.82.3': + resolution: {integrity: sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg==} engines: {node: '>=6.9.0'} - '@oxc-project/types@0.81.0': - resolution: {integrity: sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==} + '@oxc-project/types@0.82.3': + resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==} '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@pengzhanbo/eslint-config@1.36.0': - resolution: {integrity: sha512-Z0yjK3irTbnSnv483KTklXqQOYWGbIwwlSxB94BhmnOY8NNt0oencox7Dw5QTTYVHJe1+u9pMpR3I2he3MWR8A==} + '@pengzhanbo/eslint-config@1.37.0': + resolution: {integrity: sha512-L2X2KHO/IJ+oBwucJ8i62mRJNA4bf9EK409XZd2vIa3ZV5Imk92et9UjBct0rnHh+dnIbJk/88c1E5901P8hBA==} peerDependencies: - '@eslint-react/eslint-plugin': ^1.52.3 - '@next/eslint-plugin-next': ^15.4.0-canary.115 + '@eslint-react/eslint-plugin': ^1.52.9 + '@next/eslint-plugin-next': ^15.5.2 '@prettier/plugin-xml': ^3.4.2 - '@unocss/eslint-plugin': ^66.4.2 + '@unocss/eslint-plugin': ^66.5.0 astro-eslint-parser: ^1.2.2 - eslint: ^9.33.0 + eslint: ^9.34.0 eslint-plugin-astro: ^1.3.1 eslint-plugin-format: ^1.0.1 eslint-plugin-react-hooks: ^5.2.0 @@ -868,221 +718,220 @@ packages: '@pengzhanbo/utils@2.1.0': resolution: {integrity: sha512-mdcNoYZ6S9EhRqAIpjnD2dcFxaP7E9JdMrP2z5uXuEesddNcmQ4GvEs/wcyxKmFXqeFdL88fJu7l8a6hNN4zPQ==} - '@quansync/fs@0.1.3': - resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} - engines: {node: '>=20.0.0'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rolldown/binding-android-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + + '@rolldown/binding-android-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-jf5GNe5jP3Sr1Tih0WKvg2bzvh5T/1TA0fn1u32xSH7ca/p5t+/QRr4VRFCV/na5vjwKEhwWrChsL2AWlY+eoA==} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-2F/TqH4QuJQ34tgWxqBjFL3XV1gMzeQgUO8YRtCPGBSP0GhxtoFzsp7KqmQEothsxztlv+KhhT9Dbg3HHwHViQ==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.32': - resolution: {integrity: sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==} + '@rolldown/binding-darwin-x64@1.0.0-beta.34': + resolution: {integrity: sha512-E1QuFslgLWbHQ8Qli/AqUKdfg0pockQPwRxVbhNQ74SciZEZpzLaujkdmOLSccMlSXDfFCF8RPnMoRAzQ9JV8Q==} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.32': - resolution: {integrity: sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.34': + resolution: {integrity: sha512-VS8VInNCwnkpI9WeQaWu3kVBq9ty6g7KrHdLxYMzeqz24+w9hg712TcWdqzdY6sn+24lUoMD9jTZrZ/qfVpk0g==} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': - resolution: {integrity: sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': + resolution: {integrity: sha512-4St4emjcnULnxJYb/5ZDrH/kK/j6PcUgc3eAqH5STmTrcF+I9m/X2xvSF2a2bWv1DOQhxBewThu0KkwGHdgu5w==} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': - resolution: {integrity: sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': + resolution: {integrity: sha512-a737FTqhFUoWfnebS2SnQ2BS50p0JdukdkUBwy2J06j4hZ6Eej0zEB8vTfAqoCjn8BQKkXBy+3Sx0IRkgwz1gA==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': - resolution: {integrity: sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': + resolution: {integrity: sha512-NH+FeQWKyuw0k+PbXqpFWNfvD8RPvfJk766B/njdaWz4TmiEcSB0Nb6guNw1rBpM1FmltQYb3fFnTumtC6pRfA==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': - resolution: {integrity: sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': + resolution: {integrity: sha512-Q3RSCivp8pNadYK8ke3hLnQk08BkpZX9BmMjgwae2FWzdxhxxUiUzd9By7kneUL0vRQ4uRnhD9VkFQ+Haeqdvw==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': - resolution: {integrity: sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': + resolution: {integrity: sha512-wDd/HrNcVoBhWWBUW3evJHoo7GJE/RofssBy3Dsiip05YUBmokQVrYAyrboOY4dzs/lJ7HYeBtWQ9hj8wlyF0A==} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-dH3FTEV6KTNWpYSgjSXZzeX7vLty9oBYn6R3laEdhwZftQwq030LKL+5wyQdlbX5pnbh4h127hpv3Hl1+sj8dg==} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': - resolution: {integrity: sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': + resolution: {integrity: sha512-y5BUf+QtO0JsIDKA51FcGwvhJmv89BYjUl8AmN7jqD6k/eU55mH6RJYnxwCsODq5m7KSSTigVb6O7/GqB8wbPw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-ga5hFhdTwpaNxEiuxZHWnD3ed0GBAzbgzS5tRHpe0ObptxM1a9Xrq6TVfNQirBLwb5Y7T/FJmJi3pmdLy95ljg==} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-4/MBp9T9eRnZskxWr8EXD/xHvLhdjWaeX/qY9LPRG1JdCGV3DphkLTy5AWwIQ5jhAy2ZNJR5z2fYRlpWU0sIyQ==} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-Ej0i4PZk8ltblZtzVK8ouaGUacUtxRmTm5S9794mdyU/tYxXjAJNseOfxrnHpMWKjMDrOKbqkPqJ52T9NR4LQQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-7O5iUBX6HSBKlQU4WykpUoEmb0wQmonb6ziKFr3dJTHud2kzDnWMqk344T0qm3uGv9Ddq6Re/94pInxo1G2d4w==} cpu: [x64] os: [win32] '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} - '@rolldown/pluginutils@1.0.0-beta.32': - resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} - - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rolldown/pluginutils@1.0.0-beta.34': + resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} - '@rollup/rollup-android-arm-eabi@4.44.2': - resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} + '@rollup/rollup-android-arm-eabi@4.50.0': + resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.44.2': - resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} + '@rollup/rollup-android-arm64@4.50.0': + resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.44.2': - resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} + '@rollup/rollup-darwin-arm64@4.50.0': + resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.44.2': - resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} + '@rollup/rollup-darwin-x64@4.50.0': + resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.44.2': - resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} + '@rollup/rollup-freebsd-arm64@4.50.0': + resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.44.2': - resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} + '@rollup/rollup-freebsd-x64@4.50.0': + resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.44.2': - resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': + resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.44.2': - resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} + '@rollup/rollup-linux-arm-musleabihf@4.50.0': + resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.44.2': - resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} + '@rollup/rollup-linux-arm64-gnu@4.50.0': + resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.44.2': - resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} + '@rollup/rollup-linux-arm64-musl@4.50.0': + resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.44.2': - resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': + resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': - resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} + '@rollup/rollup-linux-ppc64-gnu@4.50.0': + resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.44.2': - resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} + '@rollup/rollup-linux-riscv64-gnu@4.50.0': + resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.44.2': - resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} + '@rollup/rollup-linux-riscv64-musl@4.50.0': + resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.44.2': - resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} + '@rollup/rollup-linux-s390x-gnu@4.50.0': + resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.44.2': - resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} + '@rollup/rollup-linux-x64-gnu@4.50.0': + resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.44.2': - resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} + '@rollup/rollup-linux-x64-musl@4.50.0': + resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.44.2': - resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} + '@rollup/rollup-openharmony-arm64@4.50.0': + resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.50.0': + resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.44.2': - resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} + '@rollup/rollup-win32-ia32-msvc@4.50.0': + resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.44.2': - resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} + '@rollup/rollup-win32-x64-msvc@4.50.0': + resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} cpu: [x64] os: [win32] - '@shikijs/core@3.9.2': - resolution: {integrity: sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA==} + '@shikijs/core@3.12.1': + resolution: {integrity: sha512-j9+UDQ6M50xvaSR/e9lg212H0Fqxy3lYd39Q6YITYQxfrb5VYNUKPLZp4PN9f+YmRcdpyNAm3obn/tIZ2WkUWg==} - '@shikijs/engine-javascript@3.9.2': - resolution: {integrity: sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA==} + '@shikijs/engine-javascript@3.12.1': + resolution: {integrity: sha512-mwif5T3rEBSMn/1m9dNi4WmB4dxH4VfYqreQMLpbFYov8MM3Gus98I549amFMjtEmYDAkTKGP7bmsv1n9t9I+A==} - '@shikijs/engine-oniguruma@3.9.2': - resolution: {integrity: sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==} + '@shikijs/engine-oniguruma@3.12.1': + resolution: {integrity: sha512-hbYq+XOc55CU7Irkhsgwh8WgQbx2W5IVzHV4l+wZ874olMLSNg5o3F73vo9m4SAhimFyqq/86xnx9h+T30HhhQ==} - '@shikijs/langs@3.9.2': - resolution: {integrity: sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==} + '@shikijs/langs@3.12.1': + resolution: {integrity: sha512-Y1MbMfVO5baRz7Boo7EoD36TmzfUx/I5n8e+wZumx6SlUA81Zj1ZwNJL871iIuSHrdsheV4AxJtHQ9mlooklmg==} - '@shikijs/themes@3.9.2': - resolution: {integrity: sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==} + '@shikijs/themes@3.12.1': + resolution: {integrity: sha512-9JrAm9cA5hqM/YXymA3oAAZdnCgQf1zyrNDtsnM105nNEoEpux4dyzdoOjc2KawEKj1iUs/WH2ota6Atp7GYkQ==} - '@shikijs/transformers@3.9.2': - resolution: {integrity: sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA==} + '@shikijs/transformers@3.12.1': + resolution: {integrity: sha512-crGh3cSZf6mwg3K2W8i79Ja+q4tVClRHdHLnUGi5arS58+cqdzsbkrEZBDMyevf9ehmjFUWDTEwCMEyp9I3z0g==} - '@shikijs/types@3.9.2': - resolution: {integrity: sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==} + '@shikijs/types@3.12.1': + resolution: {integrity: sha512-Is/p+1vTss22LIsGCJTmGrxu7ZC1iBL9doJFYLaZ4aI8d0VDXb7Mn0kBzhkc7pdsRpmUbQLQ5HXwNpa3H6F8og==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.2.3': - resolution: {integrity: sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==} + '@stylistic/eslint-plugin@5.3.1': + resolution: {integrity: sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -1090,8 +939,8 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@types/body-parser@1.19.2': - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -1099,8 +948,8 @@ packages: '@types/co-body@6.1.3': resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} - '@types/connect@3.4.35': - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/cookies@0.9.1': resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} @@ -1114,17 +963,14 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.17.33': - resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} - '@types/express@4.17.17': - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/formidable@3.4.5': resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} @@ -1132,14 +978,17 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/is-core-module@2.2.2': resolution: {integrity: sha512-ht+SC4Z4M1WOSaGweZ052H51lNGErPltoQiCRMvlPUUxAx5fuNAk9f6oqFjxGH2ViBSjdGVUwOwpT9YNsDjFLQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/keygrip@1.0.2': - resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1156,35 +1005,41 @@ packages: '@types/mime-types@3.0.1': resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==} - '@types/mime@3.0.1': - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} '@types/mockjs@1.0.10': resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==} - '@types/ms@0.7.31': - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.2.1': - resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/qs@6.9.7': - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + '@types/picomatch@4.0.2': + resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/range-parser@1.2.4': - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.1': - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} @@ -1192,104 +1047,67 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.39.1': - resolution: {integrity: sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==} + '@typescript-eslint/eslint-plugin@8.41.0': + resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.1 + '@typescript-eslint/parser': ^8.41.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.39.1': - resolution: {integrity: sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==} + '@typescript-eslint/parser@8.41.0': + resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.34.1': - resolution: {integrity: sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.39.1': - resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} + '@typescript-eslint/project-service@8.41.0': + resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.34.1': - resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.39.1': - resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} + '@typescript-eslint/scope-manager@8.41.0': + resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.34.1': - resolution: {integrity: sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/tsconfig-utils@8.39.1': - resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} + '@typescript-eslint/tsconfig-utils@8.41.0': + resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.39.1': - resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} + '@typescript-eslint/type-utils@8.41.0': + resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.34.1': - resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.39.1': - resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} + '@typescript-eslint/types@8.41.0': + resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.34.1': - resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/typescript-estree@8.39.1': - resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} + '@typescript-eslint/typescript-estree@8.41.0': + resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.34.1': - resolution: {integrity: sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@8.39.1': - resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} + '@typescript-eslint/utils@8.41.0': + resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.34.1': - resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.39.1': - resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} + '@typescript-eslint/visitor-keys@8.41.0': + resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@vitejs/plugin-vue@6.0.1': resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} @@ -1298,8 +1116,8 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.2.25 - '@vitest/eslint-plugin@1.3.4': - resolution: {integrity: sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==} + '@vitest/eslint-plugin@1.3.6': + resolution: {integrity: sha512-sa/QAljHbUP+sMdPjK8e/6nS2+QB/bh1aDKEkAKMqsKVzBXqz4LRYfT7UVGIP8LMIrskGTxqAbHuiL+FOYWzHg==} peerDependencies: eslint: '>= 8.57.0' typescript: '>= 5.0.0' @@ -1339,51 +1157,51 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vue/compiler-core@3.5.18': - resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} + '@vue/compiler-core@3.5.20': + resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} - '@vue/compiler-dom@3.5.18': - resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} + '@vue/compiler-dom@3.5.20': + resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} - '@vue/compiler-sfc@3.5.18': - resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} + '@vue/compiler-sfc@3.5.20': + resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} - '@vue/compiler-ssr@3.5.18': - resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} + '@vue/compiler-ssr@3.5.20': + resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} - '@vue/devtools-api@8.0.0': - resolution: {integrity: sha512-I2jF/knesMU36zTw1hnExjoixDZvDoantiWKVrHpLd2J160zqqe8vp3vrGfjWdfuHmPJwSXe/YNG3rYOYiwy1Q==} + '@vue/devtools-api@8.0.1': + resolution: {integrity: sha512-YBvjfpM7LEp5+b7ZDm4+mFrC+TgGjUmN8ff9lZcbHQ1MKhmftT/urCTZP0y1j26YQWr25l9TPaEbNLbILRiGoQ==} - '@vue/devtools-kit@8.0.0': - resolution: {integrity: sha512-b11OeQODkE0bctdT0RhL684pEV2DPXJ80bjpywVCbFn1PxuL3bmMPDoJKjbMnnoWbrnUYXYzFfmMWBZAMhORkQ==} + '@vue/devtools-kit@8.0.1': + resolution: {integrity: sha512-7kiPhgTKNtNeXltEHnJJjIDlndlJP4P+UJvCw54uVHNDlI6JzwrSiRmW4cxKTug2wDbc/dkGaMnlZghcwV+aWA==} - '@vue/devtools-shared@8.0.0': - resolution: {integrity: sha512-jrKnbjshQCiOAJanoeJjTU7WaCg0Dz2BUal6SaR6VM/P3hiFdX5Q6Pxl73ZMnrhCxNK9nAg5hvvRGqs+6dtU1g==} + '@vue/devtools-shared@8.0.1': + resolution: {integrity: sha512-PqtWqPPRpMwZ9FjTzyugb5KeV9kmg2C3hjxZHwjl0lijT4QIJDd0z6AWcnbM9w2nayjDymyTt0+sbdTv3pVeNg==} - '@vue/reactivity@3.5.18': - resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} + '@vue/reactivity@3.5.20': + resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} - '@vue/runtime-core@3.5.18': - resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} + '@vue/runtime-core@3.5.20': + resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} - '@vue/runtime-dom@3.5.18': - resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} + '@vue/runtime-dom@3.5.20': + resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} - '@vue/server-renderer@3.5.18': - resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} + '@vue/server-renderer@3.5.20': + resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} peerDependencies: - vue: 3.5.18 + vue: 3.5.20 - '@vue/shared@3.5.18': - resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} + '@vue/shared@3.5.20': + resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} - '@vueuse/core@13.6.0': - resolution: {integrity: sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==} + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@13.6.0': - resolution: {integrity: sha512-dVFdgwYvkYjdizRL3ESdUW+Hg84i9Yhuzs+Ec3kEcuzJmT5xhiL/IGdw4z394qSBngUQvFi+wbHwhHX3EGbAxQ==} + '@vueuse/integrations@13.9.0': + resolution: {integrity: sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1424,11 +1242,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@13.6.0': - resolution: {integrity: sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==} + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} - '@vueuse/shared@13.6.0': - resolution: {integrity: sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==} + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} peerDependencies: vue: ^3.5.0 @@ -1452,10 +1270,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1464,10 +1278,6 @@ packages: resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} engines: {node: '>=14'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} @@ -1515,8 +1325,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-kit@2.1.1: - resolution: {integrity: sha512-mfh6a7gKXE8pDlxTvqIc/syH/P3RkzbOF6LeHdcKztLEzYe6IMsRCL7N8vI7hqTGWNxpkCuuRTpT21xNWqhRtQ==} + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} engines: {node: '>=20.18.0'} ast-types-flow@0.0.8: @@ -1544,25 +1354,21 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - birpc@2.5.0: resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.2: - resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} + browserslist@4.25.4: + resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1604,9 +1410,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -1619,19 +1422,15 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001734: - resolution: {integrity: sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==} + caniuse-lite@1.0.30001739: + resolution: {integrity: sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1653,10 +1452,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1680,25 +1475,19 @@ packages: resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} engines: {node: '>=8.0.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@10.0.0: - resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} - engines: {node: '>=14'} + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} @@ -1716,8 +1505,8 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} conventional-changelog-angular@8.0.0: @@ -1769,8 +1558,8 @@ packages: resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} engines: {node: '>=18'} - conventional-changelog-writer@8.0.0: - resolution: {integrity: sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA==} + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} engines: {node: '>=18'} hasBin: true @@ -1778,16 +1567,12 @@ packages: resolution: {integrity: sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==} engines: {node: '>=18'} - conventional-commits-filter@4.0.0: - resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} - engines: {node: '>=16'} - conventional-commits-filter@5.0.0: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.0.0: - resolution: {integrity: sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==} + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} engines: {node: '>=18'} hasBin: true @@ -1799,8 +1584,8 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - core-js-compat@3.45.0: - resolution: {integrity: sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==} + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} @@ -1837,8 +1622,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} @@ -1866,8 +1651,12 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1887,8 +1676,8 @@ packages: resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} engines: {node: '>=12'} - dts-resolver@2.1.1: - resolution: {integrity: sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw==} + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} engines: {node: '>=20.18.0'} peerDependencies: oxc-resolver: '>=11.0.0' @@ -1900,11 +1689,11 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.200: - resolution: {integrity: sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==} + electron-to-chromium@1.5.211: + resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1916,8 +1705,8 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -1955,11 +1744,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.9: resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} @@ -2043,8 +1827,8 @@ packages: typescript: optional: true - eslint-plugin-jsdoc@53.0.1: - resolution: {integrity: sha512-9gYQy6pXAHnJXPFMATQS56O3js39okRrve61VlaXhKyaa9dZuuvTlReStF3eQ+ygG5vybFl7YTw6MkYkrf2GUQ==} + eslint-plugin-jsdoc@54.1.1: + resolution: {integrity: sha512-qoY2Gl0OkvATXIxRaG2irS2ue78+RTaOyYrADvg1ue+9FHE+2Mp7RcpO0epkuhhQgOkH/REv1oJFe58dYv8SGg==} engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -2077,8 +1861,8 @@ packages: peerDependencies: eslint: '>=8.45.0' - eslint-plugin-pnpm@1.1.0: - resolution: {integrity: sha512-sL93w0muBtjnogzk/loDsxzMbmXQOLP5Blw3swLDBXZgfb+qQI73bPcUbjVR+ZL+K62vGJdErV+43i3r5DsZPg==} + eslint-plugin-pnpm@1.1.1: + resolution: {integrity: sha512-gNo+swrLCgvT8L6JX6hVmxuKeuStGK2l8IwVjDxmYIn+wP4SW/d0ORLKyUiYamsp+UxknQo3f2M1irrTpqahCw==} peerDependencies: eslint: ^9.0.0 @@ -2100,8 +1884,8 @@ packages: peerDependencies: eslint: '>=9.29.0' - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + eslint-plugin-unused-imports@4.2.0: + resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -2137,8 +1921,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.33.0: - resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} + eslint@9.34.0: + resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2182,8 +1966,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} exsolve@1.0.7: @@ -2209,14 +1993,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2243,8 +2028,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.6.5: resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} @@ -2280,9 +2065,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2356,8 +2138,8 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true @@ -2365,10 +2147,6 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2380,10 +2158,6 @@ packages: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -2392,10 +2166,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2409,8 +2179,8 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} html-void-elements@3.0.0: @@ -2436,8 +2206,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -2448,12 +2218,12 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@0.1.2: - resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} engines: {node: '>=18'} - inflation@2.0.0: - resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} engines: {node: '>= 0.8.0'} inherits@2.0.4: @@ -2475,10 +2245,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -2619,6 +2385,10 @@ packages: resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@4.8.0: + resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} + engines: {node: '>=12.0.0'} + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -2679,11 +2449,75 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} locate-path@6.0.0: @@ -2699,17 +2533,14 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.18: + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -2718,8 +2549,8 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} markdown-title@1.0.2: resolution: {integrity: sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ==} @@ -2729,8 +2560,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -2741,8 +2572,8 @@ packages: mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} mdast-util-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} @@ -2762,8 +2593,8 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} @@ -2783,8 +2614,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} @@ -2798,8 +2629,8 @@ packages: micromark-extension-gfm-strikethrough@2.1.0: resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - micromark-extension-gfm-table@2.1.0: - resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} micromark-extension-gfm-tagfilter@2.0.0: resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} @@ -2810,65 +2641,65 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -2909,8 +2740,8 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minisearch@7.1.2: resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} @@ -2918,8 +2749,8 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mockjs@1.1.0: resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} @@ -2943,22 +2774,18 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - nypm@0.6.0: - resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + nypm@0.6.1: + resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -2966,9 +2793,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3001,8 +2825,8 @@ packages: oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} own-keys@1.0.1: @@ -3031,8 +2855,8 @@ packages: parse-imports-exports@0.2.4: resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - parse-json@8.1.0: - resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} parse-statements@1.0.11: @@ -3046,9 +2870,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} @@ -3056,8 +2877,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} perfect-debounce@1.0.0: @@ -3070,10 +2891,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -3081,15 +2898,15 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.2.0: - resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm-workspace-yaml@1.1.0: - resolution: {integrity: sha512-OWUzBxtitpyUV0fBYYwLAfWxn3mSzVbVB7cwgNaHvTTU9P0V2QHjyaY5i7f1hEiT9VeKsNH1Skfhe2E3lx/zhA==} + pnpm-workspace-yaml@1.1.1: + resolution: {integrity: sha512-nGBB7h3Ped3g9dBrR6d3YNwXCKYsEg8K9J3GMmSrwGEXq3RHeGW44/B4MZW51p4FRMnyxJzTY5feSBbUjRhIHQ==} possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} @@ -3110,22 +2927,22 @@ packages: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} rc9@2.1.2: @@ -3139,13 +2956,9 @@ packages: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} refa@0.12.1: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} @@ -3203,15 +3016,15 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown-plugin-dts@0.15.6: - resolution: {integrity: sha512-AxQlyx3Nszob5QLmVUjz/VnC5BevtUo0h8tliuE0egddss7IbtCBU7GOe7biRU0fJNRQJmQjPKXFcc7K98j3+w==} + rolldown-plugin-dts@0.15.10: + resolution: {integrity: sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g==} engines: {node: '>=20.18.0'} peerDependencies: '@typescript/native-preview': '>=7.0.0-dev.20250601.1' @@ -3226,12 +3039,52 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.32: - resolution: {integrity: sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==} + rolldown-vite@7.1.5: + resolution: {integrity: sha512-NgHjKatQn1B5TjtNVS3+Uq3JBUPP8s70cMxLzGHpv/UyCGj0SQUtVYImNWbU2uqfOpNSnqhI+nbR7tmPPcb1qQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.25.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + rolldown@1.0.0-beta.34: + resolution: {integrity: sha512-Wwh7EwalMzzX3Yy3VN58VEajeR2Si8+HDNMf706jPLIqU7CxneRW+dQVfznf5O0TWTnJyu4npelwg2bzTXB1Nw==} hasBin: true - rollup@4.44.2: - resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} + rollup@4.50.0: + resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3261,11 +3114,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -3294,8 +3142,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.9.2: - resolution: {integrity: sha512-t6NKl5e/zGTvw/IyftLcumolgOczhuroqwXngDeMqJ3h3EQiTY/7wmfgPlsmloD8oYfqkEDqxiaH37Pjm1zUhQ==} + shiki@3.12.1: + resolution: {integrity: sha512-eMlxVaXyuNQAQCaMtDKQjKv0eVm+kA6fsZtv9UqKgspP+7lWCVi7SoN+cJq1dawvIDQY7TI3SixamztotM6R6Q==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -3309,9 +3157,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -3330,11 +3175,11 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} @@ -3342,8 +3187,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} @@ -3412,23 +3257,19 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - synckit@0.6.2: - resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} - engines: {node: '>=12.20'} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} temp-dir@3.0.0: @@ -3500,8 +3341,8 @@ packages: peerDependencies: typescript: '>=4.0.0' - tsdown@0.14.1: - resolution: {integrity: sha512-/nBuFDKZeYln9hAxwWG5Cm55/823sNIVI693iVi0xRFHzf9OVUq4b/lx9PH1TErFr/IQ0kd2hutFbJIPM0XQWA==} + tsdown@0.14.2: + resolution: {integrity: sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -3533,8 +3374,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.18.1: - resolution: {integrity: sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} type-is@1.6.18: @@ -3565,11 +3406,11 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -3577,8 +3418,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unconfig@7.3.2: - resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} @@ -3628,59 +3469,19 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@7.1.1: - resolution: {integrity: sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - 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 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.1.2: - resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} + vite@7.1.4: + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3728,12 +3529,12 @@ packages: vitepress-plugin-llms@1.7.3: resolution: {integrity: sha512-XhTVbUrKwrzrwlRKd/zT2owvjwi5cdB21HgDRcHqp9PYK4Fy+mBYJUoTcLaJ5IKD1DDrJZMo0DuJeyC5RSDI9Q==} - vitepress@2.0.0-alpha.10: - resolution: {integrity: sha512-RqnglVOngEHB74pv4Ho/RqOPhqaxN8KBvZkdKFj2hfvrG30QXhQQ/5qk31uuTVuCG+2qXj/c4kpHCPEJKGQMDw==} + vitepress@2.0.0-alpha.12: + resolution: {integrity: sha512-yZwCwRRepcpN5QeAhwSnEJxS3I6zJcVixqL1dnm6km4cnriLpQyy2sXQDsE5Ti3pxGPbhU51nTMwI+XC1KNnJg==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 - oxc-minify: ^0.81.0 + oxc-minify: ^0.82.1 postcss: ^8 peerDependenciesMeta: markdown-it-mathjax3: @@ -3777,8 +3578,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - vue@3.5.18: - resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} + vue@3.5.20: + resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3811,6 +3612,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -3841,11 +3646,6 @@ packages: resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -3868,8 +3668,6 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.3.0 @@ -3877,32 +3675,25 @@ snapshots: '@antfu/utils@9.2.0': {} - '@babel/code-frame@7.22.13': + '@babel/code-frame@7.27.1': dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/generator@7.28.0': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.3 '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/highlight@7.22.20': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - chalk: 2.4.2 - js-tokens: 4.0.0 - - '@babel/parser@7.28.0': + '@babel/parser@7.28.3': dependencies: '@babel/types': 7.28.2 @@ -3911,30 +3702,30 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@conventional-changelog/git-client@1.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0)': + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': dependencies: - '@types/semver': 7.5.8 - semver: 7.7.1 + '@types/semver': 7.7.0 + semver: 7.7.2 optionalDependencies: - conventional-commits-filter: 4.0.0 - conventional-commits-parser: 6.0.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.0 - '@docsearch/css@4.0.0-beta.6': {} + '@docsearch/css@4.0.0-beta.8': {} - '@docsearch/js@4.0.0-beta.6': {} + '@docsearch/js@4.0.0-beta.8': {} - '@emnapi/core@1.4.5': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true @@ -3942,191 +3733,113 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/types': 8.41.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@es-joy/jsdoccomment@0.52.0': + '@es-joy/jsdoccomment@0.53.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/types': 8.41.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 - - '@esbuild/aix-ppc64@0.25.8': - optional: true + jsdoc-type-pratt-parser: 4.8.0 '@esbuild/aix-ppc64@0.25.9': optional: true - '@esbuild/android-arm64@0.25.8': - optional: true - '@esbuild/android-arm64@0.25.9': optional: true - '@esbuild/android-arm@0.25.8': - optional: true - '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/android-x64@0.25.8': - optional: true - '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/darwin-arm64@0.25.8': - optional: true - '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/darwin-x64@0.25.8': - optional: true - '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/freebsd-arm64@0.25.8': - optional: true - '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/freebsd-x64@0.25.8': - optional: true - '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/linux-arm64@0.25.8': - optional: true - '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/linux-arm@0.25.8': - optional: true - '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/linux-ia32@0.25.8': - optional: true - '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/linux-loong64@0.25.8': - optional: true - '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/linux-mips64el@0.25.8': - optional: true - '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/linux-ppc64@0.25.8': - optional: true - '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.25.8': - optional: true - '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/linux-s390x@0.25.8': - optional: true - '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/linux-x64@0.25.8': - optional: true - '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.8': - optional: true - '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/netbsd-x64@0.25.8': - optional: true - '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.25.8': - optional: true - '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.25.8': - optional: true - '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.25.8': - optional: true - '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/sunos-x64@0.25.8': - optional: true - '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-arm64@0.25.8': - optional: true - '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-ia32@0.25.8': - optional: true - '@esbuild/win32-ia32@0.25.9': optional: true - '@esbuild/win32-x64@0.25.8': - optional: true - '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.33.0(jiti@2.5.1))': + '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.34.0(jiti@2.5.1))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) ignore: 5.3.2 - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.5.1))': dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.6(eslint@9.33.0(jiti@2.5.1))': + '@eslint/compat@1.3.2(eslint@9.34.0(jiti@2.5.1))': optionalDependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) '@eslint/config-array@0.21.0': dependencies: @@ -4149,16 +3862,16 @@ snapshots: espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.33.0': {} + '@eslint/js@9.34.0': {} - '@eslint/markdown@7.1.0': + '@eslint/markdown@7.2.0': dependencies: '@eslint/core': 0.15.2 '@eslint/plugin-kit': 0.3.5 @@ -4168,6 +3881,7 @@ snapshots: mdast-util-gfm: 3.1.0 micromark-extension-frontmatter: 2.0.0 micromark-extension-gfm: 3.0.0 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color @@ -4191,25 +3905,25 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@hutson/parse-repository-url@5.0.0': {} - '@iconify-json/logos@1.2.4': + '@iconify-json/logos@1.2.9': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.47': + '@iconify-json/simple-icons@1.2.50': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.29': + '@iconify-json/vscode-icons@1.2.30': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.0.0': + '@iconify/utils@3.0.1': dependencies: '@antfu/install-pkg': 1.1.0 '@antfu/utils': 9.2.0 @@ -4217,8 +3931,8 @@ snapshots: debug: 4.4.1 globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.1.1 - mlly: 1.7.4 + local-pkg: 1.1.2 + mlly: 1.8.0 transitivePeerDependencies: - supports-color @@ -4228,24 +3942,24 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@napi-rs/wasm-runtime@1.0.3': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.0 optional: true @@ -4261,48 +3975,48 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.19.1 - '@oxc-project/runtime@0.81.0': {} + '@oxc-project/runtime@0.82.3': {} - '@oxc-project/types@0.81.0': {} + '@oxc-project/types@0.82.3': {} '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.8.0 - '@pengzhanbo/eslint-config@1.36.0(eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1))': + '@pengzhanbo/eslint-config@1.37.0(eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: '@antfu/install-pkg': 1.1.0 - '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.33.0(jiti@2.5.1)) - '@eslint/markdown': 7.1.0 - '@stylistic/eslint-plugin': 5.2.3(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@vitest/eslint-plugin': 1.3.4(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1)) - eslint: 9.33.0(jiti@2.5.1) - eslint-config-flat-gitignore: 2.1.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.34.0(jiti@2.5.1)) + '@eslint/markdown': 7.2.0 + '@stylistic/eslint-plugin': 5.3.1(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@vitest/eslint-plugin': 1.3.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) + eslint: 9.34.0(jiti@2.5.1) + eslint-config-flat-gitignore: 2.1.0(eslint@9.34.0(jiti@2.5.1)) eslint-flat-config-utils: 2.1.1 - eslint-merge-processors: 2.0.0(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-antfu: 3.1.1(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-command: 3.3.1(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-import-lite: 0.3.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-jsdoc: 53.0.1(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-jsonc: 2.20.1(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-n: 17.21.3(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + eslint-merge-processors: 2.0.0(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-antfu: 3.1.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-command: 3.3.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-import-lite: 0.3.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-jsdoc: 54.1.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-jsonc: 2.20.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-n: 17.21.3(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-pnpm: 1.1.0(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-regexp: 2.10.0(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-toml: 0.12.0(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-unicorn: 60.0.0(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-vuejs-accessibility: 2.4.1(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-yml: 1.18.0(eslint@9.33.0(jiti@2.5.1)) + eslint-plugin-perfectionist: 4.15.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-pnpm: 1.1.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-regexp: 2.10.0(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-toml: 0.12.0(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-unicorn: 60.0.0(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-unused-imports: 4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-vuejs-accessibility: 2.4.1(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-yml: 1.18.0(eslint@9.34.0(jiti@2.5.1)) globals: 16.3.0 jsonc-eslint-parser: 2.4.0 - local-pkg: 1.1.1 + local-pkg: 1.1.2 parse-gitignore: 2.0.0 toml-eslint-parser: 0.10.0 yaml-eslint-parser: 1.3.0 @@ -4314,169 +4028,166 @@ snapshots: '@pengzhanbo/utils@2.1.0': {} - '@quansync/fs@0.1.3': + '@pkgr/core@0.2.9': {} + + '@quansync/fs@0.1.5': dependencies: - quansync: 0.2.10 + quansync: 0.2.11 - '@rolldown/binding-android-arm64@1.0.0-beta.32': + '@rolldown/binding-android-arm64@1.0.0-beta.34': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.32': + '@rolldown/binding-darwin-arm64@1.0.0-beta.34': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.32': + '@rolldown/binding-darwin-x64@1.0.0-beta.34': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.32': + '@rolldown/binding-freebsd-x64@1.0.0-beta.34': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': dependencies: '@napi-rs/wasm-runtime': 1.0.3 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': optional: true '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rolldown/pluginutils@1.0.0-beta.32': {} + '@rolldown/pluginutils@1.0.0-beta.34': {} - '@rollup/pluginutils@5.2.0(rollup@4.44.2)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.44.2 + '@rollup/rollup-android-arm-eabi@4.50.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.44.2': + '@rollup/rollup-android-arm64@4.50.0': optional: true - '@rollup/rollup-android-arm64@4.44.2': + '@rollup/rollup-darwin-arm64@4.50.0': optional: true - '@rollup/rollup-darwin-arm64@4.44.2': + '@rollup/rollup-darwin-x64@4.50.0': optional: true - '@rollup/rollup-darwin-x64@4.44.2': + '@rollup/rollup-freebsd-arm64@4.50.0': optional: true - '@rollup/rollup-freebsd-arm64@4.44.2': + '@rollup/rollup-freebsd-x64@4.50.0': optional: true - '@rollup/rollup-freebsd-x64@4.44.2': + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + '@rollup/rollup-linux-arm-musleabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.44.2': + '@rollup/rollup-linux-arm64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.44.2': + '@rollup/rollup-linux-arm64-musl@4.50.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.44.2': + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + '@rollup/rollup-linux-ppc64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + '@rollup/rollup-linux-riscv64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.44.2': + '@rollup/rollup-linux-riscv64-musl@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.44.2': + '@rollup/rollup-linux-s390x-gnu@4.50.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.44.2': + '@rollup/rollup-linux-x64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.44.2': + '@rollup/rollup-linux-x64-musl@4.50.0': optional: true - '@rollup/rollup-linux-x64-musl@4.44.2': + '@rollup/rollup-openharmony-arm64@4.50.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.44.2': + '@rollup/rollup-win32-arm64-msvc@4.50.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.44.2': + '@rollup/rollup-win32-ia32-msvc@4.50.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.44.2': + '@rollup/rollup-win32-x64-msvc@4.50.0': optional: true - '@shikijs/core@3.9.2': + '@shikijs/core@3.12.1': dependencies: - '@shikijs/types': 3.9.2 + '@shikijs/types': 3.12.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.9.2': + '@shikijs/engine-javascript@3.12.1': dependencies: - '@shikijs/types': 3.9.2 + '@shikijs/types': 3.12.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.9.2': + '@shikijs/engine-oniguruma@3.12.1': dependencies: - '@shikijs/types': 3.9.2 + '@shikijs/types': 3.12.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.9.2': + '@shikijs/langs@3.12.1': dependencies: - '@shikijs/types': 3.9.2 + '@shikijs/types': 3.12.1 - '@shikijs/themes@3.9.2': + '@shikijs/themes@3.12.1': dependencies: - '@shikijs/types': 3.9.2 + '@shikijs/types': 3.12.1 - '@shikijs/transformers@3.9.2': + '@shikijs/transformers@3.12.1': dependencies: - '@shikijs/core': 3.9.2 - '@shikijs/types': 3.9.2 + '@shikijs/core': 3.12.1 + '@shikijs/types': 3.12.1 - '@shikijs/types@3.9.2': + '@shikijs/types@3.12.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.2.3(eslint@9.33.0(jiti@2.5.1))': + '@stylistic/eslint-plugin@5.3.1(eslint@9.34.0(jiti@2.5.1))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.39.1 - eslint: 9.33.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/types': 8.41.0 + eslint: 9.34.0(jiti@2.5.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -4487,10 +4198,10 @@ snapshots: tslib: 2.8.1 optional: true - '@types/body-parser@1.19.2': + '@types/body-parser@1.19.6': dependencies: - '@types/connect': 3.4.35 - '@types/node': 24.2.1 + '@types/connect': 3.4.38 + '@types/node': 24.3.0 '@types/chai@5.2.2': dependencies: @@ -4498,60 +4209,60 @@ snapshots: '@types/co-body@6.1.3': dependencies: - '@types/node': 24.2.1 - '@types/qs': 6.9.7 + '@types/node': 24.3.0 + '@types/qs': 6.14.0 - '@types/connect@3.4.35': + '@types/connect@3.4.38': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/cookies@0.9.1': dependencies: - '@types/connect': 3.4.35 - '@types/express': 4.17.17 - '@types/keygrip': 1.0.2 - '@types/node': 24.2.1 + '@types/connect': 3.4.38 + '@types/express': 5.0.3 + '@types/keygrip': 1.0.6 + '@types/node': 24.3.0 '@types/cors@2.8.19': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.31 + '@types/ms': 2.1.0 '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.6': {} - '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.17.33': + '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 24.2.1 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 + '@types/node': 24.3.0 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 - '@types/express@4.17.17': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.33 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.0.7 + '@types/serve-static': 1.15.8 '@types/formidable@3.4.5': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.5': {} '@types/is-core-module@2.2.2': {} '@types/json-schema@7.0.15': {} - '@types/keygrip@1.0.2': {} + '@types/keygrip@1.0.6': {} '@types/linkify-it@5.0.0': {} @@ -4562,52 +4273,60 @@ snapshots: '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/mdurl@2.0.0': {} '@types/mime-types@3.0.1': {} - '@types/mime@3.0.1': {} + '@types/mime@1.3.5': {} '@types/mockjs@1.0.10': {} - '@types/ms@0.7.31': {} + '@types/ms@2.1.0': {} - '@types/node@24.2.1': + '@types/node@24.3.0': dependencies: undici-types: 7.10.0 '@types/normalize-package-data@2.4.4': {} - '@types/qs@6.9.7': {} + '@types/picomatch@4.0.2': {} - '@types/range-parser@1.2.4': {} + '@types/qs@6.14.0': {} - '@types/semver@7.5.8': {} + '@types/range-parser@1.2.7': {} - '@types/serve-static@1.15.1': + '@types/semver@7.7.0': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.3.0 + + '@types/serve-static@1.15.8': dependencies: - '@types/mime': 3.0.1 - '@types/node': 24.2.1 + '@types/http-errors': 2.0.5 + '@types/node': 24.3.0 + '@types/send': 0.17.5 - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} '@types/ws@8.18.1': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 - '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.1 - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 + eslint: 9.34.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4616,92 +4335,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.34.1(typescript@5.9.2)': + '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.9.2) - '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1 + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.34.1': - dependencies: - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/visitor-keys': 8.34.1 - - '@typescript-eslint/scope-manager@8.39.1': - dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 - - '@typescript-eslint/tsconfig-utils@8.34.1(typescript@5.9.2)': + '@typescript-eslint/scope-manager@8.41.0': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 - '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.34.1': {} - - '@typescript-eslint/types@8.39.1': {} - - '@typescript-eslint/typescript-estree@8.34.1(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.34.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.9.2) - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/visitor-keys': 8.34.1 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.41.0': {} - '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4712,53 +4395,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.34.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.34.1': - dependencies: - '@typescript-eslint/types': 8.34.1 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.39.1': + '@typescript-eslint/visitor-keys@8.41.0': dependencies: - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/types': 8.41.0 eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@6.0.1(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))(vue@3.5.20(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) - vue: 3.5.18(typescript@5.9.2) + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) + vue: 3.5.20(typescript@5.9.2) - '@vitest/eslint-plugin@1.3.4(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1))': + '@vitest/eslint-plugin@1.3.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: - '@typescript-eslint/utils': 8.34.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) optionalDependencies: typescript: 5.9.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -4767,16 +4435,16 @@ snapshots: '@types/chai': 5.2.2 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.0 + chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.18 optionalDependencies: - vite: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -4791,7 +4459,7 @@ snapshots: '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 '@vitest/spy@3.2.4': @@ -4801,46 +4469,46 @@ snapshots: '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vue/compiler-core@3.5.18': + '@vue/compiler-core@3.5.20': dependencies: - '@babel/parser': 7.28.0 - '@vue/shared': 3.5.18 + '@babel/parser': 7.28.3 + '@vue/shared': 3.5.20 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.18': + '@vue/compiler-dom@3.5.20': dependencies: - '@vue/compiler-core': 3.5.18 - '@vue/shared': 3.5.18 + '@vue/compiler-core': 3.5.20 + '@vue/shared': 3.5.20 - '@vue/compiler-sfc@3.5.18': + '@vue/compiler-sfc@3.5.20': dependencies: - '@babel/parser': 7.28.0 - '@vue/compiler-core': 3.5.18 - '@vue/compiler-dom': 3.5.18 - '@vue/compiler-ssr': 3.5.18 - '@vue/shared': 3.5.18 + '@babel/parser': 7.28.3 + '@vue/compiler-core': 3.5.20 + '@vue/compiler-dom': 3.5.20 + '@vue/compiler-ssr': 3.5.20 + '@vue/shared': 3.5.20 estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.18 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.18': + '@vue/compiler-ssr@3.5.20': dependencies: - '@vue/compiler-dom': 3.5.18 - '@vue/shared': 3.5.18 + '@vue/compiler-dom': 3.5.20 + '@vue/shared': 3.5.20 - '@vue/devtools-api@8.0.0': + '@vue/devtools-api@8.0.1': dependencies: - '@vue/devtools-kit': 8.0.0 + '@vue/devtools-kit': 8.0.1 - '@vue/devtools-kit@8.0.0': + '@vue/devtools-kit@8.0.1': dependencies: - '@vue/devtools-shared': 8.0.0 + '@vue/devtools-shared': 8.0.1 birpc: 2.5.0 hookable: 5.5.3 mitt: 3.0.1 @@ -4848,55 +4516,55 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-shared@8.0.0': + '@vue/devtools-shared@8.0.1': dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.18': + '@vue/reactivity@3.5.20': dependencies: - '@vue/shared': 3.5.18 + '@vue/shared': 3.5.20 - '@vue/runtime-core@3.5.18': + '@vue/runtime-core@3.5.20': dependencies: - '@vue/reactivity': 3.5.18 - '@vue/shared': 3.5.18 + '@vue/reactivity': 3.5.20 + '@vue/shared': 3.5.20 - '@vue/runtime-dom@3.5.18': + '@vue/runtime-dom@3.5.20': dependencies: - '@vue/reactivity': 3.5.18 - '@vue/runtime-core': 3.5.18 - '@vue/shared': 3.5.18 + '@vue/reactivity': 3.5.20 + '@vue/runtime-core': 3.5.20 + '@vue/shared': 3.5.20 csstype: 3.1.3 - '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))': + '@vue/server-renderer@3.5.20(vue@3.5.20(typescript@5.9.2))': dependencies: - '@vue/compiler-ssr': 3.5.18 - '@vue/shared': 3.5.18 - vue: 3.5.18(typescript@5.9.2) + '@vue/compiler-ssr': 3.5.20 + '@vue/shared': 3.5.20 + vue: 3.5.20(typescript@5.9.2) - '@vue/shared@3.5.18': {} + '@vue/shared@3.5.20': {} - '@vueuse/core@13.6.0(vue@3.5.18(typescript@5.9.2))': + '@vueuse/core@13.9.0(vue@3.5.20(typescript@5.9.2))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 13.6.0 - '@vueuse/shared': 13.6.0(vue@3.5.18(typescript@5.9.2)) - vue: 3.5.18(typescript@5.9.2) + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.20(typescript@5.9.2)) + vue: 3.5.20(typescript@5.9.2) - '@vueuse/integrations@13.6.0(change-case@5.4.4)(focus-trap@7.6.5)(vue@3.5.18(typescript@5.9.2))': + '@vueuse/integrations@13.9.0(change-case@5.4.4)(focus-trap@7.6.5)(vue@3.5.20(typescript@5.9.2))': dependencies: - '@vueuse/core': 13.6.0(vue@3.5.18(typescript@5.9.2)) - '@vueuse/shared': 13.6.0(vue@3.5.18(typescript@5.9.2)) - vue: 3.5.18(typescript@5.9.2) + '@vueuse/core': 13.9.0(vue@3.5.20(typescript@5.9.2)) + '@vueuse/shared': 13.9.0(vue@3.5.20(typescript@5.9.2)) + vue: 3.5.20(typescript@5.9.2) optionalDependencies: change-case: 5.4.4 focus-trap: 7.6.5 - '@vueuse/metadata@13.6.0': {} + '@vueuse/metadata@13.9.0': {} - '@vueuse/shared@13.6.0(vue@3.5.18(typescript@5.9.2))': + '@vueuse/shared@13.9.0(vue@3.5.20(typescript@5.9.2))': dependencies: - vue: 3.5.18(typescript@5.9.2) + vue: 3.5.20(typescript@5.9.2) acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -4915,21 +4583,12 @@ snapshots: ansi-regex@5.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansis@4.1.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - are-docs-informative@0.0.2: {} argparse@1.0.10: @@ -4988,9 +4647,9 @@ snapshots: assertion-error@2.0.1: {} - ast-kit@2.1.1: + ast-kit@2.1.2: dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.3 pathe: 2.0.3 ast-types-flow@0.0.8: {} @@ -5009,16 +4668,14 @@ snapshots: balanced-match@1.0.2: {} - binary-extensions@2.2.0: {} - birpc@2.5.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -5026,12 +4683,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.2: + browserslist@4.25.4: dependencies: - caniuse-lite: 1.0.30001734 - electron-to-chromium: 1.5.200 + caniuse-lite: 1.0.30001739 + electron-to-chromium: 1.5.211 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.2) + update-browserslist-db: 1.1.3(browserslist@4.25.4) builtin-modules@5.0.0: {} @@ -5067,7 +4724,7 @@ snapshots: ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 rc9: 2.1.2 cac@6.7.14: {} @@ -5077,11 +4734,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.2: - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.0 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5096,23 +4748,17 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001734: {} + caniuse-lite@1.0.30001739: {} ccount@2.0.1: {} - chai@5.2.0: + chai@5.3.3: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + loupe: 3.2.1 + pathval: 2.0.1 chalk@4.1.2: dependencies: @@ -5129,27 +4775,15 @@ snapshots: check-error@2.1.1: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.3: dependencies: - readdirp: 4.0.2 + readdirp: 4.1.2 ci-info@4.3.0: {} citty@0.1.6: dependencies: - consola: 3.4.0 + consola: 3.4.2 clean-regexp@1.0.0: dependencies: @@ -5164,26 +4798,20 @@ snapshots: co-body@6.2.0: dependencies: '@hapi/bourne': 3.0.0 - inflation: 2.0.0 - qs: 6.11.0 - raw-body: 2.5.1 + inflation: 2.1.0 + qs: 6.14.0 + raw-body: 2.5.2 type-is: 1.6.18 - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} comma-separated-tokens@2.0.3: {} - commander@10.0.0: {} + commander@14.0.0: {} comment-parser@1.4.1: {} @@ -5198,7 +4826,7 @@ snapshots: confbox@0.2.2: {} - consola@3.4.0: {} + consola@3.4.2: {} conventional-changelog-angular@8.0.0: dependencies: @@ -5206,10 +4834,10 @@ snapshots: conventional-changelog-atom@5.0.0: {} - conventional-changelog-cli@5.0.0(conventional-commits-filter@4.0.0): + conventional-changelog-cli@5.0.0(conventional-commits-filter@5.0.0): dependencies: add-stream: 1.0.0 - conventional-changelog: 6.0.0(conventional-commits-filter@4.0.0) + conventional-changelog: 6.0.0(conventional-commits-filter@5.0.0) meow: 13.2.0 tempfile: 5.0.0 transitivePeerDependencies: @@ -5221,16 +4849,16 @@ snapshots: dependencies: compare-func: 2.0.0 - conventional-changelog-core@8.0.0(conventional-commits-filter@4.0.0): + conventional-changelog-core@8.0.0(conventional-commits-filter@5.0.0): dependencies: '@hutson/parse-repository-url': 5.0.0 add-stream: 1.0.0 - conventional-changelog-writer: 8.0.0 - conventional-commits-parser: 6.0.0 - git-raw-commits: 5.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0) - git-semver-tags: 8.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0) - hosted-git-info: 7.0.1 - normalize-package-data: 6.0.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.0 + git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + hosted-git-info: 7.0.2 + normalize-package-data: 6.0.2 read-package-up: 11.0.0 read-pkg: 9.0.1 transitivePeerDependencies: @@ -5250,21 +4878,20 @@ snapshots: conventional-changelog-preset-loader@5.0.0: {} - conventional-changelog-writer@8.0.0: + conventional-changelog-writer@8.2.0: dependencies: - '@types/semver': 7.5.8 conventional-commits-filter: 5.0.0 - handlebars: 4.7.7 + handlebars: 4.7.8 meow: 13.2.0 - semver: 7.7.1 + semver: 7.7.2 - conventional-changelog@6.0.0(conventional-commits-filter@4.0.0): + conventional-changelog@6.0.0(conventional-commits-filter@5.0.0): dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-atom: 5.0.0 conventional-changelog-codemirror: 5.0.0 conventional-changelog-conventionalcommits: 8.0.0 - conventional-changelog-core: 8.0.0(conventional-commits-filter@4.0.0) + conventional-changelog-core: 8.0.0(conventional-commits-filter@5.0.0) conventional-changelog-ember: 5.0.0 conventional-changelog-eslint: 6.0.0 conventional-changelog-express: 5.0.0 @@ -5274,12 +4901,9 @@ snapshots: transitivePeerDependencies: - conventional-commits-filter - conventional-commits-filter@4.0.0: - optional: true - conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.0.0: + conventional-commits-parser@6.2.0: dependencies: meow: 13.2.0 @@ -5292,9 +4916,9 @@ snapshots: dependencies: is-what: 4.1.16 - core-js-compat@3.45.0: + core-js-compat@3.45.1: dependencies: - browserslist: 4.25.2 + browserslist: 4.25.4 cors@2.8.5: dependencies: @@ -5333,7 +4957,7 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -5359,7 +4983,9 @@ snapshots: dequal@2.0.3: {} - destr@2.0.3: {} + destr@2.0.5: {} + + detect-libc@2.0.4: {} devlop@1.1.0: dependencies: @@ -5378,7 +5004,7 @@ snapshots: dotenv@17.2.1: {} - dts-resolver@2.1.1: {} + dts-resolver@2.1.2: {} dunder-proto@1.0.1: dependencies: @@ -5386,9 +5012,9 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.200: {} + electron-to-chromium@1.5.211: {} - emoji-regex@10.4.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -5396,10 +5022,10 @@ snapshots: empathic@2.0.0: {} - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.3 entities@4.5.0: {} @@ -5487,35 +5113,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.8: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 - esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 @@ -5553,67 +5150,67 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.33.0(jiti@2.5.1)): + eslint-compat-utils@0.5.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) semver: 7.7.2 - eslint-compat-utils@0.6.5(eslint@9.33.0(jiti@2.5.1)): + eslint-compat-utils@0.6.5(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) semver: 7.7.2 - eslint-config-flat-gitignore@2.1.0(eslint@9.33.0(jiti@2.5.1)): + eslint-config-flat-gitignore@2.1.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@eslint/compat': 1.2.6(eslint@9.33.0(jiti@2.5.1)) - eslint: 9.33.0(jiti@2.5.1) + '@eslint/compat': 1.3.2(eslint@9.34.0(jiti@2.5.1)) + eslint: 9.34.0(jiti@2.5.1) eslint-flat-config-utils@2.1.1: dependencies: pathe: 2.0.3 - eslint-json-compat-utils@0.2.1(eslint@9.33.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0): + eslint-json-compat-utils@0.2.1(eslint@9.34.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) esquery: 1.6.0 jsonc-eslint-parser: 2.4.0 - eslint-merge-processors@2.0.0(eslint@9.33.0(jiti@2.5.1)): + eslint-merge-processors@2.0.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-antfu@3.1.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-antfu@3.1.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-command@3.3.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-command@3.3.1(eslint@9.34.0(jiti@2.5.1)): dependencies: '@es-joy/jsdoccomment': 0.50.2 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-es-x@7.8.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-es-x@7.8.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.33.0(jiti@2.5.1) - eslint-compat-utils: 0.5.1(eslint@9.33.0(jiti@2.5.1)) + eslint: 9.34.0(jiti@2.5.1) + eslint-compat-utils: 0.5.1(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-import-lite@0.3.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-import-lite@0.3.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.34.1 - eslint: 9.33.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/types': 8.41.0 + eslint: 9.34.0(jiti@2.5.1) optionalDependencies: typescript: 5.9.2 - eslint-plugin-jsdoc@53.0.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-jsdoc@54.1.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@es-joy/jsdoccomment': 0.52.0 + '@es-joy/jsdoccomment': 0.53.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) espree: 10.4.0 esquery: 1.6.0 parse-imports-exports: 0.2.4 @@ -5622,21 +5219,21 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.20.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-jsonc@2.20.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - eslint: 9.33.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.33.0(jiti@2.5.1)) - eslint-json-compat-utils: 0.2.1(eslint@9.33.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + eslint: 9.34.0(jiti@2.5.1) + eslint-compat-utils: 0.6.5(eslint@9.34.0(jiti@2.5.1)) + eslint-json-compat-utils: 0.2.1(eslint@9.34.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0) espree: 10.4.0 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 - synckit: 0.6.2 + synckit: 0.11.11 transitivePeerDependencies: - '@eslint/json' - eslint-plugin-jsx-a11y@6.10.2(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.34.0(jiti@2.5.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -5646,7 +5243,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -5655,12 +5252,12 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-n@17.21.3(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-n@17.21.3(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - enhanced-resolve: 5.17.1 - eslint: 9.33.0(jiti@2.5.1) - eslint-plugin-es-x: 7.8.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + enhanced-resolve: 5.18.3 + eslint: 9.34.0(jiti@2.5.1) + eslint-plugin-es-x: 7.8.0(eslint@9.34.0(jiti@2.5.1)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -5672,57 +5269,57 @@ snapshots: eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@4.15.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-perfectionist@4.15.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/utils': 8.34.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-pnpm@1.1.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-pnpm@1.1.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) - find-up-simple: 1.0.1 + empathic: 2.0.0 + eslint: 9.34.0(jiti@2.5.1) jsonc-eslint-parser: 2.4.0 pathe: 2.0.3 - pnpm-workspace-yaml: 1.1.0 + pnpm-workspace-yaml: 1.1.1 tinyglobby: 0.2.14 yaml-eslint-parser: 1.3.0 - eslint-plugin-regexp@2.10.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-regexp@2.10.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.33.0(jiti@2.5.1) - jsdoc-type-pratt-parser: 4.1.0 + eslint: 9.34.0(jiti@2.5.1) + jsdoc-type-pratt-parser: 4.8.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-toml@0.12.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-toml@0.12.0(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.33.0(jiti@2.5.1)) + eslint: 9.34.0(jiti@2.5.1) + eslint-compat-utils: 0.6.5(eslint@9.34.0(jiti@2.5.1)) lodash: 4.17.21 toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@60.0.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-unicorn@60.0.0(eslint@9.34.0(jiti@2.5.1)): dependencies: '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint/plugin-kit': 0.3.5 change-case: 5.4.4 ci-info: 4.3.0 clean-regexp: 1.0.0 - core-js-compat: 3.45.0 - eslint: 9.33.0(jiti@2.5.1) + core-js-compat: 3.45.1 + eslint: 9.34.0(jiti@2.5.1) esquery: 1.6.0 find-up-simple: 1.0.1 globals: 16.3.0 @@ -5735,27 +5332,27 @@ snapshots: semver: 7.7.2 strip-indent: 4.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.34.0(jiti@2.5.1)): dependencies: aria-query: 5.3.2 - emoji-regex: 10.4.0 - eslint: 9.33.0(jiti@2.5.1) - vue-eslint-parser: 9.4.3(eslint@9.33.0(jiti@2.5.1)) + emoji-regex: 10.5.0 + eslint: 9.34.0(jiti@2.5.1) + vue-eslint-parser: 9.4.3(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.18.0(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-yml@1.18.0(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint: 9.33.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.33.0(jiti@2.5.1)) + eslint: 9.34.0(jiti@2.5.1) + eslint-compat-utils: 0.6.5(eslint@9.34.0(jiti@2.5.1)) natural-compare: 1.4.0 yaml-eslint-parser: 1.3.0 transitivePeerDependencies: @@ -5775,19 +5372,19 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.5.1): + eslint@9.34.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.33.0 + '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 + '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -5811,7 +5408,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 optionalDependencies: jiti: 2.5.1 transitivePeerDependencies: @@ -5845,11 +5442,11 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} - expect-type@1.2.1: {} + expect-type@1.2.2: {} exsolve@1.0.7: {} @@ -5873,15 +5470,15 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.15.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fault@2.0.1: dependencies: format: 0.2.2 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -5902,10 +5499,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.3: {} focus-trap@7.6.5: dependencies: @@ -5941,12 +5538,6 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.0: - dependencies: - function-bind: 1.1.2 - has: 1.0.3 - has-symbols: 1.0.3 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5978,23 +5569,23 @@ snapshots: giget@2.0.0: dependencies: citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.6.0 + node-fetch-native: 1.6.7 + nypm: 0.6.1 pathe: 2.0.3 - git-raw-commits@5.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0): + git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): dependencies: - '@conventional-changelog/git-client': 1.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) meow: 13.2.0 transitivePeerDependencies: - conventional-commits-filter - conventional-commits-parser - git-semver-tags@8.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0): + git-semver-tags@8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): dependencies: - '@conventional-changelog/git-client': 1.0.0(conventional-commits-filter@4.0.0)(conventional-commits-parser@6.0.0) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) meow: 13.2.0 transitivePeerDependencies: - conventional-commits-filter @@ -6036,19 +5627,17 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - handlebars@4.7.7: + handlebars@4.7.8: dependencies: - minimist: 1.2.7 + minimist: 1.2.8 neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 has-bigints@1.1.0: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -6059,17 +5648,11 @@ snapshots: dependencies: dunder-proto: 1.0.1 - has-symbols@1.0.3: {} - has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 - - has@1.0.3: - dependencies: - function-bind: 1.1.2 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -6078,7 +5661,7 @@ snapshots: hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 @@ -6095,7 +5678,7 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@7.0.1: + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -6119,7 +5702,7 @@ snapshots: ignore@7.0.5: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -6128,9 +5711,9 @@ snapshots: indent-string@5.0.0: {} - index-to-position@0.1.2: {} + index-to-position@1.1.0: {} - inflation@2.0.0: {} + inflation@2.1.0: {} inherits@2.0.4: {} @@ -6158,10 +5741,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -6286,6 +5865,8 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} + jsdoc-type-pratt-parser@4.8.0: {} + jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -6337,15 +5918,60 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - local-pkg@1.1.1: + local-pkg@1.1.2: dependencies: - mlly: 1.7.4 - pkg-types: 2.2.0 - quansync: 0.2.10 + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 locate-path@6.0.0: dependencies: @@ -6357,15 +5983,13 @@ snapshots: longest-streak@3.1.0: {} - loupe@3.1.3: {} - - loupe@3.1.4: {} + loupe@3.2.1: {} lru-cache@10.4.3: {} - magic-string@0.30.17: + magic-string@0.30.18: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 mark.js@8.11.1: {} @@ -6378,13 +6002,13 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - markdown-table@3.0.3: {} + markdown-table@3.0.4: {} markdown-title@1.0.2: {} math-intrinsics@1.1.0: {} - mdast-util-find-and-replace@3.0.1: + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 @@ -6394,16 +6018,16 @@ snapshots: mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -6414,7 +6038,7 @@ snapshots: devlop: 1.1.0 escape-string-regexp: 5.0.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color @@ -6424,16 +6048,16 @@ snapshots: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.1.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color @@ -6441,7 +6065,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -6449,9 +6073,9 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - markdown-table: 3.0.3 + markdown-table: 3.0.4 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -6460,7 +6084,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -6468,11 +6092,11 @@ snapshots: dependencies: mdast-util-from-markdown: 2.0.2 mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -6485,22 +6109,23 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -6516,201 +6141,201 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-strikethrough@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-table@2.1.0: + micromark-extension-gfm-table@2.1.1: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.1.0 micromark-extension-gfm-footnote: 2.1.0 micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-table: 2.1.1 micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-destination@2.0.0: + micromark-factory-destination@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-label@2.0.0: + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-space@2.0.0: + micromark-factory-space@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - micromark-factory-title@2.0.0: + micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-whitespace@2.0.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-character@2.1.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-chunked@2.0.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-classify-character@2.0.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-combine-extensions@2.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-decode-numeric-character-reference@2.0.1: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: + micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.2: {} - micromark@4.0.0: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.1 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -6743,28 +6368,28 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 - minimist@1.2.7: {} + minimist@1.2.8: {} minisearch@7.1.2: {} mitt@3.0.1: {} - mlly@1.7.4: + mlly@1.8.0: dependencies: acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 mockjs@1.1.0: dependencies: - commander: 10.0.0 + commander: 14.0.0 ms@2.1.3: {} @@ -6776,31 +6401,26 @@ snapshots: neo-async@2.6.2: {} - node-fetch-native@1.6.6: {} + node-fetch-native@1.6.7: {} node-releases@2.0.19: {} - normalize-package-data@6.0.0: + normalize-package-data@6.0.2: dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.16.1 - semver: 7.7.1 + hosted-git-info: 7.0.2 + semver: 7.7.2 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - - nypm@0.6.0: + nypm@0.6.1: dependencies: citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 pathe: 2.0.3 - pkg-types: 2.2.0 - tinyexec: 0.3.2 + pkg-types: 2.3.0 + tinyexec: 1.0.1 object-assign@4.1.1: {} - object-inspect@1.12.3: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -6842,14 +6462,14 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 own-keys@1.0.1: dependencies: @@ -6877,11 +6497,11 @@ snapshots: dependencies: parse-statements: 1.0.11 - parse-json@8.1.0: + parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.22.13 - index-to-position: 0.1.2 - type-fest: 4.18.1 + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 parse-statements@1.0.11: {} @@ -6889,13 +6509,11 @@ snapshots: path-key@3.1.1: {} - path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} perfect-debounce@1.0.0: {} @@ -6903,17 +6521,15 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 - pkg-types@2.2.0: + pkg-types@2.3.0: dependencies: confbox: 0.2.2 exsolve: 1.0.7 @@ -6921,9 +6537,9 @@ snapshots: pluralize@8.0.0: {} - pnpm-workspace-yaml@1.1.0: + pnpm-workspace-yaml@1.1.1: dependencies: - yaml: 2.8.0 + yaml: 2.8.1 possible-typed-array-names@1.1.0: {} @@ -6939,17 +6555,17 @@ snapshots: punycode.js@2.3.1: {} - punycode@2.3.0: {} + punycode@2.3.1: {} - qs@6.11.0: + qs@6.14.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.1.0 - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} - raw-body@2.5.1: + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -6959,27 +6575,23 @@ snapshots: rc9@2.1.2: dependencies: defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 read-package-up@11.0.0: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.18.1 + type-fest: 4.41.0 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.0 - parse-json: 8.1.0 - type-fest: 4.18.1 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 unicorn-magic: 0.1.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.0.2: {} + readdirp@4.1.2: {} refa@0.12.1: dependencies: @@ -7039,7 +6651,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -7047,7 +6659,7 @@ snapshots: remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 unified: 11.0.5 remark@15.0.1: @@ -7065,73 +6677,89 @@ snapshots: resolve-pkg-maps@1.0.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} - rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2): + rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.34)(typescript@5.9.2): dependencies: - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 '@babel/types': 7.28.2 - ast-kit: 2.1.1 + ast-kit: 2.1.2 birpc: 2.5.0 debug: 4.4.1 - dts-resolver: 2.1.1 + dts-resolver: 2.1.2 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.32 + rolldown: 1.0.0-beta.34 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.32: + rolldown-vite@7.1.5(@types/node@24.3.0)(esbuild@0.25.9)(jiti@2.5.1)(yaml@2.8.1): + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.30.1 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.34 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.3.0 + esbuild: 0.25.9 + fsevents: 2.3.3 + jiti: 2.5.1 + yaml: 2.8.1 + + rolldown@1.0.0-beta.34: dependencies: - '@oxc-project/runtime': 0.81.0 - '@oxc-project/types': 0.81.0 - '@rolldown/pluginutils': 1.0.0-beta.32 + '@oxc-project/runtime': 0.82.3 + '@oxc-project/types': 0.82.3 + '@rolldown/pluginutils': 1.0.0-beta.34 ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.32 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.32 - '@rolldown/binding-darwin-x64': 1.0.0-beta.32 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.32 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.32 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.32 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.32 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.32 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.32 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.32 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.32 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.32 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.32 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.32 - - rollup@4.44.2: + '@rolldown/binding-android-arm64': 1.0.0-beta.34 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.34 + '@rolldown/binding-darwin-x64': 1.0.0-beta.34 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.34 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.34 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.34 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.34 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.34 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.34 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.34 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.34 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.34 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.34 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.34 + + rollup@4.50.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.2 - '@rollup/rollup-android-arm64': 4.44.2 - '@rollup/rollup-darwin-arm64': 4.44.2 - '@rollup/rollup-darwin-x64': 4.44.2 - '@rollup/rollup-freebsd-arm64': 4.44.2 - '@rollup/rollup-freebsd-x64': 4.44.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 - '@rollup/rollup-linux-arm-musleabihf': 4.44.2 - '@rollup/rollup-linux-arm64-gnu': 4.44.2 - '@rollup/rollup-linux-arm64-musl': 4.44.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-musl': 4.44.2 - '@rollup/rollup-linux-s390x-gnu': 4.44.2 - '@rollup/rollup-linux-x64-gnu': 4.44.2 - '@rollup/rollup-linux-x64-musl': 4.44.2 - '@rollup/rollup-win32-arm64-msvc': 4.44.2 - '@rollup/rollup-win32-ia32-msvc': 4.44.2 - '@rollup/rollup-win32-x64-msvc': 4.44.2 + '@rollup/rollup-android-arm-eabi': 4.50.0 + '@rollup/rollup-android-arm64': 4.50.0 + '@rollup/rollup-darwin-arm64': 4.50.0 + '@rollup/rollup-darwin-x64': 4.50.0 + '@rollup/rollup-freebsd-arm64': 4.50.0 + '@rollup/rollup-freebsd-x64': 4.50.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 + '@rollup/rollup-linux-arm-musleabihf': 4.50.0 + '@rollup/rollup-linux-arm64-gnu': 4.50.0 + '@rollup/rollup-linux-arm64-musl': 4.50.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 + '@rollup/rollup-linux-ppc64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-musl': 4.50.0 + '@rollup/rollup-linux-s390x-gnu': 4.50.0 + '@rollup/rollup-linux-x64-gnu': 4.50.0 + '@rollup/rollup-linux-x64-musl': 4.50.0 + '@rollup/rollup-openharmony-arm64': 4.50.0 + '@rollup/rollup-win32-arm64-msvc': 4.50.0 + '@rollup/rollup-win32-ia32-msvc': 4.50.0 + '@rollup/rollup-win32-x64-msvc': 4.50.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -7170,8 +6798,6 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@7.7.1: {} - semver@7.7.2: {} set-function-length@1.2.2: @@ -7204,14 +6830,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.9.2: + shiki@3.12.1: dependencies: - '@shikijs/core': 3.9.2 - '@shikijs/engine-javascript': 3.9.2 - '@shikijs/engine-oniguruma': 3.9.2 - '@shikijs/langs': 3.9.2 - '@shikijs/themes': 3.9.2 - '@shikijs/types': 3.9.2 + '@shikijs/core': 3.12.1 + '@shikijs/engine-javascript': 3.12.1 + '@shikijs/engine-oniguruma': 3.12.1 + '@shikijs/langs': 3.12.1 + '@shikijs/themes': 3.12.1 + '@shikijs/types': 3.12.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -7235,12 +6861,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.0.4: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -7257,24 +6877,24 @@ snapshots: space-separated-tokens@2.0.2: {} - spdx-correct@3.1.1: + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.22 - spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 spdx-expression-parse@4.0.0: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.12: {} + spdx-license-ids@3.0.22: {} speakingurl@14.0.1: {} @@ -7351,21 +6971,17 @@ snapshots: dependencies: copy-anything: 3.0.5 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 - synckit@0.6.2: + synckit@0.11.11: dependencies: - tslib: 2.8.1 + '@pkgr/core': 0.2.9 tabbable@6.2.0: {} - tapable@2.2.1: {} + tapable@2.2.3: {} temp-dir@3.0.0: {} @@ -7381,7 +6997,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinypool@1.1.1: {} @@ -7417,7 +7033,7 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.2 - tsdown@0.14.1(typescript@5.9.2): + tsdown@0.14.2(typescript@5.9.2): dependencies: ansis: 4.1.0 cac: 6.7.14 @@ -7426,13 +7042,13 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.32 - rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2) + rolldown: 1.0.0-beta.34 + rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.34)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 tree-kill: 1.2.2 - unconfig: 7.3.2 + unconfig: 7.3.3 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -7441,7 +7057,8 @@ snapshots: - supports-color - vue-tsc - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tsscmp@1.0.6: {} @@ -7449,7 +7066,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@4.18.1: {} + type-fest@4.41.0: {} type-is@1.6.18: dependencies: @@ -7493,9 +7110,9 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.5.4: {} + ufo@1.6.1: {} - uglify-js@3.17.4: + uglify-js@3.19.3: optional: true unbox-primitive@1.1.0: @@ -7505,12 +7122,12 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unconfig@7.3.2: + unconfig@7.3.3: dependencies: - '@quansync/fs': 0.1.3 + '@quansync/fs': 0.1.5 defu: 6.1.4 jiti: 2.5.1 - quansync: 0.2.10 + quansync: 0.2.11 undici-types@7.10.0: {} @@ -7518,7 +7135,7 @@ snapshots: unified@11.0.5: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 @@ -7528,69 +7145,69 @@ snapshots: unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-remove@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.2): + update-browserslist-db@1.1.3(browserslist@4.25.4): dependencies: - browserslist: 4.25.2 + browserslist: 4.25.4 escalade: 3.2.0 picocolors: 1.1.1 uri-js@4.4.1: dependencies: - punycode: 2.3.0 + punycode: 2.3.1 validate-npm-package-license@3.0.4: dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 vary@1.1.2: {} - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.3: dependencies: - '@types/unist': 3.0.2 - vfile-message: 4.0.2 + '@types/unist': 3.0.3 + vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -7605,41 +7222,28 @@ snapshots: - tsx - yaml - vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1): - dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.44.2 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 24.2.1 - fsevents: 2.3.3 - jiti: 2.5.1 - yaml: 2.8.1 - - vite@7.1.2(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1): + vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.44.2 + rollup: 4.50.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.5.1 + lightningcss: 1.30.1 yaml: 2.8.1 - vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1)): + vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)): dependencies: - '@iconify-json/logos': 1.2.4 - '@iconify-json/vscode-icons': 1.2.29 - '@iconify/utils': 3.0.0 + '@iconify-json/logos': 1.2.9 + '@iconify-json/vscode-icons': 1.2.30 + '@iconify/utils': 3.0.1 markdown-it: 14.1.0 - vite: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -7662,26 +7266,26 @@ snapshots: - '@75lb/nature' - supports-color - vitepress@2.0.0-alpha.10(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1): + vitepress@2.0.0-alpha.12(@types/node@24.3.0)(change-case@5.4.4)(jiti@2.5.1)(lightningcss@1.30.1)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1): dependencies: - '@docsearch/css': 4.0.0-beta.6 - '@docsearch/js': 4.0.0-beta.6 - '@iconify-json/simple-icons': 1.2.47 - '@shikijs/core': 3.9.2 - '@shikijs/transformers': 3.9.2 - '@shikijs/types': 3.9.2 + '@docsearch/css': 4.0.0-beta.8 + '@docsearch/js': 4.0.0-beta.8 + '@iconify-json/simple-icons': 1.2.50 + '@shikijs/core': 3.12.1 + '@shikijs/transformers': 3.12.1 + '@shikijs/types': 3.12.1 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.1(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) - '@vue/devtools-api': 8.0.0 - '@vue/shared': 3.5.18 - '@vueuse/core': 13.6.0(vue@3.5.18(typescript@5.9.2)) - '@vueuse/integrations': 13.6.0(change-case@5.4.4)(focus-trap@7.6.5)(vue@3.5.18(typescript@5.9.2)) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))(vue@3.5.20(typescript@5.9.2)) + '@vue/devtools-api': 8.0.1 + '@vue/shared': 3.5.20 + '@vueuse/core': 13.9.0(vue@3.5.20(typescript@5.9.2)) + '@vueuse/integrations': 13.9.0(change-case@5.4.4)(focus-trap@7.6.5)(vue@3.5.20(typescript@5.9.2)) focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 - shiki: 3.9.2 - vite: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) - vue: 3.5.18(typescript@5.9.2) + shiki: 3.12.1 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) + vue: 3.5.20(typescript@5.9.2) optionalDependencies: postcss: 8.5.6 transitivePeerDependencies: @@ -7709,34 +7313,34 @@ snapshots: - universal-cookie - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@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 + chai: 5.3.3 debug: 4.4.1 - expect-type: 1.2.1 - magic-string: 0.30.17 + expect-type: 1.2.2 + magic-string: 0.30.18 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 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: 7.1.1(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.2.1 + '@types/node': 24.3.0 transitivePeerDependencies: - jiti - less @@ -7751,10 +7355,10 @@ snapshots: - tsx - yaml - vue-eslint-parser@9.4.3(eslint@9.33.0(jiti@2.5.1)): + vue-eslint-parser@9.4.3(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -7764,13 +7368,13 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.18(typescript@5.9.2): + vue@3.5.20(typescript@5.9.2): dependencies: - '@vue/compiler-dom': 3.5.18 - '@vue/compiler-sfc': 3.5.18 - '@vue/runtime-dom': 3.5.18 - '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2)) - '@vue/shared': 3.5.18 + '@vue/compiler-dom': 3.5.20 + '@vue/compiler-sfc': 3.5.20 + '@vue/runtime-dom': 3.5.20 + '@vue/server-renderer': 3.5.20(vue@3.5.20(typescript@5.9.2)) + '@vue/shared': 3.5.20 optionalDependencies: typescript: 5.9.2 @@ -7824,6 +7428,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@7.0.0: @@ -7841,9 +7447,7 @@ snapshots: yaml-eslint-parser@1.3.0: dependencies: eslint-visitor-keys: 3.4.3 - yaml: 2.8.0 - - yaml@2.8.0: {} + yaml: 2.8.1 yaml@2.8.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5f03c63..d445bf1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,10 +1,10 @@ packages: - docs - example - - plugin + - vite-plugin-mock-dev-server catalogs: dev: - '@pengzhanbo/eslint-config': ^1.36.0 + '@pengzhanbo/eslint-config': ^1.37.0 '@types/co-body': ^6.1.3 '@types/cookies': ^0.9.1 '@types/cors': ^2.8.19 @@ -13,36 +13,39 @@ catalogs: '@types/is-core-module': ^2.2.2 '@types/mime-types': ^3.0.1 '@types/mockjs': ^1.0.10 - '@types/node': ^24.2.1 + '@types/node': ^24.3.0 + '@types/picomatch': ^4.0.2 '@types/ws': ^8.18.1 bumpp: ^10.2.3 conventional-changelog-cli: ^5.0.0 esbuild: ^0.25.9 - eslint: ^9.33.0 + eslint: ^9.34.0 mockjs: ^1.1.0 - tsdown: ^0.14.1 + rolldown: ^1.0.0-beta.34 + tsdown: ^0.14.2 typescript: ^5.9.2 - vite: ^7.1.2 - vitepress: ^2.0.0-alpha.10 + vite: 'npm:rolldown-vite@latest' + vitepress: ^2.0.0-alpha.12 vitepress-plugin-group-icons: ^1.6.3 vitepress-plugin-llms: ^1.7.3 vitest: ^3.2.4 prod: '@pengzhanbo/utils': ^2.1.0 - '@rollup/pluginutils': ^5.2.0 - chokidar: 3.6.0 + ansis: ^4.1.0 + chokidar: ^4.0.3 co-body: ^6.2.0 cookies: ^0.9.1 cors: ^2.8.5 debug: ^4.4.1 - fast-glob: ^3.3.3 formidable: 3.5.4 http-status: ^2.1.0 is-core-module: ^2.16.1 json5: ^2.2.3 + local-pkg: ^1.1.2 mime-types: ^3.0.1 - path-to-regexp: 6.3.0 - picocolors: ^1.1.1 + path-to-regexp: ^8.2.0 + picomatch: ^4.0.3 + tinyglobby: ^0.2.14 ws: ^8.18.3 onlyBuiltDependencies: - esbuild diff --git a/test/matchingWeight.spec.ts b/test/matchingWeight.spec.ts deleted file mode 100644 index 58c6d88..0000000 --- a/test/matchingWeight.spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { matchingWeight } from '../plugin/src/core/matchingWeight' - -/** - * 验证 规则优先级排序 - */ -describe('matching weight', () => { - const rules = [ - '/api/(.*)', - '/api/(.*)/c', - '/api/(.*)?', - '/api/(.*)/:c', - '/api/:a*', - '/api/:a+', - '/api/:a/:b?', - '/api/a/b/c', - '/api/:a/b/c', - '/api/a/:b/c', - '/api/a/b/:c', - '/api/a/:b/:c', - '/api/:a/:b/c', - '/api/:a/b/:c', - '/api/:a/:b/:c', - '/api/a/b/:c{-:d}{-:e}?', - ] - const expects = { - '/api/a/c/b': [ - '/api/a/:b/:c', - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/e/f/g': [ - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/a/e/f': [ - '/api/a/:b/:c', - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/e/b/f': [ - '/api/:a/b/:c', - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/e/f/c': [ - '/api/:a/:b/c', - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/c', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/a': [ - '/api/:a/:b?', - '/api/:a+', - '/api/:a*', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api/e/e/e/e': [ - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - - '/api': ['/api/:a*', '/api/(.*)?'], - - '/api/a/b/c-d-e': [ - '/api/a/b/:c{-:d}{-:e}?', - '/api/a/b/:c', - '/api/a/:b/:c', - '/api/:a/b/:c', - '/api/:a/:b/:c', - '/api/:a+', - '/api/:a*', - '/api/(.*)/:c', - '/api/(.*)', - '/api/(.*)?', - ], - } - - it.each( - Object.keys(expects).map(url => ({ - rules, - url, - expected: expects[url], - })), - )('$url', ({ rules, url, expected }) => { - expect(matchingWeight(rules, url, {})).toEqual(expected) - }) -}) diff --git a/test/transform.spec.ts b/test/transform.spec.ts deleted file mode 100644 index 5ee76ef..0000000 --- a/test/transform.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { MockHttpItem } from '../plugin/src/types' -import { expect, it } from 'vitest' -import { sortByValidator } from '../plugin/src/core/transform' - -const mockList: MockHttpItem[] = [ - { url: '1', validator: () => true }, - { url: '2', validator: {} }, - { url: '3' }, - { url: '4', validator: { query: { a: 1 } } }, - { url: '5', validator: { query: { a: 1, b: [1] } } }, - { url: '6', validator: { query: { c: 1 } } }, - { url: '7', validator: { query: {} } }, -] - -/** - * 验证 validator 优先级 - */ -it('sort by validator', () => { - expect(sortByValidator(mockList).map(m => m.url)).toEqual([ - '1', - '5', - '4', - '6', - '2', - '3', - '7', - ]) -}) diff --git a/tsconfig.json b/tsconfig.json index 72267dd..51f87ab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "isolatedDeclarations": true, "skipLibCheck": true }, - "include": ["./plugin/**/*", "./docs/.vitepress/**/*"], + "include": ["./vite-plugin-mock-dev-server/**/*", "./docs/.vitepress/**/*"], "exclude": [ "**/dist/**", "**/node_modules/**", diff --git a/plugin/LICENSE b/vite-plugin-mock-dev-server/LICENSE similarity index 100% rename from plugin/LICENSE rename to vite-plugin-mock-dev-server/LICENSE diff --git a/plugin/README.md b/vite-plugin-mock-dev-server/README.md similarity index 100% rename from plugin/README.md rename to vite-plugin-mock-dev-server/README.md diff --git a/vite-plugin-mock-dev-server/__tests__/matchingWeight.spec.ts b/vite-plugin-mock-dev-server/__tests__/matchingWeight.spec.ts new file mode 100644 index 0000000..bd5dad6 --- /dev/null +++ b/vite-plugin-mock-dev-server/__tests__/matchingWeight.spec.ts @@ -0,0 +1,85 @@ +import { describe, expect, it } from 'vitest' +import { matchingWeight } from '../src/core/matchingWeight' + +describe('matching weight', () => { + const rules: string[] = [ + '/api/*rest', + '/api{/*rest}', + '/api/*rest/:d', + '/api/a', + '/api/:a', + '/api{/:a}', + '/api/a/b', + '/api/:a/:b', + '/api/a/:b', + '/api/a/b/c', + '/api/:a/b/c', + '/api/a/:b/c', + '/api/a/b/:c', + '/api/:a/:b/c', + '/api/:a/b/:c', + '/api/a/:b/:c', + '/api/:a/:b/:c', + '/api{/:a}/b/c', + '/api/:a{/:b}/c', + '/api/:a/b{/:c}', + '/api/:a{/:b/:c}', + '/api/:a{/:b/:c}/d', + ] + + const expects: Record = { + '/api/a/c/b': [ + '/api/a/:b/:c', + '/api/:a/:b/:c', + '/api/:a{/:b/:c}', + '/api/*rest/:d', + '/api/*rest', + '/api{/*rest}', + ], + '/api/e/f/g': [ + '/api/:a/:b/:c', + '/api/:a{/:b/:c}', + '/api/*rest/:d', + '/api/*rest', + '/api{/*rest}', + ], + '/api/e/b/f': [ + '/api/:a/b/:c', + '/api/:a/b{/:c}', + '/api/:a/:b/:c', + '/api/:a{/:b/:c}', + '/api/*rest/:d', + '/api/*rest', + '/api{/*rest}', + ], + '/api/a/e/f': [ + '/api/a/:b/:c', + '/api/:a/:b/:c', + '/api/:a{/:b/:c}', + '/api/*rest/:d', + '/api/*rest', + '/api{/*rest}', + ], + '/api/a': [ + '/api/a', + '/api/:a', + '/api{/:a}', + '/api/:a{/:b/:c}', + '/api/*rest', + '/api{/*rest}', + ], + '/api/e/e/e/e': ['/api/*rest/:d', '/api/*rest', '/api{/*rest}'], + '/api': ['/api{/:a}', '/api{/*rest}'], + + } + + it.each( + Object.keys(expects).map(url => ({ + rules, + url, + expected: expects[url], + })), + )('$url', ({ rules, url, expected }) => { + expect(matchingWeight(rules, url, {})).toEqual(expected) + }) +}) diff --git a/test/validator.spec.ts b/vite-plugin-mock-dev-server/__tests__/validator.spec.ts similarity index 90% rename from test/validator.spec.ts rename to vite-plugin-mock-dev-server/__tests__/validator.spec.ts index d7ebba0..34de7bc 100644 --- a/test/validator.spec.ts +++ b/vite-plugin-mock-dev-server/__tests__/validator.spec.ts @@ -1,7 +1,7 @@ import { expect, it } from 'vitest' -import { isObjectSubset } from '../plugin/src/core/validator' +import { isObjectSubset } from '../src/utils' -it('validator isObjectSubset', () => { +it('isObjectSubset', () => { // 浅层比较 expect(isObjectSubset({ a: 1 })).toBe(true) expect(isObjectSubset({ a: 1 }, { a: 1 })).toBe(true) diff --git a/plugin/package.json b/vite-plugin-mock-dev-server/package.json similarity index 81% rename from plugin/package.json rename to vite-plugin-mock-dev-server/package.json index 0602505..7e9d04e 100644 --- a/plugin/package.json +++ b/vite-plugin-mock-dev-server/package.json @@ -22,30 +22,18 @@ "import": { "types": "./dist/index.d.ts", "default": "./dist/index.js" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" } }, "./helper": { "import": { "types": "./dist/helper.d.ts", "default": "./dist/helper.js" - }, - "require": { - "types": "./dist/helper.d.cts", - "default": "./dist/helper.cjs" } }, "./server": { "import": { "types": "./dist/server.d.ts", "default": "./dist/server.js" - }, - "require": { - "types": "./dist/server.d.cts", - "default": "./dist/server.cjs" } }, "./package.json": "./package.json" @@ -63,33 +51,39 @@ }, "peerDependencies": { "esbuild": ">=0.21.0", + "rolldown": ">=1.0.0-beta.34", "vite": ">=4.0.0" }, "peerDependenciesMeta": { "esbuild": { "optional": true + }, + "rolldown": { + "optional": true } }, "dependencies": { - "@rollup/pluginutils": "catalog:prod", + "@pengzhanbo/utils": "catalog:prod", + "ansis": "catalog:prod", "chokidar": "catalog:prod", "co-body": "catalog:prod", "cookies": "catalog:prod", "cors": "catalog:prod", "debug": "catalog:prod", - "fast-glob": "catalog:prod", "formidable": "catalog:prod", "http-status": "catalog:prod", "is-core-module": "catalog:prod", "json5": "catalog:prod", + "local-pkg": "catalog:prod", "mime-types": "catalog:prod", "path-to-regexp": "catalog:prod", - "picocolors": "catalog:prod", + "picomatch": "catalog:prod", + "tinyglobby": "catalog:prod", "ws": "catalog:prod" }, "devDependencies": { - "@pengzhanbo/utils": "catalog:prod", "esbuild": "catalog:dev", + "rolldown": "catalog:dev", "vite": "catalog:dev" }, "publishConfig": { diff --git a/vite-plugin-mock-dev-server/src/build/generate.ts b/vite-plugin-mock-dev-server/src/build/generate.ts new file mode 100644 index 0000000..630b578 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/build/generate.ts @@ -0,0 +1,86 @@ +import type { Plugin } from 'vite' +import type { ResolvedMockServerPluginOptions } from '../options' +import type { ServerBuildOption } from '../types' +import fs from 'node:fs' +import fsp from 'node:fs/promises' +import path from 'node:path' +import process from 'node:process' +import { toArray } from '@pengzhanbo/utils' +import ansis from 'ansis' +import { loadPackageJSON } from 'local-pkg' +import { transform } from '../compiler' +import { generateMockEntryCode } from './mockEntryCode' +import { generatePackageJson, getMockDependencies } from './packageJson' +import { generatorServerEntryCode } from './serverEntryCode' + +type PluginContext = T extends ( + this: infer R, + ...args: any[] +) => void + ? R + : never + +export async function generateMockServer( + ctx: PluginContext, + options: ResolvedMockServerPluginOptions, +): Promise { + const include = toArray(options.include) + const exclude = toArray(options.exclude) + const cwd = options.cwd || process.cwd() + const dir = options.dir + + const pkg = await loadPackageJSON(options.context) || {} + const outputDir = (options.build as ServerBuildOption).dist! + + const content = await generateMockEntryCode(cwd, dir, include, exclude) + const mockEntry = path.join(cwd, `mock-data-${Date.now()}.js`) + await fsp.writeFile(mockEntry, content, 'utf-8') + + const { code, deps } = await transform(mockEntry, options) + const mockDeps = getMockDependencies(deps, options.alias) + await fsp.unlink(mockEntry) + + const outputList = [ + { + filename: path.join(outputDir, 'mock-data.js'), + source: code, + }, + { + filename: path.join(outputDir, 'index.js'), + source: generatorServerEntryCode(options), + }, + { + filename: path.join(outputDir, 'package.json'), + source: generatePackageJson(pkg, mockDeps), + }, + ] + try { + if (path.isAbsolute(outputDir)) { + for (const { filename } of outputList) { + if (fs.existsSync(filename)) + await fsp.rm(filename) + } + options.logger.info(`${ansis.green('✓')} generate mock server in ${ansis.cyan(outputDir)}`) + for (const { filename, source } of outputList) { + fs.mkdirSync(path.dirname(filename), { recursive: true }) + await fsp.writeFile(filename, source, 'utf-8') + const sourceSize = (source.length / 1024).toFixed(2) + const name = path.relative(outputDir, filename) + const space = name.length < 30 ? ' '.repeat(30 - name.length) : '' + options.logger.info(` ${ansis.green(name)}${space}${ansis.bold.dim(`${sourceSize} kB`)}`) + } + } + else { + for (const { filename, source } of outputList) { + ctx.emitFile({ + type: 'asset', + fileName: filename, + source, + }) + } + } + } + catch (e) { + console.error(e) + } +} diff --git a/vite-plugin-mock-dev-server/src/build/index.ts b/vite-plugin-mock-dev-server/src/build/index.ts new file mode 100644 index 0000000..c654599 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/build/index.ts @@ -0,0 +1,4 @@ +export * from './generate' +export * from './mockEntryCode' +export * from './packageJson' +export * from './serverEntryCode' diff --git a/vite-plugin-mock-dev-server/src/build/mockEntryCode.ts b/vite-plugin-mock-dev-server/src/build/mockEntryCode.ts new file mode 100644 index 0000000..3b7dbf5 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/build/mockEntryCode.ts @@ -0,0 +1,27 @@ +import path from 'node:path' +import { glob } from 'tinyglobby' +import { createMatcher, normalizePath } from '../utils' + +export async function generateMockEntryCode( + cwd: string, + dir: string, + include: string[], + exclude: string[], +): Promise { + const { pattern, ignore } = createMatcher(include, exclude) + const mockFiles = await glob(pattern, { ignore, cwd: path.join(cwd, dir) }) + + let importers = '' + const exporters: string[] = [] + mockFiles.forEach((filepath, index) => { + // fix: #21 + const file = normalizePath(path.join(cwd, dir, filepath)) + importers += `import * as m${index} from '${file}';\n` + exporters.push(`[m${index}, '${normalizePath(path.join(dir, filepath))}']`) + }) + return `import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server'; +${importers} +const exporters = [\n ${exporters.join(',\n ')}\n]; +const mockList = exporters.map(([mod, filepath]) => processRawData(mod.default || mod, filepath)); +export default processMockData(mockList);` +} diff --git a/vite-plugin-mock-dev-server/src/build/packageJson.ts b/vite-plugin-mock-dev-server/src/build/packageJson.ts new file mode 100644 index 0000000..b8589eb --- /dev/null +++ b/vite-plugin-mock-dev-server/src/build/packageJson.ts @@ -0,0 +1,74 @@ +import type { ResolvedMockServerPluginOptions } from '../options' +import isCore from 'is-core-module' +import { getPackageInfoSync } from 'local-pkg' +import { name as __PACKAGE_NAME__, version as __PACKAGE_VERSION__ } from '../../package.json' +import { aliasMatches } from '../compiler' + +/** + * 从 mock 文件的 importers 中获取依赖 + */ +export function getMockDependencies( + deps: string[], + alias: ResolvedMockServerPluginOptions['alias'], +): string[] { + const list = new Set() + const excludeDeps = [__PACKAGE_NAME__, 'connect', 'cors'] + const isAlias = (p: string) => alias.find(({ find }) => aliasMatches(find, p)) + deps.forEach((dep) => { + const name = normalizePackageName(dep) + if ( + // 在 esbuild 中 define 会被处理 + name.startsWith(', + pnpm: { peerDependencyRules: { ignoreMissing: ['vite'] } }, + } + const ignores: string[] = ['catalog:', 'file:', 'workspace:'] + for (const dep of mockDeps) { + const version = dependents[dep] as string | undefined + if (!version || ignores.some(ignore => version.startsWith(ignore))) { + const info = getPackageInfoSync(dep) + mockPkg.dependencies[dep] = info?.version ? `^${info.version}` : 'latest' + } + else { + mockPkg.dependencies[dep] = 'latest' + } + } + return JSON.stringify(mockPkg, null, 2) +} diff --git a/vite-plugin-mock-dev-server/src/build/serverEntryCode.ts b/vite-plugin-mock-dev-server/src/build/serverEntryCode.ts new file mode 100644 index 0000000..0a200ba --- /dev/null +++ b/vite-plugin-mock-dev-server/src/build/serverEntryCode.ts @@ -0,0 +1,53 @@ +import type { ResolvedMockServerPluginOptions } from '../options' +import type { ServerBuildOption } from '../types' + +export function generatorServerEntryCode({ + proxies, + wsProxies, + cookiesOptions, + bodyParserOptions, + priority, + build, +}: ResolvedMockServerPluginOptions) { + const { serverPort, log } = build as ServerBuildOption + // 生成的 entry code 有一个 潜在的问题: + // formidableOptions 配置在 `vite.config.ts` 中,`formidableOptions` 配置项 + // 支持 function,并不能被 `JSON.stringify` 转换,故会导致生成的 + // 代码中 `formidableOptions` 与 用户配置不一致。 + // 一种解决方式是使用单独的 `vite.mock.config.ts` 之类的插件独立配置文件来处理该问题 + // 但是目前也仅有 需要 build mock server 时有这个 `formidableOptions` 的配置问题, + // 从功能的优先级上看,还没有实现 `mock.config.ts` 的必要性。 + // 当前也还未收到有用户有关于该功能的潜在问题报告,暂时作为一个 待优化的问题。 + return `import { createServer } from 'node:http'; +import connect from 'connect'; +import corsMiddleware from 'cors'; +import { createMockMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server'; +import mockData from './mock-data.js'; + +const app = connect(); +const server = createServer(app); +const logger = createLogger('mock-server', '${log}'); +const proxies = ${JSON.stringify(proxies)}; +const wsProxies = ${JSON.stringify(wsProxies)}; +const cookiesOptions = ${JSON.stringify(cookiesOptions)}; +const bodyParserOptions = ${JSON.stringify(bodyParserOptions)}; +const priority = ${JSON.stringify(priority)}; +const compiler = { mockData } + +mockWebSocket(compiler, server, { wsProxies, cookiesOptions, logger }); + +app.use(corsMiddleware()); +app.use(createMockMiddleware(compiler, { + formidableOptions: { multiples: true }, + proxies, + priority, + cookiesOptions, + bodyParserOptions, + logger, +})); + +server.listen(${serverPort}); + +console.log('listen: http://localhost:${serverPort}'); +` +} diff --git a/vite-plugin-mock-dev-server/src/compiler/compile.ts b/vite-plugin-mock-dev-server/src/compiler/compile.ts new file mode 100644 index 0000000..a5b7a92 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/compile.ts @@ -0,0 +1,43 @@ +import type { CompilerOptions, CompilerResult, MockRawData, TransformResult } from './types' +import process from 'node:process' +import { isPackageExists } from 'local-pkg' +import { transformWithEsbuild } from './esbuild' +import { loadFromCode } from './loadFromCode' +import { transformWithRolldown } from './rolldown' + +const hasRolldown = isPackageExists('rolldown') +const hasEsbuild = isPackageExists('esbuild') + +export async function transform(entryPoint: string, options: CompilerOptions): Promise { + if (hasRolldown) + return transformWithRolldown(entryPoint, options) + if (hasEsbuild) + return transformWithEsbuild(entryPoint, options) + throw new Error('rolldown or esbuild not found') +} + +export async function compile( + filepath: string, + options: CompilerOptions, +): Promise { + let isESM = false + if (/\.m[jt]s$/.test(filepath)) + isESM = true + else if (/\.c[jt]s$/.test(filepath)) + isESM = false + else + isESM = options.isESM || false + + const { code, deps } = await transform(filepath, { + ...options, + isESM, + }) + const data: MockRawData = (await loadFromCode({ + filepath, + code, + isESM, + cwd: options.cwd || process.cwd(), + })) || {} + + return { data, deps } +} diff --git a/vite-plugin-mock-dev-server/src/compiler/compiler.ts b/vite-plugin-mock-dev-server/src/compiler/compiler.ts new file mode 100644 index 0000000..eccb0b0 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/compiler.ts @@ -0,0 +1,184 @@ +import type { FSWatcher } from 'chokidar' +import type { Matcher } from 'picomatch' +import type { ResolvedMockServerPluginOptions } from '../options' +import type { MockHttpItem, MockOptions, MockWebsocketItem } from '../types' +import EventEmitter from 'node:events' +import path from 'node:path' +import process from 'node:process' +import { promiseParallel } from '@pengzhanbo/utils' +import { watch } from 'chokidar' +import { loadPackageJSONSync } from 'local-pkg' +import { glob } from 'tinyglobby' +import { createMatcher, debug, normalizePath } from '../utils' +import { compile } from './compile' +import { processMockData, processRawData } from './processData' + +/** + * Mock 文件加载编译,并转换为 Mock 数据 + */ +export class Compiler extends EventEmitter { + private moduleCache: Map + = new Map() + + private moduleDeps: Map> = new Map() + cwd: string + private mockWatcher!: FSWatcher + private depsWatcher!: FSWatcher + private isESM = false + + private _mockData: Record = {} + + constructor(public options: ResolvedMockServerPluginOptions) { + super() + this.cwd = options.cwd || process.cwd() + try { + const pkg = loadPackageJSONSync(this.cwd) + this.isESM = pkg?.type === 'module' + } + catch {} + } + + get mockData(): Record { + return this._mockData + } + + run(watch?: boolean): void { + const { include, exclude } = this.options + const { pattern, ignore, isMatch } = createMatcher(include, exclude) + + glob(pattern, { ignore, cwd: path.join(this.cwd, this.options.dir) }) + /** + * 控制 文件编译 并发 数量。 + * 当使用 Promise.all 时,可能在一些比较大型的项目中,过多的 mock 文件 + * 可能导致实例化过多的 esbuild 实例而导致带来过多的内存开销,导致额外的 + * 性能开销,从而影响编译速度。 + * 实测在控制并发数的前提下,总编译时间 差异不大,但内存开销更小更加稳定。 + */ + .then(files => files.map(file => () => this.load(path.join(this.options.dir, file)))) + .then(loaders => promiseParallel(loaders, 64)) + .then(() => this.updateMockData()) + + if (!watch) + return + + this.watchMockEntry(isMatch) + this.watchDeps() + + let timer: NodeJS.Immediate | null = null + + this.on('mock:update', async (filepath: string) => { + if (!isMatch(filepath)) + return + await this.load(filepath) + if (timer) + clearImmediate(timer) + + timer = setImmediate(() => { + this.updateMockData() + this.emit('mock:update-end', normalizePath(filepath)) + timer = null + }) + }) + this.on('mock:unlink', async (filepath: string) => { + if (!isMatch(filepath)) + return + filepath = normalizePath(path.join(this.options.dir, filepath)) + this.moduleCache.delete(filepath) + this.updateMockData() + this.emit('mock:update-end', filepath) + }) + } + + close(): void { + this.mockWatcher?.close() + this.depsWatcher?.close() + } + + private async load(filepath?: string) { + if (!filepath) + return + + try { + const { define, alias } = this.options + const { data, deps } = await compile(filepath, { + cwd: this.cwd, + isESM: this.isESM, + define, + alias, + }) + this.moduleCache.set(filepath, processRawData(data, filepath)) + this.updateModuleDeps(filepath, deps) + } + catch (e) { + console.error(e) + } + } + + private updateMockData() { + this._mockData = processMockData(this.moduleCache) + } + + private updateModuleDeps(filepath: string, deps: string[]) { + for (const dep of deps) { + if (!this.moduleDeps.has(dep)) + this.moduleDeps.set(dep, new Set()) + + const cur = this.moduleDeps.get(dep)! + cur.add(filepath) + } + this.emit('update:deps') + } + + watchMockEntry(isMatch: Matcher): void { + const watcher = this.mockWatcher = watch(this.options.dir, { + ignoreInitial: true, + cwd: this.cwd, + ignored: (filepath, stats) => { + if (filepath.includes('node_modules')) + return true + return !!stats?.isFile() && !isMatch(filepath) + }, + }) + + watcher.on('add', async (filepath: string) => { + filepath = normalizePath(filepath) + this.emit('mock:update', filepath) + debug('watcher:add', filepath) + }) + watcher.on('change', async (filepath: string) => { + filepath = normalizePath(filepath) + this.emit('mock:update', filepath) + debug('watcher:change', filepath) + }) + watcher.on('unlink', async (filepath: string) => { + filepath = normalizePath(filepath) + this.emit('mock:unlink', filepath) + debug('watcher:unlink', filepath) + }) + } + + watchDeps(): void { + let oldDeps: string[] = [...this.moduleDeps.keys()] + const watcher = this.depsWatcher = watch([...oldDeps], { + ignoreInitial: true, + cwd: this.cwd, + }) + watcher.on('change', (filepath) => { + filepath = normalizePath(filepath) + const mockFiles = this.moduleDeps.get(filepath) + mockFiles?.forEach(file => this.emit('mock:update', file)) + }) + watcher.on('unlink', (filepath) => { + filepath = normalizePath(filepath) + this.moduleDeps.delete(filepath) + }) + + this.on('update:deps', () => { + const deps: string[] = [...this.moduleDeps.keys()] + const exactDeps = deps.filter(dep => !oldDeps.includes(dep)) + oldDeps = deps + if (exactDeps.length > 0) + watcher.add(exactDeps) + }) + } +} diff --git a/plugin/src/core/compiler.ts b/vite-plugin-mock-dev-server/src/compiler/esbuild.ts similarity index 73% rename from plugin/src/core/compiler.ts rename to vite-plugin-mock-dev-server/src/compiler/esbuild.ts index 4795de7..8d10b2d 100644 --- a/plugin/src/core/compiler.ts +++ b/vite-plugin-mock-dev-server/src/compiler/esbuild.ts @@ -1,14 +1,12 @@ -import type { Metafile, Plugin } from 'esbuild' +import type { Plugin } from 'esbuild' import type { Alias } from 'vite' -import fs, { promises as fsp } from 'node:fs' +import type { CompilerOptions, TransformResult } from './types' +import fsp from 'node:fs/promises' import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' -import { build } from 'esbuild' import JSON5 from 'json5' -/* ===== esbuild begin ===== */ - const externalizeDeps: Plugin = { name: 'externalize-deps', setup(build) { @@ -103,27 +101,22 @@ export function aliasMatches(pattern: string | RegExp, importee: string): boolea return importee.startsWith(`${pattern}/`) } -export interface TransformWithEsbuildOptions { - isESM?: boolean - define: Record - alias: Alias[] - cwd?: string -} +let _build: null | typeof import('esbuild').build = null -export type TransformWithEsbuildResult = Promise<{ - code: string - deps: Metafile['inputs'] -}> +async function esbuild(): Promise> { + _build ||= (await import('esbuild')).build + return _build +} export async function transformWithEsbuild( entryPoint: string, - options: TransformWithEsbuildOptions, -): TransformWithEsbuildResult { - const { isESM = true, define, alias, cwd = process.cwd() } = options + { isESM = true, define, alias, cwd = process.cwd() }: CompilerOptions, +): Promise { const filepath = path.resolve(cwd, entryPoint) const filename = path.basename(entryPoint) const dirname = path.dirname(filepath) try { + const build = await esbuild() const result = await build({ entryPoints: [entryPoint], outfile: 'out.js', @@ -142,44 +135,19 @@ export async function transformWithEsbuild( plugins: [aliasPlugin(alias), renamePlugin, externalizeDeps, jsonLoader, json5Loader], absWorkingDir: cwd, }) + const deps: Set = new Set() + const inputs = result.metafile?.inputs || {} + Object.keys(inputs).forEach(key => + inputs[key].imports.forEach(dep => deps.add(dep.path)), + ) + return { code: result.outputFiles[0].text, - deps: result.metafile?.inputs || {}, + deps: Array.from(deps), } } catch (e) { console.error(e) } - return { code: '', deps: {} } -} - -/* ===== esbuild end ===== */ -interface LoadFromCodeOptions { - filepath: string - code: string - isESM: boolean - cwd: string -} - -export async function loadFromCode({ - filepath, - code, - isESM, - cwd, -}: LoadFromCodeOptions): Promise { - filepath = path.resolve(cwd, filepath) - const ext = isESM ? '.mjs' : '.cjs' - const filepathTmp = `${filepath}.timestamp-${Date.now()}${ext}` - const file = pathToFileURL(filepathTmp).toString() - await fsp.writeFile(filepathTmp, code, 'utf8') - try { - const mod = await import(file) - return mod.default || mod - } - finally { - try { - fs.unlinkSync(filepathTmp) - } - catch {} - } + return { code: '', deps: [] } } diff --git a/vite-plugin-mock-dev-server/src/compiler/index.ts b/vite-plugin-mock-dev-server/src/compiler/index.ts new file mode 100644 index 0000000..ca735ae --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/index.ts @@ -0,0 +1,7 @@ +export * from './compile' +export * from './compiler' +export * from './esbuild' +export * from './loadFromCode' +export * from './processData' +export * from './rolldown' +export * from './types' diff --git a/vite-plugin-mock-dev-server/src/compiler/loadFromCode.ts b/vite-plugin-mock-dev-server/src/compiler/loadFromCode.ts new file mode 100644 index 0000000..8c39063 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/loadFromCode.ts @@ -0,0 +1,33 @@ +import fs, { promises as fsp } from 'node:fs' +import path from 'node:path' +import { pathToFileURL } from 'node:url' + +interface LoadFromCodeOptions { + filepath: string + code: string + isESM: boolean + cwd: string +} + +export async function loadFromCode({ + filepath, + code, + isESM, + cwd, +}: LoadFromCodeOptions): Promise { + filepath = path.resolve(cwd, filepath) + const ext = isESM ? '.mjs' : '.cjs' + const filepathTmp = `${filepath}.timestamp-${Date.now()}${ext}` + const file = pathToFileURL(filepathTmp).toString() + await fsp.writeFile(filepathTmp, code, 'utf8') + try { + const mod = await import(file) + return mod.default || mod + } + finally { + try { + fs.unlinkSync(filepathTmp) + } + catch {} + } +} diff --git a/plugin/src/core/transform.ts b/vite-plugin-mock-dev-server/src/compiler/processData.ts similarity index 86% rename from plugin/src/core/transform.ts rename to vite-plugin-mock-dev-server/src/compiler/processData.ts index 4775d12..9fa9115 100644 --- a/plugin/src/core/transform.ts +++ b/vite-plugin-mock-dev-server/src/compiler/processData.ts @@ -1,4 +1,5 @@ import type { MockHttpItem, MockOptions, MockWebsocketItem } from '../types' +import type { MockRawData } from './types' import { isArray, isEmptyObject, @@ -7,38 +8,35 @@ import { sortBy, toArray, } from '@pengzhanbo/utils' -import { urlParse } from './utils' -import { isObjectSubset } from './validator' +import { isObjectSubset, urlParse } from '../utils' -type MockRawData = MockOptions | MockHttpItem | MockWebsocketItem | Record - -export function transformRawData( +export function processRawData( raw: MockRawData, __filepath__: string, ): MockOptions | MockHttpItem | MockWebsocketItem { - let mockConfig: any + let res: MockOptions | MockHttpItem | MockWebsocketItem if (isArray(raw)) { - mockConfig = raw.map(item => ({ ...item, __filepath__ })) + res = raw.map(item => ({ ...item, __filepath__ })) as MockOptions } else if ('url' in raw) { - mockConfig = { ...raw, __filepath__ } + res = { ...raw, __filepath__ } as unknown as MockHttpItem } else { - mockConfig = [] + res = [] Object.keys((raw)).forEach((key) => { const data = raw[key] if (isArray(data)) { - mockConfig.push(...data.map(item => ({ ...item, __filepath__ }))) + (res as MockOptions).push(...data.map(item => ({ ...item, __filepath__ }))) } else { - mockConfig.push({ ...data, __filepath__ }) + (res as MockOptions).push({ ...data, __filepath__ } as unknown as MockHttpItem) } }) } - return mockConfig + return res } -export function transformMockData( +export function processMockData( mockList: | Map | (MockHttpItem | MockWebsocketItem | MockOptions)[], diff --git a/vite-plugin-mock-dev-server/src/compiler/rolldown.ts b/vite-plugin-mock-dev-server/src/compiler/rolldown.ts new file mode 100644 index 0000000..e475de6 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/rolldown.ts @@ -0,0 +1,87 @@ +import type { Plugin } from 'rolldown' +import type { CompilerOptions, TransformResult } from './types' +import path from 'node:path' +import process from 'node:process' +import { pathToFileURL } from 'node:url' +import JSON5 from 'json5' +import { aliasMatches } from './esbuild' + +const renamePlugin: Plugin = { + name: 'vite-mock:rename-plugin', + resolveId(id) { + if (id === 'vite-plugin-mock-dev-server') { + return { + id: 'vite-plugin-mock-dev-server/helper', + external: true, + } + } + }, +} + +const json5Plugin: Plugin = { + name: 'vite-mock:json5-plugin', + transform: { + filter: { id: /\.json5$/ }, + handler: (code) => { + return { code: `export default ${JSON5.stringify(JSON5.parse(code))}` } + }, + }, +} + +let _rolldown: null | { + build: typeof import('rolldown').build + aliasPlugin: typeof import('rolldown/experimental').aliasPlugin +} = null + +async function rolldown() { + _rolldown ||= { + build: (await import('rolldown')).build, + aliasPlugin: (await import('rolldown/experimental')).aliasPlugin, + } + return _rolldown +} + +export async function transformWithRolldown( + entryPoint: string, + { isESM = true, define, alias, cwd = process.cwd() }: CompilerOptions, +): Promise { + const filepath = path.resolve(cwd, entryPoint) + const filename = path.basename(entryPoint) + const dirname = path.dirname(filepath) + const isAlias = (p: string) => !!alias.find(({ find }) => aliasMatches(find, p)) + try { + const { build, aliasPlugin } = await rolldown() + const result = await build({ + input: entryPoint, + write: false, + cwd, + output: { + format: isESM ? 'esm' : 'cjs', + sourcemap: false, + file: 'out.js', + }, + platform: 'node', + define: { + ...define, + __dirname: JSON.stringify(dirname), + __filename: JSON.stringify(filename), + ...isESM ? {} : { 'import.meta.url': JSON.stringify(pathToFileURL(filepath)) }, + }, + external(id) { + if (isAlias(id)) + return false + if (id[0] !== '.' && !path.isAbsolute(id) && id !== 'vite-plugin-mock-dev-server') + return true + }, + plugins: [aliasPlugin({ entries: alias }), renamePlugin, json5Plugin], + }) + return { + code: result.output[0].code, + deps: result.output[0].imports, + } + } + catch (e) { + console.error(e) + } + return { code: '', deps: [] } +} diff --git a/vite-plugin-mock-dev-server/src/compiler/types.ts b/vite-plugin-mock-dev-server/src/compiler/types.ts new file mode 100644 index 0000000..0dce092 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/compiler/types.ts @@ -0,0 +1,21 @@ +import type { Alias } from 'vite' +import type { MockHttpItem, MockOptions, MockWebsocketItem } from '../types' + +export interface CompilerOptions { + isESM?: boolean + define: Record + alias: Alias[] + cwd?: string +} + +export interface TransformResult { + code: string + deps: string[] +} + +export interface CompilerResult { + data: MockRawData + deps: string[] +} + +export type MockRawData = MockOptions | MockHttpItem | MockWebsocketItem | Record diff --git a/vite-plugin-mock-dev-server/src/core/corsMiddleware.ts b/vite-plugin-mock-dev-server/src/core/corsMiddleware.ts new file mode 100644 index 0000000..d015ebe --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/corsMiddleware.ts @@ -0,0 +1,32 @@ +import type { Connect } from 'vite' +import type { Compiler } from '../compiler' +import type { ResolvedMockServerPluginOptions } from '../options' +import cors from 'cors' +import { doesProxyContextMatchUrl, isPathMatch, urlParse } from '../utils' + +export function createCorsMiddleware( + compiler: Compiler, + { proxies, cors: corsOptions }: ResolvedMockServerPluginOptions, +): Connect.NextHandleFunction | undefined { + return !corsOptions + ? undefined + : function (req, res, next) { + const { pathname } = urlParse(req.url!) + if ( + !pathname + || proxies.length === 0 + || !proxies.some(context => doesProxyContextMatchUrl(context, req.url!)) + ) { + return next() + } + + const mockData = compiler.mockData + + const mockUrl = Object.keys(mockData).find(pattern => isPathMatch(pattern, pathname)) + + if (!mockUrl) + return next() + + cors(corsOptions)(req, res, next) + } +} diff --git a/plugin/src/core/define.ts b/vite-plugin-mock-dev-server/src/core/define.ts similarity index 100% rename from plugin/src/core/define.ts rename to vite-plugin-mock-dev-server/src/core/define.ts diff --git a/vite-plugin-mock-dev-server/src/core/findMockData.ts b/vite-plugin-mock-dev-server/src/core/findMockData.ts new file mode 100644 index 0000000..57866d3 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/findMockData.ts @@ -0,0 +1,60 @@ +import type { ExtraRequest, Method, MockHttpItem, MockOptions } from '../types' +import type { Logger } from '../utils' +import { isArray, isFunction } from '@pengzhanbo/utils' +import ansis from 'ansis' +import { isPathMatch } from '../utils' +import { parseRequestParams, requestValidate } from './request' + +interface FindMockDataOptions { + pathname: string + method: string + request: Omit +} + +/** + * 查找匹配的 mock data + */ +export function fineMockData( + mockList: MockOptions, + logger: Logger, + { pathname, method, request }: FindMockDataOptions, +): MockHttpItem | undefined { + return mockList.find((mock) => { + // !mock : 这部分是为了避免 用户编写 mock 文件时,在 文件内容为空时的情况 + if (!pathname || !mock || !mock.url || mock.ws) + return false + const methods: Method[] = mock.method + ? isArray(mock.method) + ? mock.method + : [mock.method] + : ['GET', 'POST'] + // 判断发起的请求方法是否符合当前 mock 允许的方法 + if (!methods.includes(method as Method)) + return false + + const hasMock = isPathMatch(mock.url, pathname) + + if (hasMock && mock.validator) { + const params = parseRequestParams(mock.url, pathname) + if (isFunction(mock.validator)) { + return mock.validator({ params, ...request }) + } + else { + try { + return requestValidate({ params, ...request }, mock.validator) + } + catch (e) { + const file = (mock as any).__filepath__ + logger.error( + `${ansis.red( + `mock error at ${pathname}`, + )}\n${e}\n at validator (${ansis.underline(file)})`, + mock.log, + ) + return false + } + } + } + return hasMock + }) as MockHttpItem | undefined +} diff --git a/vite-plugin-mock-dev-server/src/core/index.ts b/vite-plugin-mock-dev-server/src/core/index.ts new file mode 100644 index 0000000..01f75c6 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/index.ts @@ -0,0 +1,9 @@ +export * from './corsMiddleware' +export * from './define' +export * from './findMockData' +export * from './init' +export * from './mockMiddleware' +export * from './request' +export * from './requestRecovery' +export * from './response' +export * from './ws' diff --git a/plugin/src/core/mockMiddleware.ts b/vite-plugin-mock-dev-server/src/core/init.ts similarity index 67% rename from plugin/src/core/mockMiddleware.ts rename to vite-plugin-mock-dev-server/src/core/init.ts index ebab021..6bc2024 100644 --- a/plugin/src/core/mockMiddleware.ts +++ b/vite-plugin-mock-dev-server/src/core/init.ts @@ -1,16 +1,13 @@ import type { Server } from 'node:http' import type { Http2SecureServer } from 'node:http2' import type { Connect, WebSocketServer } from 'vite' -import type { MockCompiler } from './mockCompiler' -import type { ResolvedMockServerPluginOptions } from './resolvePluginOptions' -import cors from 'cors' -import { pathToRegexp } from 'path-to-regexp' -import { baseMiddleware } from './baseMiddleware' -import { createMockCompiler } from './mockCompiler' -import { doesProxyContextMatchUrl, urlParse } from './utils' +import type { ResolvedMockServerPluginOptions } from '../options' +import { Compiler } from '../compiler' +import { createCorsMiddleware } from './corsMiddleware' +import { createMockMiddleware } from './mockMiddleware' import { mockWebSocket } from './ws' -export function mockServerMiddleware( +export function initMockMiddlewares( options: ResolvedMockServerPluginOptions, // vite@5 httpServer 类型发生变更 // https://github.com/vitejs/vite/pull/14834 @@ -21,7 +18,7 @@ export function mockServerMiddleware( * 加载 mock 文件, 包括监听 mock 文件的依赖文件变化, * 并注入 vite `define` / `alias` */ - const compiler = createMockCompiler(options) + const compiler = new Compiler(options) compiler.run(!!server) @@ -61,36 +58,8 @@ export function mockServerMiddleware( * 也会使用 viteConfig.server.cors 配置,并支持 用户可以对 mock 中的 cors 中间件进行配置。 * 而用户的配置也仅对 mock 的接口生效。 */ - corsMiddleware(compiler, options), - baseMiddleware(compiler, options), + createCorsMiddleware(compiler, options), + createMockMiddleware(compiler, options), ) return middlewares.filter(Boolean) as Connect.NextHandleFunction[] } - -function corsMiddleware( - compiler: MockCompiler, - { proxies, cors: corsOptions }: ResolvedMockServerPluginOptions, -): Connect.NextHandleFunction | undefined { - return !corsOptions - ? undefined - : function (req, res, next) { - const { pathname } = urlParse(req.url!) - if ( - !pathname || proxies.length === 0 - || !proxies.some(context => doesProxyContextMatchUrl(context, req.url!)) - ) { - return next() - } - - const mockData = compiler.mockData - - const mockUrl = Object.keys(mockData).find(key => - pathToRegexp(key).test(pathname), - ) - - if (!mockUrl) - return next() - - cors(corsOptions)(req, res, next) - } -} diff --git a/plugin/src/core/matchingWeight.ts b/vite-plugin-mock-dev-server/src/core/matchingWeight.ts similarity index 61% rename from plugin/src/core/matchingWeight.ts rename to vite-plugin-mock-dev-server/src/core/matchingWeight.ts index 8559898..246e6d7 100644 --- a/plugin/src/core/matchingWeight.ts +++ b/vite-plugin-mock-dev-server/src/core/matchingWeight.ts @@ -1,50 +1,56 @@ -import type { Token } from 'path-to-regexp' -import type { MockMatchPriority } from '../types' /** * 规则匹配优先级 * + * @see https://github.com/pillarjs/path-to-regexp + * * 由于一个请求可能会同时命中多个 匹配规则,需要计算 优先级,并根据优先级 从高到低 排序。 * * 规则: * 1. 无参数的规则优先级最高 * 2. 参数规则少的优先级高,对于参数数量相同的,根据参数所在位置,参数越靠后的优先级越高 - * 3. 命名参数优先级比非命名参数优先级高 - * 4. 对于 有修饰符 *+?, 优先级需要对比无修饰符的参数进行降低, - * 5. 同位置修饰符, * 比 + 的优先级低 - * 6. 对于 (.*) 的参数规则,无论其出现在任何位置,都拥有该位置的最低优先级,(.*)? 比 (.*) 优先级更低 + * 3. 对于可选参数,优先级应该比必填参数低 + * 4. 对于通配符的参数,优先级应该比其他参数低 */ +import type { Parameter, Text, Token, Wildcard } from 'path-to-regexp' +import type { MockMatchPriority } from '../types' import { isArray, isEmptyObject, - isString, sortBy, uniq, } from '@pengzhanbo/utils' import { parse, pathToRegexp } from 'path-to-regexp' +import { isPathMatch } from '../utils' + +type PathToken = (Text & { optional?: boolean }) + | (Parameter & { optional?: boolean }) + | (Wildcard & { optional?: boolean }) -const tokensCache: Record = {} +const tokensCache: Record = {} function getTokens(rule: string) { if (tokensCache[rule]) return tokensCache[rule] - - const tks = parse(rule) - const tokens: Token[] = [] - for (const tk of tks) { - if (!isString(tk)) { - tokens.push(tk) - } - else { - const hasPrefix = tk[0] === '/' - const subTks = hasPrefix ? tk.slice(1).split('/') : tk.split('/') - tokens.push( - `${hasPrefix ? '/' : ''}${subTks[0]}`, - ...subTks.slice(1).map(t => `/${t}`), - ) + const res: PathToken[] = [] + const flatten = (tokens: Token[], group = false) => { + for (const token of tokens) { + if (token.type === 'text') { + const sub = token.value.split('/').filter(Boolean) + sub.length && res.push(...sub.map(v => ({ type: 'text', value: v } as PathToken))) + } + else if (token.type === 'group') { + flatten(token.tokens, true) + } + else { + if (group) + (token as PathToken).optional = true + res.push(token) + } } } - tokensCache[rule] = tokens - return tokens + flatten(parse(rule).tokens) + tokensCache[rule] = res + return res } function getHighest(rules: string[]) { @@ -58,7 +64,7 @@ function sortFn(rule: string) { let w = 0 for (let i = 0; i < tokens.length; i++) { const token = tokens[i] - if (!isString(token)) + if (token.type !== 'text') w += 10 ** (i + 1) w += 10 ** (i + 1) @@ -73,7 +79,7 @@ function preSort(rules: string[]) { for (const rule of rules) { const tokens = getTokens(rule) - const len = tokens.filter(token => typeof token !== 'string').length + const len = tokens.filter(token => token.type !== 'text').length if (!preMatch[len]) preMatch[len] = [] preMatch[len].push(rule) @@ -90,7 +96,7 @@ function defaultPriority(rules: string[]) { return sortBy(rules, (rule) => { const tokens = getTokens(rule) - const dym = tokens.filter(token => typeof token !== 'string') + const dym = tokens.filter(token => token.type !== 'text') if (dym.length === 0) return 0 @@ -98,47 +104,34 @@ function defaultPriority(rules: string[]) { let exp = 0 for (let i = 0; i < tokens.length; i++) { const token = tokens[i] - const isDynamic = !isString(token) - const { - pattern = '', - modifier, - prefix, - name, - } = isDynamic ? token : ({} as any) - const isGlob = pattern && pattern.includes('.*') - const isSlash = prefix === '/' - const isNamed = isString(name) - - exp += isDynamic && isSlash ? 1 : 0 + // 动态参数,包括命名参数、可选参数、剩余参数通配符 + const isDynamic = token.type !== 'text' + // 通配符 剩余参数 foo/*bar + // ^^^^ + const isWildcard = token.type === 'wildcard' + // 可选参数: foo{/:bar} 可选剩余参数 foo{/*bar} + // ^^^^^^^ ^^^^^^^ + const isOptional = !!token.optional + + exp += isDynamic ? 1 : 0 // 如果规则末尾是通配,则优先级最低 - if (i === tokens.length - 1 && isGlob) { - weight += 5 * 10 ** (tokens.length === 1 ? highest + 1 : highest) + if (i === tokens.length - 1 && isWildcard) { + weight += (isOptional ? 5 : 4) * 10 ** (tokens.length === 1 ? highest + 1 : highest) } else { // 非末尾的通配,优先级次低 - if (isGlob) { + if (isWildcard) { weight += 3 * 10 ** (highest - 1) } - else if (pattern) { - if (isSlash) { - // 具名参数优先级高于非命名参数 - weight += (isNamed ? 2 : 1) * 10 ** (exp + 1) - } - else { - // :foo{-:bar}{-:baz}? 优先级高于 :foo - weight -= 1 * 10 ** exp - } + else { + weight += 2 * 10 ** exp + } + // 降低可选参数优先级 + if (isOptional) { + weight += 10 ** exp } } - if (modifier === '+') - weight += 1 * 10 ** (highest - 1) - - if (modifier === '*') - weight += 1 * 10 ** (highest - 1) + 1 - - if (modifier === '?') - weight += 1 * 10 ** (exp + (isSlash ? 1 : 0)) } return weight }) @@ -151,7 +144,7 @@ export function matchingWeight( ): string[] { // 基于默认规则下进行优先级排序 let matched = defaultPriority( - preSort(rules.filter(rule => pathToRegexp(rule).test(url))), + preSort(rules.filter(rule => isPathMatch(rule, url))), ) const { global = [], special = {} } = priority @@ -186,7 +179,7 @@ export function matchingWeight( if (lowerRules.includes(matched[0])) { if ( when.length === 0 - || when.some(path => pathToRegexp(path).test(url)) + || when.some(path => pathToRegexp(path).regexp.test(url)) ) { // 特殊规则插入到最前,保证特殊规则优先 matched = uniq([specialRule, ...matched]) @@ -196,12 +189,16 @@ export function matchingWeight( return matched } +/** + * 将规则分为静态和动态两部分 + */ function twoPartMatch(rules: string[]) { const statics: string[] = [] const dynamics: string[] = [] for (const rule of rules) { const tokens = getTokens(rule) - const dym = tokens.filter(token => typeof token !== 'string') + // 如果 tokens 中包含动态参数,则为动态规则 + const dym = tokens.filter(token => token.type !== 'text') if (dym.length > 0) dynamics.push(rule) else statics.push(rule) diff --git a/vite-plugin-mock-dev-server/src/core/mockMiddleware.ts b/vite-plugin-mock-dev-server/src/core/mockMiddleware.ts new file mode 100644 index 0000000..a8228d9 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/mockMiddleware.ts @@ -0,0 +1,191 @@ +import type { Connect } from 'vite' +import type { Compiler } from '../compiler' +import type { + MockHttpItem, + MockRequest, + MockResponse, + MockServerPluginOptions, +} from '../types' +import type { Logger } from '../utils' +import { isFunction, timestamp } from '@pengzhanbo/utils' +import ansis from 'ansis' +import Cookies from 'cookies' +import { doesProxyContextMatchUrl, urlParse } from '../utils' +import { fineMockData } from './findMockData' +import { matchingWeight } from './matchingWeight' +import { + parseRequestBody, + parseRequestParams, + requestLog, +} from './request' +import { collectRequest } from './requestRecovery' +import { + provideResponseCookies, + provideResponseHeaders, + provideResponseStatus, + responseRealDelay, + sendResponseData, +} from './response' + +export interface CreateMockMiddlewareOptions extends Pick { + proxies: string[] + logger: Logger +} + +export function createMockMiddleware( + compiler: Compiler, + { + formidableOptions = {}, + bodyParserOptions = {}, + proxies, + cookiesOptions, + logger, + priority = {}, + }: CreateMockMiddlewareOptions, +): Connect.NextHandleFunction { + return async function mockMiddleware(req, res, next) { + const startTime = timestamp() + const { query, pathname } = urlParse(req.url!) + + // 预先过滤不符合路径前缀的请求 + if ( + !pathname + || proxies.length === 0 + || !proxies.some(context => doesProxyContextMatchUrl(context, req.url!)) + ) { + return next() + } + + const mockData = compiler.mockData + // 对满足匹配规则的配置进行优先级排序 + const mockUrls = matchingWeight(Object.keys(mockData), pathname, priority) + + if (mockUrls.length === 0) { + return next() + } + + // #52 由于请求流被消费,vite http-proxy 无法获取已消费的请求,导致请求流无法继续 + // 记录请求流中被消费的数据,形成备份,当当前请求无法继续时,可以从备份中恢复请求流 + collectRequest(req) + + const { query: refererQuery } = urlParse(req.headers.referer || '') + const reqBody = await parseRequestBody(req, formidableOptions, bodyParserOptions) + const cookies = new Cookies(req, res, cookiesOptions) + const getCookie = cookies.get.bind(cookies) + + const method = req.method!.toUpperCase() + let mock: MockHttpItem | undefined + let _mockUrl: string | undefined + + // 查找匹配的mock,仅找出首个匹配的配置项后立即结束 + for (const mockUrl of mockUrls) { + mock = fineMockData(mockData[mockUrl], logger, { + pathname, + method, + request: { + query, + refererQuery, + body: reqBody, + headers: req.headers, + getCookie, + }, + }) + if (mock) { + _mockUrl = mockUrl + break + } + } + + if (!mock) { + const matched = mockUrls + .map(m => + m === _mockUrl ? ansis.underline.bold(m) : ansis.dim(m), + ) + .join(', ') + logger.warn( + `${ansis.green( + pathname, + )} matches ${matched} , but mock data is not found.`, + ) + + return next() + } + + const request = req as MockRequest + const response = res as MockResponse + + // provide request 往请求实例中注入额外的请求信息 + request.body = reqBody + request.query = query + request.refererQuery = refererQuery + request.params = parseRequestParams(mock.url, pathname) + request.getCookie = getCookie + + // provide response + response.setCookie = cookies.set.bind(cookies) + + const { + body, + delay, + type = 'json', + response: responseFn, + status = 200, + statusText, + log: logLevel, + __filepath__: filepath, + } = mock as MockHttpItem & { __filepath__: string } + + // provide headers + provideResponseStatus(response, status, statusText) + await provideResponseHeaders(request, response, mock, logger) + await provideResponseCookies(request, response, mock, logger) + + logger.info(requestLog(request, filepath), logLevel) + logger.debug( + `${ansis.magenta('DEBUG')} ${ansis.underline( + pathname, + )} matches: [ ${mockUrls + .map(m => m === _mockUrl ? ansis.underline.bold(m) : ansis.dim(m)) + .join(', ')} ]\n`, + ) + + if (body) { + try { + const content = isFunction(body) ? await body(request) : body + await responseRealDelay(startTime, delay) + sendResponseData(response, content, type) + } + catch (e) { + logger.error( + `${ansis.red( + `mock error at ${pathname}`, + )}\n${e}\n at body (${ansis.underline(filepath)})`, + logLevel, + ) + provideResponseStatus(response, 500) + res.end('') + } + return + } + + if (responseFn) { + try { + await responseRealDelay(startTime, delay) + await responseFn(request, response, next) + } + catch (e) { + logger.error( + `${ansis.red( + `mock error at ${pathname}`, + )}\n${e}\n at response (${ansis.underline(filepath)})`, + logLevel, + ) + provideResponseStatus(response, 500) + res.end('') + } + return + } + + res.end('') + } +} diff --git a/vite-plugin-mock-dev-server/src/core/request.ts b/vite-plugin-mock-dev-server/src/core/request.ts new file mode 100644 index 0000000..f30b851 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/request.ts @@ -0,0 +1,132 @@ +import type { MatchFunction } from 'path-to-regexp' +import type { Connect } from 'vite' +import type { BodyParserOptions, ExtraRequest, MockRequest } from '../types' +import { isEmptyObject } from '@pengzhanbo/utils' +import ansis from 'ansis' +import bodyParser from 'co-body' +import formidable from 'formidable' +import { match } from 'path-to-regexp' +import { isObjectSubset } from '../utils' + +/** + * 解析请求体 request.body + */ +export async function parseRequestBody( + req: Connect.IncomingMessage, + formidableOptions: formidable.Options, + bodyParserOptions: BodyParserOptions = {}, +): Promise { + const method = req.method!.toUpperCase() + if (['HEAD', 'OPTIONS'].includes(method)) + return undefined + const type = req.headers['content-type']?.toLocaleLowerCase() || '' + const { limit, formLimit, jsonLimit, textLimit, ...rest } = bodyParserOptions + try { + if (type.startsWith('application/json')) { + return await bodyParser.json(req, { + limit: jsonLimit || limit, + ...rest, + }) + } + + if (type.startsWith('application/x-www-form-urlencoded')) { + return await bodyParser.form(req, { + limit: formLimit || limit, + ...rest, + }) + } + + if (type.startsWith('text/plain')) { + return await bodyParser.text(req, { + limit: textLimit || limit, + ...rest, + }) + } + + if (type.startsWith('multipart/form-data')) + return await parseRequestBodyWithMultipart(req, formidableOptions) + } + catch (e) { + console.error(e) + } + return undefined +} + +const DEFAULT_FORMIDABLE_OPTIONS: formidable.Options = { + keepExtensions: true, + filename(name, ext, part) { + return part?.originalFilename || `${name}.${Date.now()}${ext ? `.${ext}` : ''}` + }, +} + +/** + * 解析 request form multipart body + */ +async function parseRequestBodyWithMultipart( + req: Connect.IncomingMessage, + options: formidable.Options, +): Promise { + const form = formidable({ ...DEFAULT_FORMIDABLE_OPTIONS, ...options }) + + return new Promise((resolve, reject) => { + form.parse(req, (error, fields, files) => { + if (error) { + reject(error) + return + } + resolve({ ...fields, ...files }) + }) + }) +} + +const matcherCache: Map>>> = new Map() + +/** + * 解析请求 url 中的动态参数 params + */ +export function parseRequestParams( + pattern: string, + url: string, +): Partial> { + let matcher = matcherCache.get(pattern) + if (!matcher) { + matcher = match(pattern, { decode: decodeURIComponent }) + matcherCache.set(pattern, matcher) + } + const matched = matcher(url) + return matched ? matched.params : {} +} + +/** + * 验证请求是否符合 validator + */ +export function requestValidate( + request: ExtraRequest, + validator: Partial, +): boolean { + return ( + isObjectSubset(request.headers, validator.headers) + && isObjectSubset(request.body, validator.body) + && isObjectSubset(request.params, validator.params) + && isObjectSubset(request.query, validator.query) + && isObjectSubset(request.refererQuery, validator.refererQuery) + ) +} + +function formatLog(prefix: string, data: any) { + return !data || isEmptyObject(data) + ? '' + : ` ${ansis.gray(`${prefix}:`)}${JSON.stringify(data)}` +} + +export function requestLog(request: MockRequest, filepath: string): string { + const { url, method, query, params, body } = request + let { pathname } = new URL(url!, 'http://example.com') + pathname = ansis.green(decodeURIComponent(pathname)) + const ms = ansis.magenta.bold(method) + const qs = formatLog('query', query) + const ps = formatLog('params', params) + const bs = formatLog('body', body) + const file = ` ${ansis.dim.underline(`(${filepath})`)}` + return `${ms} ${pathname}${qs}${ps}${bs}${file}` +} diff --git a/plugin/src/core/requestRecovery.ts b/vite-plugin-mock-dev-server/src/core/requestRecovery.ts similarity index 98% rename from plugin/src/core/requestRecovery.ts rename to vite-plugin-mock-dev-server/src/core/requestRecovery.ts index 77ccb72..ca56d45 100644 --- a/plugin/src/core/requestRecovery.ts +++ b/vite-plugin-mock-dev-server/src/core/requestRecovery.ts @@ -1,4 +1,3 @@ -import type { Connect, UserConfig } from 'vite' /** * 请求复原 * @@ -6,11 +5,14 @@ import type { Connect, UserConfig } from 'vite' * 导致当接口不需要被 mock,继而由 vite http-proxy 转发时,请求流无法继续。 * 为此,我们在请求流中记录请求数据,当当前请求无法继续时,可以从备份中恢复请求流 */ +import type { Connect, UserConfig } from 'vite' import { Buffer } from 'node:buffer' const cache = new WeakMap() -// 备份请求数据 +/** + * 备份请求数据 + */ export function collectRequest(req: Connect.IncomingMessage): void { const chunks: Buffer[] = [] req.addListener('data', (chunk) => { diff --git a/vite-plugin-mock-dev-server/src/core/response.ts b/vite-plugin-mock-dev-server/src/core/response.ts new file mode 100644 index 0000000..4c882d7 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/core/response.ts @@ -0,0 +1,143 @@ +import type { MockHttpItem, MockRequest, MockResponse, ResponseBody } from '../types' +import { Buffer } from 'node:buffer' +import { isArray, isFunction, random, sleep, timestamp } from '@pengzhanbo/utils' +import ansis from 'ansis' +import HTTP_STATUS from 'http-status' +import * as mime from 'mime-types' +import { isReadableStream, type Logger } from '../utils' + +/** + * 根据状态码获取状态文本 + */ +export function getHTTPStatusText(status: number): string { + return HTTP_STATUS[status as keyof typeof HTTP_STATUS] as string || 'Unknown' +} + +/** + * 设置响应状态 + */ +export function provideResponseStatus( + response: MockResponse, + status = 200, + statusText?: string, +): void { + response.statusCode = status + response.statusMessage = statusText || getHTTPStatusText(status) +} + +/** + * 设置响应头 + */ +export async function provideResponseHeaders( + req: MockRequest, + res: MockResponse, + mock: MockHttpItem, + logger: Logger, +): Promise { + const { headers, type = 'json' } = mock + const filepath = (mock as any).__filepath__ as string + const contentType + = mime.contentType(type) || mime.contentType(mime.lookup(type) || '') + + if (contentType) + res.setHeader('Content-Type', contentType) + + res.setHeader('Cache-Control', 'no-cache,max-age=0') + res.setHeader('X-Mock-Power-By', 'vite-plugin-mock-dev-server') + + if (filepath) + res.setHeader('X-File-Path', filepath) + + if (!headers) + return + + try { + const raw = isFunction(headers) ? await headers(req) : headers + Object.keys(raw).forEach((key) => { + res.setHeader(key, raw[key]!) + }) + } + catch (e) { + logger.error( + `${ansis.red( + `mock error at ${req.url!.split('?')[0]}`, + )}\n${e}\n at headers (${ansis.underline(filepath)})`, + mock.log, + ) + } +} + +/** + * 设置响应cookie + */ +export async function provideResponseCookies( + req: MockRequest, + res: MockResponse, + mock: MockHttpItem, + logger: Logger, +): Promise { + const { cookies } = mock + const filepath = (mock as any).__filepath__ as string + if (!cookies) + return + try { + const raw = isFunction(cookies) ? await cookies(req) : cookies + Object.keys(raw).forEach((key) => { + const cookie = raw[key] + if (isArray(cookie)) { + const [value, options] = cookie + res.setCookie(key, value, options) + } + else { + res.setCookie(key, cookie) + } + }) + } + catch (e) { + logger.error( + `${ansis.red( + `mock error at ${req.url!.split('?')[0]}`, + )}\n${e}\n at cookies (${ansis.underline(filepath)})`, + mock.log, + ) + } +} + +/** + * 设置响应数据 + */ +export function sendResponseData(res: MockResponse, raw: ResponseBody, type: string): void { + if (isReadableStream(raw)) { + raw.pipe(res) + } + else if (Buffer.isBuffer(raw)) { + res.end(type === 'text' || type === 'json' ? raw.toString('utf-8') : raw) + } + else { + const content = typeof raw === 'string' ? raw : JSON.stringify(raw) + res.end(type === 'buffer' ? Buffer.from(content) : content) + } +} + +/** + * 实际响应延迟 + */ +export async function responseRealDelay(startTime: number, delay?: MockHttpItem['delay']): Promise { + if ( + !delay + || (typeof delay === 'number' && delay <= 0) + || (isArray(delay) && delay.length !== 2) + ) { + return + } + let realDelay = 0 + if (isArray(delay)) { + const [min, max] = delay + realDelay = random(min, max) + } + else { + realDelay = delay - (timestamp() - startTime) + } + if (realDelay > 0) + await sleep(realDelay) +} diff --git a/plugin/src/core/ws.ts b/vite-plugin-mock-dev-server/src/core/ws.ts similarity index 90% rename from plugin/src/core/ws.ts rename to vite-plugin-mock-dev-server/src/core/ws.ts index 613c682..21e6e35 100644 --- a/plugin/src/core/ws.ts +++ b/vite-plugin-mock-dev-server/src/core/ws.ts @@ -13,18 +13,18 @@ import type { Server } from 'node:http' import type { Http2SecureServer } from 'node:http2' import type { WebSocket } from 'ws' +import type { Compiler } from '../compiler' +import type { ResolvedMockServerPluginOptions } from '../options' import type { MockRequest, MockWebsocketItem, WebSocketSetupContext, } from '../types' -import type { MockCompiler } from './mockCompiler' -import type { ResolvedMockServerPluginOptions } from './resolvePluginOptions' +import ansis from 'ansis' import Cookies from 'cookies' -import { pathToRegexp } from 'path-to-regexp' -import colors from 'picocolors' import { WebSocketServer } from 'ws' -import { doesProxyContextMatchUrl, parseParams, urlParse } from './utils' +import { doesProxyContextMatchUrl, isPathMatch, urlParse } from '../utils' +import { parseRequestParams } from './request' type PoolMap = Map type WSSMap = Map @@ -45,7 +45,7 @@ interface WSSContext { * mock websocket */ export function mockWebSocket( - compiler: MockCompiler, + compiler: Compiler, server: Server | Http2SecureServer | null, { wsProxies: proxies, @@ -95,7 +95,7 @@ export function mockWebSocket( wss.on('close', () => wssMap.delete(pathname)) wss.on('error', (e) => { logger.error( - `${colors.red( + `${ansis.red( `WebSocket mock error at ${wss.path}`, )}\n${e}\n at setup (${filepath})`, mock.log, @@ -104,7 +104,7 @@ export function mockWebSocket( } catch (e) { logger.error( - `${colors.red( + `${ansis.red( `WebSocket mock error at ${wss.path}`, )}\n${e}\n at setup (${filepath})`, mock.log, @@ -175,14 +175,12 @@ export function mockWebSocket( } const mockData = compiler.mockData - const mockUrl = Object.keys(mockData).find((key) => { - return pathToRegexp(key).test(pathname) - }) + const mockUrl = Object.keys(mockData).find(key => isPathMatch(key, pathname)) if (!mockUrl) return const mock = mockData[mockUrl].find((mock) => { - return mock.url && mock.ws && pathToRegexp(mock.url).test(pathname) + return mock.url && mock.ws && isPathMatch(mock.url, pathname) }) as MockWebsocketItem if (!mock) @@ -213,14 +211,14 @@ export function mockWebSocket( request.query = query request.refererQuery = refererQuery - request.params = parseParams(mockUrl, pathname) + request.params = parseRequestParams(mockUrl, pathname) request.getCookie = cookies.get.bind(cookies) wss.handleUpgrade(request, socket, head, (ws) => { logger.info( - `${colors.magenta(colors.bold('WebSocket'))} ${colors.green( + `${ansis.magenta.bold('WebSocket')} ${ansis.green( req.url, - )} connected ${colors.dim(`(${filepath})`)}`, + )} connected ${ansis.dim(`(${filepath})`)}`, mock.log, ) wssContext.connectionList.push({ req: request, ws }) diff --git a/plugin/src/core/sse.ts b/vite-plugin-mock-dev-server/src/helper/createSSEStream.ts similarity index 87% rename from plugin/src/core/sse.ts rename to vite-plugin-mock-dev-server/src/helper/createSSEStream.ts index a0f48ba..ad5061e 100644 --- a/plugin/src/core/sse.ts +++ b/vite-plugin-mock-dev-server/src/helper/createSSEStream.ts @@ -88,6 +88,22 @@ function dataString(data: string | object): string { return data.split(/\r\n|\r|\n/).map(line => `data: ${line}\n`).join('') } +/** + * 创建一个 Server-sent events 写入流,用于支持模拟 EventSource + * + * @example + * ```ts + * import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server' + * + * export default defineMock({ + * url: '/api', + * response: (req, res) => { + * const sse = createSSEStream(req, res) + * sse.write({ event: 'message', data: { message: 'hello world' } }) + * } + * }) + * ``` + */ export function createSSEStream(req: IncomingMessage, res: ServerResponse): SSEStream { const sse = new SSEStream(req) sse.pipe(res) diff --git a/plugin/src/core/defineMock.ts b/vite-plugin-mock-dev-server/src/helper/defineMock.ts similarity index 100% rename from plugin/src/core/defineMock.ts rename to vite-plugin-mock-dev-server/src/helper/defineMock.ts diff --git a/plugin/src/core/defineMockData.ts b/vite-plugin-mock-dev-server/src/helper/defineMockData.ts similarity index 100% rename from plugin/src/core/defineMockData.ts rename to vite-plugin-mock-dev-server/src/helper/defineMockData.ts diff --git a/vite-plugin-mock-dev-server/src/helper/index.ts b/vite-plugin-mock-dev-server/src/helper/index.ts new file mode 100644 index 0000000..a1563d2 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/helper/index.ts @@ -0,0 +1,4 @@ +export type * from '../types' +export * from './createSSEStream' +export * from './defineMock' +export * from './defineMockData' diff --git a/vite-plugin-mock-dev-server/src/index.ts b/vite-plugin-mock-dev-server/src/index.ts new file mode 100644 index 0000000..b1cea57 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/index.ts @@ -0,0 +1,14 @@ +import { mockDevServerPlugin } from './plugin' + +export * from './helper' +export * from './server' +export type { + FormidableFile, + MockHttpItem, + MockOptions, + MockRequest, + MockServerPluginOptions, + MockWebsocketItem, +} from './types' + +export { mockDevServerPlugin } diff --git a/plugin/src/core/resolvePluginOptions.ts b/vite-plugin-mock-dev-server/src/options.ts similarity index 68% rename from plugin/src/core/resolvePluginOptions.ts rename to vite-plugin-mock-dev-server/src/options.ts index 14207c6..15dca9b 100644 --- a/plugin/src/core/resolvePluginOptions.ts +++ b/vite-plugin-mock-dev-server/src/options.ts @@ -1,13 +1,12 @@ import type { CorsOptions } from 'cors' import type { Alias, AliasOptions, ResolvedConfig } from 'vite' -import type { MockServerPluginOptions, ServerBuildOption } from '../types' -import type { Logger } from './logger' +import type { MockServerPluginOptions, ServerBuildOption } from './types' +import type { Logger } from './utils' import process from 'node:process' import { isArray, isBoolean, toArray, uniq } from '@pengzhanbo/utils' -import color from 'picocolors' -import { viteDefine } from './define' -import { createLogger } from './logger' -import { ensureProxies } from './utils' +import ansis from 'ansis' +import { viteDefine } from './core' +import { createLogger } from './utils' export type ResolvedMockServerPluginOptions = Required< Omit @@ -26,8 +25,9 @@ export function resolvePluginOptions({ prefix = [], wsPrefix = [], cwd, - include = ['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}'], - exclude = ['**/node_modules/**', '**/.vscode/**', '**/.git/**'], + dir = 'mock', + include = ['**/*.mock.{js,ts,cjs,mjs,json,json5}'], + exclude = [], reload = false, log = 'info', cors = true, @@ -44,7 +44,7 @@ export function resolvePluginOptions({ const wsProxies = toArray(wsPrefix) if (!proxies.length && !wsProxies.length) - logger.warn(`No proxy was configured, mock server will not work. See ${color.cyan('https://vite-plugin-mock-dev-server.netlify.app/guide/usage')}`) + logger.warn(`No proxy was configured, mock server will not work. See ${ansis.cyan('https://vite-plugin-mock-dev-server.netlify.app/guide/usage')}`) // enable cors by default const enabled = cors === false ? false : config.server.cors !== false @@ -79,6 +79,7 @@ export function resolvePluginOptions({ return { cwd: cwd || process.cwd(), + dir, include, exclude, context: config.root, @@ -86,21 +87,16 @@ export function resolvePluginOptions({ cors: enabled ? corsOptions : false, cookiesOptions, log, - formidableOptions: { - multiples: true, - ...formidableOptions, - }, + formidableOptions: { multiples: true, ...formidableOptions }, bodyParserOptions, priority, build: build - ? Object.assign( - { - serverPort: 8080, - dist: 'mockServer', - log: 'error', - }, - typeof build === 'object' ? build : {}, - ) + ? { + serverPort: 8080, + dist: 'mockServer', + log: 'error', + ...typeof build === 'object' ? build : {}, + } : false, proxies, wsProxies, @@ -109,3 +105,25 @@ export function resolvePluginOptions({ define: viteDefine(config), } } + +export function ensureProxies( + serverProxy: ResolvedConfig['server']['proxy'] = {}, +): { httpProxies: string[], wsProxies: string[] } { + const httpProxies: string[] = [] + const wsProxies: string[] = [] + Object.keys(serverProxy).forEach((key) => { + const value = serverProxy[key] + if ( + typeof value === 'string' + || (!value.ws + && !value.target?.toString().startsWith('ws:') + && !value.target?.toString().startsWith('wss:')) + ) { + httpProxies.push(key) + } + else { + wsProxies.push(key) + } + }) + return { httpProxies, wsProxies } +} diff --git a/plugin/src/plugin.ts b/vite-plugin-mock-dev-server/src/plugin.ts similarity index 86% rename from plugin/src/plugin.ts rename to vite-plugin-mock-dev-server/src/plugin.ts index a7faebc..a13d7e8 100644 --- a/plugin/src/plugin.ts +++ b/vite-plugin-mock-dev-server/src/plugin.ts @@ -1,11 +1,9 @@ import type { Plugin, ResolvedConfig } from 'vite' -import type { ResolvedMockServerPluginOptions } from './core/resolvePluginOptions' import type { MockServerPluginOptions } from './types' import { toArray } from '@pengzhanbo/utils' -import { generateMockServer } from './core/build' -import { mockServerMiddleware } from './core/mockMiddleware' -import { recoverRequest } from './core/requestRecovery' -import { resolvePluginOptions } from './core/resolvePluginOptions' +import { generateMockServer } from './build' +import { initMockMiddlewares, recoverRequest } from './core' +import { type ResolvedMockServerPluginOptions, resolvePluginOptions } from './options' export function mockDevServerPlugin(options: MockServerPluginOptions = {}): Plugin[] { const plugins: Plugin[] = [serverPlugin(options)] @@ -74,7 +72,7 @@ export function serverPlugin( }, configureServer({ middlewares, httpServer, ws }) { - const middlewareList = mockServerMiddleware(resolvedOptions, httpServer, ws) + const middlewareList = initMockMiddlewares(resolvedOptions, httpServer, ws) middlewareList.forEach(middleware => middlewares.use(middleware)) }, @@ -83,7 +81,7 @@ export function serverPlugin( // pending... // feat: use preview server parameter in preview server hook #11647 // https://github.com/vitejs/vite/pull/11647 - const middlewareList = mockServerMiddleware(resolvedOptions, httpServer) + const middlewareList = initMockMiddlewares(resolvedOptions, httpServer) middlewareList.forEach(middleware => middlewares.use(middleware)) }, } diff --git a/vite-plugin-mock-dev-server/src/server.ts b/vite-plugin-mock-dev-server/src/server.ts new file mode 100644 index 0000000..1992ab7 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/server.ts @@ -0,0 +1,4 @@ +export * from './compiler/processData' +export * from './core/mockMiddleware' +export * from './core/ws' +export * from './utils/logger' diff --git a/plugin/src/types.ts b/vite-plugin-mock-dev-server/src/types.ts similarity index 99% rename from plugin/src/types.ts rename to vite-plugin-mock-dev-server/src/types.ts index 84e6faa..eefc90e 100644 --- a/plugin/src/types.ts +++ b/vite-plugin-mock-dev-server/src/types.ts @@ -49,6 +49,15 @@ export interface MockServerPluginOptions { */ cwd?: string + /** + * The directory to store mock files + * + * 存储 mock 文件的目录 + * + * @default 'mock' + */ + dir?: string + /** * glob string matching mock includes files * diff --git a/vite-plugin-mock-dev-server/src/utils/createMatcher.ts b/vite-plugin-mock-dev-server/src/utils/createMatcher.ts new file mode 100644 index 0000000..8290c9c --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/createMatcher.ts @@ -0,0 +1,25 @@ +import type { Matcher } from 'picomatch' +import { toArray } from '@pengzhanbo/utils' +import picomatch from 'picomatch' + +export function createMatcher( + include: string | string[], + exclude: string | string[], +): { + pattern: string[] + ignore: string[] + isMatch: Matcher +} { + const pattern: string[] = [] + const ignore: string[] = ['**/node_modules/**', ...toArray(exclude)] + toArray(include).forEach((item) => { + if (item[0] === '!') + ignore.push(item.slice(1)) + else + pattern.push(item) + }) + + const isMatch = picomatch(pattern, { ignore }) + + return { pattern, ignore, isMatch } +} diff --git a/vite-plugin-mock-dev-server/src/utils/doesProxyContextMatchUrl.ts b/vite-plugin-mock-dev-server/src/utils/doesProxyContextMatchUrl.ts new file mode 100644 index 0000000..2254e21 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/doesProxyContextMatchUrl.ts @@ -0,0 +1,9 @@ +export function doesProxyContextMatchUrl( + context: string, + url: string, +): boolean { + return ( + (context[0] === '^' && new RegExp(context).test(url)) + || url.startsWith(context) + ) +} diff --git a/vite-plugin-mock-dev-server/src/utils/index.ts b/vite-plugin-mock-dev-server/src/utils/index.ts new file mode 100644 index 0000000..6aa0037 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/index.ts @@ -0,0 +1,8 @@ +export * from './createMatcher' +export * from './doesProxyContextMatchUrl' +export * from './is' +export * from './isObjectSubset' +export * from './isPathMatch' +export * from './logger' +export * from './shared' +export * from './urlParse' diff --git a/vite-plugin-mock-dev-server/src/utils/is.ts b/vite-plugin-mock-dev-server/src/utils/is.ts new file mode 100644 index 0000000..dd2cf21 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/is.ts @@ -0,0 +1,14 @@ +import type { Readable, Stream } from 'node:stream' + +export function isStream(stream: unknown): stream is Stream { + return stream !== null + && typeof stream === 'object' + && typeof (stream as any).pipe === 'function' +} + +export function isReadableStream(stream: unknown): stream is Readable { + return isStream(stream) + && (stream as any).readable !== false + && typeof (stream as any)._read === 'function' + && typeof (stream as any)._readableState === 'object' +} diff --git a/plugin/src/core/validator.ts b/vite-plugin-mock-dev-server/src/utils/isObjectSubset.ts similarity index 75% rename from plugin/src/core/validator.ts rename to vite-plugin-mock-dev-server/src/utils/isObjectSubset.ts index 09fb34d..50362e6 100644 --- a/plugin/src/core/validator.ts +++ b/vite-plugin-mock-dev-server/src/utils/isObjectSubset.ts @@ -1,19 +1,5 @@ -import type { ExtraRequest } from '../types' import { isArray, isPlainObject } from '@pengzhanbo/utils' -export function validate( - request: ExtraRequest, - validator: Partial, -): boolean { - return ( - isObjectSubset(request.headers, validator.headers) - && isObjectSubset(request.body, validator.body) - && isObjectSubset(request.params, validator.params) - && isObjectSubset(request.query, validator.query) - && isObjectSubset(request.refererQuery, validator.refererQuery) - ) -} - /** * Checks if target object is a subset of source object. * That is, all properties and their corresponding values in target exist in source. diff --git a/vite-plugin-mock-dev-server/src/utils/isPathMatch.ts b/vite-plugin-mock-dev-server/src/utils/isPathMatch.ts new file mode 100644 index 0000000..c759521 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/isPathMatch.ts @@ -0,0 +1,15 @@ +import { pathToRegexp } from 'path-to-regexp' + +const cache: Map = new Map() + +/** + * 判断 path 是否匹配 pattern + */ +export function isPathMatch(pattern: string, path: string): boolean { + let regexp = cache.get(pattern) + if (!regexp) { + regexp = pathToRegexp(pattern).regexp + cache.set(pattern, regexp) + } + return regexp.test(path) +} diff --git a/plugin/src/core/logger.ts b/vite-plugin-mock-dev-server/src/utils/logger.ts similarity index 85% rename from plugin/src/core/logger.ts rename to vite-plugin-mock-dev-server/src/utils/logger.ts index dcfd23a..4670443 100644 --- a/plugin/src/core/logger.ts +++ b/vite-plugin-mock-dev-server/src/utils/logger.ts @@ -1,6 +1,6 @@ import type { LogLevel, LogType } from '../types' import { isBoolean } from '@pengzhanbo/utils' -import colors from 'picocolors' +import ansis from 'ansis' export interface Logger { debug: (msg: string, level?: boolean | LogLevel) => void @@ -30,13 +30,13 @@ export function createLogger( const method = type === 'info' || type === 'debug' ? 'log' : type const tag = type === 'debug' - ? colors.magenta(colors.bold(prefix)) + ? ansis.magenta.bold(prefix) : type === 'info' - ? colors.cyan(colors.bold(prefix)) + ? ansis.cyan.bold(prefix) : type === 'warn' - ? colors.yellow(colors.bold(prefix)) - : colors.red(colors.bold(prefix)) - const format = `${colors.dim( + ? ansis.yellow.bold(prefix) + : ansis.red.bold(prefix) + const format = `${ansis.dim( new Date().toLocaleTimeString(), )} ${tag} ${msg}` diff --git a/vite-plugin-mock-dev-server/src/utils/shared.ts b/vite-plugin-mock-dev-server/src/utils/shared.ts new file mode 100644 index 0000000..e15e398 --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/shared.ts @@ -0,0 +1,20 @@ +import os from 'node:os' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import Debug from 'debug' + +export function getDirname(importMetaUrl: string): string { + return path.dirname(fileURLToPath(importMetaUrl)) +} + +export const debug: Debug.Debugger = Debug('vite:mock-dev-server') + +const windowsSlashRE = /\\/g +const isWindows = os.platform() === 'win32' + +export function slash(p: string): string { + return p.replace(windowsSlashRE, '/') +} +export function normalizePath(id: string): string { + return path.posix.normalize(isWindows ? slash(id) : id) +} diff --git a/vite-plugin-mock-dev-server/src/utils/urlParse.ts b/vite-plugin-mock-dev-server/src/utils/urlParse.ts new file mode 100644 index 0000000..5a48a7b --- /dev/null +++ b/vite-plugin-mock-dev-server/src/utils/urlParse.ts @@ -0,0 +1,16 @@ +import type { ParsedUrlQuery } from 'node:querystring' +import { parse as queryParse } from 'node:querystring' + +/** + * nodejs 从 19.0.0 开始 弃用 url.parse,因此使用 url.parse 来解析 可能会报错, + * 使用 URL 来解析 + */ +export function urlParse(input: string): { + pathname: string + query: ParsedUrlQuery +} { + const url = new URL(input, 'http://example.com') + const pathname = decodeURIComponent(url.pathname) + const query = queryParse(url.search.replace(/^\?/, '')) + return { pathname, query } +} diff --git a/vite-plugin-mock-dev-server/tsdown.config.ts b/vite-plugin-mock-dev-server/tsdown.config.ts new file mode 100644 index 0000000..067819f --- /dev/null +++ b/vite-plugin-mock-dev-server/tsdown.config.ts @@ -0,0 +1,17 @@ +import type { UserConfig } from 'tsdown' +import { defineConfig } from 'tsdown' + +const tsdownConfig: UserConfig = defineConfig({ + entry: { + index: 'src/index.ts', + types: 'src/types.ts', + server: 'src/server.ts', + helper: 'src/helper/index.ts', + }, + shims: true, + sourcemap: false, + dts: true, + format: 'esm', +}) + +export default tsdownConfig diff --git a/vitest.config.ts b/vitest.config.ts index 2a0134e..b35db0b 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,6 +2,6 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { - include: ['test/**/*.spec.ts'], + include: ['vite-plugin-mock-dev-server/__tests__/**/*.spec.ts'], }, })