json-input.js 1.1 KB

123456789101112131415161718192021222324252627282930
  1. import { promises as fs } from 'node:fs'
  2. import path from 'node:path'
  3. /**
  4. * F1 通道的 JSON 输入一律走文件(--file/--payload,Windows 中文管道编码雷区,不走 stdin)。
  5. * 相对路径相对 ctx.repoPath(书仓库),无书时相对 ctx.workdir。
  6. * @returns {Promise<{ok: true, data: object}|{ok: false, error: string}>}
  7. */
  8. export async function readJsonInput(ctx, value, flagName) {
  9. if (!value || value === true) {
  10. return { ok: false, error: `缺少 --${flagName}=<json文件路径>(JSON 走文件,不走管道)` }
  11. }
  12. const base = ctx.repoPath || ctx.workdir || process.cwd()
  13. const full = path.isAbsolute(value) ? value : path.resolve(base, value)
  14. let raw
  15. try {
  16. raw = await fs.readFile(full, 'utf8')
  17. } catch (err) {
  18. return { ok: false, error: `读不到 ${value}:${err.message}` }
  19. }
  20. try {
  21. const data = JSON.parse(raw)
  22. if (!data || typeof data !== 'object' || Array.isArray(data)) {
  23. return { ok: false, error: `${value} 的内容需要是 JSON 对象` }
  24. }
  25. return { ok: true, data }
  26. } catch (err) {
  27. return { ok: false, error: `${value} 不是合法 JSON:${err.message}` }
  28. }
  29. }