{"version":3,"file":"interactive.mjs","names":[],"sources":["../../src/extension/interactive.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { hasInteractiveConfig, thenMaybe } from '../core/results.ts';\nimport { buildCommandArgs, checkUnknownArgs } from '../core/validate.ts';\nimport { promptInteractiveFields } from '../feature/interactive.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext, InterceptorValidateResult } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst interactiveInterceptor = defineInterceptor({ id: 'padrone:interactive', name: 'padrone:interactive', order: -999 }, () => ({\n  validate(ctx: InterceptorValidateContext, next) {\n    // Extract --interactive / -i flags from rawArgs\n    let flagInteractive: boolean | undefined;\n    if (hasInteractiveConfig(ctx.command.meta)) {\n      if (ctx.rawArgs.interactive !== undefined) {\n        flagInteractive = ctx.rawArgs.interactive !== false && ctx.rawArgs.interactive !== 'false';\n        delete ctx.rawArgs.interactive;\n      }\n      if (ctx.rawArgs.i !== undefined) {\n        flagInteractive = ctx.rawArgs.i !== false && ctx.rawArgs.i !== 'false';\n        delete ctx.rawArgs.i;\n      }\n    }\n\n    // Resolve effective interactivity\n    const { runtime, command } = ctx;\n    const runtimeDefault: boolean | undefined =\n      runtime.interactive === 'forced' ? true : runtime.interactive === 'disabled' ? false : undefined;\n    const effectiveInteractive: boolean | undefined = flagInteractive ?? ctx.evalInteractive ?? runtimeDefault;\n    const commandUsesStdin = !!command.meta?.stdin;\n    const stdinIsPiped = commandUsesStdin && (runtime.stdin ? !runtime.stdin.isTTY : runtime.terminal?.isTTY !== true);\n    const interactivitySuppressed =\n      runtime.interactive === 'unsupported' || effectiveInteractive === false || (stdinIsPiped && effectiveInteractive !== true);\n    const forceInteractive = !interactivitySuppressed && effectiveInteractive === true;\n\n    const willPrompt = !interactivitySuppressed && runtime.prompt && hasInteractiveConfig(command.meta);\n    if (!willPrompt) return next();\n\n    // Preprocess args to determine what's missing\n    const { args: preprocessedArgs, issues: positionalIssues } = buildCommandArgs(command, ctx.rawArgs, ctx.positionalArgs);\n    if (positionalIssues) return { args: undefined, argsResult: { issues: positionalIssues } } as any;\n\n    // Check for unknown args before prompting\n    const unknowns = checkUnknownArgs(command, preprocessedArgs);\n    if (unknowns.length > 0) {\n      const issues: StandardSchemaV1.Issue[] = unknowns.map(({ key }) => ({\n        path: [key],\n        message: `Unknown option: \"${key}\"`,\n      }));\n      return { args: undefined, argsResult: { issues } } as any;\n    }\n\n    // Early-validate provided fields — fail fast on user-supplied errors before prompting\n    const earlyValidateAndPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n      if (command.argsSchema) {\n        const providedKeys = new Set(Object.keys(preprocessedArgs).filter((k) => preprocessedArgs[k] !== undefined));\n        const earlyCheck = command.argsSchema['~standard'].validate(preprocessedArgs);\n\n        const checkForProvidedFieldErrors = (result: StandardSchemaV1.Result<unknown>): InterceptorValidateResult | undefined => {\n          if (!result.issues) return undefined;\n          const providedFieldIssues = result.issues.filter((issue: StandardSchemaV1.Issue) => {\n            const rootKey = issue.path?.[0];\n            return rootKey !== undefined && providedKeys.has(String(rootKey));\n          });\n          if (providedFieldIssues.length > 0) return { args: undefined, argsResult: { issues: providedFieldIssues } as any };\n          return undefined;\n        };\n\n        const earlyResult = thenMaybe(earlyCheck, (result) => checkForProvidedFieldErrors(result) ?? undefined);\n        if (earlyResult instanceof Promise) {\n          return earlyResult.then((err) => (err ? err : doPrompt()));\n        }\n        if (earlyResult) return earlyResult;\n      }\n\n      return doPrompt();\n    };\n\n    // Prompt for missing fields, then pass filled args to downstream validation via next()\n    const doPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n      const afterInteractive = promptInteractiveFields(preprocessedArgs, command, runtime, forceInteractive || undefined);\n\n      return thenMaybe(afterInteractive, (filledArgs) => {\n        // Pass preprocessed+prompted args downstream with empty positionalArgs (already mapped)\n        return next({ rawArgs: filledArgs, positionalArgs: [] });\n      });\n    };\n\n    return earlyValidateAndPrompt();\n  },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles interactive prompting for missing arguments.\n * Extracts `--interactive` / `-i` flags, resolves effective interactivity,\n * and prompts for missing fields before passing filled args to validation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneInteractive())\n * ```\n */\nexport function padroneInteractive(): <T extends CommandTypesBase>(builder: T) => T {\n  return ((builder: AnyPadroneBuilder) => builder.intercept(interactiveInterceptor)) as any;\n}\n"],"mappings":";;;;;AASA,MAAM,yBAAyB,kBAAkB;CAAE,IAAI;CAAuB,MAAM;CAAuB,OAAO;AAAK,UAAU,EAC/H,SAAS,KAAiC,MAAM;CAE9C,IAAI;CACJ,IAAI,qBAAqB,IAAI,QAAQ,IAAI,GAAG;EAC1C,IAAI,IAAI,QAAQ,gBAAgB,KAAA,GAAW;GACzC,kBAAkB,IAAI,QAAQ,gBAAgB,SAAS,IAAI,QAAQ,gBAAgB;GACnF,OAAO,IAAI,QAAQ;EACrB;EACA,IAAI,IAAI,QAAQ,MAAM,KAAA,GAAW;GAC/B,kBAAkB,IAAI,QAAQ,MAAM,SAAS,IAAI,QAAQ,MAAM;GAC/D,OAAO,IAAI,QAAQ;EACrB;CACF;CAGA,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,iBACJ,QAAQ,gBAAgB,WAAW,OAAO,QAAQ,gBAAgB,aAAa,QAAQ,KAAA;CACzF,MAAM,uBAA4C,mBAAmB,IAAI,mBAAmB;CAE5F,MAAM,eAAe,CADK,CAAC,QAAQ,MAAM,UACC,QAAQ,QAAQ,CAAC,QAAQ,MAAM,QAAQ,QAAQ,UAAU,UAAU;CAC7G,MAAM,0BACJ,QAAQ,gBAAgB,iBAAiB,yBAAyB,SAAU,gBAAgB,yBAAyB;CACvH,MAAM,mBAAmB,CAAC,2BAA2B,yBAAyB;CAG9E,IAAI,EADe,CAAC,2BAA2B,QAAQ,UAAU,qBAAqB,QAAQ,IAAI,IACjF,OAAO,KAAK;CAG7B,MAAM,EAAE,MAAM,kBAAkB,QAAQ,qBAAqB,iBAAiB,SAAS,IAAI,SAAS,IAAI,cAAc;CACtH,IAAI,kBAAkB,OAAO;EAAE,MAAM,KAAA;EAAW,YAAY,EAAE,QAAQ,iBAAiB;CAAE;CAGzF,MAAM,WAAW,iBAAiB,SAAS,gBAAgB;CAC3D,IAAI,SAAS,SAAS,GAKpB,OAAO;EAAE,MAAM,KAAA;EAAW,YAAY,EAAE,QAJC,SAAS,KAAK,EAAE,WAAW;GAClE,MAAM,CAAC,GAAG;GACV,SAAS,oBAAoB,IAAI;EACnC,EAC6C,EAAE;CAAE;CAInD,MAAM,+BAA+F;EACnG,IAAI,QAAQ,YAAY;GACtB,MAAM,eAAe,IAAI,IAAI,OAAO,KAAK,gBAAgB,CAAC,CAAC,QAAQ,MAAM,iBAAiB,OAAO,KAAA,CAAS,CAAC;GAC3G,MAAM,aAAa,QAAQ,WAAW,YAAY,CAAC,SAAS,gBAAgB;GAE5E,MAAM,+BAA+B,WAAoF;IACvH,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;IAC3B,MAAM,sBAAsB,OAAO,OAAO,QAAQ,UAAkC;KAClF,MAAM,UAAU,MAAM,OAAO;KAC7B,OAAO,YAAY,KAAA,KAAa,aAAa,IAAI,OAAO,OAAO,CAAC;IAClE,CAAC;IACD,IAAI,oBAAoB,SAAS,GAAG,OAAO;KAAE,MAAM,KAAA;KAAW,YAAY,EAAE,QAAQ,oBAAoB;IAAS;GAEnH;GAEA,MAAM,cAAc,UAAU,aAAa,WAAW,4BAA4B,MAAM,KAAK,KAAA,CAAS;GACtG,IAAI,uBAAuB,SACzB,OAAO,YAAY,MAAM,QAAS,MAAM,MAAM,SAAS,CAAE;GAE3D,IAAI,aAAa,OAAO;EAC1B;EAEA,OAAO,SAAS;CAClB;CAGA,MAAM,iBAAiF;EAGrF,OAAO,UAFkB,wBAAwB,kBAAkB,SAAS,SAAS,oBAAoB,KAAA,CAEzE,IAAI,eAAe;GAEjD,OAAO,KAAK;IAAE,SAAS;IAAY,gBAAgB,CAAC;GAAE,CAAC;EACzD,CAAC;CACH;CAEA,OAAO,uBAAuB;AAChC,EACF,EAAE;;;;;;;;;;;AAcF,SAAgB,qBAAoE;CAClF,SAAS,YAA+B,QAAQ,UAAU,sBAAsB;AAClF"}