/** * status 子指令:一行 JSON 回答「我現在到底是什麼狀態」。 * * 四件事:裝的是哪個版本、正本實際解析到哪個目錄(順帶揭露是不是 npm link 開發模式)、 * node / git / tea 在不在 PATH、Gitea 登入還有沒有效,外加各平台的轉接檔現況。 * * 登入那層會打網路。status 存在的理由就是在出事前先知道,而 token 失效是實務上最常見 * 的故障;一次使用者主動發起的查詢很便宜,為它多開一個旗標只是把判斷推回給使用者。 * * 用法(由 bin/tea-sdlc.js 轉入): * tea-sdlc status */ import { sep } from 'node:path'; import { giteaRequest, onPath, packageVersion, parseFlags, pluginRoot, resolveLogin, } from './lib.js'; import { platformReport } from './install.js'; /** * @param {string[]} argv bin 取走子指令之後剩下的參數 * @returns {Promise} 放進 data 的內容 */ export async function runStatus(argv) { parseFlags(argv, {}); const environment = { node: onPath('node') !== null, git: onPath('git') !== null, tea: onPath('tea') !== null, login: await loginWorks(), }; return { version: packageVersion(), root: pluginRoot(), linked: isLinked(), // ok 說的是「這支指令跑成功了」,環境好不好是 data 的事,兩者不能混 healthy: Object.values(environment).every(Boolean), environment, platforms: platformReport(), }; } /** * 登入還有沒有效。三種失敗(沒登入、token 過期、連不上)在這裡都只是 false—— * 這支指令的工作是回報,不是替使用者決定要不要停下來。 */ async function loginWorks() { try { const response = await giteaRequest(resolveLogin(), 'GET', '/user'); return response.status >= 200 && response.status < 300; } catch { return false; } } /** * 是不是 npm link 的開發模式。判準是「解析到的目錄在不在某個 node_modules 底下」: * link 出來的套件實際住在 working tree,裝進去的則住在 node_modules。 */ function isLinked() { return !pluginRoot().split(sep).includes('node_modules'); }