{"version":3,"file":"stdin.mjs","names":[],"sources":["../../src/extension/stdin.ts"],"sourcesContent":["import { applyValues, isArrayField, isAsyncStreamField } from '../core/args.ts';\nimport { resolveStdin, resolveStdinAlways } from '../core/default-runtime.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport { createStdinStream } from '../util/stream.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst stdinInterceptor = defineInterceptor({ id: 'padrone:stdin', name: 'padrone:stdin', order: -1001 }, () => ({\n  validate(ctx: InterceptorValidateContext, next) {\n    const stdinField = ctx.command.meta?.stdin;\n    if (!stdinField) return next();\n\n    // Skip if the field was already provided via CLI flags\n    if (stdinField in ctx.rawArgs && ctx.rawArgs[stdinField] !== undefined) return next();\n\n    const streamInfo = isAsyncStreamField(ctx.command.argsSchema, stdinField);\n    if (streamInfo) {\n      const stdinForStream = resolveStdinAlways(ctx.runtime as any);\n      const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: createStdinStream(stdinForStream, streamInfo.itemSchema) });\n      return next({ rawArgs: mergedRawArgs });\n    }\n\n    const stdin = resolveStdin(ctx.runtime as any);\n    if (!stdin) return next();\n\n    if (isArrayField(ctx.command.argsSchema, stdinField)) {\n      return (async () => {\n        const lines: string[] = [];\n        for await (const line of stdin.lines()) {\n          lines.push(line);\n        }\n        const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: lines });\n        return next({ rawArgs: mergedRawArgs });\n      })();\n    }\n\n    return stdin.text().then((text) => {\n      if (!text) return next();\n      const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: text });\n      return next({ rawArgs: mergedRawArgs });\n    });\n  },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that reads stdin data into the argument field specified by `meta.stdin`.\n * Included by default via `createPadrone()`.\n *\n * Read mode is inferred from the schema type:\n * - `string` field → reads all stdin as a single string\n * - `string[]` field → reads stdin line-by-line into an array\n * - `AsyncIterable` field → returns a stream for line-by-line async consumption\n *\n * Stdin is only read when piped (not a TTY) and the field wasn't already provided via CLI flags.\n */\nexport function padroneStdin(options?: { disabled?: boolean }): <T extends CommandTypesBase>(builder: T) => T {\n  const interceptor = options?.disabled ? defineInterceptor({ ...stdinInterceptor, disabled: true }, () => ({})) : stdinInterceptor;\n  return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n"],"mappings":";;;;;AAQA,MAAM,mBAAmB,kBAAkB;CAAE,IAAI;CAAiB,MAAM;CAAiB,OAAO;AAAM,UAAU,EAC9G,SAAS,KAAiC,MAAM;CAC9C,MAAM,aAAa,IAAI,QAAQ,MAAM;CACrC,IAAI,CAAC,YAAY,OAAO,KAAK;CAG7B,IAAI,cAAc,IAAI,WAAW,IAAI,QAAQ,gBAAgB,KAAA,GAAW,OAAO,KAAK;CAEpF,MAAM,aAAa,mBAAmB,IAAI,QAAQ,YAAY,UAAU;CACxE,IAAI,YAAY;EACd,MAAM,iBAAiB,mBAAmB,IAAI,OAAc;EAE5D,OAAO,KAAK,EAAE,SADQ,YAAY,IAAI,SAAS,GAAG,aAAa,kBAAkB,gBAAgB,WAAW,UAAU,EAAE,CACrF,EAAE,CAAC;CACxC;CAEA,MAAM,QAAQ,aAAa,IAAI,OAAc;CAC7C,IAAI,CAAC,OAAO,OAAO,KAAK;CAExB,IAAI,aAAa,IAAI,QAAQ,YAAY,UAAU,GACjD,QAAQ,YAAY;EAClB,MAAM,QAAkB,CAAC;EACzB,WAAW,MAAM,QAAQ,MAAM,MAAM,GACnC,MAAM,KAAK,IAAI;EAGjB,OAAO,KAAK,EAAE,SADQ,YAAY,IAAI,SAAS,GAAG,aAAa,MAAM,CAClC,EAAE,CAAC;CACxC,EAAA,CAAG;CAGL,OAAO,MAAM,KAAK,CAAC,CAAC,MAAM,SAAS;EACjC,IAAI,CAAC,MAAM,OAAO,KAAK;EAEvB,OAAO,KAAK,EAAE,SADQ,YAAY,IAAI,SAAS,GAAG,aAAa,KAAK,CACjC,EAAE,CAAC;CACxC,CAAC;AACH,EACF,EAAE;;;;;;;;;;;;AAeF,SAAgB,aAAa,SAAiF;CAC5G,MAAM,cAAc,SAAS,WAAW,kBAAkB;EAAE,GAAG;EAAkB,UAAU;CAAK,UAAU,CAAC,EAAE,IAAI;CACjH,SAAS,YAA+B,QAAQ,UAAU,WAAW;AACvE"}