{"version":3,"file":"parse.mjs","names":[],"sources":["../../src/cli/parse.ts"],"sourcesContent":["import type { CommandDescriptor } from \"./catalog\";\n\ntype SchemaLike = {\n  _def?: {\n    type?: string;\n    innerType?: SchemaLike;\n    shape?: Record<string, SchemaLike>;\n    values?: Record<string, string> | string[];\n  };\n  parse: (value: unknown) => unknown;\n};\n\nfunction unwrap(schema: SchemaLike): SchemaLike {\n  let current = schema;\n  while (true) {\n    const type = current._def?.type;\n    if (type === \"default\" || type === \"optional\" || type === \"nullable\" || type === \"nullish\") {\n      const inner = current._def?.innerType;\n      if (!inner) break;\n      current = inner;\n      continue;\n    }\n    return current;\n  }\n  return current;\n}\n\nfunction isBooleanSchema(schema: SchemaLike): boolean {\n  return unwrap(schema)._def?.type === \"boolean\";\n}\n\nfunction isArraySchema(schema: SchemaLike): boolean {\n  return unwrap(schema)._def?.type === \"array\";\n}\n\nfunction coerceValue(raw: string, schema: SchemaLike): unknown {\n  const inner = unwrap(schema);\n  switch (inner._def?.type) {\n    case \"boolean\":\n      return raw === \"true\" || raw === \"1\" || raw === \"yes\";\n    case \"number\": {\n      const value = Number(raw);\n      if (Number.isNaN(value)) throw new Error(`Invalid number: ${raw}`);\n      return value;\n    }\n    case \"enum\":\n      return raw;\n    default:\n      return raw;\n  }\n}\n\nfunction toFlagName(field: string): string {\n  return `--${field.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase()}`;\n}\n\nfunction getShape(schema: SchemaLike): Record<string, SchemaLike> {\n  const inner = unwrap(schema);\n  const shape = inner._def?.shape;\n  if (!shape) return {};\n  return shape;\n}\n\nexport function parseCommandInput(descriptor: CommandDescriptor, argv: string[]): unknown {\n  const schema = (descriptor.procedure as any)[\"~orpc\"]?.inputSchema as SchemaLike | undefined;\n  if (!schema) return {};\n\n  const shape = getShape(schema);\n  const fields = Object.entries(shape);\n  const fieldByFlag = new Map<string, string>();\n  const positionalFields: string[] = [];\n\n  for (const [fieldName] of fields) {\n    fieldByFlag.set(toFlagName(fieldName), fieldName);\n    if (descriptor.meta.fields?.[fieldName]?.positional) {\n      positionalFields.push(fieldName);\n    }\n  }\n\n  const input: Record<string, unknown> = {};\n  const positionals: string[] = [];\n\n  for (let i = 0; i < argv.length; i += 1) {\n    const token = argv[i];\n    if (!token) continue;\n\n    if (token.startsWith(\"--no-\")) {\n      const flagName = `--${token.slice(5)}`;\n      const fieldName = fieldByFlag.get(flagName);\n      if (!fieldName) throw new Error(`Unknown flag: ${token}`);\n      input[fieldName] = false;\n      continue;\n    }\n\n    if (token.startsWith(\"--\")) {\n      const [flag, inline] = token.split(\"=\", 2);\n      const fieldName = fieldByFlag.get(flag);\n      if (!fieldName) throw new Error(`Unknown flag: ${token}`);\n\n      const fieldSchema = shape[fieldName];\n      if (isBooleanSchema(fieldSchema)) {\n        input[fieldName] = inline ? coerceValue(inline, fieldSchema) : true;\n        continue;\n      }\n\n      const next = inline ?? argv[i + 1];\n\n      if (isArraySchema(fieldSchema)) {\n        if (next === undefined || next.startsWith(\"--\")) {\n          throw new Error(`Missing value for ${flag}`);\n        }\n        input[fieldName] = next\n          .split(\",\")\n          .map((s: string) => s.trim())\n          .filter(Boolean);\n        if (!inline) i += 1;\n        continue;\n      }\n\n      if (next === undefined || next.startsWith(\"--\")) {\n        throw new Error(`Missing value for ${flag}`);\n      }\n      input[fieldName] = coerceValue(next, fieldSchema);\n      if (!inline) i += 1;\n      continue;\n    }\n\n    positionals.push(token);\n  }\n\n  if (positionalFields.length > 0) {\n    positionalFields.forEach((fieldName, index) => {\n      const raw = positionals[index];\n      if (raw !== undefined) {\n        input[fieldName] = coerceValue(raw, shape[fieldName]);\n      }\n    });\n  } else if (positionals.length > 0) {\n    const candidate = fields.find(([, fieldSchema]) => !isBooleanSchema(fieldSchema));\n    if (candidate) {\n      const [fieldName, fieldSchema] = candidate;\n      input[fieldName] = coerceValue(positionals[0], fieldSchema);\n    }\n  }\n\n  return schema.parse(input);\n}\n"],"mappings":"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"}