diff --git a/package-lock.json b/package-lock.json index 8209924..c360c56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,18 +19,18 @@ }, "devDependencies": { "@types/jest": "^29.5.14", - "@types/node": "^24.3.0", + "@types/node": "^24.7.1", "@typescript-eslint/eslint-plugin": "^8.38.0", "@typescript-eslint/parser": "^8.38.0", "eslint": "^9.31.0", "jest": "^29.7.0", "jest-junit": "^16.0.0", "prettier": "^3.6.2", - "ts-jest": "^29.4.1", + "ts-jest": "^29.4.4", "ts-node": "^10.9.2", "tsc-alias": "^1.8.16", "tsx": "^4.20.3", - "typescript": "^5.9.2" + "typescript": "^5.9.3" }, "engines": { "node": ">=20.0.0" @@ -1107,19 +1107,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1188,9 +1191,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", "engines": { @@ -1211,13 +1214,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { @@ -2115,13 +2118,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", - "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz", + "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.13.0" + "undici-types": "~7.14.0" } }, "node_modules/@types/stack-utils": { @@ -2155,17 +2158,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2179,22 +2182,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", + "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2210,14 +2213,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2232,14 +2235,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2250,9 +2253,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", "dev": true, "license": "MIT", "engines": { @@ -2267,15 +2270,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2292,9 +2295,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, "license": "MIT", "engines": { @@ -2306,16 +2309,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2335,16 +2338,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2359,13 +2362,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2662,9 +2665,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", - "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz", + "integrity": "sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2798,9 +2801,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true, "funding": [ { @@ -3186,9 +3189,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.228", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.228.tgz", - "integrity": "sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==", + "version": "1.5.234", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", + "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", "dev": true, "license": "ISC" }, @@ -3294,20 +3297,20 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3811,9 +3814,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", "dev": true, "license": "MIT", "dependencies": { @@ -5196,9 +5199,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "dev": true, "license": "MIT" }, @@ -5820,9 +5823,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6373,9 +6376,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6401,9 +6404,9 @@ } }, "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 7a6ac29..de2244c 100644 --- a/package.json +++ b/package.json @@ -47,17 +47,17 @@ }, "devDependencies": { "@types/jest": "^29.5.14", - "@types/node": "^24.3.0", + "@types/node": "^24.7.1", "@typescript-eslint/eslint-plugin": "^8.38.0", "@typescript-eslint/parser": "^8.38.0", "eslint": "^9.31.0", "jest": "^29.7.0", "jest-junit": "^16.0.0", "prettier": "^3.6.2", - "ts-jest": "^29.4.1", + "ts-jest": "^29.4.4", "ts-node": "^10.9.2", "tsc-alias": "^1.8.16", "tsx": "^4.20.3", - "typescript": "^5.9.2" + "typescript": "^5.9.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8103a0b..8e2b603 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,20 +34,20 @@ importers: specifier: ^29.5.14 version: 29.5.14 '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^24.7.1 + version: 24.7.2 '@typescript-eslint/eslint-plugin': specifier: ^8.38.0 - version: 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2) + version: 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.3))(eslint@9.33.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.38.0 - version: 8.39.1(eslint@9.33.0)(typescript@5.9.2) + version: 8.39.1(eslint@9.33.0)(typescript@5.9.3) eslint: specifier: ^9.31.0 version: 9.33.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + version: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) jest-junit: specifier: ^16.0.0 version: 16.0.0 @@ -55,11 +55,11 @@ importers: specifier: ^3.6.2 version: 3.6.2 ts-jest: - specifier: ^29.4.1 - version: 29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))(typescript@5.9.2) + specifier: ^29.4.4 + version: 29.4.5(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.3.0)(typescript@5.9.2) + version: 10.9.2(@types/node@24.7.2)(typescript@5.9.3) tsc-alias: specifier: ^1.8.16 version: 1.8.16 @@ -67,8 +67,8 @@ importers: specifier: ^4.20.3 version: 4.20.4 typescript: - specifier: ^5.9.2 - version: 5.9.2 + specifier: ^5.9.3 + version: 5.9.3 packages: @@ -699,8 +699,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1830,6 +1830,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1942,8 +1947,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.1: - resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} + ts-jest@29.4.5: + resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2013,8 +2018,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -2023,8 +2028,8 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -2472,27 +2477,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + jest-config: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2517,7 +2522,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -2535,7 +2540,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -2551,7 +2556,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-regex-util: 30.0.1 optional: true @@ -2563,7 +2568,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.30 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -2659,7 +2664,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.3.0 + '@types/node': 24.7.2 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -2669,7 +2674,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.3.0 + '@types/node': 24.7.2 '@types/yargs': 17.0.33 chalk: 4.1.2 optional: true @@ -2821,7 +2826,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.3.0 + '@types/node': 24.7.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -2840,9 +2845,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@24.3.0': + '@types/node@24.7.2': dependencies: - undici-types: 7.10.0 + undici-types: 7.14.0 '@types/stack-utils@2.0.3': {} @@ -2854,41 +2859,41 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.3))(eslint@9.33.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.39.1 eslint: 9.33.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 eslint: 9.33.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.39.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.3) '@typescript-eslint/types': 8.39.1 debug: 4.4.1 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2897,28 +2902,28 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.3) debug: 4.4.1 eslint: 9.33.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.39.1': {} - '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/project-service': 8.39.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.3) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 @@ -2926,19 +2931,19 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.1(eslint@9.33.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0) '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.3) eslint: 9.33.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -3205,13 +3210,13 @@ snapshots: convert-source-map@2.0.0: {} - create-jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + create-jest@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + jest-config: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3615,7 +3620,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -3635,16 +3640,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + jest-cli@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + create-jest: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + jest-config: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3654,7 +3659,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + jest-config@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 '@jest/test-sequencer': 29.7.0 @@ -3679,8 +3684,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.3.0 - ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.9.2) + '@types/node': 24.7.2 + ts-node: 10.9.2(@types/node@24.7.2)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -3709,7 +3714,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3719,7 +3724,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.3.0 + '@types/node': 24.7.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -3734,7 +3739,7 @@ snapshots: jest-haste-map@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.3.0 + '@types/node': 24.7.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -3781,7 +3786,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -3819,7 +3824,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -3847,7 +3852,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -3893,7 +3898,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -3902,7 +3907,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.3.0 + '@types/node': 24.7.2 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -3922,7 +3927,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.3.0 + '@types/node': 24.7.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -3931,26 +3936,26 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.3.0 + '@types/node': 24.7.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.5: dependencies: - '@types/node': 24.3.0 + '@types/node': 24.7.2 '@ungap/structured-clone': 1.3.0 jest-util: 30.0.5 merge-stream: 2.0.0 supports-color: 8.1.1 optional: true - jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + jest@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + jest-cli: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4219,6 +4224,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4314,22 +4321,22 @@ snapshots: triple-beam@1.4.1: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-jest@29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)))(typescript@5.9.2): + ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + jest: 29.7.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.2 + semver: 7.7.3 type-fest: 4.41.0 - typescript: 5.9.2 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.28.3 @@ -4338,21 +4345,21 @@ snapshots: babel-jest: 30.0.5(@babel/core@7.28.3) jest-util: 30.0.5 - ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2): + ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.0 + '@types/node': 24.7.2 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -4389,12 +4396,12 @@ snapshots: type-fest@4.41.0: {} - typescript@5.9.2: {} + typescript@5.9.3: {} uglify-js@3.19.3: optional: true - undici-types@7.10.0: {} + undici-types@7.14.0: {} universal-user-agent@7.0.3: {} diff --git a/src/services/worker/prompt-generator.ts b/src/services/worker/prompt-generator.ts index 4595126..35cc4eb 100644 --- a/src/services/worker/prompt-generator.ts +++ b/src/services/worker/prompt-generator.ts @@ -41,12 +41,29 @@ ${task.boardItem?.description || '작업 제목을 참고하여 적절한 구현 3. **PR 생성**: \`gh pr create --title "${task.boardItem?.title || task.taskId}" --body "작업 완료 요약${task.boardItem?.contentNumber && task.boardItem?.contentType === 'issue' ? '\n\nCloses #' + task.boardItem.contentNumber : ''}"\` 4. **PR 링크 제공**: 생성된 PR 링크를 응답에 포함 -## 작업 요청 -위 작업을 수행하고, 완료되면 다음을 포함하여 응답해주세요: -1. **작업 진행 상황 요약**: 구현한 기능과 변경 사항 -2. **PR 링크**: \`PR: https://github.com/...\` 형식으로 제공 -3. **주요 변경 사항**: 추가/수정/삭제된 파일과 핵심 로직 설명 -4. **테스트 결과**: 실행된 테스트와 결과 상태 +## 응답 형식 +작업이 완료되면 **반드시** 다음 형식으로 응답해주세요: + +\`\`\` +---TASK_RESULT_START--- +상태: [성공 또는 실패] +메시지: [작업이 성공적으로 완료되었습니다 / 작업 처리 중 오류가 발생했습니다] + +## 작업 진행 상황 요약 +[구현한 기능과 변경 사항을 상세히 기술] + +## PR 링크 +PR: https://github.com/... + +## 주요 변경 사항 +[추가/수정/삭제된 파일과 핵심 로직 설명] + +## 테스트 결과 +[실행된 테스트와 결과 상태] +---TASK_RESULT_END--- +\`\`\` + +**중요**: 위 형식을 정확히 따라주세요. 특히 \`---TASK_RESULT_START---\`와 \`---TASK_RESULT_END---\` 구분자는 필수입니다. 작업을 시작해주세요!`; @@ -97,12 +114,29 @@ ${task.boardItem?.description || '작업 제목을 참고하여 적절한 구현 - 새 PR 생성 시: \`gh pr create --title "${task.boardItem?.title || task.taskId}" --body "작업 완료 요약${task.boardItem?.contentNumber && task.boardItem?.contentType === 'issue' ? '\n\nCloses #' + task.boardItem.contentNumber : ''}"\` 4. **PR 링크 제공**: PR 링크를 응답에 포함 -## 완료 요청 -작업이 완료되면 다음을 포함하여 응답해주세요: -1. **이전 상태 요약**: 재개 시점의 프로젝트 상태 -2. **새로 진행한 작업 내용**: 추가로 구현한 기능과 변경 사항 -3. **PR 링크**: \`PR: https://github.com/...\` 형식으로 제공 -4. **테스트 결과**: 실행된 테스트와 결과 상태 +## 응답 형식 +작업이 완료되면 **반드시** 다음 형식으로 응답해주세요: + +\`\`\` +---TASK_RESULT_START--- +상태: [성공 또는 실패] +메시지: [작업이 성공적으로 완료되었습니다 / 작업 처리 중 오류가 발생했습니다] + +## 이전 상태 요약 +[재개 시점의 프로젝트 상태] + +## 새로 진행한 작업 내용 +[추가로 구현한 기능과 변경 사항] + +## PR 링크 +PR: https://github.com/... + +## 테스트 결과 +[실행된 테스트와 결과 상태] +---TASK_RESULT_END--- +\`\`\` + +**중요**: 위 형식을 정확히 따라주세요. 특히 \`---TASK_RESULT_START---\`와 \`---TASK_RESULT_END---\` 구분자는 필수입니다. 계속 진행해주세요!`; @@ -194,12 +228,29 @@ ${commentsSection} 2. **푸시**: \`git push origin ${task.taskId}\` 3. **댓글 작성**: \`gh pr comment ${prNumber} --body "${commentMessage}"\` -## 완료 요청 -모든 피드백을 처리한 후 다음을 포함하여 응답해주세요: -1. **처리한 피드백 요약**: 각 코멘트별 수정 내용 -2. **주요 변경 사항**: 수정된 파일과 핵심 변경점 -3. **테스트 결과**: 실행된 테스트와 결과 상태 -4. **추가 커밋 정보**: 생성된 커밋 메시지와 해시 +## 응답 형식 +모든 피드백 처리가 완료되면 **반드시** 다음 형식으로 응답해주세요: + +\`\`\` +---TASK_RESULT_START--- +상태: [성공 또는 실패] +메시지: [피드백이 성공적으로 반영되었습니다 / 피드백 처리 중 오류가 발생했습니다] + +## 처리한 피드백 요약 +[각 코멘트별 수정 내용] + +## 주요 변경 사항 +[수정된 파일과 핵심 변경점] + +## 테스트 결과 +[실행된 테스트와 결과 상태] + +## 추가 커밋 정보 +[생성된 커밋 메시지와 해시] +---TASK_RESULT_END--- +\`\`\` + +**중요**: 위 형식을 정확히 따라주세요. 특히 \`---TASK_RESULT_START---\`와 \`---TASK_RESULT_END---\` 구분자는 필수입니다. 피드백을 처리해주세요!`; @@ -264,12 +315,29 @@ ${commentsSection} - 브랜치 자동 삭제 확인 - 관련 이슈가 있다면 자동 종료 확인 -## 완료 요청 -병합이 완료되면 다음을 포함하여 응답해주세요: -1. **병합 결과**: 성공 여부와 병합 방식 -2. **발생한 충돌과 해결 방법**: 충돌이 있었다면 해결 과정 -3. **최종 테스트 결과**: 병합 후 테스트 실행 결과 -4. **정리 완료 상태**: 브랜치 삭제 및 이슈 종료 상태 +## 응답 형식 +병합이 완료되면 **반드시** 다음 형식으로 응답해주세요: + +\`\`\` +---TASK_RESULT_START--- +상태: [성공 또는 실패] +메시지: [병합이 성공적으로 완료되었습니다 / 병합 처리 중 오류가 발생했습니다] + +## 병합 결과 +[성공 여부와 병합 방식] + +## 발생한 충돌과 해결 방법 +[충돌이 있었다면 해결 과정, 없으면 "충돌 없이 병합 완료"] + +## 최종 테스트 결과 +[병합 후 테스트 실행 결과] + +## 정리 완료 상태 +[브랜치 삭제 및 이슈 종료 상태] +---TASK_RESULT_END--- +\`\`\` + +**중요**: 위 형식을 정확히 따라주세요. 특히 \`---TASK_RESULT_START---\`와 \`---TASK_RESULT_END---\` 구분자는 필수입니다. 병합을 진행해주세요!`; diff --git a/src/services/worker/result-processor.ts b/src/services/worker/result-processor.ts index 325e6f0..26aa5db 100644 --- a/src/services/worker/result-processor.ts +++ b/src/services/worker/result-processor.ts @@ -207,30 +207,95 @@ export class ResultProcessor implements ResultProcessorInterface { } private isSuccessfulOutput(output: string): boolean { - // 성공 지표 확인 - const successIndicators = [ - '성공적으로 완료', - 'PR:', - '생성된 PR', - 'Pull Request', - '✓.*tests? passed', - '모든 테스트.*통과', - 'Coverage:', - '병합.*성공적으로.*완료', - '작업을.*완료했습니다', - 'merge.*successful', - 'Everything up-to-date', - '모든 변경사항.*적용' + // 1. 명확한 실패 지표 확인 (우선순위 높음) + const criticalFailurePatterns = [ + /TypeScript compilation failed/i, + /✗\s*\d+\s*tests?\s*failed/, + /npm ERR!/, + /Error:/, + /FAIL(?:ED)?:/i, + /fatal:/i, + /Exception:/i, + /throw new Error/i ]; - const hasSuccessIndicator = successIndicators.some(pattern => - new RegExp(pattern, 'i').test(output) + // 치명적 실패 패턴이 있으면 즉시 실패로 판단 + const hasCriticalFailure = criticalFailurePatterns.some(pattern => + pattern.test(output) ); - // 실패 지표 확인 (에러가 없고 성공 지표가 있으면 성공) - const hasErrorIndicator = /ERROR|FAIL|✗.*failed/i.test(output); + if (hasCriticalFailure) { + return false; + } + + // 2. 명확한 성공 지표 확인 + const strongSuccessIndicators = [ + /성공적으로\s*완료/i, + /successfully\s*completed/i, + /PR:\s*https:\/\/github\.com/i, + /생성된\s*PR:\s*https:\/\/github\.com/i, + /Pull\s*Request.*https:\/\/github\.com/i, + /✓\s*\d+\s*tests?\s*passed/, + /모든\s*테스트.*통과/i, + /all\s*tests?\s*passed/i, + /병합.*성공적으로.*완료/i, + /merge.*successful/i, + /Everything up-to-date/, + /작업을.*완료했습니다/i, + /task.*completed/i + ]; + + const hasStrongSuccessIndicator = strongSuccessIndicators.some(pattern => + pattern.test(output) + ); + + // 3. 약한 성공 지표 확인 (보조적) + const weakSuccessIndicators = [ + /Coverage:/i, + /모든\s*변경사항.*적용/i, + /✓/, + /커밋.*생성/i, + /commit.*created/i + ]; + + const hasWeakSuccessIndicator = weakSuccessIndicators.some(pattern => + pattern.test(output) + ); + + // 4. 경미한 경고나 에러 메시지 확인 (성공에 영향 없음) + const minorWarningPatterns = [ + /warning:/i, + /deprecated/i, + /WARN/i + ]; + + // 5. 최종 판단 + // - 강한 성공 지표가 있으면 성공 + // - 강한 성공 지표가 없어도 약한 성공 지표가 2개 이상 있으면 성공 + if (hasStrongSuccessIndicator) { + return true; + } + + // 약한 지표만 있는 경우 추가 검증 + if (hasWeakSuccessIndicator) { + // 출력이 매우 짧으면 (50자 미만) 불확실하므로 실패로 간주 + if (output.length < 50) { + return false; + } + + // 경고만 있고 실제 성공 내용이 없으면 실패 + const onlyWarnings = minorWarningPatterns.some(p => p.test(output)) && + !output.includes('완료') && + !output.includes('completed'); + if (onlyWarnings) { + return false; + } + + return true; + } - return hasSuccessIndicator && !hasErrorIndicator; + // 성공 지표가 없으면 실패 + return false; } private extractResultDetails(output: string, success: boolean): Record { diff --git a/tests/unit/services/worker/prompt-generator.test.ts b/tests/unit/services/worker/prompt-generator.test.ts index 8bc78a3..7d6dc29 100644 --- a/tests/unit/services/worker/prompt-generator.test.ts +++ b/tests/unit/services/worker/prompt-generator.test.ts @@ -439,10 +439,43 @@ describe('PromptGenerator', () => { // When: 프롬프트 생성 const prompt = await promptGenerator.generateNewTaskPrompt(task, workspaceInfo); - // Then: 공통 지침 포함 + // Then: 공통 지침 포함 expect(prompt).toContain('CLAUDE.local.md 파일을 반드시 참고'); expect(prompt).toContain('GitHub 워크플로'); - expect(prompt).toContain('작업 요청'); + expect(prompt).toContain('응답 형식'); + }); + + it('응답 형식 지침이 포함되어야 한다', async () => { + // Given: 기본 작업 + const task: WorkerTask = { + taskId: 'task-format', + action: WorkerAction.START_NEW_TASK, + repositoryId: 'owner/repo', + assignedAt: new Date(), + boardItem: { + id: 'task-format', + title: 'Test response format' + } + }; + + const workspaceInfo: WorkspaceInfo = { + taskId: 'task-format', + repositoryId: 'owner/repo', + workspaceDir: '/workspace/test', + branchName: 'task-format', + worktreeCreated: true, + claudeLocalPath: '/workspace/test/CLAUDE.local.md', + createdAt: new Date() + }; + + // When: 신규 작업 프롬프트 생성 + const prompt = await promptGenerator.generateNewTaskPrompt(task, workspaceInfo); + + // Then: 응답 형식 지침 포함 + expect(prompt).toContain('## 응답 형식'); + expect(prompt).toContain('---TASK_RESULT_START---'); + expect(prompt).toContain('---TASK_RESULT_END---'); + expect(prompt).toContain('성공적으로 완료되었습니다'); }); it('잘못된 입력에 대해 에러를 발생시켜야 한다', async () => {