{"version":3,"file":"impl-B_z2cpM5.mjs","names":[],"sources":["../src/commands/admin/parquet-to-csv/ui/plugin.ts","../src/commands/admin/parquet-to-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 parquet-to-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 parquet-to-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 parquetToCsvPlugin: 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 { collectParquetFilesOrExit } from '../../../lib/helpers/index.js';\nimport {\n  createExtraKeyHandler,\n  dashboardPlugin,\n  installInteractiveSwitcher,\n} from '../../../lib/pooling/index.js';\nimport { logger } from '../../../logger.js';\nimport { parquetToCsvPlugin } from './ui/index.js';\nimport type { ParquetProgress, ParquetResult, ParquetTask } from './worker.js';\n\n/** No custom totals for the header; the runner’s built-ins suffice. */\ntype Totals = Record<string, never>;\n\nexport type ParquetToCsvCommandFlags = {\n  directory: string;\n  outputDir?: string;\n  clearOutputDir: boolean;\n  concurrency?: number;\n  viewerMode: boolean;\n};\n\n/**\n * Convert all Parquet files in a directory to CSV, in parallel.\n *\n * @param flags - The command flags.\n */\nexport async function parquetToCsv(\n  this: LocalContext,\n  flags: ParquetToCsvCommandFlags,\n): Promise<void> {\n  doneInputValidation(this.process.exit);\n\n  const { directory, outputDir, clearOutputDir, concurrency, viewerMode } = flags;\n\n  /* 1) Discover .parquet inputs */\n  const files = collectParquetFilesOrExit(directory, this);\n\n  /* 2) Size the pool */\n  const { poolSize, cpuCount } = computePoolSize(concurrency, files.length);\n\n  logger.info(\n    colors.green(\n      `Converting ${files.length} Parquet file(s) → CSV with pool size ${poolSize} (CPU=${cpuCount})`,\n    ),\n  );\n\n  /* 3) Build FIFO queue of tasks (one per file) */\n  const queue = files.map<ParquetTask>((filePath) => ({\n    filePath,\n    options: { outputDir, clearOutputDir },\n  }));\n\n  /* 4) Pool hooks */\n  const hooks: PoolHooks<ParquetTask, ParquetProgress, ParquetResult, 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: async () => {\n      // nothing special post-run\n    },\n  };\n\n  /* 5) Launch the pool runner with custom dashboard plugin */\n  await runPool({\n    title: `Parquet → CSV - ${directory}`,\n    baseDir: directory || outputDir || process.cwd(),\n    childFlag: CHILD_FLAG,\n    childModulePath: resolveWorkerPath(import.meta.url, 'commands/admin/parquet-to-csv/worker.mjs'),\n    poolSize,\n    cpuCount,\n    filesTotal: files.length,\n    hooks,\n    viewerMode,\n    render: (input) => dashboardPlugin(input, parquetToCsvPlugin, 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({ logsBySlot, repaint, setPaused }),\n  }).catch((err) => {\n    if (err instanceof PoolCancelledError) {\n      process.exit(130);\n    }\n    throw err;\n  });\n}\n"],"mappings":"mYAcA,SAAS,EAAsB,EAAsD,CAEnF,OAAO,EAAW,EAAI,CASxB,SAAS,EAAuB,EAAsD,CACpF,OAAO,EAAe,EAAI,CAG5B,MAAa,EAAkE,CAC7E,eACA,gBAED,CCKD,eAAsB,EAEpB,EACe,CACf,EAAoB,KAAK,QAAQ,KAAK,CAEtC,GAAM,CAAE,YAAW,YAAW,iBAAgB,cAAa,cAAe,EAGpE,EAAQ,EAA0B,EAAW,KAAK,CAGlD,CAAE,WAAU,YAAa,EAAgB,EAAa,EAAM,OAAO,CAEzE,EAAO,KACL,EAAO,MACL,cAAc,EAAM,OAAO,wCAAwC,EAAS,QAAQ,EAAS,GAC9F,CACF,CAGD,IAAM,EAAQ,EAAM,IAAkB,IAAc,CAClD,WACA,QAAS,CAAE,YAAW,iBAAgB,CACvC,EAAE,CAgBH,MAAM,EAAQ,CACZ,MAAO,mBAAmB,IAC1B,QAAS,GAAa,GAAa,QAAQ,KAAK,CAChD,UAAW,EACX,gBAAiB,EAAkB,OAAO,KAAK,IAAK,2CAA2C,CAC/F,WACA,WACA,WAAY,EAAM,OAClB,MAAA,CApBA,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,EACpD,YAAa,SAAY,GAcpB,CACL,aACA,OAAS,GAAU,EAAgB,EAAO,EAAoB,EAAW,CACzE,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,CAAE,aAAY,UAAS,YAAW,CAAC,CAC5D,CAAC,CAAC,MAAO,GAAQ,CAIhB,MAHI,aAAe,GACjB,QAAQ,KAAK,IAAI,CAEb,GACN"}