()
| 191 | } |
| 192 | |
| 193 | async function main(): Promise<void> { |
| 194 | const parsed = parseArgs(process.argv); |
| 195 | |
| 196 | if (!parsed.command) { |
| 197 | printUsage(); |
| 198 | process.exit(ExitCode.BadArgs); |
| 199 | } |
| 200 | |
| 201 | if (!COMMANDS.has(parsed.command)) { |
| 202 | console.error(`$P: unknown command: ${parsed.command}`); |
| 203 | console.error(""); |
| 204 | printUsage(); |
| 205 | process.exit(ExitCode.BadArgs); |
| 206 | } |
| 207 | |
| 208 | try { |
| 209 | switch (parsed.command) { |
| 210 | case "version": { |
| 211 | // Read from VERSION file or fall back to a hard-coded default. |
| 212 | try { |
| 213 | const fs = await import("node:fs"); |
| 214 | const path = await import("node:path"); |
| 215 | const versionFile = path.resolve( |
| 216 | path.dirname(process.argv[1] || ""), |
| 217 | "../../VERSION", |
| 218 | ); |
| 219 | const version = fs.readFileSync(versionFile, "utf8").trim(); |
| 220 | console.log(version); |
| 221 | } catch { |
| 222 | console.log("make-pdf (version unknown)"); |
| 223 | } |
| 224 | process.exit(ExitCode.Success); |
| 225 | } |
| 226 | |
| 227 | case "setup": { |
| 228 | const { runSetup } = await import("./setup"); |
| 229 | await runSetup(); |
| 230 | process.exit(ExitCode.Success); |
| 231 | } |
| 232 | |
| 233 | case "generate": { |
| 234 | const opts = generateOptionsFromFlags(parsed); |
| 235 | const { generate } = await import("./orchestrator"); |
| 236 | const outputPath = await generate(opts); |
| 237 | // Contract: stdout = output path only |
| 238 | console.log(outputPath); |
| 239 | process.exit(ExitCode.Success); |
| 240 | } |
| 241 | |
| 242 | case "preview": { |
| 243 | const opts = previewOptionsFromFlags(parsed); |
| 244 | const { preview } = await import("./orchestrator"); |
| 245 | const htmlPath = await preview(opts); |
| 246 | console.log(htmlPath); |
| 247 | process.exit(ExitCode.Success); |
| 248 | } |
| 249 | |
| 250 | default: |
no test coverage detected