{"version":3,"file":"impl-Cbgurxln.mjs","names":[],"sources":["../src/commands/admin/chunk-csv/ui/plugin.ts","../src/commands/admin/chunk-csv/impl.ts"],"sourcesContent":["import {\n  makeHeader,\n  makeWorkerRows,\n  type ChunkSlotProgress,\n  type CommonCtx,\n  type DashboardPlugin,\n} from '../../../../lib/pooling/index.js';\n\n/**\n * Header for chunk-csv (no extra totals block).\n *\n * @param ctx - Dashboard context.\n * @returns Header lines.\n */\nfunction renderHeader<TTotals>(ctx: CommonCtx<TTotals, ChunkSlotProgress>): string[] {\n  // no extra lines — reuse the shared header as-is\n  return makeHeader(ctx);\n}\n\n/**\n * Worker rows for chunk-csv — share the generic row renderer.\n *\n * @param ctx - Dashboard context.\n * @returns Array of strings, each representing one worker row.\n */\nfunction renderWorkers<TTotals>(ctx: CommonCtx<TTotals, ChunkSlotProgress>): string[] {\n  return makeWorkerRows(ctx);\n}\n\nexport const chunkCsvPlugin: DashboardPlugin<unknown, ChunkSlotProgress> = {\n  renderHeader,\n  renderWorkers,\n  // no extras\n};\n","import {\n  CHILD_FLAG,\n  type PoolHooks,\n  runPool,\n  computePoolSize,\n  PoolCancelledError,\n  resolveWorkerPath,\n} from '@transcend-io/utils';\nimport colors from 'colors';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { collectCsvFilesOrExit } from '../../../lib/helpers/collectCsvFilesOrExit.js';\nimport {\n  createExtraKeyHandler,\n  dashboardPlugin,\n  installInteractiveSwitcher,\n} from '../../../lib/pooling/index.js';\nimport { logger } from '../../../logger.js';\nimport { chunkCsvPlugin } from './ui/index.js';\nimport type { ChunkProgress, ChunkResult, ChunkTask } from './worker.js';\n\n/**\n * Totals aggregate for this command.\n * We don’t need custom counters since the runner already tracks\n * completed/failed counts in its header — so we just use an empty record.\n */\ntype Totals = Record<string, never>;\n\n/**\n * CLI flags accepted by the `chunk-csv` command.\n *\n * These are passed down from the CLI parser into the parent process.\n */\nexport type ChunkCsvCommandFlags = {\n  directory: string;\n  outputDir?: string;\n  clearOutputDir: boolean;\n  chunkSizeMB: number;\n  concurrency?: number;\n  viewerMode: boolean;\n};\n\n/**\n * Parent entrypoint for chunking many CSVs in parallel using the worker pool runner.\n *\n * Lifecycle:\n *  1) Discover CSV inputs (exit if none).\n *  2) Compute pool size (CPU-count heuristic or --concurrency).\n *  3) Build a FIFO queue of `ChunkTask`s.\n *  4) Define pool hooks to drive task assignment, progress, and result handling.\n *  5) Launch the pool with `runPool`, rendering via the `chunkCsvPlugin`.\n *\n * @param this  - Bound CLI context (provides process exit + logging).\n * @param flags - CLI options for the run.\n */\nexport async function chunkCsv(this: LocalContext, flags: ChunkCsvCommandFlags): Promise<void> {\n  doneInputValidation(this.process.exit);\n\n  const { directory, outputDir, clearOutputDir, chunkSizeMB, concurrency, viewerMode } = flags;\n\n  /* 1) Discover CSV inputs */\n  const files = collectCsvFilesOrExit(directory, this);\n\n  /* 2) Size the pool */\n  const { poolSize, cpuCount } = computePoolSize(concurrency, files.length);\n\n  logger.info(\n    colors.green(\n      `Chunking ${files.length} CSV file(s) with pool size ${poolSize} (CPU=${cpuCount})`,\n    ),\n  );\n\n  /* 3) Prepare a simple FIFO queue of tasks (one per file). */\n  const queue = files.map<ChunkTask>((filePath) => ({\n    filePath,\n    options: { outputDir, clearOutputDir, chunkSizeMB },\n  }));\n\n  /* 4) Define pool hooks to adapt runner to this command. */\n  const hooks: PoolHooks<ChunkTask, ChunkProgress, ChunkResult, Totals> = {\n    nextTask: () => queue.shift(),\n    taskLabel: (t) => t.filePath,\n    initTotals: () => ({}) as Totals,\n    initSlotProgress: () => undefined,\n    onProgress: (totals) => totals,\n    onResult: (totals, res) => ({ totals, ok: !!res.ok }),\n    // postProcess receives log context when viewerMode=true — we don’t need it here.\n    postProcess: async () => {\n      // nothing extra for chunk-csv\n    },\n  };\n\n  /* 5) Launch the pool runner with our hooks and custom dashboard plugin. */\n  await runPool({\n    title: `Chunk CSV - ${directory}`,\n    baseDir: directory || outputDir || process.cwd(),\n    childFlag: CHILD_FLAG,\n    childModulePath: resolveWorkerPath(import.meta.url, 'commands/admin/chunk-csv/worker.mjs'),\n    poolSize,\n    cpuCount,\n    filesTotal: files.length,\n    hooks,\n    viewerMode,\n    render: (input) => dashboardPlugin(input, chunkCsvPlugin, viewerMode),\n    installInteractiveSwitcher: viewerMode\n      ? undefined\n      : ({\n          workers,\n          onCtrlC,\n          getLogPaths,\n          replayBytes: rb,\n          replayWhich: rw,\n          setPaused,\n          repaint: rp,\n        }) =>\n          installInteractiveSwitcher({\n            workers,\n            onCtrlC,\n            getLogPaths,\n            replayBytes: rb,\n            replayWhich: rw,\n            onAttach: () => setPaused(true),\n            onDetach: () => {\n              setPaused(false);\n              rp();\n            },\n            onEnterAttachScreen: (id) => {\n              setPaused(true);\n              process.stdout.write('\\x1b[2J\\x1b[H');\n              process.stdout.write(\n                `Attached to worker ${id}. (Esc/Ctrl+] detach \\u2022 Ctrl+D EOF \\u2022 Ctrl+C SIGINT)\\n`,\n              );\n            },\n          }),\n    extraKeyHandler: ({ logsBySlot, repaint, setPaused }) =>\n      createExtraKeyHandler({\n        logsBySlot,\n        repaint,\n        setPaused,\n      }),\n  }).catch((err) => {\n    if (err instanceof PoolCancelledError) {\n      process.exit(130);\n    }\n    throw err;\n  });\n}\n"],"mappings":"+XAcA,SAAS,EAAsB,EAAsD,CAEnF,OAAO,EAAW,EAAI,CASxB,SAAS,EAAuB,EAAsD,CACpF,OAAO,EAAe,EAAI,CAG5B,MAAa,EAA8D,CACzE,eACA,gBAED,CCuBD,eAAsB,EAA6B,EAA4C,CAC7F,EAAoB,KAAK,QAAQ,KAAK,CAEtC,GAAM,CAAE,YAAW,YAAW,iBAAgB,cAAa,cAAa,cAAe,EAGjF,EAAQ,EAAsB,EAAW,KAAK,CAG9C,CAAE,WAAU,YAAa,EAAgB,EAAa,EAAM,OAAO,CAEzE,EAAO,KACL,EAAO,MACL,YAAY,EAAM,OAAO,8BAA8B,EAAS,QAAQ,EAAS,GAClF,CACF,CAGD,IAAM,EAAQ,EAAM,IAAgB,IAAc,CAChD,WACA,QAAS,CAAE,YAAW,iBAAgB,cAAa,CACpD,EAAE,CAiBH,MAAM,EAAQ,CACZ,MAAO,eAAe,IACtB,QAAS,GAAa,GAAa,QAAQ,KAAK,CAChD,UAAW,EACX,gBAAiB,EAAkB,OAAO,KAAK,IAAK,sCAAsC,CAC1F,WACA,WACA,WAAY,EAAM,OAClB,MAAA,CArBA,aAAgB,EAAM,OAAO,CAC7B,UAAY,GAAM,EAAE,SACpB,gBAAmB,EAAE,EACrB,qBAAwB,IAAA,GACxB,WAAa,GAAW,EACxB,UAAW,EAAQ,KAAS,CAAE,SAAQ,GAAI,CAAC,CAAC,EAAI,GAAI,EAEpD,YAAa,SAAY,GAcpB,CACL,aACA,OAAS,GAAU,EAAgB,EAAO,EAAgB,EAAW,CACrE,2BAA4B,EACxB,IAAA,IACC,CACC,UACA,UACA,cACA,YAAa,EACb,YAAa,EACb,YACA,QAAS,KAET,EAA2B,CACzB,UACA,UACA,cACA,YAAa,EACb,YAAa,EACb,aAAgB,EAAU,GAAK,CAC/B,aAAgB,CACd,EAAU,GAAM,CAChB,GAAI,EAEN,oBAAsB,GAAO,CAC3B,EAAU,GAAK,CACf,QAAQ,OAAO,MAAM,gBAAgB,CACrC,QAAQ,OAAO,MACb,sBAAsB,EAAG,gEAC1B,EAEJ,CAAC,CACR,iBAAkB,CAAE,aAAY,UAAS,eACvC,EAAsB,CACpB,aACA,UACA,YACD,CAAC,CACL,CAAC,CAAC,MAAO,GAAQ,CAIhB,MAHI,aAAe,GACjB,QAAQ,KAAK,IAAI,CAEb,GACN"}