Methods
buildSpawnArgs(command, argsopt) → {Object}
- Description:
將command與args轉為可安全交給child_process.spawn之參數, 主要處理Windows下npm全域命令為.cmd批次檔而spawn無法直接執行之問題 策略優先順序:
- .exe → 直接spawn
- .cmd → 解析JS入口, 用node直接執行(繞過cmd.exe, 支援多行參數)
- .cmd但無法解析JS入口 → 透過cmd.exe /d /s /c執行(fallback, 不支援多行參數) 非Windows平台原樣回傳 回傳物件三個分支一律帶opt鍵(無額外設定時為{}), 呼叫端可直接展開至spawn之選項物件
- Source:
Parameters:
| Name | Type | Attributes | Default | Description |
|---|---|---|---|---|
command |
String | 輸入執行檔名稱字串 |
||
args |
Array |
<optional> |
[]
|
輸入參數陣列, 預設[] |
Returns:
回傳spawn參數物件, 內含file(執行檔), args(參數陣列), opt(spawn額外選項物件)
- Type
- Object
buildSpawnEnv(envExtraopt) → {Object}
- Description:
建立子進程之環境變數物件: 以process.env為底, 加入PYTHONIOENCODING=utf-8, 再併入envExtra(同名以envExtra為準) 每次呼叫重新求值且不動本進程process.env, 故並行調用可各自帶不同值 Windows下環境變數大小寫不敏感但JS物件鍵敏感, 故併入前先移除大小寫不同之同名既有鍵, 否則呼叫端傳Path而process.env為PATH時兩鍵並存且Windows取原值, 注入靜默失效 此刪除僅限win32: POSIX環境變數大小寫敏感, Path與PATH為兩個獨立變數, 誤刪即退化
- Source:
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
envExtra |
Object |
<optional> |
輸入額外注入之環境變數物件, 值為undefined代表移除該變數, 預設undefined代表不覆寫任何變數 |
Returns:
回傳可交給spawn之env物件
- Type
- Object
buildValidator(rule) → {function|null}
- Description:
建立驗證函式 支援'nonempty', 'json', 'min:100'或自訂函式, 多規則可用逗號串接
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
rule |
String | function | 輸入驗證規則字串或自訂函式 |
Returns:
回傳驗證函式, 無有效規則回傳null
- Type
- function | null
escapeWinArg(arg) → {String}
- Description:
轉義cmd.exe的單一參數(cross-spawn escapeArgument邏輯) 參考: https://qntm.org/cmd
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
arg |
String | 輸入參數字串 |
Returns:
回傳轉義後參數字串
- Type
- String
escapeWinCmd(cmd) → {String}
- Description:
轉義cmd.exe的命令部分
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
cmd |
String | 輸入命令字串 |
Returns:
回傳轉義後命令字串
- Type
- String
execCliOnce(command, argsopt, optopt) → {Promise}
- Description:
單次非同步呼叫(內部使用, 不含重試邏輯)
- Source:
Parameters:
| Name | Type | Attributes | Default | Description |
|---|---|---|---|---|
command |
String | 輸入執行檔名稱字串 |
||
args |
Array |
<optional> |
[]
|
輸入參數陣列 |
opt |
Object |
<optional> |
{}
|
輸入設定物件 |
Returns:
回傳Promise, resolve回傳結果物件
- Type
- Promise
genBasic() → {Object}
Returns:
回傳eventemitter3實例
- Type
- Object
genSafe(funGetListenerErroropt) → {Object}
- Description:
建立事件物件, 並攔截應用端監聽器之錯誤
適用於emit以setTimeout延後派發之情境(如cache等內部以timer脫勾派發者): 監聽器同步拋錯即為計時器回呼內之uncaughtException, async監聽器reject即為unhandledRejection, 兩者於nodejs皆使整個行程崩潰(伺服器端即整個服務死亡), 且emit端無法以try catch攔截; 又若事件之參數含該請求之pm(如execute/upload/download), 監聽器出錯而未settle會使請求永久懸置。 故於註冊時包裝監聽器, 同步拋錯與async reject皆交由funGetListenerError處置(由呼叫端決定是否reject pm、發error事件)
以on/once/addListener註冊者皆包裝; 包裝函數以(原函數, 事件名)為鍵快取, 同一組合重用同一包裝, 使off/removeListener能以原函數反查移除(eventemitter3以函數識別嚴格比對), 同一函數掛於多個事件亦各自正確; once由eventemitter3內部以包裝函數自行移除, 傳入者已為包裝函數則直通不再包一層 listeners()對外回傳原函數(非包裝函數); 包裝函數於該事件已無註冊時(off/once自動移除/removeAllListeners)自快取清除, 避免長壽原函數配動態事件名無界累積 funGetListenerError本身同步拋錯或回傳rejection(async handler)皆被吞掉, 避免防護函數反成崩潰來源; 監聽器移除後其尚未settle之async reject仍會回報(依當下是否有error監聽者決定emit或console.error)
未提供funGetListenerError時採預設政策: 事件參數args[0].pm若為promise-like且可reject(具then與reject, 即genPm之形狀; 業務物件恰有reject方法不算)先reject之(reject自身出錯不影響後續通報), 使模組流程不因監聽器出錯而懸置; 再於同一實例emit('error', { fun: 'listener', name, msg: err, args })供呼叫端得知; 若出錯者本身即為error事件之監聽器(否則無限遞迴)、或實例上無任何error監聽者(eventemitter3對無人監聽之error不throw亦不印, 錯誤會無聲消失), 則改以console.error留痕
- Source:
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
funGetListenerError |
function |
<optional> |
監聽器出錯時之回呼, 傳入(name, err, args), name為事件名稱, err為錯誤, args為該次派發之參數陣列, 未提供則採預設政策 |
Returns:
回傳eventemitter3實例
- Type
- Object
parseJsEntryFromCmd(cmdPath) → {String|null}
- Description:
從.cmd shim中解析出實際入口檔案路徑(可能為JS, 亦可能為原生.exe) npm全域安裝的.cmd格式固定, 末行為: ... "%_prog%" "%dp0%\node_modules...\entry" %* 入口可能為.js / .cjs / .mjs / 無副檔名 / .exe(如opencode的bin/opencode.exe), 故一律抓引號內node_modules後的相對路徑, 再以fsIsFile驗證實體檔存在 (只匹配.js會讓無副檔名入口落入cmd.exe fallback, 破壞多行prompt) 回傳後由buildSpawnArgs依副檔名決定: .exe直接spawn, 其餘交給node
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
cmdPath |
String | 輸入.cmd檔案路徑字串 |
Returns:
回傳入口檔案路徑字串, 無法解析回傳null
- Type
- String | null
parseVersion(v) → {Array|null}
- Description:
自字串解析版本號(取第一個「數字.數字.數字」)
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
v |
String | 輸入字串 |
Returns:
回傳三段整數陣列, 無法解析回傳null
- Type
- Array | null
resolveCommand(cmd) → {String}
- Description:
用where指令找到命令的實際路徑(.cmd / .exe)
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
cmd |
String | 輸入命令字串 |
Returns:
回傳解析後之命令路徑字串
- Type
- String