{"version":3,"file":"ink.mjs","names":[],"sources":["../../src/extension/ink.ts"],"sourcesContent":["import { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport type { InterceptorExecuteResult } from '../types/interceptor.ts';\n\n// ── React element detection ─────────────────────────────────────────────\n\nconst reactElement = Symbol.for('react.element');\nconst reactTransitional = Symbol.for('react.transitional.element');\n\n/** Checks whether a value is a React element (JSX) by inspecting its `$$typeof` symbol. */\nexport function isReactElement(value: unknown): boolean {\n  if (value === null || typeof value !== 'object') return false;\n  const tag = (value as Record<string | symbol, unknown>).$$typeof;\n  return tag === reactElement || tag === reactTransitional;\n}\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type InkOptions = {\n  /** Whether to wait for the Ink app to unmount before resolving. Defaults to `true`. */\n  waitUntilExit?: boolean;\n  /** Options forwarded to Ink's `render()`. */\n  render?: import('ink').RenderOptions;\n};\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst inkMeta = { id: 'padrone:ink', name: 'padrone:ink', order: -1050 } as const;\n\nfunction createInkInterceptor(rawOptions?: InkOptions) {\n  return defineInterceptor(inkMeta)\n    .requires<{ inkConfig?: InkOptions }>()\n    .factory(() => ({\n      execute(ctx, next) {\n        const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.inkConfig as InkOptions | undefined;\n        const options: InkOptions = { ...ctxCfg, ...rawOptions };\n        const { waitUntilExit = true } = options;\n\n        const handleResult = async (e: InterceptorExecuteResult): Promise<InterceptorExecuteResult> => {\n          let value = e.result;\n          if (value instanceof Promise) value = await value;\n          if (!isReactElement(value)) return e;\n\n          const { render } = await import('ink');\n          const instance = render(value as import('react').ReactElement, options.render);\n\n          // Unmount on abort so Ink cleans up stdin/stdout\n          const onAbort = () => instance.unmount();\n          ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n          if (waitUntilExit) {\n            try {\n              await instance.waitUntilExit();\n            } finally {\n              ctx.signal.removeEventListener('abort', onAbort);\n            }\n          }\n\n          // Return undefined so auto-output skips this result\n          return { result: undefined };\n        };\n\n        const executedOrPromise = next();\n        if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n        return handleResult(executedOrPromise);\n      },\n    }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\n/**\n * Extension that renders React (Ink) components returned from command actions.\n *\n * When a command's action returns a React element (JSX), this extension\n * renders it using Ink instead of passing it to the normal output path.\n *\n * Requires `ink` and `react` as peer dependencies.\n *\n * ```ts\n * import { createPadrone } from 'padrone';\n * import { padroneInk } from 'padrone/ink';\n *\n * const program = createPadrone('my-tui')\n *   .extend(padroneInk())\n *   .command('dashboard', (c) =>\n *     c.action(() => <Dashboard />)\n *   );\n * ```\n */\nexport function padroneInk(options?: InkOptions): <T extends CommandTypesBase>(builder: T) => T {\n  const interceptor = createInkInterceptor(options);\n  return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n"],"mappings":";;AAMA,MAAM,eAAe,OAAO,IAAI,eAAe;AAC/C,MAAM,oBAAoB,OAAO,IAAI,4BAA4B;;AAGjE,SAAgB,eAAe,OAAyB;CACtD,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,MAAM,MAAO,MAA2C;CACxD,OAAO,QAAQ,gBAAgB,QAAQ;AACzC;AAaA,MAAM,UAAU;CAAE,IAAI;CAAe,MAAM;CAAe,OAAO;AAAM;AAEvE,SAAS,qBAAqB,YAAyB;CACrD,OAAO,kBAAkB,OAAO,CAAC,CAC9B,SAAqC,CAAC,CACtC,eAAe,EACd,QAAQ,KAAK,MAAM;EAEjB,MAAM,UAAsB;GAAE,GADd,IAAI,SAAiD;GAC5B,GAAG;EAAW;EACvD,MAAM,EAAE,gBAAgB,SAAS;EAEjC,MAAM,eAAe,OAAO,MAAmE;GAC7F,IAAI,QAAQ,EAAE;GACd,IAAI,iBAAiB,SAAS,QAAQ,MAAM;GAC5C,IAAI,CAAC,eAAe,KAAK,GAAG,OAAO;GAEnC,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,WAAW,OAAO,OAAuC,QAAQ,MAAM;GAG7E,MAAM,gBAAgB,SAAS,QAAQ;GACvC,IAAI,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;GAE5D,IAAI,eACF,IAAI;IACF,MAAM,SAAS,cAAc;GAC/B,UAAU;IACR,IAAI,OAAO,oBAAoB,SAAS,OAAO;GACjD;GAIF,OAAO,EAAE,QAAQ,KAAA,EAAU;EAC7B;EAEA,MAAM,oBAAoB,KAAK;EAC/B,IAAI,6BAA6B,SAAS,OAAO,kBAAkB,KAAK,YAAY;EACpF,OAAO,aAAa,iBAAiB;CACvC,EACF,EAAE;AACN;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,WAAW,SAAqE;CAC9F,MAAM,cAAc,qBAAqB,OAAO;CAChD,SAAS,YAA+B,QAAQ,UAAU,WAAW;AACvE"}