diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 463d204a..29960367 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -21,6 +21,6 @@ jobs: - run: pnpm install - name: Fix lint issues run: pnpm run lint:fix - - uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c + - uses: autofix-ci/action@551dded8c6cc8a1054039c8bc0b8b48c51dfc6ef with: commit-message: "chore: apply automated updates" diff --git a/CHANGELOG.md b/CHANGELOG.md index 27b46ede..889fcffa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## v3.4.0 + +[compare changes](https://github.com/unjs/consola/compare/v3.3.3...v3.4.0) + +### 🚀 Enhancements + +- Use upstream `@clack/prompts` ([#332](https://github.com/unjs/consola/pull/332)) + +### 🩹 Fixes + +- Calculate box width without escape sequence chars ([#336](https://github.com/unjs/consola/pull/336)) + +### 💅 Refactors + +- Keep prompt styles (cont. #332) ([#332](https://github.com/unjs/consola/issues/332)) + +### 📦 Build + +- Update exports for node16 typescript resolution ([#331](https://github.com/unjs/consola/pull/331)) + +### 🏡 Chore + +- Update deps ([9193d63](https://github.com/unjs/consola/commit/9193d63)) +- Apply automated updates ([fc8b9b9](https://github.com/unjs/consola/commit/fc8b9b9)) + +### ❤️ Contributors + +- Pooya Parsa ([@pi0](http://github.com/pi0)) +- Yongqi + ## v3.3.3 [compare changes](https://github.com/unjs/consola/compare/v3.3.2...v3.3.3) diff --git a/LICENSE b/LICENSE index 647a8346..12498077 100644 --- a/LICENSE +++ b/LICENSE @@ -22,7 +22,7 @@ SOFTWARE. --- -Prompt support is based on https://github.com/natemoo-re/clack +Prompt support is based on https://github.com/bombshell-dev/clack MIT License diff --git a/build.config.ts b/build.config.ts index 87e64a03..6454d8b7 100644 --- a/build.config.ts +++ b/build.config.ts @@ -11,6 +11,30 @@ export default defineBuildConfig({ output.exports = "named"; } + // Prompts theme + // https://github.com/bombshell-dev/clack/issues/36 + options.plugins.push({ + name: "@clack/prompts", + transform(code, id) { + if (id.endsWith("@clack/prompts/dist/index.mjs")) { + const replaces = [ + ["} $", "} $"], + [String.raw`"\u25C6","*"`, '"❯", ">"'], + [String.raw`"\u25A0","x"`, '"■", "x"'], + [String.raw`"\u25B2","x"`, '"▲", "x"'], + [String.raw`"\u25C7","o"`, '"✔", "√"'], + [String.raw`"\u250C","T"`, '""'], + [String.raw`"\u2502","|"`, '""'], + [String.raw`"\u2514","\u2014"`, '""'], + ] as const; + for (const [from, to] of replaces) { + code = code.replaceAll(from, to); + } + return code; + } + }, + }); + // Node.js 14 support // https://github.com/unjs/consola/issues/204 options.plugins.push({ diff --git a/examples/box.ts b/examples/box.ts index b461af6c..68c602c7 100644 --- a/examples/box.ts +++ b/examples/box.ts @@ -1,8 +1,13 @@ import { consola } from "./utils"; +import { colors } from "../src/utils"; function main() { consola.box(`I am the default banner`); + consola.box( + `${colors.red("I")} ${colors.yellowBright("am")} ${colors.yellow("the")} ${colors.green("rainbow")} ${colors.blue("banner")}`, + ); + consola.box({ title: "Box with options", message: `I am a banner with different options`, diff --git a/examples/prompt.mjs b/examples/prompt.mjs new file mode 100755 index 00000000..dda54472 --- /dev/null +++ b/examples/prompt.mjs @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +import { consola } from "../dist/index.mjs"; + +const name = await consola.prompt("What is your name?", { + placeholder: "Not sure", + initial: "java", + cancel: "undefined", +}); + +if (!name) { + process.exit(1); +} + +const confirmed = await consola.prompt("Do you want to continue?", { + type: "confirm", + cancel: "undefined", +}); + +if (!confirmed) { + process.exit(1); +} + +const projectType = await consola.prompt("Pick a project type.", { + type: "select", + options: [ + "JavaScript", + "TypeScript", + { label: "CoffeeScript", value: "CoffeeScript", hint: "oh no" }, + ], + cancel: "undefined", + initial: "TypeScript", +}); + +if (!projectType) { + process.exit(1); +} + +const tools = await consola.prompt("Select additional tools.", { + type: "multiselect", + required: false, + options: [ + { value: "eslint", label: "ESLint", hint: "recommended" }, + { value: "prettier", label: "Prettier" }, + { value: "gh-action", label: "GitHub Action" }, + ], + cancel: "undefined", + initial: ["eslint", "prettier"], +}); + +if (!tools) { + process.exit(1); +} + +consola.start("Creating project..."); +await new Promise((resolve) => setTimeout(resolve, 1000)); +consola.success("Project created!"); diff --git a/package.json b/package.json index 089873ca..d79423f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "consola", - "version": "3.3.3", + "version": "3.4.0", "description": "Elegant Console Wrapper", "keywords": [ "console", @@ -22,42 +22,77 @@ "exports": { ".": { "node": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./lib/index.cjs" + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./lib/index.cjs" + } }, "default": { - "types": "./dist/browser.d.ts", - "import": "./dist/browser.mjs", - "require": "./dist/browser.cjs" + "import": { + "types": "./dist/browser.d.mts", + "default": "./dist/browser.mjs" + }, + "require": { + "types": "./dist/browser.d.cts", + "default": "./dist/browser.cjs" + } } }, "./browser": { - "types": "./dist/browser.d.ts", - "import": "./dist/browser.mjs", - "require": "./dist/browser.cjs" + "import": { + "types": "./dist/browser.d.mts", + "default": "./dist/browser.mjs" + }, + "require": { + "types": "./dist/browser.d.cts", + "default": "./dist/browser.cjs" + } }, "./basic": { "node": { - "types": "./dist/basic.d.ts", - "import": "./dist/basic.mjs", - "require": "./dist/basic.cjs" + "import": { + "types": "./dist/basic.d.mts", + "default": "./dist/basic.mjs" + }, + "require": { + "types": "./dist/basic.d.cts", + "default": "./dist/basic.cjs" + } }, "default": { - "types": "./dist/browser.d.ts", - "import": "./dist/browser.mjs", - "require": "./dist/browser.cjs" + "import": { + "types": "./dist/browser.d.mts", + "default": "./dist/browser.mjs" + }, + "require": { + "types": "./dist/browser.d.cts", + "default": "./dist/browser.cjs" + } } }, "./core": { - "types": "./dist/core.d.ts", - "import": "./dist/core.mjs", - "require": "./dist/core.cjs" + "import": { + "types": "./dist/core.d.mts", + "default": "./dist/core.mjs" + }, + "require": { + "types": "./dist/core.d.cts", + "default": "./dist/core.cjs" + } }, "./utils": { - "types": "./dist/utils.d.ts", - "import": "./dist/utils.mjs", - "require": "./dist/utils.cjs" + "import": { + "types": "./dist/utils.d.mts", + "default": "./dist/utils.mjs" + }, + "require": { + "types": "./dist/utils.d.cts", + "default": "./dist/utils.cjs" + } } }, "main": "./lib/index.cjs", @@ -78,12 +113,13 @@ "test": "pnpm lint && pnpm vitest run --coverage" }, "devDependencies": { - "@clack/core": "^0.4.0", - "@types/node": "^22.10.2", + "@clack/core": "^0.4.1", + "@clack/prompts": "^0.9.1", + "@types/node": "^22.10.5", "@vitest/coverage-v8": "^2.1.8", "changelogen": "^0.5.7", "defu": "^6.1.4", - "eslint": "^9.17.0", + "eslint": "^9.18.0", "eslint-config-unjs": "^0.4.2", "is-unicode-supported": "^2.1.0", "jiti": "^2.4.2", @@ -93,12 +129,12 @@ "sisteransi": "^1.0.5", "std-env": "^3.8.0", "string-width": "^7.2.0", - "typescript": "^5.7.2", - "unbuild": "^3.0.1", + "typescript": "^5.7.3", + "unbuild": "^3.3.1", "vitest": "^2.1.8" }, "engines": { "node": "^14.18.0 || >=16.10.0" }, - "packageManager": "pnpm@9.12.3" + "packageManager": "pnpm@9.15.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 189c8e42..397948f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,17 @@ importers: .: devDependencies: '@clack/core': - specifier: ^0.4.0 - version: 0.4.0 + specifier: ^0.4.1 + version: 0.4.1 + '@clack/prompts': + specifier: ^0.9.1 + version: 0.9.1 '@types/node': - specifier: ^22.10.2 - version: 22.10.2 + specifier: ^22.10.5 + version: 22.10.5 '@vitest/coverage-v8': specifier: ^2.1.8 - version: 2.1.8(vitest@2.1.8(@types/node@22.10.2)) + version: 2.1.8(vitest@2.1.8(@types/node@22.10.5)) changelogen: specifier: ^0.5.7 version: 0.5.7(magicast@0.3.5) @@ -24,11 +27,11 @@ importers: specifier: ^6.1.4 version: 6.1.4 eslint: - specifier: ^9.17.0 - version: 9.17.0(jiti@2.4.2) + specifier: ^9.18.0 + version: 9.18.0(jiti@2.4.2) eslint-config-unjs: specifier: ^0.4.2 - version: 0.4.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + version: 0.4.2(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) is-unicode-supported: specifier: ^2.1.0 version: 2.1.0 @@ -54,14 +57,14 @@ importers: specifier: ^7.2.0 version: 7.2.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 unbuild: - specifier: ^3.0.1 - version: 3.0.1(typescript@5.7.2) + specifier: ^3.3.1 + version: 3.3.1(typescript@5.7.3) vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.2) + version: 2.1.8(@types/node@22.10.5) packages: @@ -73,20 +76,20 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.3': - resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -115,32 +118,35 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/standalone@7.26.4': - resolution: {integrity: sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==} + '@babel/standalone@7.26.5': + resolution: {integrity: sha512-vXbSrFq1WauHvOg/XWcjkF6r7wDSHbN3+3Aro6LYjfODpGw8dCyqqbUMRX5LXlgzVAUrTSN6JkepFiHhLKHV5Q==} engines: {node: '>=6.9.0'} '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@clack/core@0.4.0': - resolution: {integrity: sha512-YJCYBsyJfNDaTbvDUVSJ3SgSuPrcujarRgkJ5NLjexDZKvaOiVVJvAQYx8lIgG0qRT8ff0fPgqyBCVivanIZ+A==} + '@clack/core@0.4.1': + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + + '@clack/prompts@0.9.1': + resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -148,8 +154,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -160,8 +166,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -172,8 +178,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -184,8 +190,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -196,8 +202,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -208,8 +214,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -220,8 +226,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -232,8 +238,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -244,8 +250,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -256,8 +262,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -268,8 +274,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -280,8 +286,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -292,8 +298,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -304,8 +310,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -316,8 +322,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -328,8 +334,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -340,26 +346,32 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -370,8 +382,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -382,8 +394,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -394,8 +406,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -406,8 +418,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -418,8 +430,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -438,24 +450,24 @@ packages: resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.5': resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -547,8 +559,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + '@rollup/plugin-node-resolve@16.0.0': + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -574,98 +586,98 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] @@ -682,8 +694,8 @@ packages: '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/node@22.10.2': - resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -694,51 +706,51 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@typescript-eslint/eslint-plugin@8.18.1': - resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} + '@typescript-eslint/eslint-plugin@8.20.0': + resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.18.1': - resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} + '@typescript-eslint/parser@8.20.0': + resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.20.0': + resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.1': - resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + '@typescript-eslint/type-utils@8.20.0': + resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.20.0': + resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.20.0': + resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.20.0': + resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + '@typescript-eslint/visitor-keys@8.20.0': + resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@2.1.8': @@ -853,8 +865,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -885,8 +897,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001690: - resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + caniuse-lite@1.0.30001692: + resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} @@ -958,8 +970,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + consola@3.3.3: + resolution: {integrity: sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==} engines: {node: ^14.18.0 || >=16.10.0} convert-gitmoji@0.1.5: @@ -968,8 +980,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -1071,8 +1083,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} @@ -1081,8 +1093,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.75: - resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} + electron-to-chromium@1.5.80: + resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -1100,16 +1112,16 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true @@ -1155,8 +1167,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.18.0: + resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1202,8 +1214,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1212,8 +1224,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} @@ -1362,8 +1374,8 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-decimal@1.0.4: @@ -1597,13 +1609,13 @@ packages: engines: {node: '>=10'} hasBin: true - mkdist@2.1.0: - resolution: {integrity: sha512-FhJRzoA2GEZr7X9S8S8SR5BcuGwgGi6IZKnJUHlMkRHUBJAtTU3xfIIcHnK4t9M/B9zK1ffpE+vGSS1003R7Dw==} + mkdist@2.2.0: + resolution: {integrity: sha512-GfKwu4A2grXfhj2TZm4ydfzP515NaALqKaPq4WqaZ6NhEnD47BiIQPySoCTTvVqHxYcuqVkNdCXjYf9Bz1Y04Q==} hasBin: true peerDependencies: sass: ^1.83.0 typescript: '>=5.7.2' - vue: ^3.2.13 + vue: ^3.5.13 vue-tsc: ^1.8.27 || ^2.0.21 peerDependenciesMeta: sass: @@ -1615,8 +1627,8 @@ packages: vue-tsc: optional: true - mlly@1.7.3: - resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -1740,6 +1752,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.1: + resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -1758,15 +1773,15 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@1.3.0: + resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - postcss-calc@10.0.2: - resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + postcss-calc@10.1.0: + resolution: {integrity: sha512-uQ/LDGsf3mgsSUEXmAt3VsCSHR3aKqtEIkmB+4PhzYwRYOW5MZs/GhCCFpsOtJJkP6EC6uGipbrnaTjqaJZcJw==} engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: postcss: ^8.4.38 @@ -2017,8 +2032,8 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2154,8 +2169,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} @@ -2177,11 +2192,11 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -2195,26 +2210,26 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - typescript-eslint@8.18.1: - resolution: {integrity: sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==} + typescript-eslint@8.20.0: + resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - unbuild@3.0.1: - resolution: {integrity: sha512-03Fv1B8hmJzYCdL4TDgmgBg1WMU0CB5P2tBqPCW7XAvZG/l275m6JU/xf2tJ4yuUeHtmSzg1G387Te9nlsufFA==} + unbuild@3.3.1: + resolution: {integrity: sha512-/5OeeHmW1JlWEyQw3SPkB9BV16lzr6C5i8D+O17NLx6ETgvCZ3ZlyXfWkVVfG2YCsv8xAVQCqJNJtbEAGwHg7A==} hasBin: true peerDependencies: - typescript: ^5.7.2 + typescript: ^5.7.3 peerDependenciesMeta: typescript: optional: true @@ -2232,8 +2247,8 @@ packages: resolution: {integrity: sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==} hasBin: true - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2336,8 +2351,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -2358,20 +2373,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.3': {} + '@babel/compat-data@7.26.5': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -2380,26 +2395,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.3': + '@babel/generator@7.26.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.25.9': + '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.26.3 + '@babel/compat-data': 7.26.5 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.3 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -2408,7 +2423,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/traverse': 7.26.5 transitivePeerDependencies: - supports-color @@ -2421,188 +2436,197 @@ snapshots: '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/standalone@7.26.4': {} + '@babel/standalone@7.26.5': {} '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - '@babel/traverse@7.26.4': + '@babel/traverse@7.26.5': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@bcoe/v8-coverage@0.2.3': {} - '@clack/core@0.4.0': + '@clack/core@0.4.1': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 + '@clack/prompts@0.9.1': + dependencies: + '@clack/core': 0.4.1 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.0': + '@esbuild/aix-ppc64@0.24.2': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.0': + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.0': + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.0': + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.0': + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.0': + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.0': + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-ia32@0.24.2': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.0': + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@2.4.2))': dependencies: - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2615,7 +2639,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/core@0.10.0': dependencies: '@types/json-schema': 7.0.15 @@ -2633,12 +2657,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.18.0': {} '@eslint/object-schema@2.1.5': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.5': dependencies: + '@eslint/core': 0.10.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -2692,18 +2717,18 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/plugin-alias@5.1.1(rollup@4.28.1)': + '@rollup/plugin-alias@5.1.1(rollup@4.30.1)': optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/plugin-commonjs@28.0.2(rollup@4.28.1)': + '@rollup/plugin-commonjs@28.0.2(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.2(picomatch@4.0.2) @@ -2711,94 +2736,94 @@ snapshots: magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/plugin-json@6.1.0(rollup@4.28.1)': + '@rollup/plugin-json@6.1.0(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.28.1)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/plugin-replace@6.0.2(rollup@4.28.1)': + '@rollup/plugin-replace@6.0.2(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) magic-string: 0.30.17 optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/pluginutils@5.1.4(rollup@4.28.1)': + '@rollup/pluginutils@5.1.4(rollup@4.30.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true '@trysound/sax@0.2.0': {} @@ -2811,7 +2836,7 @@ snapshots: dependencies: '@types/unist': 2.0.11 - '@types/node@22.10.2': + '@types/node@22.10.5': dependencies: undici-types: 6.20.0 @@ -2821,84 +2846,84 @@ snapshots: '@types/unist@2.0.11': {} - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 - eslint: 9.17.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.20.0 + eslint: 9.18.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': + '@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.20.0 debug: 4.4.0 - eslint: 9.17.0(jiti@2.4.2) - typescript: 5.7.2 + eslint: 9.18.0(jiti@2.4.2) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.20.0': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 - '@typescript-eslint/type-utils@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.17.0(jiti@2.4.2) - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + eslint: 9.18.0(jiti@2.4.2) + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.20.0': {} - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': + '@typescript-eslint/utils@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.2) - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + eslint: 9.18.0(jiti@2.4.2) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.18.1': + '@typescript-eslint/visitor-keys@8.20.0': dependencies: - '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/types': 8.20.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.2))': + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.5))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -2912,7 +2937,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.2) + vitest: 2.1.8(@types/node@22.10.5) transitivePeerDependencies: - supports-color @@ -2923,13 +2948,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.5))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@22.10.2) + vite: 5.4.11(@types/node@22.10.5) '@vitest/pretty-format@2.1.8': dependencies: @@ -2996,8 +3021,8 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.49): dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001692 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -3023,12 +3048,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001690 - electron-to-chromium: 1.5.75 + caniuse-lite: 1.0.30001692 + electron-to-chromium: 1.5.80 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.2(browserslist@4.24.4) builtin-modules@3.3.0: {} @@ -3044,11 +3069,11 @@ snapshots: dotenv: 16.4.7 giget: 1.2.3 jiti: 1.21.7 - mlly: 1.7.3 + mlly: 1.7.4 ohash: 1.1.4 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.2.1 + pkg-types: 1.3.0 rc9: 2.1.2 optionalDependencies: magicast: 0.3.5 @@ -3059,12 +3084,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001692 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001690: {} + caniuse-lite@1.0.30001692: {} chai@5.1.2: dependencies: @@ -3083,18 +3108,18 @@ snapshots: dependencies: c12: 1.11.2(magicast@0.3.5) colorette: 2.0.20 - consola: 3.2.3 + consola: 3.3.3 convert-gitmoji: 0.1.5 mri: 1.2.0 node-fetch-native: 1.6.4 ofetch: 1.4.1 open: 10.1.0 pathe: 1.1.2 - pkg-types: 1.2.1 + pkg-types: 1.3.0 scule: 1.3.0 semver: 7.6.3 std-env: 3.8.0 - yaml: 2.6.1 + yaml: 2.7.0 transitivePeerDependencies: - magicast @@ -3124,7 +3149,7 @@ snapshots: citty@0.1.6: dependencies: - consola: 3.2.3 + consola: 3.3.3 clean-regexp@1.0.0: dependencies: @@ -3148,15 +3173,15 @@ snapshots: confbox@0.1.8: {} - consola@3.2.3: {} + consola@3.3.3: {} convert-gitmoji@0.1.5: {} convert-source-map@2.0.0: {} - core-js-compat@3.39.0: + core-js-compat@3.40.0: dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 cross-spawn@7.0.6: dependencies: @@ -3173,7 +3198,7 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-tree@2.2.1: @@ -3192,11 +3217,11 @@ snapshots: cssnano-preset-default@7.0.6(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 css-declaration-sorter: 7.2.0(postcss@8.4.49) cssnano-utils: 5.0.0(postcss@8.4.49) postcss: 8.4.49 - postcss-calc: 10.0.2(postcss@8.4.49) + postcss-calc: 10.1.0(postcss@8.4.49) postcss-colormin: 7.0.2(postcss@8.4.49) postcss-convert-values: 7.0.4(postcss@8.4.49) postcss-discard-comments: 7.0.3(postcss@8.4.49) @@ -3273,7 +3298,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -3283,7 +3308,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.75: {} + electron-to-chromium@1.5.80: {} emoji-regex@10.4.0: {} @@ -3297,7 +3322,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} esbuild@0.21.5: optionalDependencies: @@ -3325,32 +3350,33 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.0: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escalade@3.2.0: {} @@ -3358,33 +3384,33 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-unjs@0.4.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2): + eslint-config-unjs@0.4.2(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@eslint/js': 9.17.0 - eslint: 9.17.0(jiti@2.4.2) - eslint-plugin-markdown: 5.1.0(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-unicorn: 56.0.1(eslint@9.17.0(jiti@2.4.2)) + '@eslint/js': 9.18.0 + eslint: 9.18.0(jiti@2.4.2) + eslint-plugin-markdown: 5.1.0(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-unicorn: 56.0.1(eslint@9.18.0(jiti@2.4.2)) globals: 15.14.0 - typescript: 5.7.2 - typescript-eslint: 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + typescript: 5.7.3 + typescript-eslint: 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) transitivePeerDependencies: - supports-color - eslint-plugin-markdown@5.1.0(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-markdown@5.1.0(eslint@9.18.0(jiti@2.4.2)): dependencies: - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@56.0.1(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-unicorn@56.0.1(eslint@9.18.0(jiti@2.4.2)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) ci-info: 4.1.0 clean-regexp: 1.0.0 - core-js-compat: 3.39.0 - eslint: 9.17.0(jiti@2.4.2) + core-js-compat: 3.40.0 + eslint: 9.18.0(jiti@2.4.2) esquery: 1.6.0 globals: 15.14.0 indent-string: 4.0.0 @@ -3406,15 +3432,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@2.4.2): + eslint@9.18.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 + '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -3487,7 +3513,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -3499,7 +3525,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -3557,7 +3583,7 @@ snapshots: giget@1.2.3: dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.3.3 defu: 6.1.4 node-fetch-native: 1.6.4 nypm: 0.3.12 @@ -3632,7 +3658,7 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -3768,8 +3794,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 source-map-js: 1.2.1 make-dir@4.0.0: @@ -3835,29 +3861,29 @@ snapshots: mkdirp@1.0.4: {} - mkdist@2.1.0(typescript@5.7.2): + mkdist@2.2.0(typescript@5.7.3): dependencies: autoprefixer: 10.4.20(postcss@8.4.49) citty: 0.1.6 cssnano: 7.0.6(postcss@8.4.49) defu: 6.1.4 - esbuild: 0.24.0 + esbuild: 0.24.2 jiti: 1.21.7 - mlly: 1.7.3 + mlly: 1.7.4 pathe: 1.1.2 - pkg-types: 1.2.1 + pkg-types: 1.3.0 postcss: 8.4.49 postcss-nested: 7.0.2(postcss@8.4.49) semver: 7.6.3 tinyglobby: 0.2.10 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 - mlly@1.7.3: + mlly@1.7.4: dependencies: acorn: 8.14.0 - pathe: 1.1.2 - pkg-types: 1.2.1 + pathe: 2.0.1 + pkg-types: 1.3.0 ufo: 1.5.4 mri@1.2.0: {} @@ -3900,10 +3926,10 @@ snapshots: nypm@0.3.12: dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.3.3 execa: 8.0.1 pathe: 1.1.2 - pkg-types: 1.2.1 + pkg-types: 1.3.0 ufo: 1.5.4 ofetch@1.4.1: @@ -3989,6 +4015,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.1: {} + pathval@2.0.0: {} perfect-debounce@1.0.0: {} @@ -3999,23 +4027,23 @@ snapshots: picomatch@4.0.2: {} - pkg-types@1.2.1: + pkg-types@1.3.0: dependencies: confbox: 0.1.8 - mlly: 1.7.3 + mlly: 1.7.4 pathe: 1.1.2 pluralize@8.0.0: {} - postcss-calc@10.0.2(postcss@8.4.49): + postcss-calc@10.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 postcss-colormin@7.0.2(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.49 @@ -4023,7 +4051,7 @@ snapshots: postcss-convert-values@7.0.4(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 postcss: 8.4.49 postcss-value-parser: 4.2.0 @@ -4052,7 +4080,7 @@ snapshots: postcss-merge-rules@7.0.4(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 caniuse-api: 3.0.0 cssnano-utils: 5.0.0(postcss@8.4.49) postcss: 8.4.49 @@ -4072,7 +4100,7 @@ snapshots: postcss-minify-params@7.0.2(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 cssnano-utils: 5.0.0(postcss@8.4.49) postcss: 8.4.49 postcss-value-parser: 4.2.0 @@ -4119,7 +4147,7 @@ snapshots: postcss-normalize-unicode@7.0.2(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 postcss: 8.4.49 postcss-value-parser: 4.2.0 @@ -4141,7 +4169,7 @@ snapshots: postcss-reduce-initial@7.0.2(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 caniuse-api: 3.0.0 postcss: 8.4.49 @@ -4227,43 +4255,43 @@ snapshots: resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} - rollup-plugin-dts@6.1.1(rollup@4.28.1)(typescript@5.7.2): + rollup-plugin-dts@6.1.1(rollup@4.30.1)(typescript@5.7.3): dependencies: magic-string: 0.30.17 - rollup: 4.28.1 - typescript: 5.7.2 + rollup: 4.30.1 + typescript: 5.7.3 optionalDependencies: '@babel/code-frame': 7.26.2 - rollup@4.28.1: + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -4355,7 +4383,7 @@ snapshots: stylehacks@7.0.4(postcss@8.4.49): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 postcss: 8.4.49 postcss-selector-parser: 6.1.2 @@ -4394,7 +4422,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.1: {} + tinyexec@0.3.2: {} tinyglobby@0.2.10: dependencies: @@ -4411,9 +4439,9 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@2.0.0(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 type-check@0.4.0: dependencies: @@ -4423,48 +4451,47 @@ snapshots: type-fest@0.8.1: {} - typescript-eslint@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2): + typescript-eslint@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.2) - typescript: 5.7.2 + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.18.0(jiti@2.4.2) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript@5.7.2: {} + typescript@5.7.3: {} ufo@1.5.4: {} - unbuild@3.0.1(typescript@5.7.2): + unbuild@3.3.1(typescript@5.7.3): dependencies: - '@rollup/plugin-alias': 5.1.1(rollup@4.28.1) - '@rollup/plugin-commonjs': 28.0.2(rollup@4.28.1) - '@rollup/plugin-json': 6.1.0(rollup@4.28.1) - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.28.1) - '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/plugin-alias': 5.1.1(rollup@4.30.1) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.30.1) + '@rollup/plugin-json': 6.1.0(rollup@4.30.1) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.30.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) citty: 0.1.6 - consola: 3.2.3 + consola: 3.3.3 defu: 6.1.4 - esbuild: 0.24.0 + esbuild: 0.24.2 hookable: 5.5.3 jiti: 2.4.2 magic-string: 0.30.17 - mkdist: 2.1.0(typescript@5.7.2) - mlly: 1.7.3 - pathe: 1.1.2 - pkg-types: 1.2.1 + mkdist: 2.2.0(typescript@5.7.3) + mlly: 1.7.4 + pathe: 2.0.1 + pkg-types: 1.3.0 pretty-bytes: 6.1.1 - rollup: 4.28.1 - rollup-plugin-dts: 6.1.1(rollup@4.28.1)(typescript@5.7.2) + rollup: 4.30.1 + rollup-plugin-dts: 6.1.1(rollup@4.30.1)(typescript@5.7.3) scule: 1.3.0 tinyglobby: 0.2.10 - ufo: 1.5.4 untyped: 1.5.2 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - sass - supports-color @@ -4482,8 +4509,8 @@ snapshots: untyped@1.5.2: dependencies: '@babel/core': 7.26.0 - '@babel/standalone': 7.26.4 - '@babel/types': 7.26.3 + '@babel/standalone': 7.26.5 + '@babel/types': 7.26.5 citty: 0.1.6 defu: 6.1.4 jiti: 2.4.2 @@ -4492,9 +4519,9 @@ snapshots: transitivePeerDependencies: - supports-color - update-browserslist-db@1.1.1(browserslist@4.24.3): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -4509,13 +4536,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@2.1.8(@types/node@22.10.2): + vite-node@2.1.8(@types/node@22.10.5): dependencies: cac: 6.7.14 debug: 4.4.0 - es-module-lexer: 1.5.4 + es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.11(@types/node@22.10.2) + vite: 5.4.11(@types/node@22.10.5) transitivePeerDependencies: - '@types/node' - less @@ -4527,19 +4554,19 @@ snapshots: - supports-color - terser - vite@5.4.11(@types/node@22.10.2): + vite@5.4.11(@types/node@22.10.5): dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.1 + rollup: 4.30.1 optionalDependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.10.2): + vitest@2.1.8(@types/node@22.10.5): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)) + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.5)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -4552,14 +4579,14 @@ snapshots: pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 - tinyexec: 0.3.1 + tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.10.2) - vite-node: 2.1.8(@types/node@22.10.2) + vite: 5.4.11(@types/node@22.10.5) + vite-node: 2.1.8(@types/node@22.10.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 transitivePeerDependencies: - less - lightningcss @@ -4598,6 +4625,6 @@ snapshots: yallist@4.0.0: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yocto-queue@0.1.0: {} diff --git a/src/prompt.ts b/src/prompt.ts index e24f21fd..8aee0e31 100644 --- a/src/prompt.ts +++ b/src/prompt.ts @@ -1,4 +1,4 @@ -import { text, confirm, select, multiselect } from "./utils/prompt"; +import { text, confirm, select, multiselect } from "@clack/prompts"; type SelectOption = { label: string; diff --git a/src/utils/box.ts b/src/utils/box.ts index 7fc069a3..dba957ff 100644 --- a/src/utils/box.ts +++ b/src/utils/box.ts @@ -256,7 +256,8 @@ export function box(text: string, _opts: BoxOpts = {}) { opts.style.padding % 2 === 0 ? opts.style.padding : opts.style.padding + 1; const height = textLines.length + paddingOffset; const width = - Math.max(...textLines.map((line) => line.length)) + paddingOffset; + Math.max(...textLines.map((line) => stripAnsi(line).length)) + + paddingOffset; const widthOffset = width + paddingOffset; const leftSpace = diff --git a/src/utils/prompt.ts b/src/utils/prompt.ts deleted file mode 100644 index af7ac2d5..00000000 --- a/src/utils/prompt.ts +++ /dev/null @@ -1,1084 +0,0 @@ -/** - * Based on https://github.com/natemoo-re/clack - * Read LICENSE file for more information - * https://github.com/natemoo-re/clack/blob/593f93d06c1a53c8424e9aaf0c1c63fbf6975527/packages/prompts/src/index.ts - */ - -import { - block, - ConfirmPrompt, - GroupMultiSelectPrompt, - isCancel, - MultiSelectPrompt, - PasswordPrompt, - SelectKeyPrompt, - SelectPrompt, - State, - TextPrompt, -} from "@clack/core"; - -import isUnicodeSupported from "is-unicode-supported"; - -import { cursor, erase } from "sisteransi"; - -import { colors as color } from "./color"; - -export { isCancel } from "@clack/core"; - -const unicode = isUnicodeSupported(); -/** - * Checks if the environment supports Unicode and selects symbols accordingly. - * @param {string} c - The preferred unicode symbol. - * @param {string} fallback - The fallback symbol if Unicode is not supported. - * @returns {string} The selected symbol based on Unicode support. - */ -const s = (c: string, fallback: string) => (unicode ? c : fallback); -const S_STEP_ACTIVE = s("❯", ">"); -const S_STEP_CANCEL = s("■", "x"); -const S_STEP_ERROR = s("▲", "x"); -const S_STEP_SUBMIT = s("✔", "√"); - -const S_BAR_START = ""; // s("┌", "T"); -const S_BAR = ""; // s("│", "|"); -const S_BAR_END = ""; // s("└", "—"); - -const S_RADIO_ACTIVE = s("●", ">"); -const S_RADIO_INACTIVE = s("○", " "); -const S_CHECKBOX_ACTIVE = s("◻", "[•]"); -const S_CHECKBOX_SELECTED = s("◼", "[+]"); -const S_CHECKBOX_INACTIVE = s("◻", "[ ]"); -const S_PASSWORD_MASK = s("▪", "•"); - -const S_BAR_H = s("─", "-"); -const S_CORNER_TOP_RIGHT = s("╮", "+"); -const S_CONNECT_LEFT = s("├", "+"); -const S_CORNER_BOTTOM_RIGHT = s("╯", "+"); - -const S_INFO = s("●", "•"); -const S_SUCCESS = s("◆", "*"); -const S_WARN = s("▲", "!"); -const S_ERROR = s("■", "x"); - -const symbol = (state: State) => { - switch (state) { - case "initial": - case "active": { - return color.cyan(S_STEP_ACTIVE); - } - case "cancel": { - return color.red(S_STEP_CANCEL); - } - case "error": { - return color.yellow(S_STEP_ERROR); - } - case "submit": { - return color.green(S_STEP_SUBMIT); - } - } -}; - -export interface TextOptions { - /** - * The primary message to display for the prompt. - */ - message: string; - - /** - * A placeholder string that is displayed in the input field when it is empty. It disappears when the user starts typing. - * @optional - */ - placeholder?: string; - - /** - * The primary message to display for the prompt. - * A default value for the input field.This value will be returned if the user does not enter a value. - * @optional - */ - defaultValue?: string; - - /** - * An initial value that appears in the input field. Unlike `defaultValue`, it can be edited or removed by the user. - * @optional - */ - initialValue?: string; - - /** - * A function to validate the input. If the input is not valid, this function should return a string message. - * The prompt will continue until a valid value is entered or the prompt is aborted. - * @param {string} value - The current value of the input field. - * @returns {string | void} A string with an error message if validation fails or `void` if the input is valid. - * optional - */ - validate?: (value: string) => string | void; -} -/** - * Provides text input functionality with customisable options. - * @param {TextOptions} opts - Options to customise the text prompt. See {@link TextOptions}. - * @returns {Promise} A promise that resolves to the user input or a symbol for special cases. - */ -export const text = (opts: TextOptions) => { - return new TextPrompt({ - validate: opts.validate, - placeholder: opts.placeholder, - defaultValue: opts.defaultValue, - initialValue: opts.initialValue, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - const placeholder = opts.placeholder - ? color.inverse(opts.placeholder[0]) + - color.dim(opts.placeholder.slice(1)) - : color.inverse(color.hidden("_")); - const value = this.value ? this.valueWithCursor : placeholder; - - switch (this.state) { - case "error": { - return `${title.trim()}\n${color.yellow( - S_BAR, - )} ${value}\n${color.yellow(S_BAR_END)} ${color.yellow( - this.error, - )}\n`; - } - case "submit": { - return `${title}${color.gray(S_BAR)} ${color.dim( - this.value || opts.placeholder, - )}`; - } - case "cancel": { - return `${title}${color.gray(S_BAR)} ${color.strikethrough( - color.dim(this.value ?? ""), - )}${this.value?.trim() ? "\n" + color.gray(S_BAR) : ""}`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${value}\n${color.cyan( - S_BAR_END, - )}\n`; - } - } - }, - }).prompt() as Promise; -}; - -export interface PasswordOptions { - /** - * The message to be displayed above the input field. - */ - message: string; - - /** - * A character that masks the user's input, hiding the text they type. - * @optional - */ - mask?: string; - - /** - * A function to validate the input. Returns an error message if the input fails validation. - * @param {string} value - The current value of the input field. - * @returns {string | void} An error message if the input fails validation, or `void` if the input is valid. - * @optional - */ - validate?: (value: string) => string | void; -} -/** - * Provides password input functionality with customisable options, including input masking. - * @param {PasswordOptions} opts - Options to customise the password prompt. See {@link PasswordOptions}. - * @returns {Promise} A promise that resolves to the user input or a symbol for special cases. - */ -export const password = (opts: PasswordOptions) => { - return new PasswordPrompt({ - validate: opts.validate, - mask: opts.mask ?? S_PASSWORD_MASK, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - const value = this.valueWithCursor; - const masked = this.masked; - - switch (this.state) { - case "error": { - return `${title.trim()}\n${color.yellow( - S_BAR, - )} ${masked}\n${color.yellow(S_BAR_END)} ${color.yellow( - this.error, - )}\n`; - } - case "submit": { - return `${title}${color.gray(S_BAR)} ${color.dim(masked)}`; - } - case "cancel": { - return `${title}${color.gray(S_BAR)} ${color.strikethrough( - color.dim(masked ?? ""), - )}${masked ? "\n" + color.gray(S_BAR) : ""}`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${value}\n${color.cyan( - S_BAR_END, - )}\n`; - } - } - }, - }).prompt() as Promise; -}; - -export interface ConfirmOptions { - /** - * The primary message to display for the prompt. - */ - message: string; - - /** - * The text to display for the active/affirmative choice. - * @optional - */ - active?: string; - - /** - * Text to display for the inactive/negative choice. - * @optional - */ - inactive?: string; - - /** - * The initial selection value. - * @optional - */ - initialValue?: boolean; -} -/** - * Provides a confirmation prompt with customisable options. - * @param {ConfirmOptions} opts - Options to customise the confirmation prompt. See {@link ConfirmOptions}. - * @returns {Promise} A promise that resolves to the user's choice, or a symbol for special cases. - */ -export const confirm = (opts: ConfirmOptions) => { - const active = opts.active ?? "Yes"; - const inactive = opts.inactive ?? "No"; - return new ConfirmPrompt({ - active, - inactive, - initialValue: opts.initialValue ?? true, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - const value = this.value ? active : inactive; - - switch (this.state) { - case "submit": { - return `${title}${color.gray(S_BAR)} ${color.dim(value)}`; - } - case "cancel": { - return `${title}${color.gray(S_BAR)} ${color.strikethrough( - color.dim(value), - )}\n${color.gray(S_BAR)}`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${ - this.value - ? `${color.green(S_RADIO_ACTIVE)} ${active}` - : `${color.dim(S_RADIO_INACTIVE)} ${color.dim(active)}` - } ${color.dim("/")} ${ - this.value - ? `${color.dim(S_RADIO_INACTIVE)} ${color.dim(inactive)}` - : `${color.green(S_RADIO_ACTIVE)} ${inactive}` - }\n${color.cyan(S_BAR_END)}\n`; - } - } - }, - }).prompt() as Promise; -}; - -/** - * A generic type for option values in a select prompt, supporting both primitive and complex types. - */ -type Primitive = Readonly; - -/** - * Defines the structure of an option in a select prompt. - */ -type Option = Value extends Primitive - ? { value: Value; label?: string; hint?: string } // For primitive types - : { value: Value; label: string; hint?: string }; // For complex types - -/** - * Options for configuring the select prompt. - * @template Options - An array of option objects. See {@link Option}. - * @template Value - The type of option value. See {@link Option}. - */ -export interface SelectOptions[], Value> { - /** - * The primary message to display at the prompt. - */ - message: string; - - /** - * The list of options from which the user can choose. See {@link Option}. - */ - options: Options; - - /** - * The initial value selected in the prompt. See {@link Value}. - * @optional - */ - initialValue?: Value; -} -/** - * Provides a select prompt functionality where the user can choose from a list of options. - * @param {SelectOptions} opts - Options to customise the select prompt. See {@link SelectOptions}. - * @returns {Promise} A promise that resolves to the selected value or a symbol for special cases. See {@link Value}. - */ -export const select = [], Value>( - opts: SelectOptions, -) => { - const opt = ( - option: Option, - state: "inactive" | "active" | "selected" | "cancelled", - ) => { - const label = option.label ?? String(option.value); - switch (state) { - case "active": { - return `${color.green(S_RADIO_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : "" - }`; - } - case "selected": { - return `${color.dim(label)}`; - } - case "cancelled": { - return `${color.strikethrough(color.dim(label))}`; - } - // No default - } - return `${color.dim(S_RADIO_INACTIVE)} ${color.dim(label)}`; - }; - - return new SelectPrompt({ - options: opts.options, - initialValue: opts.initialValue, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - - switch (this.state) { - case "submit": { - return `${title}${color.gray(S_BAR)} ${opt( - this.options[this.cursor], - "selected", - )}`; - } - case "cancel": { - return `${title}${color.gray(S_BAR)} ${opt( - this.options[this.cursor], - "cancelled", - )}\n${color.gray(S_BAR)}`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${this.options - .map((option, i) => - opt(option, i === this.cursor ? "active" : "inactive"), - ) - .join(`\n${color.cyan(S_BAR)} `)}\n${color.cyan(S_BAR_END)}\n`; - } - } - }, - }).prompt() as Promise; -}; - -/** - * Provides a prompt that allows the user to select an option by pressing a key. - * This is useful for scenarios where each option is associated with a specific key. - * @param {SelectOptions} opts - Configuration options for the select key prompt. See {@link SelectOptions}. - * @returns {Promise} A promise that resolves to the value of the selected option, or a symbol for special cases such as abort. See {@link Value}. - */ -export const selectKey = < - Options extends Option[], - Value extends string, ->( - opts: SelectOptions, -) => { - const opt = ( - option: Option, - state: "inactive" | "active" | "selected" | "cancelled" = "inactive", - ) => { - const label = option.label ?? String(option.value); - switch (state) { - case "selected": { - return `${color.dim(label)}`; - } - case "cancelled": { - return `${color.strikethrough(color.dim(label))}`; - } - case "active": { - return `${color.bgCyan(color.gray(` ${option.value} `))} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : "" - }`; - } - // No default - } - return `${color.gray( - color.bgWhite(color.inverse(` ${option.value} `)), - )} ${label} ${option.hint ? color.dim(`(${option.hint})`) : ""}`; - }; - - return new SelectKeyPrompt({ - options: opts.options, - initialValue: opts.initialValue, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - - switch (this.state) { - case "submit": { - return `${title}${color.gray(S_BAR)} ${opt( - this.options.find((opt) => opt.value === this.value)!, - "selected", - )}`; - } - case "cancel": { - return `${title}${color.gray(S_BAR)} ${opt( - this.options[0], - "cancelled", - )}\n${color.gray(S_BAR)}`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${this.options - .map((option, i) => - opt(option, i === this.cursor ? "active" : "inactive"), - ) - .join(`\n${color.cyan(S_BAR)} `)}\n${color.cyan(S_BAR_END)}\n`; - } - } - }, - }).prompt() as Promise; -}; - -export interface MultiSelectOptions[], Value> { - /** - * The primary message to be displayed above the multi-select list. - */ - message: string; - - /** - * The list of options from which users can select multiple items. See {@link Option}. - */ - options: Options; - - /** - * An array of values representing the options initially selected in the prompt. See {@link Value}. - * @optional - */ - initialValues?: Value[]; - - /** - * Specifies whether at least one selection is required before submitting. - * @optional - */ - required?: boolean; - - /** - * The value of the option on which the cursor is initially placed when the command prompt opens. See {@link Value}. - * @optional - */ - cursorAt?: Value; -} -/** - * Provides multi-select prompt functionality where the user can select multiple options from a list. - * @param {MultiSelectOptions} opts - Options to customise the multi-select prompt. See {@link MultiSelectOptions}. - * @returns {Promise} A promise that resolves to an array of selected values, or a symbol for special cases. - */ -export const multiselect = [], Value>( - opts: MultiSelectOptions, -) => { - const opt = ( - option: Option, - state: - | "inactive" - | "active" - | "selected" - | "active-selected" - | "submitted" - | "cancelled", - ) => { - const label = option.label ?? String(option.value); - switch (state) { - case "active": { - return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : "" - }`; - } - case "selected": { - return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`; - } - case "cancelled": { - return `${color.strikethrough(color.dim(label))}`; - } - case "active-selected": { - return `${color.green(S_CHECKBOX_SELECTED)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : "" - }`; - } - case "submitted": { - return `${color.dim(label)}`; - } - // No default - } - return `${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`; - }; - - return new MultiSelectPrompt({ - options: opts.options, - initialValues: opts.initialValues, - required: opts.required ?? true, - cursorAt: opts.cursorAt, - validate(selected: Value[]) { - if (this.required && selected.length === 0) { - return `Please select at least one option.\n${color.reset( - color.dim( - `Press ${color.gray( - color.bgWhite(color.inverse(" space ")), - )} to select, ${color.gray( - color.bgWhite(color.inverse(" enter ")), - )} to submit`, - ), - )}`; - } - }, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - - switch (this.state) { - case "submit": { - return `${title}${color.gray(S_BAR)} ${ - this.options - .filter(({ value }) => this.value.includes(value)) - .map((option) => opt(option, "submitted")) - .join(color.dim(", ")) || color.dim("none") - }`; - } - case "cancel": { - const label = this.options - .filter(({ value }) => this.value.includes(value)) - .map((option) => opt(option, "cancelled")) - .join(color.dim(", ")); - return `${title}${color.gray(S_BAR)} ${ - label.trim() ? `${label}\n${color.gray(S_BAR)}` : "" - }`; - } - case "error": { - const footer = this.error - .split("\n") - .map((ln, i) => - i === 0 - ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` - : ` ${ln}`, - ) - .join("\n"); - return ( - title + - color.yellow(S_BAR) + - " " + - this.options - .map((option, i) => { - const selected = this.value.includes(option.value); - const active = i === this.cursor; - if (active && selected) { - return opt(option, "active-selected"); - } - if (selected) { - return opt(option, "selected"); - } - return opt(option, active ? "active" : "inactive"); - }) - .join(`\n${color.yellow(S_BAR)} `) + - "\n" + - footer + - "\n" - ); - } - default: { - return `${title}${color.cyan(S_BAR)} ${this.options - .map((option, i) => { - const selected = this.value.includes(option.value); - const active = i === this.cursor; - if (active && selected) { - return opt(option, "active-selected"); - } - if (selected) { - return opt(option, "selected"); - } - return opt(option, active ? "active" : "inactive"); - }) - .join(`\n${color.cyan(S_BAR)} `)}\n${color.cyan(S_BAR_END)}\n`; - } - } - }, - }).prompt() as Promise; -}; - -export interface GroupMultiSelectOptions< - Options extends Option[], - Value, -> { - /** - * The primary message to be displayed above the group multi-select list. - */ - message: string; - - /** - * An object containing groups of options. Each key represents a group name, - * and the associated value is an array of options within that group. See {@link Option}. - */ - options: Record; - - /** - * An array of values representing the initially selected options across all groups. See {@link Value}. - * @optional - */ - initialValues?: Value[]; - - /** - * Specifies whether at least one selection is required before submission is allowed. - * @optional - */ - required?: boolean; - - /** - * The value of the option on which the cursor will initially appear when the command prompt opens. See {@link Value}. - * @optional - */ - cursorAt?: Value; -} -export const groupMultiselect = [], Value>( - opts: GroupMultiSelectOptions, -) => { - const opt = ( - option: Option, - state: - | "inactive" - | "active" - | "selected" - | "active-selected" - | "group-active" - | "group-active-selected" - | "submitted" - | "cancelled", - options: Option[] = [], - ) => { - const label = option.label ?? String(option.value); - const isItem = typeof (option as any).group === "string"; - const next = - isItem && (options[options.indexOf(option) + 1] ?? { group: true }); - const isLast = isItem && (next as any).group === true; - const prefix = isItem ? `${isLast ? S_BAR_END : S_BAR} ` : ""; - - switch (state) { - case "active": { - return `${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : "" - }`; - } - case "group-active": { - return `${prefix}${color.cyan(S_CHECKBOX_ACTIVE)} ${color.dim(label)}`; - } - case "group-active-selected": { - return `${prefix}${color.green(S_CHECKBOX_SELECTED)} ${color.dim( - label, - )}`; - } - case "selected": { - return `${color.dim(prefix)}${color.green( - S_CHECKBOX_SELECTED, - )} ${color.dim(label)}`; - } - case "cancelled": { - return `${color.strikethrough(color.dim(label))}`; - } - case "active-selected": { - return `${color.dim(prefix)}${color.green( - S_CHECKBOX_SELECTED, - )} ${label} ${option.hint ? color.dim(`(${option.hint})`) : ""}`; - } - case "submitted": { - return `${color.dim(label)}`; - } - // No default - } - return `${color.dim(prefix)}${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim( - label, - )}`; - }; - - return new GroupMultiSelectPrompt({ - options: opts.options, - initialValues: opts.initialValues, - required: opts.required ?? true, - cursorAt: opts.cursorAt, - validate(selected: Value[]) { - if (this.required && selected.length === 0) { - return `Please select at least one option.\n${color.reset( - color.dim( - `Press ${color.gray( - color.bgWhite(color.inverse(" space ")), - )} to select, ${color.gray( - color.bgWhite(color.inverse(" enter ")), - )} to submit`, - ), - )}`; - } - }, - render() { - const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${ - opts.message - }\n`; - - switch (this.state) { - case "submit": { - return `${title}${color.gray(S_BAR)} ${this.options - .filter(({ value }) => this.value.includes(value)) - .map((option) => opt(option, "submitted")) - .join(color.dim(", "))}`; - } - case "cancel": { - const label = this.options - .filter(({ value }) => this.value.includes(value)) - .map((option) => opt(option, "cancelled")) - .join(color.dim(", ")); - return `${title}${color.gray(S_BAR)} ${ - label.trim() ? `${label}\n${color.gray(S_BAR)}` : "" - }`; - } - case "error": { - const footer = this.error - .split("\n") - .map((ln, i) => - i === 0 - ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` - : ` ${ln}`, - ) - .join("\n"); - return `${title}${color.yellow(S_BAR)} ${this.options - .map((option, i, options) => { - const selected = - this.value.includes(option.value) || - (option.group === true && - this.isGroupSelected(`${option.value}`)); - const active = i === this.cursor; - const groupActive = - !active && - typeof option.group === "string" && - this.options[this.cursor].value === option.group; - if (groupActive) { - return opt( - option, - selected ? "group-active-selected" : "group-active", - options, - ); - } - if (active && selected) { - return opt(option, "active-selected", options); - } - if (selected) { - return opt(option, "selected", options); - } - return opt(option, active ? "active" : "inactive", options); - }) - .join(`\n${color.yellow(S_BAR)} `)}\n${footer}\n`; - } - default: { - return `${title}${color.cyan(S_BAR)} ${this.options - .map((option, i, options) => { - const selected = - this.value.includes(option.value) || - (option.group === true && - this.isGroupSelected(`${option.value}`)); - const active = i === this.cursor; - const groupActive = - !active && - typeof option.group === "string" && - this.options[this.cursor].value === option.group; - if (groupActive) { - return opt( - option, - selected ? "group-active-selected" : "group-active", - options, - ); - } - if (active && selected) { - return opt(option, "active-selected", options); - } - if (selected) { - return opt(option, "selected", options); - } - return opt(option, active ? "active" : "inactive", options); - }) - .join(`\n${color.cyan(S_BAR)} `)}\n${color.cyan(S_BAR_END)}\n`; - } - } - }, - }).prompt() as Promise; -}; - -const strip = (str: string) => str.replace(ansiRegex(), ""); - -/** - * Displays a formatted note in the console, with an optional title. The note is visually distinguished - * from regular console output with ANSI colour codes and styles to make it stand out. The function calculates - * the length of the longest line to ensure the note is properly aligned and framed. - * - * @param {string} [message=""] - The main text of the note. Supports multiline strings. - * @param {string} [title=""] - An optional title for the note. If provided, it'll be displayed above the message. - */ -export const note = (message = "", title = "") => { - const lines = `\n${message}\n`.split("\n"); - const len = - Math.max( - // eslint-disable-next-line unicorn/no-array-reduce - lines.reduce((sum, ln) => { - ln = strip(ln); - return Math.max(ln.length, sum); - }, 0), - strip(title).length, - ) + 2; - const msg = lines - .map( - (ln) => - `${color.gray(S_BAR)} ${color.dim(ln)}${" ".repeat( - len - strip(ln).length, - )}${color.gray(S_BAR)}`, - ) - .join("\n"); - process.stdout.write( - `${color.gray(S_BAR)}\n${color.green(S_STEP_SUBMIT)} ${color.reset( - title, - )} ${color.gray( - S_BAR_H.repeat(Math.max(len - title.length - 1, 1)) + S_CORNER_TOP_RIGHT, - )}\n${msg}\n${color.gray( - S_CONNECT_LEFT + S_BAR_H.repeat(len + 2) + S_CORNER_BOTTOM_RIGHT, - )}\n`, - ); -}; - -/** - * Prints an abort message to the console. This is typically used to indicate - * that a process or operation has been cancelled. The message is coloured for - * for emphasis and visual differentiation. - * - * @param {string} [message=""] - The cancellation message to display. This parameter - * is optional; if omitted, the default styling will be used without a specific message. - */ -export const cancel = (message = "") => { - process.stdout.write(`${color.gray(S_BAR_END)} ${color.red(message)}\n\n`); -}; - -/** - * Prints an introductory message to the console. This function is used to - * Display a title or short message at the beginning of a script or application. - * framed by a specified bar character for visual distinction. - * - * @param {string} [title=""] - The title or message to display. This parameter is optional; if omitted, only the framing bar will be printed. - */ -export const intro = (title = "") => { - process.stdout.write(`${color.gray(S_BAR_START)} ${title}\n`); -}; - -/** - * Prints a closing message to the console. Similar to the `intro` function, - * `outro' is designed to indicate the end of a script or application execution - * with a framed message for clear visual separation from the rest of the console output. - * - * @param {string} [message=""] - The final message to display. This parameter is optional; if omitted, only the border will be printed. - */ -export const outro = (message = "") => { - process.stdout.write( - `${color.gray(S_BAR)}\n${color.gray(S_BAR_END)} ${message}\n\n`, - ); -}; - -export type LogMessageOptions = { - /** - * A custom icon to be placed in front of the log message. This allows visual differentiation - * log messages based on their importance or category (e.g. info, error). - * @optional - */ - symbol?: string; -}; -/** - * Logs a message to the console, with support for different types of messages (info, success, warning, error). - */ -export const log = { - /** - * Logs an message, prefixed with a gray bar. - * @param {string} message - The message to log. - * @param {LogMessageOptions} [opts] - Optional settings for the log message. See {@link LogMessageOptions}. - */ - message: ( - message = "", - { symbol = color.gray(S_BAR) }: LogMessageOptions = {}, - ) => { - const parts = [`${color.gray(S_BAR)}`]; - if (message) { - const [firstLine, ...lines] = message.split("\n"); - parts.push( - `${symbol} ${firstLine}`, - ...lines.map((ln) => `${color.gray(S_BAR)} ${ln}`), - ); - } - process.stdout.write(`${parts.join("\n")}\n`); - }, - /** - * Logs an information message, prefixed with a blue info icon. - * @param {string} message - The message to log. - */ - info: (message: string) => { - log.message(message, { symbol: color.blue(S_INFO) }); - }, - /** - * Logs a success message, preceded by a green check symbol. - * @param {string} message - The message to log. - */ - success: (message: string) => { - log.message(message, { symbol: color.green(S_SUCCESS) }); - }, - /** - * Logs a step message, typically used to indicate a step in a process, preceded by a green submit symbol. - * @param {string} message - The message to log. - */ - step: (message: string) => { - log.message(message, { symbol: color.green(S_STEP_SUBMIT) }); - }, - /** - * Logs a warning message, preceded by a yellow warning icon. - * @param {string} message - The message to log. - */ - warn: (message: string) => { - log.message(message, { symbol: color.yellow(S_WARN) }); - }, - /** alias for `log.warn()`. See {@link log.warn}. */ - warning: (message: string) => { - log.warn(message); - }, - /** - * Logs an error message, preceded by a red error icon. - * @param {string} message - The message to log. - */ - error: (message: string) => { - log.message(message, { symbol: color.red(S_ERROR) }); - }, -}; - -const frames = unicode ? ["◒", "◐", "◓", "◑"] : ["•", "o", "O", "0"]; - -/** - * Displays an animated spinner with a message, with functionality to start and stop the animation. - * @returns an object with `start` and `stop` methods to control the spinner. - */ -export const spinner = () => { - let unblock: () => void; - let loop: NodeJS.Timeout; - const delay = unicode ? 80 : 120; - return { - start(message = "") { - message = message.replace(/\.?\.?\.$/, ""); - unblock = block(); - process.stdout.write( - `${color.gray(S_BAR)}\n${color.magenta("○")} ${message}\n`, - ); - let i = 0; - let dot = 0; - loop = setInterval(() => { - const frame = frames[i]; - process.stdout.write(cursor.move(-999, -1)); - process.stdout.write( - `${color.magenta(frame)} ${message}${ - Math.floor(dot) >= 1 ? ".".repeat(Math.floor(dot)).slice(0, 3) : "" - } \n`, - ); - i = i === frames.length - 1 ? 0 : i + 1; - dot = dot === frames.length ? 0 : dot + 0.125; - }, delay); - }, - stop(message = "") { - process.stdout.write(cursor.move(-999, -2)); - process.stdout.write(erase.down(2)); - clearInterval(loop); - process.stdout.write( - `${color.gray(S_BAR)}\n${color.green(S_STEP_SUBMIT)} ${message}\n`, - ); - unblock(); - }, - }; -}; - -// Adapted from https://github.com/chalk/ansi-regex -// @see LICENSE -function ansiRegex() { - const pattern = [ - String.raw`[\u001B\u009B][[\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\d\/#&.:=?%@~_]+)*|[a-zA-Z\d]+(?:;[-a-zA-Z\d\/#&.:=?%@~_]*)*)?\u0007)`, - String.raw`(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))`, - ].join("|"); - - return new RegExp(pattern, "g"); -} - -export type PromptGroupAwaitedReturn = { - [P in keyof T]: Exclude, symbol>; -}; - -export interface PromptGroupOptions { - /** - * Control how the group can be canceled - * if one of the prompts is canceled. - */ - onCancel?: (opts: { - results: Prettify>>; - }) => void; -} - -type Prettify = {} & { - [P in keyof T]: T[P]; -}; - -export type PromptGroup = { - [P in keyof T]: (opts: { - results: Prettify>>>; - }) => void | Promise; -}; - -/** - * Groups multiple prompts together so that they can be displayed and resolved in sequence. - * @param {PromptGroup} prompts - The prompts to display in the group. See {@link PromptGroup}. - * @param {PromptGroupOptions} [opts] - Optional settings for the prompt group. See {@link PromptGroupOptions}. - * @returns {Promise>>} A promise that resolves to an object containing the results of each prompt in the group. - */ -export const group = async ( - prompts: PromptGroup, - opts?: PromptGroupOptions, -): Promise>> => { - const results = {} as any; - const promptNames = Object.keys(prompts); - - for (const name of promptNames) { - const prompt = prompts[name as keyof T]; - const result = await prompt({ results })?.catch((e) => { - throw e; - }); - - // Pass the results to the onCancel function - // so the user can decide what to do with the results - // TODO: Switch to callback within core to avoid isCancel Fn - if (typeof opts?.onCancel === "function" && isCancel(result)) { - results[name] = "canceled"; - opts.onCancel({ results }); - continue; - } - - results[name] = result; - } - - return results; -};