From 8d44047fc3779d3aad59e3140321d7b88e95ba4c Mon Sep 17 00:00:00 2001 From: S0ngRu1 <1922909737@qq.com> Date: Mon, 25 May 2026 18:18:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(wizard):=20=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E8=8F=9C=E5=8D=95=E4=B8=8A=E4=B8=8B=E9=94=AE=E9=9C=80?= =?UTF-8?q?=E5=85=88=E6=8C=89=E5=9B=9E=E8=BD=A6=E6=89=8D=E8=83=BD=E5=93=8D?= =?UTF-8?q?=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 promptHelper 从老 inquirer 9.x 迁移到 @inquirer/* modular API, 并升级 @inquirer/select、@inquirer/search 到 5.x/4.x,让所有 @inquirer/* 子包共享同一份 @inquirer/core@11,消除 stdin readline 残留监听器导致的按键被吞问题(issue #17)。 同时在 showToolMenu 中加入 versionFetched 标志位,避免 npm registry 不可达时 fetchPromise 反复触发 abort,造成 select 死循环。 closes #17 --- package.json | 10 +- pnpm-lock.yaml | 520 +++++++---------------------- src/lib/wizard/menus/tool-menu.ts | 35 +- src/lib/wizard/ui/prompt-helper.ts | 73 ++-- src/locales/en_US.json | 1 + src/locales/zh_CN.json | 1 + 6 files changed, 183 insertions(+), 457 deletions(-) diff --git a/package.json b/package.json index 5ebca16..e3ab4e5 100644 --- a/package.json +++ b/package.json @@ -45,17 +45,19 @@ "dist" ], "dependencies": { - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.2.1", + "@inquirer/checkbox": "^5.1.5", + "@inquirer/confirm": "^6.0.13", + "@inquirer/input": "^5.0.13", + "@inquirer/password": "^5.0.13", + "@inquirer/search": "^4.1.9", + "@inquirer/select": "^5.1.5", "chalk": "^5.3.0", "commander": "^12.1.0", - "inquirer": "^9.2.12", "js-yaml": "^4.1.0", "ora": "^8.0.1", "terminal-link": "^5.0.0" }, "devDependencies": { - "@types/inquirer": "^9.0.7", "@types/js-yaml": "^4.0.9", "@types/node": "^20.11.0", "typescript": "^5.3.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c19353..c8a0e66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,21 +8,30 @@ importers: .: dependencies: + '@inquirer/checkbox': + specifier: ^5.1.5 + version: 5.1.5(@types/node@20.19.35) + '@inquirer/confirm': + specifier: ^6.0.13 + version: 6.0.13(@types/node@20.19.35) + '@inquirer/input': + specifier: ^5.0.13 + version: 5.0.13(@types/node@20.19.35) + '@inquirer/password': + specifier: ^5.0.13 + version: 5.0.13(@types/node@20.19.35) '@inquirer/search': - specifier: ^3.2.2 - version: 3.2.2(@types/node@20.19.35) + specifier: ^4.1.9 + version: 4.1.9(@types/node@20.19.35) '@inquirer/select': - specifier: ^4.2.1 - version: 4.4.2(@types/node@20.19.35) + specifier: ^5.1.5 + version: 5.1.5(@types/node@20.19.35) chalk: specifier: ^5.3.0 version: 5.6.2 commander: specifier: ^12.1.0 version: 12.1.0 - inquirer: - specifier: ^9.2.12 - version: 9.3.8(@types/node@20.19.35) js-yaml: specifier: ^4.1.0 version: 4.1.1 @@ -33,9 +42,6 @@ importers: specifier: ^5.0.0 version: 5.0.0 devDependencies: - '@types/inquirer': - specifier: ^9.0.7 - version: 9.0.9 '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 @@ -48,61 +54,85 @@ importers: packages: - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.5': + resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.1.5': + resolution: {integrity: sha512-Jmf9tgBHIEK5SAOB7swYfStqmtkZb00xOTpSQmkoGEpdxOTpJi9RS0A8bkfDPHTTItZRJrRdZrEMu25wyj0VfQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} + '@inquirer/confirm@6.0.13': + resolution: {integrity: sha512-wkGPC7yJ5WJk1DJ5SX7fzk+gfj4BM8cf5dDDi71B/551xHrdsZVRJOC0WyikXd0pEsb/9cLniuE4atbsMqmFkw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + '@inquirer/core@11.1.10': + resolution: {integrity: sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} + '@inquirer/figures@2.0.5': + resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + + '@inquirer/input@5.0.13': + resolution: {integrity: sha512-0l0jCHlJnXIV8CTxwQC0C+5Ziq8WP22edWgmciW2xYvoeoSck4v5FvCS1ctKdqLLR0dUo93uAHgWHywgBSoRyw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} + '@inquirer/password@5.0.13': + resolution: {integrity: sha512-XDGu64ROHZjOOXLAANvJN7iIxWKhOSCG5VakrZ5kaScVR+snVJCFglD/hL3/677awtWcu4pXoWa280CDIYcBeg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/search@4.1.9': + resolution: {integrity: sha512-ZlbM28Q9lmLkFPNAIv+ZuY530n5Km8U1WW48oYEvDhe9yc2uL3m3t+JSdRUkQlk5fuIuskgiIVjcb7czFzQpuA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@5.1.5': + resolution: {integrity: sha512-6SRg6kHfK/sjLXOsuqNebuir+sjwrf/iWuRUnXgB2slzEewppI1WfzeS16XxDcOQmXBruMmmB9Cgrz7wsAxqMg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@types/inquirer@9.0.9': - resolution: {integrity: sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==} + '@inquirer/type@4.0.5': + resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -110,56 +140,21 @@ packages: '@types/node@20.19.35': resolution: {integrity: sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==} - '@types/through@0.0.33': - resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -172,76 +167,38 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + get-east-asian-width@1.5.0: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - has-flag@5.0.1: resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} engines: {node: '>=12'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - inquirer@9.3.8: - resolution: {integrity: sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==} - engines: {node: '>=18'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -254,74 +211,30 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - ora@8.2.0: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -330,21 +243,10 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -353,10 +255,6 @@ packages: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - supports-hyperlinks@4.4.0: resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} engines: {node: '>=20'} @@ -365,13 +263,6 @@ packages: resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} engines: {node: '>=20'} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -380,73 +271,75 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} +snapshots: - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.5': {} -snapshots: + '@inquirer/checkbox@5.1.5(@types/node@20.19.35)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.35) + optionalDependencies: + '@types/node': 20.19.35 - '@inquirer/ansi@1.0.2': {} + '@inquirer/confirm@6.0.13(@types/node@20.19.35)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/type': 4.0.5(@types/node@20.19.35) + optionalDependencies: + '@types/node': 20.19.35 - '@inquirer/core@10.3.2(@types/node@20.19.35)': + '@inquirer/core@11.1.10(@types/node@20.19.35)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.35) + '@inquirer/ansi': 2.0.5 + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.35) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 20.19.35 - '@inquirer/external-editor@1.0.3(@types/node@20.19.35)': + '@inquirer/figures@2.0.5': {} + + '@inquirer/input@5.0.13(@types/node@20.19.35)': dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/type': 4.0.5(@types/node@20.19.35) optionalDependencies: '@types/node': 20.19.35 - '@inquirer/figures@1.0.15': {} - - '@inquirer/search@3.2.2(@types/node@20.19.35)': + '@inquirer/password@5.0.13(@types/node@20.19.35)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.35) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.35) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/type': 4.0.5(@types/node@20.19.35) optionalDependencies: '@types/node': 20.19.35 - '@inquirer/select@4.4.2(@types/node@20.19.35)': + '@inquirer/search@4.1.9(@types/node@20.19.35)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.35) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.35) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.35) optionalDependencies: '@types/node': 20.19.35 - '@inquirer/type@3.0.10(@types/node@20.19.35)': + '@inquirer/select@5.1.5(@types/node@20.19.35)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.35) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.35) optionalDependencies: '@types/node': 20.19.35 - '@types/inquirer@9.0.9': - dependencies: - '@types/through': 0.0.33 - rxjs: 7.8.2 + '@inquirer/type@4.0.5(@types/node@20.19.35)': + optionalDependencies: + '@types/node': 20.19.35 '@types/js-yaml@4.0.9': {} @@ -454,54 +347,16 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/through@0.0.33': - dependencies: - '@types/node': 20.19.35 - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 - ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - argparse@2.0.1: {} - base64-js@1.5.1: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.6.2: {} - chardet@2.1.1: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -510,65 +365,28 @@ snapshots: cli-width@4.1.0: {} - clone@1.0.4: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - commander@12.1.0: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} - environment@1.1.0: {} - get-east-asian-width@1.5.0: {} - - has-flag@4.0.0: {} - - has-flag@5.0.1: {} + fast-string-truncated-width@3.0.3: {} - iconv-lite@0.7.2: + fast-string-width@3.0.2: dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - inherits@2.0.4: {} + fast-string-truncated-width: 3.0.3 - inquirer@9.3.8(@types/node@20.19.35): + fast-wrap-ansi@0.2.2: dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@20.19.35) - '@inquirer/figures': 1.0.15 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - transitivePeerDependencies: - - '@types/node' + fast-string-width: 3.0.2 - is-fullwidth-code-point@3.0.0: {} + get-east-asian-width@1.5.0: {} - is-interactive@1.0.0: {} + has-flag@5.0.1: {} is-interactive@2.0.0: {} - is-unicode-supported@0.1.0: {} - is-unicode-supported@1.3.0: {} is-unicode-supported@2.1.0: {} @@ -577,44 +395,19 @@ snapshots: dependencies: argparse: 2.0.1 - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - log-symbols@6.0.0: dependencies: chalk: 5.6.2 is-unicode-supported: 1.3.0 - mimic-fn@2.1.0: {} - mimic-function@5.0.1: {} - mute-stream@1.0.0: {} - - mute-stream@2.0.0: {} - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 + mute-stream@3.0.0: {} onetime@7.0.0: dependencies: mimic-function: 5.0.1 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - ora@8.2.0: dependencies: chalk: 5.6.2 @@ -627,68 +420,27 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 - run-async@3.0.0: {} - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} stdin-discarder@0.2.2: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 supports-color@10.2.2: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-hyperlinks@4.4.0: dependencies: has-flag: 5.0.1 @@ -699,24 +451,6 @@ snapshots: ansi-escapes: 7.3.0 supports-hyperlinks: 4.4.0 - tslib@2.8.1: {} - - type-fest@0.21.3: {} - typescript@5.9.3: {} undici-types@6.21.0: {} - - util-deprecate@1.0.2: {} - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - yoctocolors-cjs@2.1.3: {} diff --git a/src/lib/wizard/menus/tool-menu.ts b/src/lib/wizard/menus/tool-menu.ts index b2112c2..a9a9d40 100644 --- a/src/lib/wizard/menus/tool-menu.ts +++ b/src/lib/wizard/menus/tool-menu.ts @@ -24,10 +24,24 @@ export async function showToolMenu(tool: ITool): Promise { // 异步获取最新版本(不阻塞菜单渲染) let latestVersion: string | null = null; let fetchPromise: Promise | null = null; + // 标识版本查询是否已结束(成功或失败)。必须独立于 latestVersion: + // 网络失败时 latestVersion 仍为 null,若以 null 判断会每轮循环重挂 abort 钩子, + // 已 resolved 的 promise 立刻触发 abort,造成 select 死循环(issue #17)。 + let versionFetched = false; if (tool.npmPackageName) { fetchPromise = fetchLatestVersion(tool.npmPackageName); - fetchPromise.then(v => { latestVersion = v; }).catch(() => {}); + // 必须在同一回调里同时更新两个变量,保证下面的 abort 钩子触发时 + // versionFetched 已是 true(promise 链上同一 promise 的回调按挂载顺序执行)。 + fetchPromise.then( + v => { + latestVersion = v; + versionFetched = true; + }, + () => { + versionFetched = true; + }, + ); } while (true) { @@ -36,12 +50,12 @@ export async function showToolMenu(tool: ITool): Promise { // 显示版本信息 const installedVersion = tool.getVersion(); - renderVersionInfo(installedVersion, latestVersion, tool.npmPackageName, tool.isInstalled() === null); + renderVersionInfo(installedVersion, latestVersion, versionFetched, tool.npmPackageName, tool.isInstalled() === null); - // 如果最新版本还未获取到,设置 AbortController 以便版本到达后自动刷新 + // 仅当版本查询仍在进行中时,挂 AbortController 以便完成后自动刷新 const controller = new AbortController(); - if (latestVersion === null && fetchPromise) { - fetchPromise.then(() => { + if (!versionFetched && fetchPromise) { + fetchPromise.finally(() => { if (!controller.signal.aborted) { controller.abort(); } @@ -107,8 +121,13 @@ export async function showToolMenu(tool: ITool): Promise { await updateTool(tool); // 更新后重新获取最新版本信息 if (tool.npmPackageName) { + versionFetched = false; fetchPromise = fetchLatestVersion(tool.npmPackageName); - latestVersion = await fetchPromise; + try { + latestVersion = await fetchPromise; + } finally { + versionFetched = true; + } } break; @@ -126,6 +145,7 @@ export async function showToolMenu(tool: ITool): Promise { function renderVersionInfo( installed: string | null, latest: string | null, + fetched: boolean, npmPackageName?: string, isDesktop = false, ): void { @@ -159,6 +179,9 @@ function renderVersionInfo( `${chalk.white(latest)} ${chalk.green(t('tool_version_up_to_date'))}`, ); } + } else if (fetched) { + // 查询已结束但未拿到版本(如 npm registry 不可达) + uiRenderer.renderConfigItem(t('tool_version_latest'), chalk.dim(t('tool_version_unavailable'))); } else { uiRenderer.renderConfigItem(t('tool_version_latest'), chalk.dim(t('tool_version_checking'))); } diff --git a/src/lib/wizard/ui/prompt-helper.ts b/src/lib/wizard/ui/prompt-helper.ts index 0e7f614..0a0c717 100644 --- a/src/lib/wizard/ui/prompt-helper.ts +++ b/src/lib/wizard/ui/prompt-helper.ts @@ -1,4 +1,7 @@ -import inquirer from 'inquirer'; +import select from '@inquirer/select'; +import input from '@inquirer/input'; +import password from '@inquirer/password'; +import checkbox from '@inquirer/checkbox'; import search from '@inquirer/search'; import { t } from '../../i18n.js'; import { theme } from './theme.js'; @@ -7,44 +10,25 @@ import { theme } from './theme.js'; const SKIP_VALUE = '__skip__'; // inquirer 封装 - 统一交互式 prompt +// 全部基于 @inquirer/* modular API,避免与老 inquirer 9.x 混用导致 stdin +// readline 残留监听器(按上下键失效、需先按回车的根因)。 export const promptHelper = { // 单选列表 async select(message: string, choices: { name: string; value: T }[]): Promise { - const { answer } = await inquirer.prompt([ - { - type: 'list', - name: 'answer', - message, - choices, - }, - ]); - return answer as T; + return await select({ + message, + choices: choices.map(c => ({ name: c.name, value: c.value })), + }); }, // 密码/隐藏输入 async password(message: string): Promise { - const { answer } = await inquirer.prompt([ - { - type: 'password', - name: 'answer', - message, - mask: '*', - }, - ]); - return answer as string; + return await password({ message, mask: '*' }); }, // 文本输入 async input(message: string, defaultValue?: string): Promise { - const { answer } = await inquirer.prompt([ - { - type: 'input', - name: 'answer', - message, - default: defaultValue, - }, - ]); - return answer as string; + return await input({ message, default: defaultValue }); }, // 确认 (上下选择) @@ -59,40 +43,21 @@ export const promptHelper = { { name: `${theme.icon('✔')} ${t('confirm_yes')}`, value: true }, ]; - const { answer } = await inquirer.prompt([ - { - type: 'list', - name: 'answer', - message, - choices, - }, - ]); - return answer as boolean; + return await select({ message, choices }); }, // 按回车继续(不显示 Yes/No,仅等待用户按回车) async pressEnter(message?: string): Promise { - await inquirer.prompt([ - { - type: 'input', - name: 'answer', - message: message || t('press_enter_to_continue'), - }, - ]); + await input({ message: message || t('press_enter_to_continue') }); }, // 多选列表 async checkbox(message: string, choices: { name: string; value: T }[]): Promise { - const { answer } = await inquirer.prompt([ - { - type: 'checkbox', - name: 'answer', - message, - choices, - pageSize: 15, - }, - ]); - return answer as T[]; + return await checkbox({ + message, + choices: choices.map(c => ({ name: c.name, value: c.value })), + pageSize: 15, + }); }, // 搜索+自动补全选择(同时展示输入框和可滚动列表,支持自定义输入和跳过) diff --git a/src/locales/en_US.json b/src/locales/en_US.json index daa67bd..27a9b81 100644 --- a/src/locales/en_US.json +++ b/src/locales/en_US.json @@ -69,6 +69,7 @@ "tool_version_installed": "Installed", "tool_version_latest": "Latest", "tool_version_checking": "Checking...", + "tool_version_unavailable": "Unavailable (check network)", "tool_version_unknown": "Unknown", "tool_version_not_installed": "Not installed", "tool_version_update_hint": "Update available!", diff --git a/src/locales/zh_CN.json b/src/locales/zh_CN.json index c4e2b70..7647fce 100644 --- a/src/locales/zh_CN.json +++ b/src/locales/zh_CN.json @@ -76,6 +76,7 @@ "tool_version_installed": "当前版本", "tool_version_latest": "最新版本", "tool_version_checking": "检查中...", + "tool_version_unavailable": "未能获取(请检查网络)", "tool_version_unknown": "未知", "tool_version_not_installed": "未安装", "tool_version_update_hint": "有新版本可用!",