diff --git a/README.md b/README.md index d866196..d59711d 100644 --- a/README.md +++ b/README.md @@ -476,9 +476,6 @@ model: sonnet # Default model (optional) anthropic_api_key: sk-ant-... # For Claude (Anthropic) # openai_api_key: sk-... # For Codex (OpenAI) -trusted_directories: - - /path/to/trusted/dir - # Pipeline execution configuration (optional) # Customize branch names, commit messages, and PR body. # pipeline: @@ -490,6 +487,8 @@ trusted_directories: # Closes #{issue} ``` +**Note:** The Codex SDK requires running inside a Git repository. `--skip-git-repo-check` is only available in the Codex CLI. + **API Key Configuration Methods:** 1. **Set via environment variables**: diff --git a/bin/takt b/bin/takt index 8559dd9..39872cb 100755 --- a/bin/takt +++ b/bin/takt @@ -9,7 +9,7 @@ * - npm exec takt */ -import { fileURLToPath } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; import { dirname, join } from 'node:path'; const __filename = fileURLToPath(import.meta.url); @@ -19,7 +19,8 @@ const __dirname = dirname(__filename); const cliPath = join(__dirname, '..', 'dist', 'app', 'cli', 'index.js'); try { - await import(cliPath); + const cliUrl = pathToFileURL(cliPath).href; + await import(cliUrl); } catch (err) { console.error('Failed to load TAKT CLI. Have you run "npm run build"?'); console.error(err.message); diff --git a/docs/README.ja.md b/docs/README.ja.md index 1c785ac..7e49641 100644 --- a/docs/README.ja.md +++ b/docs/README.ja.md @@ -472,9 +472,6 @@ model: sonnet # デフォルトモデル(オプション) anthropic_api_key: sk-ant-... # Claude (Anthropic) を使う場合 # openai_api_key: sk-... # Codex (OpenAI) を使う場合 -trusted_directories: - - /path/to/trusted/dir - # パイプライン実行設定(オプション) # ブランチ名、コミットメッセージ、PRの本文をカスタマイズできます。 # pipeline: @@ -486,6 +483,8 @@ trusted_directories: # Closes #{issue} ``` +**注意:** Codex SDK は Git 管理下のディレクトリでのみ動作します。`--skip-git-repo-check` は Codex CLI 専用です。 + **API Key の設定方法:** 1. **環境変数で設定**: diff --git a/package-lock.json b/package-lock.json index 05285a8..d16d5f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ }, "bin": { "takt": "bin/takt", - "takt-cli": "dist/cli.js", + "takt-cli": "dist/app/cli/index.js", "takt-dev": "bin/takt" }, "devDependencies": { @@ -39,10 +39,9 @@ } }, "node_modules/@anthropic-ai/claude-agent-sdk": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.2.19.tgz", - "integrity": "sha512-DjaX4t3Swjt5PcsZt6krcp5TfBTRxVuUZhkY6L8WWF8kZBJFuuEd5akNg486XRskTXGuwLmitxp0wHB1hJ9muw==", - "license": "SEE LICENSE IN README.md", + "version": "0.2.31", + "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.2.31.tgz", + "integrity": "sha512-ZepnDG6r91je1LvrHST2C67m3olgmiYfrhnj4Elyj8AGqOHGYig1zDIPVhGF0u62y0rVVri2mGFDYQI0oW/LBw==", "engines": { "node": ">=18.0.0" }, @@ -68,7 +67,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -85,7 +83,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -102,7 +99,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -119,7 +115,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -136,7 +131,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -153,7 +147,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -170,7 +163,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -187,7 +179,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -204,7 +195,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -221,7 +211,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -238,7 +227,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -255,7 +243,6 @@ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -272,7 +259,6 @@ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -289,7 +275,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -306,7 +291,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -323,7 +307,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -340,7 +323,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -357,7 +339,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -374,7 +355,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -391,7 +371,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -408,7 +387,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -425,7 +403,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -442,7 +419,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -456,7 +432,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -475,7 +450,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -485,7 +459,6 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -500,7 +473,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -511,7 +483,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -524,7 +495,6 @@ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0" }, @@ -537,7 +507,6 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -550,7 +519,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -574,7 +542,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -585,7 +552,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -595,7 +561,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -608,7 +573,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -621,7 +585,6 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -631,7 +594,6 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -645,7 +607,6 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -655,7 +616,6 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -669,7 +629,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -683,7 +642,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -699,7 +657,6 @@ "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -721,7 +678,6 @@ "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -743,7 +699,6 @@ "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -759,7 +714,6 @@ "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -775,7 +729,6 @@ "cpu": [ "arm" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -791,7 +744,6 @@ "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -807,7 +759,6 @@ "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -823,7 +774,6 @@ "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -839,7 +789,6 @@ "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -855,7 +804,6 @@ "cpu": [ "arm" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -877,7 +825,6 @@ "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -899,7 +846,6 @@ "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -921,7 +867,6 @@ "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -943,7 +888,6 @@ "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -965,7 +909,6 @@ "cpu": [ "x64" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -981,14 +924,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@openai/codex-sdk": { "version": "0.91.0", "resolved": "https://registry.npmjs.org/@openai/codex-sdk/-/codex-sdk-0.91.0.tgz", "integrity": "sha512-YYf8QNkpQyuzNgn9Mf9D3G1pp0ObI98ADCNqASBpdlpxqykMyABgQdMRdc4c/l1KdoTnGVkUw0ljXaCHurs5vA==", - "license": "Apache-2.0", "engines": { "node": ">=18" } @@ -997,7 +938,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -1006,7 +946,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -1017,14 +956,12 @@ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/@pnpm/npm-conf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", - "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -1035,350 +972,325 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", - "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", - "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", - "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", - "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", - "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", - "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", - "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", - "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", - "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", - "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", - "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", - "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", - "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", - "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", - "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", - "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", - "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", - "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", - "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", - "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", - "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", - "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", - "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", - "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", - "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1388,22 +1300,19 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", + "version": "20.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.31.tgz", + "integrity": "sha512-5jsi0wpncvTD33Sh1UCgacK37FFwDn+EG7wCmEvs62fCvBL+n8/76cAYDok21NF6+jaVWIqKwCZyX7Vbu8eB3A==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } @@ -1412,21 +1321,19 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/wanakana/-/wanakana-4.0.6.tgz", "integrity": "sha512-al8hJELQI+RDcexy6JLV/BqghQ/nP0B9d62m0F3jEvPyxAq9RXFH9xDoGa73oT9/keCUKRxWCA6l37wv4TCfQw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", - "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1439,22 +1346,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.53.1", + "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", - "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "engines": { @@ -1470,14 +1376,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", - "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "engines": { @@ -1492,14 +1397,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", - "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1510,11 +1414,10 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", - "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1527,15 +1430,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", - "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -1552,11 +1454,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", - "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1566,16 +1467,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", - "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -1594,16 +1494,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", - "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1618,13 +1517,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", - "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1640,7 +1538,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1653,7 +1550,6 @@ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", @@ -1669,7 +1565,6 @@ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/spy": "2.1.9", "estree-walker": "^3.0.3", @@ -1696,7 +1591,6 @@ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", "dev": true, - "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -1709,7 +1603,6 @@ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/utils": "2.1.9", "pathe": "^1.1.2" @@ -1723,7 +1616,6 @@ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/pretty-format": "2.1.9", "magic-string": "^0.30.12", @@ -1738,7 +1630,6 @@ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", "dev": true, - "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" }, @@ -1751,7 +1642,6 @@ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", @@ -1766,7 +1656,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1779,7 +1668,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1789,7 +1677,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1805,7 +1692,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", "dependencies": { "string-width": "^4.1.0" } @@ -1814,7 +1700,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -1822,14 +1707,12 @@ "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1843,7 +1726,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1855,7 +1737,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -1864,16 +1745,11 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -1883,15 +1759,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" } @@ -1900,7 +1774,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.0.tgz", "integrity": "sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==", - "license": "MIT", "dependencies": { "stubborn-fs": "^2.0.0", "when-exit": "^2.1.4" @@ -1910,14 +1783,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/boxen": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", - "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", @@ -1940,7 +1811,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1950,7 +1820,6 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1960,7 +1829,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1969,7 +1837,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "license": "MIT", "engines": { "node": ">=16" }, @@ -1982,7 +1849,6 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, - "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -1998,7 +1864,6 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2011,7 +1876,6 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 16" } @@ -2020,7 +1884,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -2033,7 +1896,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2045,14 +1907,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", "engines": { "node": ">=18" } @@ -2061,14 +1921,12 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -2077,14 +1935,12 @@ "node_modules/config-chain/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/configstore": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", - "license": "BSD-2-Clause", "dependencies": { "atomically": "^2.0.3", "dot-prop": "^9.0.0", @@ -2103,7 +1959,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2118,7 +1973,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2136,7 +1990,6 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2145,7 +1998,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2154,14 +2006,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/dot-prop": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "license": "MIT", "dependencies": { "type-fest": "^4.18.2" }, @@ -2175,15 +2025,13 @@ "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/esbuild": { "version": "0.21.5", @@ -2191,7 +2039,6 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -2228,7 +2075,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -2241,7 +2087,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2254,7 +2099,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -2314,7 +2158,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2331,7 +2174,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2339,12 +2181,26 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2355,7 +2211,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2372,7 +2227,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2385,7 +2239,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -2395,7 +2248,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2408,7 +2260,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -2426,7 +2277,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2439,7 +2289,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2452,7 +2301,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2465,7 +2313,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2475,7 +2322,6 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -2485,7 +2331,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2495,7 +2340,6 @@ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.0.0" } @@ -2504,29 +2348,25 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -2544,7 +2384,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -2557,7 +2396,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2574,7 +2412,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2587,8 +2424,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -2596,7 +2432,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2609,7 +2444,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -2622,7 +2456,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2634,7 +2467,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -2650,7 +2482,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -2661,15 +2492,13 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2679,7 +2508,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -2689,7 +2517,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2706,7 +2533,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2715,7 +2541,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -2725,7 +2550,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2734,7 +2558,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -2744,7 +2567,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2756,7 +2578,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", - "license": "MIT", "bin": { "is-in-ci": "cli.js" }, @@ -2771,7 +2592,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "license": "MIT", "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" @@ -2787,7 +2607,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2799,7 +2618,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -2811,15 +2629,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2831,29 +2647,25 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -2862,7 +2674,6 @@ "version": "1.14.3", "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -2874,7 +2685,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", - "license": "MIT", "dependencies": { "package-json": "^10.0.0" }, @@ -2890,7 +2700,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2904,7 +2713,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -2919,22 +2727,19 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -2944,7 +2749,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2959,7 +2763,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2968,8 +2771,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nanoid": { "version": "3.3.11", @@ -2982,7 +2784,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2994,15 +2795,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3020,7 +2819,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3036,7 +2834,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -3051,7 +2848,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", - "license": "MIT", "dependencies": { "ky": "^1.2.0", "registry-auth-token": "^5.0.2", @@ -3070,7 +2866,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3083,7 +2878,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3093,7 +2887,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3102,15 +2895,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pathval": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.16" } @@ -3119,15 +2910,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3154,7 +2943,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -3169,7 +2957,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -3177,15 +2964,13 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3194,7 +2979,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", - "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" }, @@ -3209,7 +2993,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3223,14 +3006,12 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3239,7 +3020,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", - "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^3.0.2" }, @@ -3251,7 +3031,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -3267,17 +3046,15 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/rollup": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", - "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -3289,31 +3066,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.56.0", - "@rollup/rollup-android-arm64": "4.56.0", - "@rollup/rollup-darwin-arm64": "4.56.0", - "@rollup/rollup-darwin-x64": "4.56.0", - "@rollup/rollup-freebsd-arm64": "4.56.0", - "@rollup/rollup-freebsd-x64": "4.56.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", - "@rollup/rollup-linux-arm-musleabihf": "4.56.0", - "@rollup/rollup-linux-arm64-gnu": "4.56.0", - "@rollup/rollup-linux-arm64-musl": "4.56.0", - "@rollup/rollup-linux-loong64-gnu": "4.56.0", - "@rollup/rollup-linux-loong64-musl": "4.56.0", - "@rollup/rollup-linux-ppc64-gnu": "4.56.0", - "@rollup/rollup-linux-ppc64-musl": "4.56.0", - "@rollup/rollup-linux-riscv64-gnu": "4.56.0", - "@rollup/rollup-linux-riscv64-musl": "4.56.0", - "@rollup/rollup-linux-s390x-gnu": "4.56.0", - "@rollup/rollup-linux-x64-gnu": "4.56.0", - "@rollup/rollup-linux-x64-musl": "4.56.0", - "@rollup/rollup-openbsd-x64": "4.56.0", - "@rollup/rollup-openharmony-arm64": "4.56.0", - "@rollup/rollup-win32-arm64-msvc": "4.56.0", - "@rollup/rollup-win32-ia32-msvc": "4.56.0", - "@rollup/rollup-win32-x64-gnu": "4.56.0", - "@rollup/rollup-win32-x64-msvc": "4.56.0", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, @@ -3321,7 +3098,6 @@ "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3334,7 +3110,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3347,7 +3122,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3356,15 +3130,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3373,21 +3145,18 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -3404,7 +3173,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3420,7 +3188,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -3432,7 +3199,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz", "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==", - "license": "MIT", "dependencies": { "stubborn-utils": "^1.0.1" } @@ -3440,15 +3206,13 @@ "node_modules/stubborn-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz", - "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==", - "license": "MIT" + "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==" }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3460,22 +3224,19 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -3492,7 +3253,6 @@ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, - "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -3502,7 +3262,6 @@ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -3512,7 +3271,6 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -3522,7 +3280,6 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.12" }, @@ -3535,7 +3292,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3547,7 +3303,6 @@ "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -3560,7 +3315,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3570,16 +3324,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz", - "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1" + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3597,14 +3350,12 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/update-notifier": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.3.1.tgz", "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", - "license": "BSD-2-Clause", "dependencies": { "boxen": "^8.0.1", "chalk": "^5.3.0", @@ -3629,7 +3380,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -3639,7 +3389,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -3699,7 +3448,6 @@ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", "dev": true, - "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", @@ -3722,7 +3470,6 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/expect": "2.1.9", "@vitest/mocker": "2.1.9", @@ -3787,7 +3534,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/wanakana/-/wanakana-5.3.1.tgz", "integrity": "sha512-OSDqupzTlzl2LGyqTdhcXcl6ezMiFhcUwLBP8YKaBIbMYW1wAwDvupw2T9G9oVaKT9RmaSpyTXjxddFPUcFFIw==", - "license": "MIT", "engines": { "node": ">=12" } @@ -3795,15 +3541,13 @@ "node_modules/when-exit": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz", - "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==", - "license": "MIT" + "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==" }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3819,7 +3563,6 @@ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -3835,7 +3578,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", - "license": "MIT", "dependencies": { "string-width": "^7.0.0" }, @@ -3851,7 +3593,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3860,7 +3601,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -3873,23 +3613,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -3901,7 +3628,6 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -3917,7 +3643,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3929,7 +3654,6 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/resources/global/en/config.yaml b/resources/global/en/config.yaml index 56b56fc..ae75306 100644 --- a/resources/global/en/config.yaml +++ b/resources/global/en/config.yaml @@ -4,9 +4,6 @@ # Language setting (en or ja) language: en -# Trusted directories - projects in these directories skip confirmation prompts -trusted_directories: [] - # Default piece to use when no piece is specified default_piece: default diff --git a/resources/global/ja/config.yaml b/resources/global/ja/config.yaml index f082c0f..341103c 100644 --- a/resources/global/ja/config.yaml +++ b/resources/global/ja/config.yaml @@ -4,10 +4,7 @@ # 言語設定 (en または ja) language: ja -# 信頼済みディレクトリ - これらのディレクトリ内のプロジェクトは確認プロンプトをスキップします -trusted_directories: [] - -# デフォルトピース - ピースが指定されていない場合に使用します +# デフォルトのピース - 指定がない場合に使用します default_piece: default # ログレベル: debug, info, warn, error diff --git a/src/__tests__/apiKeyAuth.test.ts b/src/__tests__/apiKeyAuth.test.ts index 59fc579..dc418e2 100644 --- a/src/__tests__/apiKeyAuth.test.ts +++ b/src/__tests__/apiKeyAuth.test.ts @@ -1,292 +1,282 @@ -/** - * Tests for API key authentication feature - * - * Tests the resolution logic for Anthropic and OpenAI API keys: - * - Environment variable priority over config.yaml - * - Config.yaml fallback when env var is not set - * - Undefined when neither is set - * - Schema validation for API key fields - * - GlobalConfig load/save round-trip with API keys - */ - -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; -import { mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { randomUUID } from 'node:crypto'; -import { GlobalConfigSchema } from '../core/models/index.js'; - -// Mock paths module to redirect config to temp directory -const testId = randomUUID(); -const testDir = join(tmpdir(), `takt-api-key-test-${testId}`); -const taktDir = join(testDir, '.takt'); -const configPath = join(taktDir, 'config.yaml'); - -vi.mock('../infra/config/paths.js', async (importOriginal) => { - const original = await importOriginal() as Record; - return { - ...original, - getGlobalConfigPath: () => configPath, - getTaktDir: () => taktDir, - }; -}); - -// Import after mocking -const { loadGlobalConfig, saveGlobalConfig, resolveAnthropicApiKey, resolveOpenaiApiKey, invalidateGlobalConfigCache } = await import('../infra/config/global/globalConfig.js'); - -describe('GlobalConfigSchema API key fields', () => { - it('should accept config without API keys', () => { - const result = GlobalConfigSchema.parse({ - language: 'en', - }); - expect(result.anthropic_api_key).toBeUndefined(); - expect(result.openai_api_key).toBeUndefined(); - }); - - it('should accept config with anthropic_api_key', () => { - const result = GlobalConfigSchema.parse({ - language: 'en', - anthropic_api_key: 'sk-ant-test-key', - }); - expect(result.anthropic_api_key).toBe('sk-ant-test-key'); - }); - - it('should accept config with openai_api_key', () => { - const result = GlobalConfigSchema.parse({ - language: 'en', - openai_api_key: 'sk-openai-test-key', - }); - expect(result.openai_api_key).toBe('sk-openai-test-key'); - }); - - it('should accept config with both API keys', () => { - const result = GlobalConfigSchema.parse({ - language: 'en', - anthropic_api_key: 'sk-ant-key', - openai_api_key: 'sk-openai-key', - }); - expect(result.anthropic_api_key).toBe('sk-ant-key'); - expect(result.openai_api_key).toBe('sk-openai-key'); - }); -}); - -describe('GlobalConfig load/save with API keys', () => { - beforeEach(() => { - invalidateGlobalConfigCache(); - mkdirSync(taktDir, { recursive: true }); - }); - - afterEach(() => { - rmSync(testDir, { recursive: true, force: true }); - }); - - it('should load config with API keys from YAML', () => { - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - 'anthropic_api_key: sk-ant-from-yaml', - 'openai_api_key: sk-openai-from-yaml', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const config = loadGlobalConfig(); - expect(config.anthropicApiKey).toBe('sk-ant-from-yaml'); - expect(config.openaiApiKey).toBe('sk-openai-from-yaml'); - }); - - it('should load config without API keys', () => { - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const config = loadGlobalConfig(); - expect(config.anthropicApiKey).toBeUndefined(); - expect(config.openaiApiKey).toBeUndefined(); - }); - - it('should save and reload config with API keys', () => { - // Write initial config - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const config = loadGlobalConfig(); - config.anthropicApiKey = 'sk-ant-saved'; - config.openaiApiKey = 'sk-openai-saved'; - saveGlobalConfig(config); - - const reloaded = loadGlobalConfig(); - expect(reloaded.anthropicApiKey).toBe('sk-ant-saved'); - expect(reloaded.openaiApiKey).toBe('sk-openai-saved'); - }); - - it('should not persist API keys when not set', () => { - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const config = loadGlobalConfig(); - saveGlobalConfig(config); - - const content = readFileSync(configPath, 'utf-8'); - expect(content).not.toContain('anthropic_api_key'); - expect(content).not.toContain('openai_api_key'); - }); -}); - -describe('resolveAnthropicApiKey', () => { - const originalEnv = process.env['TAKT_ANTHROPIC_API_KEY']; - - beforeEach(() => { - invalidateGlobalConfigCache(); - mkdirSync(taktDir, { recursive: true }); - }); - - afterEach(() => { - if (originalEnv !== undefined) { - process.env['TAKT_ANTHROPIC_API_KEY'] = originalEnv; - } else { - delete process.env['TAKT_ANTHROPIC_API_KEY']; - } - rmSync(testDir, { recursive: true, force: true }); - }); - - it('should return env var when set', () => { - process.env['TAKT_ANTHROPIC_API_KEY'] = 'sk-ant-from-env'; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - 'anthropic_api_key: sk-ant-from-yaml', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveAnthropicApiKey(); - expect(key).toBe('sk-ant-from-env'); - }); - - it('should fall back to config when env var is not set', () => { - delete process.env['TAKT_ANTHROPIC_API_KEY']; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - 'anthropic_api_key: sk-ant-from-yaml', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveAnthropicApiKey(); - expect(key).toBe('sk-ant-from-yaml'); - }); - - it('should return undefined when neither env var nor config is set', () => { - delete process.env['TAKT_ANTHROPIC_API_KEY']; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveAnthropicApiKey(); - expect(key).toBeUndefined(); - }); - - it('should return undefined when config file does not exist', () => { - delete process.env['TAKT_ANTHROPIC_API_KEY']; - // No config file created - rmSync(testDir, { recursive: true, force: true }); - - const key = resolveAnthropicApiKey(); - expect(key).toBeUndefined(); - }); -}); - -describe('resolveOpenaiApiKey', () => { - const originalEnv = process.env['TAKT_OPENAI_API_KEY']; - - beforeEach(() => { - invalidateGlobalConfigCache(); - mkdirSync(taktDir, { recursive: true }); - }); - - afterEach(() => { - if (originalEnv !== undefined) { - process.env['TAKT_OPENAI_API_KEY'] = originalEnv; - } else { - delete process.env['TAKT_OPENAI_API_KEY']; - } - rmSync(testDir, { recursive: true, force: true }); - }); - - it('should return env var when set', () => { - process.env['TAKT_OPENAI_API_KEY'] = 'sk-openai-from-env'; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - 'openai_api_key: sk-openai-from-yaml', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveOpenaiApiKey(); - expect(key).toBe('sk-openai-from-env'); - }); - - it('should fall back to config when env var is not set', () => { - delete process.env['TAKT_OPENAI_API_KEY']; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - 'openai_api_key: sk-openai-from-yaml', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveOpenaiApiKey(); - expect(key).toBe('sk-openai-from-yaml'); - }); - - it('should return undefined when neither env var nor config is set', () => { - delete process.env['TAKT_OPENAI_API_KEY']; - const yaml = [ - 'language: en', - 'trusted_directories: []', - 'default_piece: default', - 'log_level: info', - 'provider: claude', - ].join('\n'); - writeFileSync(configPath, yaml, 'utf-8'); - - const key = resolveOpenaiApiKey(); - expect(key).toBeUndefined(); - }); -}); +/** + * Tests for API key authentication feature + * + * Tests the resolution logic for Anthropic and OpenAI API keys: + * - Environment variable priority over config.yaml + * - Config.yaml fallback when env var is not set + * - Undefined when neither is set + * - Schema validation for API key fields + * - GlobalConfig load/save round-trip with API keys + */ + +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { randomUUID } from 'node:crypto'; +import { GlobalConfigSchema } from '../core/models/index.js'; + +// Mock paths module to redirect config to temp directory +const testId = randomUUID(); +const testDir = join(tmpdir(), `takt-api-key-test-${testId}`); +const taktDir = join(testDir, '.takt'); +const configPath = join(taktDir, 'config.yaml'); + +vi.mock('../infra/config/paths.js', async (importOriginal) => { + const original = await importOriginal() as Record; + return { + ...original, + getGlobalConfigPath: () => configPath, + getTaktDir: () => taktDir, + }; +}); + +// Import after mocking +const { loadGlobalConfig, saveGlobalConfig, resolveAnthropicApiKey, resolveOpenaiApiKey, invalidateGlobalConfigCache } = await import('../infra/config/global/globalConfig.js'); + +describe('GlobalConfigSchema API key fields', () => { + it('should accept config without API keys', () => { + const result = GlobalConfigSchema.parse({ + language: 'en', + }); + expect(result.anthropic_api_key).toBeUndefined(); + expect(result.openai_api_key).toBeUndefined(); + }); + + it('should accept config with anthropic_api_key', () => { + const result = GlobalConfigSchema.parse({ + language: 'en', + anthropic_api_key: 'sk-ant-test-key', + }); + expect(result.anthropic_api_key).toBe('sk-ant-test-key'); + }); + + it('should accept config with openai_api_key', () => { + const result = GlobalConfigSchema.parse({ + language: 'en', + openai_api_key: 'sk-openai-test-key', + }); + expect(result.openai_api_key).toBe('sk-openai-test-key'); + }); + + it('should accept config with both API keys', () => { + const result = GlobalConfigSchema.parse({ + language: 'en', + anthropic_api_key: 'sk-ant-key', + openai_api_key: 'sk-openai-key', + }); + expect(result.anthropic_api_key).toBe('sk-ant-key'); + expect(result.openai_api_key).toBe('sk-openai-key'); + }); +}); + +describe('GlobalConfig load/save with API keys', () => { + beforeEach(() => { + invalidateGlobalConfigCache(); + mkdirSync(taktDir, { recursive: true }); + }); + + afterEach(() => { + rmSync(testDir, { recursive: true, force: true }); + }); + + it('should load config with API keys from YAML', () => { + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + 'anthropic_api_key: sk-ant-from-yaml', + 'openai_api_key: sk-openai-from-yaml', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const config = loadGlobalConfig(); + expect(config.anthropicApiKey).toBe('sk-ant-from-yaml'); + expect(config.openaiApiKey).toBe('sk-openai-from-yaml'); + }); + + it('should load config without API keys', () => { + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const config = loadGlobalConfig(); + expect(config.anthropicApiKey).toBeUndefined(); + expect(config.openaiApiKey).toBeUndefined(); + }); + + it('should save and reload config with API keys', () => { + // Write initial config + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const config = loadGlobalConfig(); + config.anthropicApiKey = 'sk-ant-saved'; + config.openaiApiKey = 'sk-openai-saved'; + saveGlobalConfig(config); + + const reloaded = loadGlobalConfig(); + expect(reloaded.anthropicApiKey).toBe('sk-ant-saved'); + expect(reloaded.openaiApiKey).toBe('sk-openai-saved'); + }); + + it('should not persist API keys when not set', () => { + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const config = loadGlobalConfig(); + saveGlobalConfig(config); + + const content = readFileSync(configPath, 'utf-8'); + expect(content).not.toContain('anthropic_api_key'); + expect(content).not.toContain('openai_api_key'); + }); +}); + +describe('resolveAnthropicApiKey', () => { + const originalEnv = process.env['TAKT_ANTHROPIC_API_KEY']; + + beforeEach(() => { + invalidateGlobalConfigCache(); + mkdirSync(taktDir, { recursive: true }); + }); + + afterEach(() => { + if (originalEnv !== undefined) { + process.env['TAKT_ANTHROPIC_API_KEY'] = originalEnv; + } else { + delete process.env['TAKT_ANTHROPIC_API_KEY']; + } + rmSync(testDir, { recursive: true, force: true }); + }); + + it('should return env var when set', () => { + process.env['TAKT_ANTHROPIC_API_KEY'] = 'sk-ant-from-env'; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + 'anthropic_api_key: sk-ant-from-yaml', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveAnthropicApiKey(); + expect(key).toBe('sk-ant-from-env'); + }); + + it('should fall back to config when env var is not set', () => { + delete process.env['TAKT_ANTHROPIC_API_KEY']; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + 'anthropic_api_key: sk-ant-from-yaml', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveAnthropicApiKey(); + expect(key).toBe('sk-ant-from-yaml'); + }); + + it('should return undefined when neither env var nor config is set', () => { + delete process.env['TAKT_ANTHROPIC_API_KEY']; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveAnthropicApiKey(); + expect(key).toBeUndefined(); + }); + + it('should return undefined when config file does not exist', () => { + delete process.env['TAKT_ANTHROPIC_API_KEY']; + // No config file created + rmSync(testDir, { recursive: true, force: true }); + + const key = resolveAnthropicApiKey(); + expect(key).toBeUndefined(); + }); +}); + +describe('resolveOpenaiApiKey', () => { + const originalEnv = process.env['TAKT_OPENAI_API_KEY']; + + beforeEach(() => { + invalidateGlobalConfigCache(); + mkdirSync(taktDir, { recursive: true }); + }); + + afterEach(() => { + if (originalEnv !== undefined) { + process.env['TAKT_OPENAI_API_KEY'] = originalEnv; + } else { + delete process.env['TAKT_OPENAI_API_KEY']; + } + rmSync(testDir, { recursive: true, force: true }); + }); + + it('should return env var when set', () => { + process.env['TAKT_OPENAI_API_KEY'] = 'sk-openai-from-env'; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + 'openai_api_key: sk-openai-from-yaml', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveOpenaiApiKey(); + expect(key).toBe('sk-openai-from-env'); + }); + + it('should fall back to config when env var is not set', () => { + delete process.env['TAKT_OPENAI_API_KEY']; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + 'openai_api_key: sk-openai-from-yaml', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveOpenaiApiKey(); + expect(key).toBe('sk-openai-from-yaml'); + }); + + it('should return undefined when neither env var nor config is set', () => { + delete process.env['TAKT_OPENAI_API_KEY']; + const yaml = [ + 'language: en', + 'default_piece: default', + 'log_level: info', + 'provider: claude', + ].join('\n'); + writeFileSync(configPath, yaml, 'utf-8'); + + const key = resolveOpenaiApiKey(); + expect(key).toBeUndefined(); + }); +}); diff --git a/src/__tests__/cli-wrapper.test.ts b/src/__tests__/cli-wrapper.test.ts new file mode 100644 index 0000000..379a26c --- /dev/null +++ b/src/__tests__/cli-wrapper.test.ts @@ -0,0 +1,37 @@ +/** + * Tests for the CLI wrapper URL handling. + */ + +import { describe, it, expect } from 'vitest'; +import { readFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import { posix, win32, resolve } from 'node:path'; + +describe('cli wrapper import URL', () => { + it('builds a file URL for Windows paths', () => { + const winPath = win32.join('C:\\', 'work', 'git', 'takt', 'dist', 'app', 'cli', 'index.js'); + const url = pathToFileURL(winPath).href; + + if (process.platform === 'win32') { + expect(url).toBe('file:///C:/work/git/takt/dist/app/cli/index.js'); + return; + } + + expect(url).toMatch(/C:%5Cwork%5Cgit%5Ctakt%5Cdist%5Capp%5Ccli%5Cindex\.js$/); + }); + + it('builds a file URL for POSIX paths', () => { + const posixPath = posix.join('/', 'usr', 'local', 'lib', 'takt', 'dist', 'app', 'cli', 'index.js'); + const url = pathToFileURL(posixPath).href; + + expect(url).toBe('file:///usr/local/lib/takt/dist/app/cli/index.js'); + }); + + it('uses pathToFileURL in the npm wrapper', async () => { + const wrapperPath = resolve('bin', 'takt'); + const wrapperContents = await readFile(wrapperPath, 'utf8'); + + expect(wrapperContents).toContain('pathToFileURL'); + expect(wrapperContents).toContain('pathToFileURL(cliPath)'); + }); +}); diff --git a/src/__tests__/globalConfig-defaults.test.ts b/src/__tests__/globalConfig-defaults.test.ts index 277a179..e120d0e 100644 --- a/src/__tests__/globalConfig-defaults.test.ts +++ b/src/__tests__/globalConfig-defaults.test.ts @@ -39,7 +39,6 @@ describe('loadGlobalConfig', () => { const config = loadGlobalConfig(); expect(config.language).toBe('en'); - expect(config.trustedDirectories).toEqual([]); expect(config.defaultPiece).toBe('default'); expect(config.logLevel).toBe('info'); expect(config.provider).toBe('claude'); diff --git a/src/__tests__/it-worktree-delete.test.ts b/src/__tests__/it-worktree-delete.test.ts index 9e3e2e9..f9c9901 100644 --- a/src/__tests__/it-worktree-delete.test.ts +++ b/src/__tests__/it-worktree-delete.test.ts @@ -156,6 +156,12 @@ describe('worktree branch deletion', () => { }); it('should delete regular (non-worktree) branches normally', () => { + const defaultBranch = execFileSync('git', ['branch', '--show-current'], { + cwd: testDir, + encoding: 'utf-8', + stdio: 'pipe', + }).trim(); + // Create a regular local branch const branchName = 'takt/20260203T1002-regular-branch'; execFileSync('git', ['checkout', '-b', branchName], { cwd: testDir }); @@ -166,7 +172,7 @@ describe('worktree branch deletion', () => { execFileSync('git', ['commit', '-m', 'Test change'], { cwd: testDir }); // Switch back to main - execFileSync('git', ['checkout', 'master'], { cwd: testDir }); + execFileSync('git', ['checkout', defaultBranch || 'main'], { cwd: testDir }); // Verify branch exists const branchesBefore = listTaktBranches(testDir); diff --git a/src/__tests__/models.test.ts b/src/__tests__/models.test.ts index 8583cce..32ebda3 100644 --- a/src/__tests__/models.test.ts +++ b/src/__tests__/models.test.ts @@ -201,7 +201,6 @@ describe('GlobalConfigSchema', () => { const config = {}; const result = GlobalConfigSchema.parse(config); - expect(result.trusted_directories).toEqual([]); expect(result.default_piece).toBe('default'); expect(result.log_level).toBe('info'); expect(result.provider).toBe('claude'); @@ -209,13 +208,11 @@ describe('GlobalConfigSchema', () => { it('should accept valid config', () => { const config = { - trusted_directories: ['/home/user/projects'], default_piece: 'custom', log_level: 'debug' as const, }; const result = GlobalConfigSchema.parse(config); - expect(result.trusted_directories).toHaveLength(1); expect(result.log_level).toBe('debug'); }); }); diff --git a/src/__tests__/pipelineExecution.test.ts b/src/__tests__/pipelineExecution.test.ts index efc7c38..1db0bda 100644 --- a/src/__tests__/pipelineExecution.test.ts +++ b/src/__tests__/pipelineExecution.test.ts @@ -1,438 +1,434 @@ -/** - * Tests for pipeline execution - * - * Tests the orchestration logic with mocked dependencies. - */ - -import { describe, it, expect, vi, beforeEach } from 'vitest'; - -// Mock all external dependencies -const mockFetchIssue = vi.fn(); -const mockCheckGhCli = vi.fn().mockReturnValue({ available: true }); -vi.mock('../infra/github/issue.js', () => ({ - fetchIssue: mockFetchIssue, - formatIssueAsTask: vi.fn((issue: { title: string; body: string; number: number }) => - `## GitHub Issue #${issue.number}: ${issue.title}\n\n${issue.body}` - ), - checkGhCli: mockCheckGhCli, -})); - -const mockCreatePullRequest = vi.fn(); -const mockPushBranch = vi.fn(); -const mockBuildPrBody = vi.fn(() => 'Default PR body'); -vi.mock('../infra/github/pr.js', () => ({ - createPullRequest: mockCreatePullRequest, - pushBranch: mockPushBranch, - buildPrBody: mockBuildPrBody, -})); - -const mockExecuteTask = vi.fn(); -vi.mock('../features/tasks/index.js', () => ({ - executeTask: mockExecuteTask, -})); - -// Mock loadGlobalConfig -const mockLoadGlobalConfig = vi.fn(); -vi.mock('../infra/config/global/globalConfig.js', async (importOriginal) => ({ ...(await importOriginal>()), - loadGlobalConfig: mockLoadGlobalConfig, -})); - -// Mock execFileSync for git operations -const mockExecFileSync = vi.fn(); -vi.mock('node:child_process', () => ({ - execFileSync: mockExecFileSync, -})); - -// Mock UI -vi.mock('../shared/ui/index.js', () => ({ - info: vi.fn(), - error: vi.fn(), - success: vi.fn(), - status: vi.fn(), - blankLine: vi.fn(), - header: vi.fn(), - section: vi.fn(), - warn: vi.fn(), - debug: vi.fn(), -})); -// Mock debug logger -vi.mock('../shared/utils/index.js', async (importOriginal) => ({ - ...(await importOriginal>()), - createLogger: () => ({ - info: vi.fn(), - debug: vi.fn(), - error: vi.fn(), - }), -})); - -const { executePipeline } = await import('../features/pipeline/index.js'); - -describe('executePipeline', () => { - beforeEach(() => { - vi.clearAllMocks(); - // Default: git operations succeed - mockExecFileSync.mockReturnValue('abc1234\n'); - // Default: no pipeline config - mockLoadGlobalConfig.mockReturnValue({ - language: 'en', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'claude', - }); - }); - - it('should return exit code 2 when neither --issue nor --task is specified', async () => { - const exitCode = await executePipeline({ - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(2); - }); - - it('should return exit code 2 when gh CLI is not available', async () => { - mockCheckGhCli.mockReturnValueOnce({ available: false, error: 'gh not found' }); - - const exitCode = await executePipeline({ - issueNumber: 99, - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(2); - }); - - it('should return exit code 2 when issue fetch fails', async () => { - mockFetchIssue.mockImplementationOnce(() => { - throw new Error('Issue not found'); - }); - - const exitCode = await executePipeline({ - issueNumber: 999, - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(2); - }); - - it('should return exit code 3 when piece fails', async () => { - mockFetchIssue.mockReturnValueOnce({ - number: 99, - title: 'Test issue', - body: 'Test body', - labels: [], - comments: [], - }); - mockExecuteTask.mockResolvedValueOnce(false); - - const exitCode = await executePipeline({ - issueNumber: 99, - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(3); - }); - - it('should return exit code 0 on successful task-only execution', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(0); - expect(mockExecuteTask).toHaveBeenCalledWith({ - task: 'Fix the bug', - cwd: '/tmp/test', - pieceIdentifier: 'default', - projectCwd: '/tmp/test', - agentOverrides: undefined, - }); - }); - - it('passes provider/model overrides to task execution', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - provider: 'codex', - model: 'codex-model', - }); - - expect(exitCode).toBe(0); - expect(mockExecuteTask).toHaveBeenCalledWith({ - task: 'Fix the bug', - cwd: '/tmp/test', - pieceIdentifier: 'default', - projectCwd: '/tmp/test', - agentOverrides: { provider: 'codex', model: 'codex-model' }, - }); - }); - - it('should return exit code 5 when PR creation fails', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - mockCreatePullRequest.mockReturnValueOnce({ success: false, error: 'PR failed' }); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: true, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(5); - }); - - it('should create PR with correct branch when --auto-pr', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/test/pr/1' }); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - branch: 'fix/my-branch', - autoPr: true, - repo: 'owner/repo', - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(0); - expect(mockCreatePullRequest).toHaveBeenCalledWith( - '/tmp/test', - expect.objectContaining({ - branch: 'fix/my-branch', - repo: 'owner/repo', - }), - ); - }); - - it('should use --task when both --task and positional task are provided', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - - const exitCode = await executePipeline({ - task: 'From --task flag', - piece: 'magi', - autoPr: false, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(0); - expect(mockExecuteTask).toHaveBeenCalledWith({ - task: 'From --task flag', - cwd: '/tmp/test', - pieceIdentifier: 'magi', - projectCwd: '/tmp/test', - agentOverrides: undefined, - }); - }); - - describe('PipelineConfig template expansion', () => { - it('should use commit_message_template when configured', async () => { - mockLoadGlobalConfig.mockReturnValue({ - language: 'en', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'claude', - pipeline: { - commitMessageTemplate: 'fix: {title} (#{issue})', - }, - }); - - mockFetchIssue.mockReturnValueOnce({ - number: 42, - title: 'Login broken', - body: 'Cannot login.', - labels: [], - comments: [], - }); - mockExecuteTask.mockResolvedValueOnce(true); - - await executePipeline({ - issueNumber: 42, - piece: 'default', - branch: 'test-branch', - autoPr: false, - cwd: '/tmp/test', - }); - - // Verify commit was called with expanded template - const commitCall = mockExecFileSync.mock.calls.find( - (call: unknown[]) => call[0] === 'git' && (call[1] as string[])[0] === 'commit', - ); - expect(commitCall).toBeDefined(); - expect((commitCall![1] as string[])[2]).toBe('fix: Login broken (#42)'); - }); - - it('should use default_branch_prefix when configured', async () => { - mockLoadGlobalConfig.mockReturnValue({ - language: 'en', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'claude', - pipeline: { - defaultBranchPrefix: 'feat/', - }, - }); - - mockFetchIssue.mockReturnValueOnce({ - number: 10, - title: 'Add feature', - body: 'Please add.', - labels: [], - comments: [], - }); - mockExecuteTask.mockResolvedValueOnce(true); - - await executePipeline({ - issueNumber: 10, - piece: 'default', - autoPr: false, - cwd: '/tmp/test', - }); - - // Verify checkout -b was called with prefix - const checkoutCall = mockExecFileSync.mock.calls.find( - (call: unknown[]) => call[0] === 'git' && (call[1] as string[])[0] === 'checkout' && (call[1] as string[])[1] === '-b', - ); - expect(checkoutCall).toBeDefined(); - const branchName = (checkoutCall![1] as string[])[2]; - expect(branchName).toMatch(/^feat\/issue-10-\d+$/); - }); - - it('should use pr_body_template when configured for PR creation', async () => { - mockLoadGlobalConfig.mockReturnValue({ - language: 'en', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'claude', - pipeline: { - prBodyTemplate: '## Summary\n{issue_body}\n\nCloses #{issue}', - }, - }); - - mockFetchIssue.mockReturnValueOnce({ - number: 50, - title: 'Fix auth', - body: 'Auth is broken.', - labels: [], - comments: [], - }); - mockExecuteTask.mockResolvedValueOnce(true); - mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/pr/1' }); - - await executePipeline({ - issueNumber: 50, - piece: 'default', - branch: 'fix-auth', - autoPr: true, - cwd: '/tmp/test', - }); - - // When prBodyTemplate is set, buildPrBody (mock) should NOT be called - // Instead, the template is expanded directly - expect(mockCreatePullRequest).toHaveBeenCalledWith( - '/tmp/test', - expect.objectContaining({ - body: '## Summary\nAuth is broken.\n\nCloses #50', - }), - ); - }); - - it('should fall back to buildPrBody when no template is configured', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/pr/1' }); - - await executePipeline({ - task: 'Fix bug', - piece: 'default', - branch: 'fix-branch', - autoPr: true, - cwd: '/tmp/test', - }); - - // Should use buildPrBody (the mock) - expect(mockBuildPrBody).toHaveBeenCalled(); - expect(mockCreatePullRequest).toHaveBeenCalledWith( - '/tmp/test', - expect.objectContaining({ - body: 'Default PR body', - }), - ); - }); - }); - - describe('--skip-git', () => { - it('should skip branch creation, commit, push when skipGit is true', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: false, - skipGit: true, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(0); - expect(mockExecuteTask).toHaveBeenCalledWith({ - task: 'Fix the bug', - cwd: '/tmp/test', - pieceIdentifier: 'default', - projectCwd: '/tmp/test', - agentOverrides: undefined, - }); - - // No git operations should have been called - const gitCalls = mockExecFileSync.mock.calls.filter( - (call: unknown[]) => call[0] === 'git', - ); - expect(gitCalls).toHaveLength(0); - expect(mockPushBranch).not.toHaveBeenCalled(); - }); - - it('should ignore --auto-pr when skipGit is true', async () => { - mockExecuteTask.mockResolvedValueOnce(true); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: true, - skipGit: true, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(0); - expect(mockCreatePullRequest).not.toHaveBeenCalled(); - }); - - it('should still return piece failure exit code when skipGit is true', async () => { - mockExecuteTask.mockResolvedValueOnce(false); - - const exitCode = await executePipeline({ - task: 'Fix the bug', - piece: 'default', - autoPr: false, - skipGit: true, - cwd: '/tmp/test', - }); - - expect(exitCode).toBe(3); - }); - }); -}); +/** + * Tests for pipeline execution + * + * Tests the orchestration logic with mocked dependencies. + */ + +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +// Mock all external dependencies +const mockFetchIssue = vi.fn(); +const mockCheckGhCli = vi.fn().mockReturnValue({ available: true }); +vi.mock('../infra/github/issue.js', () => ({ + fetchIssue: mockFetchIssue, + formatIssueAsTask: vi.fn((issue: { title: string; body: string; number: number }) => + `## GitHub Issue #${issue.number}: ${issue.title}\n\n${issue.body}` + ), + checkGhCli: mockCheckGhCli, +})); + +const mockCreatePullRequest = vi.fn(); +const mockPushBranch = vi.fn(); +const mockBuildPrBody = vi.fn(() => 'Default PR body'); +vi.mock('../infra/github/pr.js', () => ({ + createPullRequest: mockCreatePullRequest, + pushBranch: mockPushBranch, + buildPrBody: mockBuildPrBody, +})); + +const mockExecuteTask = vi.fn(); +vi.mock('../features/tasks/index.js', () => ({ + executeTask: mockExecuteTask, +})); + +// Mock loadGlobalConfig +const mockLoadGlobalConfig = vi.fn(); +vi.mock('../infra/config/global/globalConfig.js', async (importOriginal) => ({ ...(await importOriginal>()), + loadGlobalConfig: mockLoadGlobalConfig, +})); + +// Mock execFileSync for git operations +const mockExecFileSync = vi.fn(); +vi.mock('node:child_process', () => ({ + execFileSync: mockExecFileSync, +})); + +// Mock UI +vi.mock('../shared/ui/index.js', () => ({ + info: vi.fn(), + error: vi.fn(), + success: vi.fn(), + status: vi.fn(), + blankLine: vi.fn(), + header: vi.fn(), + section: vi.fn(), + warn: vi.fn(), + debug: vi.fn(), +})); +// Mock debug logger +vi.mock('../shared/utils/index.js', async (importOriginal) => ({ + ...(await importOriginal>()), + createLogger: () => ({ + info: vi.fn(), + debug: vi.fn(), + error: vi.fn(), + }), +})); + +const { executePipeline } = await import('../features/pipeline/index.js'); + +describe('executePipeline', () => { + beforeEach(() => { + vi.clearAllMocks(); + // Default: git operations succeed + mockExecFileSync.mockReturnValue('abc1234\n'); + // Default: no pipeline config + mockLoadGlobalConfig.mockReturnValue({ + language: 'en', + defaultPiece: 'default', + logLevel: 'info', + provider: 'claude', + }); + }); + + it('should return exit code 2 when neither --issue nor --task is specified', async () => { + const exitCode = await executePipeline({ + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(2); + }); + + it('should return exit code 2 when gh CLI is not available', async () => { + mockCheckGhCli.mockReturnValueOnce({ available: false, error: 'gh not found' }); + + const exitCode = await executePipeline({ + issueNumber: 99, + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(2); + }); + + it('should return exit code 2 when issue fetch fails', async () => { + mockFetchIssue.mockImplementationOnce(() => { + throw new Error('Issue not found'); + }); + + const exitCode = await executePipeline({ + issueNumber: 999, + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(2); + }); + + it('should return exit code 3 when piece fails', async () => { + mockFetchIssue.mockReturnValueOnce({ + number: 99, + title: 'Test issue', + body: 'Test body', + labels: [], + comments: [], + }); + mockExecuteTask.mockResolvedValueOnce(false); + + const exitCode = await executePipeline({ + issueNumber: 99, + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(3); + }); + + it('should return exit code 0 on successful task-only execution', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(0); + expect(mockExecuteTask).toHaveBeenCalledWith({ + task: 'Fix the bug', + cwd: '/tmp/test', + pieceIdentifier: 'default', + projectCwd: '/tmp/test', + agentOverrides: undefined, + }); + }); + + it('passes provider/model overrides to task execution', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + provider: 'codex', + model: 'codex-model', + }); + + expect(exitCode).toBe(0); + expect(mockExecuteTask).toHaveBeenCalledWith({ + task: 'Fix the bug', + cwd: '/tmp/test', + pieceIdentifier: 'default', + projectCwd: '/tmp/test', + agentOverrides: { provider: 'codex', model: 'codex-model' }, + }); + }); + + it('should return exit code 5 when PR creation fails', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + mockCreatePullRequest.mockReturnValueOnce({ success: false, error: 'PR failed' }); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: true, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(5); + }); + + it('should create PR with correct branch when --auto-pr', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/test/pr/1' }); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + branch: 'fix/my-branch', + autoPr: true, + repo: 'owner/repo', + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(0); + expect(mockCreatePullRequest).toHaveBeenCalledWith( + '/tmp/test', + expect.objectContaining({ + branch: 'fix/my-branch', + repo: 'owner/repo', + }), + ); + }); + + it('should use --task when both --task and positional task are provided', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + + const exitCode = await executePipeline({ + task: 'From --task flag', + piece: 'magi', + autoPr: false, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(0); + expect(mockExecuteTask).toHaveBeenCalledWith({ + task: 'From --task flag', + cwd: '/tmp/test', + pieceIdentifier: 'magi', + projectCwd: '/tmp/test', + agentOverrides: undefined, + }); + }); + + describe('PipelineConfig template expansion', () => { + it('should use commit_message_template when configured', async () => { + mockLoadGlobalConfig.mockReturnValue({ + language: 'en', + defaultPiece: 'default', + logLevel: 'info', + provider: 'claude', + pipeline: { + commitMessageTemplate: 'fix: {title} (#{issue})', + }, + }); + + mockFetchIssue.mockReturnValueOnce({ + number: 42, + title: 'Login broken', + body: 'Cannot login.', + labels: [], + comments: [], + }); + mockExecuteTask.mockResolvedValueOnce(true); + + await executePipeline({ + issueNumber: 42, + piece: 'default', + branch: 'test-branch', + autoPr: false, + cwd: '/tmp/test', + }); + + // Verify commit was called with expanded template + const commitCall = mockExecFileSync.mock.calls.find( + (call: unknown[]) => call[0] === 'git' && (call[1] as string[])[0] === 'commit', + ); + expect(commitCall).toBeDefined(); + expect((commitCall![1] as string[])[2]).toBe('fix: Login broken (#42)'); + }); + + it('should use default_branch_prefix when configured', async () => { + mockLoadGlobalConfig.mockReturnValue({ + language: 'en', + defaultPiece: 'default', + logLevel: 'info', + provider: 'claude', + pipeline: { + defaultBranchPrefix: 'feat/', + }, + }); + + mockFetchIssue.mockReturnValueOnce({ + number: 10, + title: 'Add feature', + body: 'Please add.', + labels: [], + comments: [], + }); + mockExecuteTask.mockResolvedValueOnce(true); + + await executePipeline({ + issueNumber: 10, + piece: 'default', + autoPr: false, + cwd: '/tmp/test', + }); + + // Verify checkout -b was called with prefix + const checkoutCall = mockExecFileSync.mock.calls.find( + (call: unknown[]) => call[0] === 'git' && (call[1] as string[])[0] === 'checkout' && (call[1] as string[])[1] === '-b', + ); + expect(checkoutCall).toBeDefined(); + const branchName = (checkoutCall![1] as string[])[2]; + expect(branchName).toMatch(/^feat\/issue-10-\d+$/); + }); + + it('should use pr_body_template when configured for PR creation', async () => { + mockLoadGlobalConfig.mockReturnValue({ + language: 'en', + defaultPiece: 'default', + logLevel: 'info', + provider: 'claude', + pipeline: { + prBodyTemplate: '## Summary\n{issue_body}\n\nCloses #{issue}', + }, + }); + + mockFetchIssue.mockReturnValueOnce({ + number: 50, + title: 'Fix auth', + body: 'Auth is broken.', + labels: [], + comments: [], + }); + mockExecuteTask.mockResolvedValueOnce(true); + mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/pr/1' }); + + await executePipeline({ + issueNumber: 50, + piece: 'default', + branch: 'fix-auth', + autoPr: true, + cwd: '/tmp/test', + }); + + // When prBodyTemplate is set, buildPrBody (mock) should NOT be called + // Instead, the template is expanded directly + expect(mockCreatePullRequest).toHaveBeenCalledWith( + '/tmp/test', + expect.objectContaining({ + body: '## Summary\nAuth is broken.\n\nCloses #50', + }), + ); + }); + + it('should fall back to buildPrBody when no template is configured', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + mockCreatePullRequest.mockReturnValueOnce({ success: true, url: 'https://github.com/pr/1' }); + + await executePipeline({ + task: 'Fix bug', + piece: 'default', + branch: 'fix-branch', + autoPr: true, + cwd: '/tmp/test', + }); + + // Should use buildPrBody (the mock) + expect(mockBuildPrBody).toHaveBeenCalled(); + expect(mockCreatePullRequest).toHaveBeenCalledWith( + '/tmp/test', + expect.objectContaining({ + body: 'Default PR body', + }), + ); + }); + }); + + describe('--skip-git', () => { + it('should skip branch creation, commit, push when skipGit is true', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: false, + skipGit: true, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(0); + expect(mockExecuteTask).toHaveBeenCalledWith({ + task: 'Fix the bug', + cwd: '/tmp/test', + pieceIdentifier: 'default', + projectCwd: '/tmp/test', + agentOverrides: undefined, + }); + + // No git operations should have been called + const gitCalls = mockExecFileSync.mock.calls.filter( + (call: unknown[]) => call[0] === 'git', + ); + expect(gitCalls).toHaveLength(0); + expect(mockPushBranch).not.toHaveBeenCalled(); + }); + + it('should ignore --auto-pr when skipGit is true', async () => { + mockExecuteTask.mockResolvedValueOnce(true); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: true, + skipGit: true, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(0); + expect(mockCreatePullRequest).not.toHaveBeenCalled(); + }); + + it('should still return piece failure exit code when skipGit is true', async () => { + mockExecuteTask.mockResolvedValueOnce(false); + + const exitCode = await executePipeline({ + task: 'Fix the bug', + piece: 'default', + autoPr: false, + skipGit: true, + cwd: '/tmp/test', + }); + + expect(exitCode).toBe(3); + }); + }); +}); diff --git a/src/__tests__/summarize.test.ts b/src/__tests__/summarize.test.ts index 95367f5..cc7ceeb 100644 --- a/src/__tests__/summarize.test.ts +++ b/src/__tests__/summarize.test.ts @@ -1,273 +1,271 @@ -/** - * Tests for summarizeTaskName - */ - -import { describe, it, expect, vi, beforeEach } from 'vitest'; - -vi.mock('../infra/providers/index.js', () => ({ - getProvider: vi.fn(), -})); - -vi.mock('../infra/config/global/globalConfig.js', () => ({ - loadGlobalConfig: vi.fn(), - getBuiltinPiecesEnabled: vi.fn().mockReturnValue(true), -})); - -vi.mock('../shared/utils/index.js', async (importOriginal) => ({ - ...(await importOriginal>()), - createLogger: () => ({ - info: vi.fn(), - debug: vi.fn(), - error: vi.fn(), - }), -})); - -import { getProvider } from '../infra/providers/index.js'; -import { loadGlobalConfig } from '../infra/config/global/globalConfig.js'; -import { summarizeTaskName } from '../infra/task/summarize.js'; - -const mockGetProvider = vi.mocked(getProvider); -const mockLoadGlobalConfig = vi.mocked(loadGlobalConfig); - -const mockProviderCall = vi.fn(); -const mockProvider = { - call: mockProviderCall, - callCustom: vi.fn(), -}; - -beforeEach(() => { - vi.clearAllMocks(); - mockGetProvider.mockReturnValue(mockProvider); - mockLoadGlobalConfig.mockReturnValue({ - language: 'ja', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'claude', - model: 'haiku', - }); -}); - -describe('summarizeTaskName', () => { - it('should return AI-generated slug for Japanese task name', async () => { - // Given: AI returns a slug for Japanese input - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'add-auth', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('認証機能を追加する', { cwd: '/project' }); - - // Then - expect(result).toBe('add-auth'); - expect(mockGetProvider).toHaveBeenCalledWith('claude'); - expect(mockProviderCall).toHaveBeenCalledWith( - 'summarizer', - '認証機能を追加する', - expect.objectContaining({ - cwd: '/project', - model: 'haiku', - allowedTools: [], - }) - ); - }); - - it('should return AI-generated slug for English task name', async () => { - // Given - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'fix-login-bug', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('Fix the login bug', { cwd: '/project' }); - - // Then - expect(result).toBe('fix-login-bug'); - }); - - it('should clean up AI response with extra characters', async () => { - // Given: AI response has extra whitespace or formatting - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: ' Add-User-Auth! \n', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('ユーザー認証を追加', { cwd: '/project' }); - - // Then - expect(result).toBe('add-user-auth'); - }); - - it('should truncate long slugs to 30 characters without trailing hyphen', async () => { - // Given: AI returns a long slug - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'this-is-a-very-long-slug-that-exceeds-thirty-characters', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('長いタスク名', { cwd: '/project' }); - - // Then - expect(result.length).toBeLessThanOrEqual(30); - expect(result).toBe('this-is-a-very-long-slug-that'); - expect(result).not.toMatch(/-$/); // No trailing hyphen - }); - - it('should return "task" as fallback for empty AI response', async () => { - // Given: AI returns empty string - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: '', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('test', { cwd: '/project' }); - - // Then - expect(result).toBe('task'); - }); - - it('should use custom model if specified in options', async () => { - // Given - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'custom-task', - timestamp: new Date(), - }); - - // When - await summarizeTaskName('test', { cwd: '/project', model: 'sonnet' }); - - // Then - expect(mockProviderCall).toHaveBeenCalledWith( - 'summarizer', - expect.any(String), - expect.objectContaining({ - model: 'sonnet', - }) - ); - }); - - it('should use provider from config.yaml', async () => { - // Given: config has codex provider - mockLoadGlobalConfig.mockReturnValue({ - language: 'ja', - trustedDirectories: [], - defaultPiece: 'default', - logLevel: 'info', - provider: 'codex', - model: 'gpt-4', - }); - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'codex-task', - timestamp: new Date(), - }); - - // When - await summarizeTaskName('test', { cwd: '/project' }); - - // Then - expect(mockGetProvider).toHaveBeenCalledWith('codex'); - expect(mockProviderCall).toHaveBeenCalledWith( - 'summarizer', - expect.any(String), - expect.objectContaining({ - model: 'gpt-4', - }) - ); - }); - - it('should remove consecutive hyphens', async () => { - // Given: AI response has consecutive hyphens - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'fix---multiple---hyphens', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('test', { cwd: '/project' }); - - // Then - expect(result).toBe('fix-multiple-hyphens'); - }); - - it('should remove leading and trailing hyphens', async () => { - // Given: AI response has leading/trailing hyphens - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: '-leading-trailing-', - timestamp: new Date(), - }); - - // When - const result = await summarizeTaskName('test', { cwd: '/project' }); - - // Then - expect(result).toBe('leading-trailing'); - }); - - it('should throw error when config load fails', async () => { - // Given: config loading throws error - mockLoadGlobalConfig.mockImplementation(() => { - throw new Error('Config not found'); - }); - - // When/Then - await expect(summarizeTaskName('test', { cwd: '/project' })).rejects.toThrow('Config not found'); - }); - - it('should use romanization when useLLM is false', async () => { - // When: useLLM is explicitly false - const result = await summarizeTaskName('認証機能を追加する', { cwd: '/project', useLLM: false }); - - // Then: should not call provider, should return romaji - expect(mockProviderCall).not.toHaveBeenCalled(); - expect(result).toMatch(/^[a-z0-9-]+$/); - expect(result.length).toBeLessThanOrEqual(30); - }); - - it('should handle mixed Japanese/English with romanization', async () => { - // When - const result = await summarizeTaskName('Add 認証機能', { cwd: '/project', useLLM: false }); - - // Then - expect(result).toMatch(/^[a-z0-9-]+$/); - expect(result).not.toMatch(/^-|-$/); // No leading/trailing hyphens - }); - - it('should use LLM by default', async () => { - // Given - mockProviderCall.mockResolvedValue({ - agent: 'summarizer', - status: 'done', - content: 'add-auth', - timestamp: new Date(), - }); - - // When: useLLM not specified (defaults to true) - await summarizeTaskName('test', { cwd: '/project' }); - - // Then: should call provider - expect(mockProviderCall).toHaveBeenCalled(); - }); -}); +/** + * Tests for summarizeTaskName + */ + +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +vi.mock('../infra/providers/index.js', () => ({ + getProvider: vi.fn(), +})); + +vi.mock('../infra/config/global/globalConfig.js', () => ({ + loadGlobalConfig: vi.fn(), + getBuiltinPiecesEnabled: vi.fn().mockReturnValue(true), +})); + +vi.mock('../shared/utils/index.js', async (importOriginal) => ({ + ...(await importOriginal>()), + createLogger: () => ({ + info: vi.fn(), + debug: vi.fn(), + error: vi.fn(), + }), +})); + +import { getProvider } from '../infra/providers/index.js'; +import { loadGlobalConfig } from '../infra/config/global/globalConfig.js'; +import { summarizeTaskName } from '../infra/task/summarize.js'; + +const mockGetProvider = vi.mocked(getProvider); +const mockLoadGlobalConfig = vi.mocked(loadGlobalConfig); + +const mockProviderCall = vi.fn(); +const mockProvider = { + call: mockProviderCall, + callCustom: vi.fn(), +}; + +beforeEach(() => { + vi.clearAllMocks(); + mockGetProvider.mockReturnValue(mockProvider); + mockLoadGlobalConfig.mockReturnValue({ + language: 'ja', + defaultPiece: 'default', + logLevel: 'info', + provider: 'claude', + model: 'haiku', + }); +}); + +describe('summarizeTaskName', () => { + it('should return AI-generated slug for task name', async () => { + // Given: AI returns a slug for input + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'add-auth', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('add-auth'); + expect(mockGetProvider).toHaveBeenCalledWith('claude'); + expect(mockProviderCall).toHaveBeenCalledWith( + 'summarizer', + 'long task name for testing', + expect.objectContaining({ + cwd: '/project', + model: 'haiku', + allowedTools: [], + }) + ); + }); + + it('should return AI-generated slug for English task name', async () => { + // Given + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'fix-login-bug', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('fix-login-bug'); + }); + + it('should clean up AI response with extra characters', async () => { + // Given: AI response has extra whitespace or formatting + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: ' Add-User-Auth! \n', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('add-user-auth'); + }); + + it('should truncate long slugs to 30 characters without trailing hyphen', async () => { + // Given: AI returns a long slug + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'this-is-a-very-long-slug-that-exceeds-thirty-characters', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result.length).toBeLessThanOrEqual(30); + expect(result).toBe('this-is-a-very-long-slug-that'); + expect(result).not.toMatch(/-$/); // No trailing hyphen + }); + + it('should return "task" as fallback for empty AI response', async () => { + // Given: AI returns empty string + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: '', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('task'); + }); + + it('should use custom model if specified in options', async () => { + // Given + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'custom-task', + timestamp: new Date(), + }); + + // When + await summarizeTaskName('test', { cwd: '/project', model: 'sonnet' }); + + // Then + expect(mockProviderCall).toHaveBeenCalledWith( + 'summarizer', + expect.any(String), + expect.objectContaining({ + model: 'sonnet', + }) + ); + }); + + it('should use provider from config.yaml', async () => { + // Given: config has codex provider + mockLoadGlobalConfig.mockReturnValue({ + language: 'ja', + defaultPiece: 'default', + logLevel: 'info', + provider: 'codex', + model: 'gpt-4', + }); + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'codex-task', + timestamp: new Date(), + }); + + // When + await summarizeTaskName('test', { cwd: '/project' }); + + // Then + expect(mockGetProvider).toHaveBeenCalledWith('codex'); + expect(mockProviderCall).toHaveBeenCalledWith( + 'summarizer', + expect.any(String), + expect.objectContaining({ + model: 'gpt-4', + }) + ); + }); + + it('should remove consecutive hyphens', async () => { + // Given: AI response has consecutive hyphens + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'fix---multiple---hyphens', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('fix-multiple-hyphens'); + }); + + it('should remove leading and trailing hyphens', async () => { + // Given: AI response has leading/trailing hyphens + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: '-leading-trailing-', + timestamp: new Date(), + }); + + // When + const result = await summarizeTaskName('long task name for testing', { cwd: '/project' }); + + // Then + expect(result).toBe('leading-trailing'); + }); + + it('should throw error when config load fails', async () => { + // Given: config loading throws error + mockLoadGlobalConfig.mockImplementation(() => { + throw new Error('Config not found'); + }); + + // When/Then + await expect(summarizeTaskName('test', { cwd: '/project' })).rejects.toThrow('Config not found'); + }); + + it('should use romanization when useLLM is false', async () => { + // When: useLLM is explicitly false + const result = await summarizeTaskName('romanization test', { cwd: '/project', useLLM: false }); + + // Then: should not call provider, should return romaji + expect(mockProviderCall).not.toHaveBeenCalled(); + expect(result).toMatch(/^[a-z0-9-]+$/); + expect(result.length).toBeLessThanOrEqual(30); + }); + + it('should handle mixed Japanese/English with romanization', async () => { + // When + const result = await summarizeTaskName('Add romanization', { cwd: '/project', useLLM: false }); + + // Then + expect(result).toMatch(/^[a-z0-9-]+$/); + expect(result).not.toMatch(/^-|-$/); // No leading/trailing hyphens + }); + + it('should use LLM by default', async () => { + // Given + mockProviderCall.mockResolvedValue({ + agent: 'summarizer', + status: 'done', + content: 'add-auth', + timestamp: new Date(), + }); + + // When: useLLM not specified (defaults to true) + await summarizeTaskName('test', { cwd: '/project' }); + + // Then: should call provider + expect(mockProviderCall).toHaveBeenCalled(); + }); +}); diff --git a/src/core/models/global-config.ts b/src/core/models/global-config.ts index 1e4a20b..c6b9cd8 100644 --- a/src/core/models/global-config.ts +++ b/src/core/models/global-config.ts @@ -36,7 +36,6 @@ export interface PipelineConfig { /** Global configuration for takt */ export interface GlobalConfig { language: Language; - trustedDirectories: string[]; defaultPiece: string; logLevel: 'debug' | 'info' | 'warn' | 'error'; provider?: 'claude' | 'codex' | 'mock'; diff --git a/src/core/models/schemas.ts b/src/core/models/schemas.ts index cd48f74..e8beaad 100644 --- a/src/core/models/schemas.ts +++ b/src/core/models/schemas.ts @@ -216,7 +216,6 @@ export const PieceCategoryConfigSchema = z.record(z.string(), PieceCategoryConfi /** Global config schema */ export const GlobalConfigSchema = z.object({ language: LanguageSchema.optional().default(DEFAULT_LANGUAGE), - trusted_directories: z.array(z.string()).optional().default([]), default_piece: z.string().optional().default('default'), log_level: z.enum(['debug', 'info', 'warn', 'error']).optional().default('info'), provider: z.enum(['claude', 'codex', 'mock']).optional().default('claude'), diff --git a/src/features/interactive/interactive.ts b/src/features/interactive/interactive.ts index e555f59..850cb20 100644 --- a/src/features/interactive/interactive.ts +++ b/src/features/interactive/interactive.ts @@ -285,6 +285,11 @@ export async function interactiveMode( const result = await callAIWithRetry(initialInput, prompts.systemPrompt); if (result) { + if (!result.success) { + error(result.content); + blankLine(); + return { confirmed: false, task: '' }; + } history.push({ role: 'assistant', content: result.content }); blankLine(); } else { @@ -332,6 +337,11 @@ export async function interactiveMode( info(prompts.ui.summarizeFailed); continue; } + if (!summaryResult.success) { + error(summaryResult.content); + blankLine(); + return { confirmed: false, task: '' }; + } const task = summaryResult.content.trim(); const confirmed = await confirmTask( task, @@ -362,6 +372,12 @@ export async function interactiveMode( const result = await callAIWithRetry(trimmed, prompts.systemPrompt); if (result) { + if (!result.success) { + error(result.content); + blankLine(); + history.pop(); + return { confirmed: false, task: '' }; + } history.push({ role: 'assistant', content: result.content }); blankLine(); } else { diff --git a/src/infra/config/global/globalConfig.ts b/src/infra/config/global/globalConfig.ts index 484188f..dbb8ccc 100644 --- a/src/infra/config/global/globalConfig.ts +++ b/src/infra/config/global/globalConfig.ts @@ -6,7 +6,6 @@ */ import { readFileSync, existsSync, writeFileSync } from 'node:fs'; -import { join } from 'node:path'; import { parse as parseYaml, stringify as stringifyYaml } from 'yaml'; import { GlobalConfigSchema } from '../../../core/models/index.js'; import type { GlobalConfig, DebugConfig, Language } from '../../../core/models/index.js'; @@ -17,7 +16,6 @@ import { DEFAULT_LANGUAGE } from '../../../shared/constants.js'; function createDefaultGlobalConfig(): GlobalConfig { return { language: DEFAULT_LANGUAGE, - trustedDirectories: [], defaultPiece: 'default', logLevel: 'info', provider: 'claude', @@ -68,7 +66,6 @@ export class GlobalConfigManager { const parsed = GlobalConfigSchema.parse(raw); const config: GlobalConfig = { language: parsed.language, - trustedDirectories: parsed.trusted_directories, defaultPiece: parsed.default_piece, logLevel: parsed.log_level, provider: parsed.provider, @@ -100,7 +97,6 @@ export class GlobalConfigManager { const configPath = getGlobalConfigPath(); const raw: Record = { language: config.language, - trusted_directories: config.trustedDirectories, default_piece: config.defaultPiece, log_level: config.logLevel, provider: config.provider, @@ -203,23 +199,6 @@ export function setProvider(provider: 'claude' | 'codex'): void { saveGlobalConfig(config); } -export function addTrustedDirectory(dir: string): void { - const config = loadGlobalConfig(); - const resolvedDir = join(dir); - if (!config.trustedDirectories.includes(resolvedDir)) { - config.trustedDirectories.push(resolvedDir); - saveGlobalConfig(config); - } -} - -export function isDirectoryTrusted(dir: string): boolean { - const config = loadGlobalConfig(); - const resolvedDir = join(dir); - return config.trustedDirectories.some( - (trusted) => resolvedDir === trusted || resolvedDir.startsWith(trusted + '/') - ); -} - /** * Resolve the Anthropic API key. * Priority: TAKT_ANTHROPIC_API_KEY env var > config.yaml > undefined (CLI auth fallback) @@ -290,4 +269,3 @@ export function getEffectiveDebugConfig(projectDir?: string): DebugConfig | unde return debugConfig; } - diff --git a/src/infra/config/global/index.ts b/src/infra/config/global/index.ts index df2e4b6..f866866 100644 --- a/src/infra/config/global/index.ts +++ b/src/infra/config/global/index.ts @@ -12,8 +12,6 @@ export { getLanguage, setLanguage, setProvider, - addTrustedDirectory, - isDirectoryTrusted, resolveAnthropicApiKey, resolveOpenaiApiKey, loadProjectDebugConfig, diff --git a/src/infra/config/loaders/loader.ts b/src/infra/config/loaders/loader.ts index a4f0cda..0e0dcfc 100644 --- a/src/infra/config/loaders/loader.ts +++ b/src/infra/config/loaders/loader.ts @@ -28,8 +28,6 @@ export { loadGlobalConfig, saveGlobalConfig, invalidateGlobalConfigCache, - addTrustedDirectory, - isDirectoryTrusted, loadProjectDebugConfig, getEffectiveDebugConfig, } from '../global/globalConfig.js'; diff --git a/src/infra/providers/codex.ts b/src/infra/providers/codex.ts index 178db42..61acb15 100644 --- a/src/infra/providers/codex.ts +++ b/src/infra/providers/codex.ts @@ -2,14 +2,40 @@ * Codex provider implementation */ +import { execFileSync } from 'node:child_process'; import { callCodex, callCodexCustom, type CodexCallOptions } from '../codex/index.js'; import { resolveOpenaiApiKey } from '../config/index.js'; import type { AgentResponse } from '../../core/models/index.js'; import type { Provider, ProviderCallOptions } from './types.js'; +const NOT_GIT_REPO_MESSAGE = + 'Codex をご利用の場合 Git 管理下のディレクトリでのみ動作します。'; + +function isInsideGitRepo(cwd: string): boolean { + try { + const result = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], { + cwd, + encoding: 'utf-8', + stdio: 'pipe', + }).trim(); + return result === 'true'; + } catch { + return false; + } +} + /** Codex provider - wraps existing Codex client */ export class CodexProvider implements Provider { async call(agentName: string, prompt: string, options: ProviderCallOptions): Promise { + if (!isInsideGitRepo(options.cwd)) { + return { + agent: agentName, + status: 'blocked', + content: NOT_GIT_REPO_MESSAGE, + timestamp: new Date(), + }; + } + const callOptions: CodexCallOptions = { cwd: options.cwd, sessionId: options.sessionId, @@ -24,6 +50,15 @@ export class CodexProvider implements Provider { } async callCustom(agentName: string, prompt: string, systemPrompt: string, options: ProviderCallOptions): Promise { + if (!isInsideGitRepo(options.cwd)) { + return { + agent: agentName, + status: 'blocked', + content: NOT_GIT_REPO_MESSAGE, + timestamp: new Date(), + }; + } + const callOptions: CodexCallOptions = { cwd: options.cwd, sessionId: options.sessionId,