{"version":3,"file":"timing.mjs","names":[],"sources":["../../src/extension/timing.ts"],"sourcesContent":["import { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n  if (ms < 1000) return `${ms.toFixed(0)}ms`;\n  if (ms < 60_000) return `${(ms / 1000).toFixed(2)}s`;\n  const mins = Math.floor(ms / 60_000);\n  const secs = ((ms % 60_000) / 1000).toFixed(2);\n  return `${mins}m ${secs}s`;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst timingMeta = { id: 'padrone:timing', name: 'padrone:timing', order: -1002 } as const;\n\nfunction createTimingInterceptor(enabledByDefault: boolean) {\n  return defineInterceptor(timingMeta, () => {\n    let enabled = enabledByDefault;\n    let startTime = 0;\n\n    return {\n      parse(_ctx, next) {\n        return thenMaybe(next(), (res) => {\n          if ('timing' in res.rawArgs) {\n            enabled = res.rawArgs.timing !== false;\n            delete res.rawArgs.timing;\n          }\n          if ('time' in res.rawArgs) {\n            enabled = res.rawArgs.time !== false;\n            delete res.rawArgs.time;\n          }\n          return res;\n        });\n      },\n      start(_ctx, next) {\n        startTime = performance.now();\n        return next();\n      },\n      shutdown(ctx, next) {\n        return thenMaybe(next(), (res) => {\n          if (enabled) {\n            const elapsed = performance.now() - startTime;\n            ctx.runtime.error(`\\nDone in ${formatDuration(elapsed)}`);\n          }\n          return res;\n        });\n      },\n    };\n  });\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport interface PadroneTimingOptions {\n  /** Enable timing by default without requiring `--time` flag. Default: `false`. */\n  enabled?: boolean;\n}\n\n/**\n * Extension that tracks command execution time.\n *\n * - `--time` / `--timing` → enables timing output\n * - `--no-time` / `--no-timing` → disables timing output\n *\n * Pass `{ enabled: true }` to enable timing by default (can be disabled via `--no-time`).\n *\n * Usage:\n * ```ts\n * // Opt-in via flag\n * createPadrone('my-cli').extend(padroneTiming())\n *\n * // Always on, opt-out via --no-time\n * createPadrone('my-cli').extend(padroneTiming({ enabled: true }))\n * ```\n */\nexport function padroneTiming(options?: PadroneTimingOptions): <T extends CommandTypesBase>(builder: T) => T {\n  return ((builder: AnyPadroneBuilder) => builder.intercept(createTimingInterceptor(options?.enabled ?? false))) as any;\n}\n"],"mappings":";;;AAMA,SAAS,eAAe,IAAoB;CAC1C,IAAI,KAAK,KAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,EAAE;CACvC,IAAI,KAAK,KAAQ,OAAO,IAAI,KAAK,IAAA,CAAM,QAAQ,CAAC,EAAE;CAGlD,OAAO,GAFM,KAAK,MAAM,KAAK,GAEhB,EAAE,KADA,KAAK,MAAU,IAAA,CAAM,QAAQ,CACtB,EAAE;AAC1B;AAIA,MAAM,aAAa;CAAE,IAAI;CAAkB,MAAM;CAAkB,OAAO;AAAM;AAEhF,SAAS,wBAAwB,kBAA2B;CAC1D,OAAO,kBAAkB,kBAAkB;EACzC,IAAI,UAAU;EACd,IAAI,YAAY;EAEhB,OAAO;GACL,MAAM,MAAM,MAAM;IAChB,OAAO,UAAU,KAAK,IAAI,QAAQ;KAChC,IAAI,YAAY,IAAI,SAAS;MAC3B,UAAU,IAAI,QAAQ,WAAW;MACjC,OAAO,IAAI,QAAQ;KACrB;KACA,IAAI,UAAU,IAAI,SAAS;MACzB,UAAU,IAAI,QAAQ,SAAS;MAC/B,OAAO,IAAI,QAAQ;KACrB;KACA,OAAO;IACT,CAAC;GACH;GACA,MAAM,MAAM,MAAM;IAChB,YAAY,YAAY,IAAI;IAC5B,OAAO,KAAK;GACd;GACA,SAAS,KAAK,MAAM;IAClB,OAAO,UAAU,KAAK,IAAI,QAAQ;KAChC,IAAI,SAAS;MACX,MAAM,UAAU,YAAY,IAAI,IAAI;MACpC,IAAI,QAAQ,MAAM,aAAa,eAAe,OAAO,GAAG;KAC1D;KACA,OAAO;IACT,CAAC;GACH;EACF;CACF,CAAC;AACH;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,cAAc,SAA+E;CAC3G,SAAS,YAA+B,QAAQ,UAAU,wBAAwB,SAAS,WAAW,KAAK,CAAC;AAC9G"}