UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

1 lines 6.85 kB
{"version":3,"file":"parse.cjs","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":";;AAYA,SAAS,OAAO,QAAgC;CAC9C,IAAI,UAAU;AACd,QAAO,MAAM;EACX,MAAM,OAAO,QAAQ,MAAM;AAC3B,MAAI,SAAS,aAAa,SAAS,cAAc,SAAS,cAAc,SAAS,WAAW;GAC1F,MAAM,QAAQ,QAAQ,MAAM;AAC5B,OAAI,CAAC,MAAO;AACZ,aAAU;AACV;;AAEF,SAAO;;AAET,QAAO;;AAGT,SAAS,gBAAgB,QAA6B;AACpD,QAAO,OAAO,OAAO,CAAC,MAAM,SAAS;;AAGvC,SAAS,cAAc,QAA6B;AAClD,QAAO,OAAO,OAAO,CAAC,MAAM,SAAS;;AAGvC,SAAS,YAAY,KAAa,QAA6B;AAE7D,SADc,OAAO,OACR,CAAC,MAAM,MAApB;EACE,KAAK,UACH,QAAO,QAAQ,UAAU,QAAQ,OAAO,QAAQ;EAClD,KAAK,UAAU;GACb,MAAM,QAAQ,OAAO,IAAI;AACzB,OAAI,OAAO,MAAM,MAAM,CAAE,OAAM,IAAI,MAAM,mBAAmB,MAAM;AAClE,UAAO;;EAET,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,WAAW,OAAuB;AACzC,QAAO,KAAK,MAAM,QAAQ,sBAAsB,QAAQ,CAAC,aAAa;;AAGxE,SAAS,SAAS,QAAgD;CAEhE,MAAM,QADQ,OAAO,OACF,CAAC,MAAM;AAC1B,KAAI,CAAC,MAAO,QAAO,EAAE;AACrB,QAAO;;AAGT,SAAgB,kBAAkB,YAA+B,MAAyB;CACxF,MAAM,SAAU,WAAW,UAAkB,UAAU;AACvD,KAAI,CAAC,OAAQ,QAAO,EAAE;CAEtB,MAAM,QAAQ,SAAS,OAAO;CAC9B,MAAM,SAAS,OAAO,QAAQ,MAAM;CACpC,MAAM,8BAAc,IAAI,KAAqB;CAC7C,MAAM,mBAA6B,EAAE;AAErC,MAAK,MAAM,CAAC,cAAc,QAAQ;AAChC,cAAY,IAAI,WAAW,UAAU,EAAE,UAAU;AACjD,MAAI,WAAW,KAAK,SAAS,YAAY,WACvC,kBAAiB,KAAK,UAAU;;CAIpC,MAAM,QAAiC,EAAE;CACzC,MAAM,cAAwB,EAAE;AAEhC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;EACvC,MAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,WAAW,QAAQ,EAAE;GAC7B,MAAM,WAAW,KAAK,MAAM,MAAM,EAAE;GACpC,MAAM,YAAY,YAAY,IAAI,SAAS;AAC3C,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,iBAAiB,QAAQ;AACzD,SAAM,aAAa;AACnB;;AAGF,MAAI,MAAM,WAAW,KAAK,EAAE;GAC1B,MAAM,CAAC,MAAM,UAAU,MAAM,MAAM,KAAK,EAAE;GAC1C,MAAM,YAAY,YAAY,IAAI,KAAK;AACvC,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,iBAAiB,QAAQ;GAEzD,MAAM,cAAc,MAAM;AAC1B,OAAI,gBAAgB,YAAY,EAAE;AAChC,UAAM,aAAa,SAAS,YAAY,QAAQ,YAAY,GAAG;AAC/D;;GAGF,MAAM,OAAO,UAAU,KAAK,IAAI;AAEhC,OAAI,cAAc,YAAY,EAAE;AAC9B,QAAI,SAAS,UAAa,KAAK,WAAW,KAAK,CAC7C,OAAM,IAAI,MAAM,qBAAqB,OAAO;AAE9C,UAAM,aAAa,KAChB,MAAM,IAAI,CACV,KAAK,MAAc,EAAE,MAAM,CAAC,CAC5B,OAAO,QAAQ;AAClB,QAAI,CAAC,OAAQ,MAAK;AAClB;;AAGF,OAAI,SAAS,UAAa,KAAK,WAAW,KAAK,CAC7C,OAAM,IAAI,MAAM,qBAAqB,OAAO;AAE9C,SAAM,aAAa,YAAY,MAAM,YAAY;AACjD,OAAI,CAAC,OAAQ,MAAK;AAClB;;AAGF,cAAY,KAAK,MAAM;;AAGzB,KAAI,iBAAiB,SAAS,EAC5B,kBAAiB,SAAS,WAAW,UAAU;EAC7C,MAAM,MAAM,YAAY;AACxB,MAAI,QAAQ,OACV,OAAM,aAAa,YAAY,KAAK,MAAM,WAAW;GAEvD;UACO,YAAY,SAAS,GAAG;EACjC,MAAM,YAAY,OAAO,MAAM,GAAG,iBAAiB,CAAC,gBAAgB,YAAY,CAAC;AACjF,MAAI,WAAW;GACb,MAAM,CAAC,WAAW,eAAe;AACjC,SAAM,aAAa,YAAY,YAAY,IAAI,YAAY;;;AAI/D,QAAO,OAAO,MAAM,MAAM"}