{"version":3,"file":"timing.cjs","names":[],"sources":["../../src/cli/timing.ts"],"sourcesContent":["import type { spinner as clackSpinner } from \"@clack/prompts\";\n\ntype Spinner = ReturnType<typeof clackSpinner>;\n\nexport interface PhaseTiming {\n  name: string;\n  durationMs: number;\n}\n\nconst PHASE_LABELS: Record<string, string> = {\n  \"parent config\": \"Fetching parent config...\",\n  \"template source\": \"Resolving template source...\",\n  \"scaffold project\": \"Creating project scaffold...\",\n  \"copy files\": \"Copying template files...\",\n  \"personalize config\": \"Personalizing config...\",\n  \"write snapshot\": \"Writing snapshot...\",\n  \"resolve config\": \"Resolving config...\",\n  \"generate env/docker\": \"Generating environment config...\",\n  \"create env file\": \"Creating .env file...\",\n  \"install dependencies\": \"Installing dependencies...\",\n  \"generate types\": \"Generating types...\",\n  \"generate migrations\": \"Generating database migrations...\",\n  \"generate code artifacts\": \"Generating code artifacts...\",\n  \"docker compose up\": \"Starting Docker services...\",\n};\n\nfunction phaseLabel(name: string): string {\n  return PHASE_LABELS[name] ?? name;\n}\n\nexport async function timePhase<T>(\n  timings: PhaseTiming[],\n  name: string,\n  fn: () => Promise<T>,\n  spinner?: Spinner,\n): Promise<T> {\n  spinner?.message(phaseLabel(name));\n  const startedAt = Date.now();\n  try {\n    return await fn();\n  } finally {\n    timings.push({ name, durationMs: Date.now() - startedAt });\n  }\n}\n\nexport function sumPhaseDurations(timings: PhaseTiming[]): number {\n  return timings.reduce((total, timing) => total + timing.durationMs, 0);\n}\n\nexport function formatDuration(durationMs: number): string {\n  if (durationMs < 1000) {\n    return `${durationMs}ms`;\n  }\n\n  if (durationMs < 60_000) {\n    const seconds = durationMs / 1000;\n    return `${seconds.toFixed(seconds >= 10 ? 0 : 1)}s`;\n  }\n\n  const minutes = Math.floor(durationMs / 60_000);\n  const seconds = Math.round((durationMs % 60_000) / 1000);\n  return `${minutes}m ${seconds}s`;\n}\n"],"mappings":";;AASA,MAAM,eAAuC;CAC3C,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,cAAc;CACd,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,mBAAmB;CACnB,wBAAwB;CACxB,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,qBAAqB;CACtB;AAED,SAAS,WAAW,MAAsB;AACxC,QAAO,aAAa,SAAS;;AAG/B,eAAsB,UACpB,SACA,MACA,IACA,SACY;AACZ,UAAS,QAAQ,WAAW,KAAK,CAAC;CAClC,MAAM,YAAY,KAAK,KAAK;AAC5B,KAAI;AACF,SAAO,MAAM,IAAI;WACT;AACR,UAAQ,KAAK;GAAE;GAAM,YAAY,KAAK,KAAK,GAAG;GAAW,CAAC;;;AAI9D,SAAgB,kBAAkB,SAAgC;AAChE,QAAO,QAAQ,QAAQ,OAAO,WAAW,QAAQ,OAAO,YAAY,EAAE;;AAGxE,SAAgB,eAAe,YAA4B;AACzD,KAAI,aAAa,IACf,QAAO,GAAG,WAAW;AAGvB,KAAI,aAAa,KAAQ;EACvB,MAAM,UAAU,aAAa;AAC7B,SAAO,GAAG,QAAQ,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;;AAKnD,QAAO,GAFS,KAAK,MAAM,aAAa,IAEvB,CAAC,IADF,KAAK,MAAO,aAAa,MAAU,IACtB,CAAC"}