quota/readJsonOrNull.mjs

import get from 'lodash-es/get.js'
import fsReadJson from 'wsemi/src/fsReadJson.mjs'


// readJsonOrNull.mjs — 讀取JSON檔, 任何失敗一律回null
//
// 【為何獨立成檔】三個額度轉接器都要讀各自CLI之憑證或設定檔, 且處置一致(檔案不存在、
//   無權限、內容非JSON皆視為「取不到」而非錯誤); 同一段判斷曾各自手寫三份,
//   依全域規範「同一規則手寫≥2處即補丁訊號」收斂於此。
//
// 【為何包wsemi之fsReadJson而非自寫try/catch】fsReadJson已是套件內讀JSON之canonical實作
//   (純JSON.parse, 無型別轉換), 以{ success }/{ error }回報; 本檔只把它收斂成
//   「成功回值、失敗回null」之單一契約, 令呼叫端不必每處都判斷error鍵。


/**
 * 讀取JSON檔,任何失敗一律回傳null
 *
 * 檔案不存在、無讀取權限、內容非合法JSON三種情形對呼叫端而言皆為「取不到」,
 * 無須區分,故一律回null,由呼叫端決定後續處置(例如回報未登入)
 *
 * @param {String} fp 輸入檔案路徑字串
 * @returns {Object|Array|null} 回傳解析後之JSON值,讀取或解析失敗回傳null
 * @example
 *
 * import readJsonOrNull from './src/quota/readJsonOrNull.mjs'
 *
 * console.log(readJsonOrNull('./package.json') !== null)
 * // => true
 *
 * console.log(readJsonOrNull('./no-such-file.json'))
 * // => null
 *
 */
function readJsonOrNull(fp) {
    let rj = fsReadJson(fp)
    return get(rj, 'success', null)
}


export default readJsonOrNull