@veztraa/report-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
import { render } from "@veztraa/report-renderer";
|
|
5
|
+
import { TemplateSchema } from "@veztraa/report-core";
|
|
6
|
+
/* ── Minimal spinner (replaces ora) ──────────────────────────────────────── */
|
|
7
|
+
const SPIN_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
8
|
+
function spinner(initial) {
|
|
9
|
+
let frame = 0;
|
|
10
|
+
const timer = setInterval(() => {
|
|
11
|
+
process.stdout.write(`\r${SPIN_FRAMES[frame++ % SPIN_FRAMES.length]} ${initial}`);
|
|
12
|
+
}, 80);
|
|
13
|
+
process.stdout.write("\x1b[?25l"); // hide cursor
|
|
14
|
+
return {
|
|
15
|
+
succeed(msg) {
|
|
16
|
+
clearInterval(timer);
|
|
17
|
+
process.stdout.write(`\r\x1b[32m✓\x1b[0m ${msg}\n\x1b[?25h`);
|
|
18
|
+
},
|
|
19
|
+
fail(msg) {
|
|
20
|
+
clearInterval(timer);
|
|
21
|
+
process.stdout.write(`\r\x1b[31m✗\x1b[0m ${msg}\n\x1b[?25h`);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/* ── Minimal arg parser (replaces commander) ─────────────────────────────── */
|
|
26
|
+
function parseArgs(argv) {
|
|
27
|
+
const opts = {};
|
|
28
|
+
const positional = [];
|
|
29
|
+
for (let i = 0; i < argv.length; i++) {
|
|
30
|
+
if (argv[i].startsWith("--")) {
|
|
31
|
+
const key = argv[i].slice(2);
|
|
32
|
+
const next = argv[i + 1];
|
|
33
|
+
if (next && !next.startsWith("--")) {
|
|
34
|
+
opts[key] = next;
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
else
|
|
38
|
+
opts[key] = true;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
positional.push(argv[i]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { opts, positional };
|
|
45
|
+
}
|
|
46
|
+
const [, , command, ...rest] = process.argv;
|
|
47
|
+
const { opts, positional } = parseArgs(rest);
|
|
48
|
+
function printHelp() {
|
|
49
|
+
console.log(`
|
|
50
|
+
report-designer v0.1.0 — Advanced PDF report generator
|
|
51
|
+
|
|
52
|
+
USAGE
|
|
53
|
+
report-designer render <template> [data] [options]
|
|
54
|
+
report-designer validate <template>
|
|
55
|
+
|
|
56
|
+
COMMANDS
|
|
57
|
+
render Render a report template to PDF
|
|
58
|
+
validate Validate a report template JSON file
|
|
59
|
+
|
|
60
|
+
OPTIONS (render)
|
|
61
|
+
--output <path> Output PDF file path (default: output.pdf)
|
|
62
|
+
--watch Watch for changes and re-render
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
/* ── render command ──────────────────────────────────────────────────────── */
|
|
66
|
+
if (command === "render") {
|
|
67
|
+
const [templatePath, dataPath] = positional;
|
|
68
|
+
const outputArg = typeof opts["output"] === "string" ? opts["output"] : "output.pdf";
|
|
69
|
+
const watchMode = opts["watch"] === true;
|
|
70
|
+
if (!templatePath) {
|
|
71
|
+
console.error("Usage: report-designer render <template> [data]");
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const doRender = async () => {
|
|
75
|
+
const spin = spinner("Rendering PDF...");
|
|
76
|
+
try {
|
|
77
|
+
const templateFile = resolve(process.cwd(), templatePath);
|
|
78
|
+
if (!existsSync(templateFile)) {
|
|
79
|
+
spin.fail(`Template file not found: ${templateFile}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const template = TemplateSchema.parse(JSON.parse(readFileSync(templateFile, "utf-8")));
|
|
83
|
+
let data = {};
|
|
84
|
+
if (dataPath) {
|
|
85
|
+
const dataFile = resolve(process.cwd(), dataPath);
|
|
86
|
+
if (existsSync(dataFile))
|
|
87
|
+
data = JSON.parse(readFileSync(dataFile, "utf-8"));
|
|
88
|
+
}
|
|
89
|
+
const pdfBuffer = await render(template, data);
|
|
90
|
+
const outputPath = resolve(process.cwd(), outputArg);
|
|
91
|
+
writeFileSync(outputPath, pdfBuffer);
|
|
92
|
+
spin.succeed(`PDF saved to: ${outputPath}`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
spin.fail(`Render failed: ${err.message}`);
|
|
96
|
+
if (!watchMode)
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
await doRender();
|
|
101
|
+
if (watchMode) {
|
|
102
|
+
const { watch } = await import("fs");
|
|
103
|
+
const templateFile = resolve(process.cwd(), templatePath);
|
|
104
|
+
console.log(`\nWatching for changes: ${templateFile}`);
|
|
105
|
+
watch(templateFile, async () => { console.log("\nChange detected, re-rendering..."); await doRender(); });
|
|
106
|
+
}
|
|
107
|
+
/* ── validate command ────────────────────────────────────────────────────── */
|
|
108
|
+
}
|
|
109
|
+
else if (command === "validate") {
|
|
110
|
+
const [templatePath] = positional;
|
|
111
|
+
if (!templatePath) {
|
|
112
|
+
console.error("Usage: report-designer validate <template>");
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
const spin = spinner("Validating template...");
|
|
116
|
+
try {
|
|
117
|
+
const templateFile = resolve(process.cwd(), templatePath);
|
|
118
|
+
if (!existsSync(templateFile)) {
|
|
119
|
+
spin.fail(`File not found: ${templateFile}`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const result = TemplateSchema.safeParse(JSON.parse(readFileSync(templateFile, "utf-8")));
|
|
123
|
+
if (result.success) {
|
|
124
|
+
spin.succeed("Template is valid");
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
spin.fail("Template validation failed:");
|
|
128
|
+
result.error.errors.forEach((e) => console.error(` [${e.path.join(".")}] ${e.message}`));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
spin.fail(`Error: ${err.message}`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
/* ── help / unknown ──────────────────────────────────────────────────────── */
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
printHelp();
|
|
140
|
+
if (command && command !== "--help" && command !== "-h")
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@veztraa/report-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool for ReportForge — render PDFs from the command line",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"files": ["dist"],
|
|
9
|
+
"publishConfig": { "access": "public" },
|
|
10
|
+
"bin": {
|
|
11
|
+
"report-designer": "dist/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"clean": "rm -rf dist"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@veztraa/report-core": "workspace:*",
|
|
20
|
+
"@veztraa/report-renderer": "workspace:*"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"typescript": "^5.7.2",
|
|
24
|
+
"@types/node": "^22.10.2"
|
|
25
|
+
}
|
|
26
|
+
}
|