pretext-pdf 0.8.3 → 0.9.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/CHANGELOG.md +22 -0
- package/README.md +362 -268
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +210 -0
- package/dist/cli.js.map +1 -0
- package/dist/compat.d.ts +120 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +429 -0
- package/dist/compat.js.map +1 -0
- package/dist/markdown.d.ts +5 -3
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +48 -3
- package/dist/markdown.js.map +1 -1
- package/package.json +9 -2
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,210 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* pretext-pdf CLI — JSON in, PDF out.
|
|
4
|
+
*
|
|
5
|
+
* pretext-pdf doc.json out.pdf
|
|
6
|
+
* pretext-pdf doc.json > out.pdf
|
|
7
|
+
* cat doc.json | pretext-pdf > out.pdf
|
|
8
|
+
* echo '{"content":[...]}' | pretext-pdf -o out.pdf
|
|
9
|
+
*
|
|
10
|
+
* Optional flags:
|
|
11
|
+
* -o, --output <path> Write PDF to path instead of stdout
|
|
12
|
+
* -i, --input <path> Read JSON from path instead of first positional
|
|
13
|
+
* --markdown Treat input as Markdown (requires `marked` peer dep)
|
|
14
|
+
* --code-font <name> Pair with --markdown to enable styled code blocks
|
|
15
|
+
* -v, --version Print pretext-pdf version
|
|
16
|
+
* -h, --help Print this help
|
|
17
|
+
*
|
|
18
|
+
* Exit codes:
|
|
19
|
+
* 0 success
|
|
20
|
+
* 1 user error (bad arguments, file not found, invalid JSON)
|
|
21
|
+
* 2 render error (validation, font, image, pagination etc.)
|
|
22
|
+
*/
|
|
23
|
+
import { promises as fs } from 'node:fs';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { createRequire } from 'node:module';
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
const pkg = require('../package.json');
|
|
28
|
+
const HELP = `pretext-pdf v${pkg.version} — JSON → PDF
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
pretext-pdf [<input.json>] [<output.pdf>]
|
|
32
|
+
pretext-pdf -i <input> -o <output>
|
|
33
|
+
cat doc.json | pretext-pdf > out.pdf
|
|
34
|
+
|
|
35
|
+
Options:
|
|
36
|
+
-i, --input <path> Read JSON (or Markdown with --markdown) from path
|
|
37
|
+
-o, --output <path> Write PDF to path (default: stdout)
|
|
38
|
+
--markdown Treat input as Markdown — converts via pretext-pdf/markdown
|
|
39
|
+
--code-font <name> With --markdown, font family for fenced code blocks
|
|
40
|
+
-v, --version Print pretext-pdf version
|
|
41
|
+
-h, --help Print this help
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
pretext-pdf doc.json invoice.pdf
|
|
45
|
+
echo '{"content":[{"type":"heading","level":1,"text":"Hi"}]}' | pretext-pdf > out.pdf
|
|
46
|
+
pretext-pdf --markdown --code-font 'Courier New' README.md docs.pdf
|
|
47
|
+
`;
|
|
48
|
+
function parseArgs(argv) {
|
|
49
|
+
const args = { markdown: false };
|
|
50
|
+
const positional = [];
|
|
51
|
+
for (let i = 0; i < argv.length; i++) {
|
|
52
|
+
const a = argv[i];
|
|
53
|
+
if (a === '-h' || a === '--help')
|
|
54
|
+
return { exit: 0, message: HELP };
|
|
55
|
+
if (a === '-v' || a === '--version')
|
|
56
|
+
return { exit: 0, message: pkg.version };
|
|
57
|
+
if (a === '-i' || a === '--input') {
|
|
58
|
+
const next = argv[++i];
|
|
59
|
+
if (!next)
|
|
60
|
+
return { error: `${a} requires a path argument` };
|
|
61
|
+
args.inputPath = next;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (a === '-o' || a === '--output') {
|
|
65
|
+
const next = argv[++i];
|
|
66
|
+
if (!next)
|
|
67
|
+
return { error: `${a} requires a path argument` };
|
|
68
|
+
args.outputPath = next;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (a === '--markdown') {
|
|
72
|
+
args.markdown = true;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (a === '--code-font') {
|
|
76
|
+
const next = argv[++i];
|
|
77
|
+
if (!next)
|
|
78
|
+
return { error: `${a} requires a font family argument` };
|
|
79
|
+
args.codeFont = next;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (a.startsWith('-'))
|
|
83
|
+
return { error: `unknown option: ${a}` };
|
|
84
|
+
positional.push(a);
|
|
85
|
+
}
|
|
86
|
+
// Positional fallback: first positional is input, second is output
|
|
87
|
+
if (!args.inputPath && positional[0])
|
|
88
|
+
args.inputPath = positional[0];
|
|
89
|
+
if (!args.outputPath && positional[1])
|
|
90
|
+
args.outputPath = positional[1];
|
|
91
|
+
if (positional.length > 2)
|
|
92
|
+
return { error: `too many positional arguments (got ${positional.length}, max 2)` };
|
|
93
|
+
return args;
|
|
94
|
+
}
|
|
95
|
+
async function readInput(inputPath) {
|
|
96
|
+
if (inputPath) {
|
|
97
|
+
const abs = path.resolve(inputPath);
|
|
98
|
+
try {
|
|
99
|
+
return await fs.readFile(abs, 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
throw new CliError(`failed to read ${inputPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// stdin
|
|
106
|
+
if (process.stdin.isTTY) {
|
|
107
|
+
throw new CliError('no input — pass a file path or pipe JSON to stdin. Run with -h for help.');
|
|
108
|
+
}
|
|
109
|
+
const chunks = [];
|
|
110
|
+
for await (const chunk of process.stdin) {
|
|
111
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
112
|
+
}
|
|
113
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
114
|
+
}
|
|
115
|
+
async function writeOutput(outputPath, bytes) {
|
|
116
|
+
if (outputPath) {
|
|
117
|
+
const abs = path.resolve(outputPath);
|
|
118
|
+
await fs.writeFile(abs, bytes);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// stdout
|
|
122
|
+
if (process.stdout.isTTY) {
|
|
123
|
+
throw new CliError('refusing to write binary PDF to a TTY. Pass an output path or redirect (> out.pdf).');
|
|
124
|
+
}
|
|
125
|
+
await new Promise((resolve, reject) => {
|
|
126
|
+
process.stdout.write(Buffer.from(bytes), (err) => (err ? reject(err) : resolve()));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
class CliError extends Error {
|
|
130
|
+
}
|
|
131
|
+
async function main() {
|
|
132
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
133
|
+
if ('exit' in parsed) {
|
|
134
|
+
process.stdout.write(parsed.message + '\n');
|
|
135
|
+
return parsed.exit;
|
|
136
|
+
}
|
|
137
|
+
if ('error' in parsed) {
|
|
138
|
+
process.stderr.write(`pretext-pdf: ${parsed.error}\n\n${HELP}`);
|
|
139
|
+
return 1;
|
|
140
|
+
}
|
|
141
|
+
let raw;
|
|
142
|
+
try {
|
|
143
|
+
raw = await readInput(parsed.inputPath);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
process.stderr.write(`pretext-pdf: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
// Build the PdfDocument. Either parse as JSON, or convert Markdown.
|
|
150
|
+
const { render } = await import('./index.js');
|
|
151
|
+
let doc;
|
|
152
|
+
if (parsed.markdown) {
|
|
153
|
+
let markdownToContent;
|
|
154
|
+
try {
|
|
155
|
+
({ markdownToContent } = await import('./markdown.js'));
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
process.stderr.write(`pretext-pdf: failed to load markdown converter: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
159
|
+
return 2;
|
|
160
|
+
}
|
|
161
|
+
const opts = {};
|
|
162
|
+
if (parsed.codeFont)
|
|
163
|
+
opts.codeFontFamily = parsed.codeFont;
|
|
164
|
+
try {
|
|
165
|
+
const content = await markdownToContent(raw, opts);
|
|
166
|
+
doc = { content };
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
process.stderr.write(`pretext-pdf: markdown conversion failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
170
|
+
return 2;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
try {
|
|
175
|
+
doc = JSON.parse(raw);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
process.stderr.write(`pretext-pdf: invalid JSON in input: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
179
|
+
return 1;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
let pdf;
|
|
183
|
+
try {
|
|
184
|
+
pdf = await render(doc);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const code = err?.code ?? 'RENDER_ERROR';
|
|
188
|
+
process.stderr.write(`pretext-pdf: ${code}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
189
|
+
return 2;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
await writeOutput(parsed.outputPath, pdf);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
process.stderr.write(`pretext-pdf: failed to write output: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
196
|
+
return 1;
|
|
197
|
+
}
|
|
198
|
+
// Success: only print a confirmation when writing to a real file (not stdout).
|
|
199
|
+
if (parsed.outputPath && !process.env.PRETEXT_PDF_QUIET) {
|
|
200
|
+
process.stderr.write(`pretext-pdf: wrote ${pdf.byteLength} bytes to ${parsed.outputPath}\n`);
|
|
201
|
+
}
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
main()
|
|
205
|
+
.then((code) => process.exit(code))
|
|
206
|
+
.catch((err) => {
|
|
207
|
+
process.stderr.write(`pretext-pdf: unexpected error: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
208
|
+
process.exit(2);
|
|
209
|
+
});
|
|
210
|
+
//# 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/compat.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pretext-pdf/compat — translate a pdfmake document descriptor into a
|
|
3
|
+
* pretext-pdf PdfDocument so existing pdfmake codebases can switch with
|
|
4
|
+
* a one-line change at the entry point.
|
|
5
|
+
*
|
|
6
|
+
* import { fromPdfmake } from 'pretext-pdf/compat'
|
|
7
|
+
* import { render } from 'pretext-pdf'
|
|
8
|
+
*
|
|
9
|
+
* const pdfmakeDoc = { content: [...], styles: {...} }
|
|
10
|
+
* const pdf = await render(fromPdfmake(pdfmakeDoc))
|
|
11
|
+
*
|
|
12
|
+
* What's translated:
|
|
13
|
+
* - pageSize ('A4', 'LETTER', { width, height }), pageOrientation, pageMargins
|
|
14
|
+
* - defaultStyle + styles map (style names referenced via { text, style: 'h1' })
|
|
15
|
+
* - String content → paragraph
|
|
16
|
+
* - { text } → paragraph or rich-paragraph (depends on inline styling)
|
|
17
|
+
* - { ul } / { ol } → list (recursive)
|
|
18
|
+
* - { table: {body, widths, headerRows} } → table
|
|
19
|
+
* - { image } → image
|
|
20
|
+
* - { qr, fit } → qr-code (requires the `qrcode` peer dep at render time)
|
|
21
|
+
* - { pageBreak } → page-break
|
|
22
|
+
* - { stack } → recurse children inline
|
|
23
|
+
* - header / footer (string forms only — pdfmake function-style headers are not supported)
|
|
24
|
+
*
|
|
25
|
+
* What's NOT translated (skipped, optionally warns):
|
|
26
|
+
* - { columns } — flattened into a stack with a console warning
|
|
27
|
+
* - { canvas } — drawing primitives are unsupported
|
|
28
|
+
* - Function-style headers/footers
|
|
29
|
+
* - styles[name].marginX / marginY / decoration
|
|
30
|
+
*
|
|
31
|
+
* Heading detection:
|
|
32
|
+
* By default style names like 'header', 'h1'..'h4', 'title', 'subheader' map
|
|
33
|
+
* to pretext-pdf heading levels 1..4. Override with `options.headingMap`.
|
|
34
|
+
*/
|
|
35
|
+
import type { PdfDocument } from './types.js';
|
|
36
|
+
/** A pdfmake-style document descriptor, stripped to the fields this shim handles. */
|
|
37
|
+
export interface PdfmakeDocument {
|
|
38
|
+
content: PdfmakeNode | PdfmakeNode[];
|
|
39
|
+
styles?: Record<string, PdfmakeStyle>;
|
|
40
|
+
defaultStyle?: PdfmakeStyle;
|
|
41
|
+
pageSize?: string | {
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
};
|
|
45
|
+
pageOrientation?: 'portrait' | 'landscape';
|
|
46
|
+
pageMargins?: number | [number, number] | [number, number, number, number];
|
|
47
|
+
header?: string | {
|
|
48
|
+
text: string;
|
|
49
|
+
alignment?: PdfmakeStyle['alignment'];
|
|
50
|
+
fontSize?: number;
|
|
51
|
+
color?: string;
|
|
52
|
+
};
|
|
53
|
+
footer?: string | {
|
|
54
|
+
text: string;
|
|
55
|
+
alignment?: PdfmakeStyle['alignment'];
|
|
56
|
+
fontSize?: number;
|
|
57
|
+
color?: string;
|
|
58
|
+
};
|
|
59
|
+
info?: {
|
|
60
|
+
title?: string;
|
|
61
|
+
author?: string;
|
|
62
|
+
subject?: string;
|
|
63
|
+
keywords?: string;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export type PdfmakeNode = string | PdfmakeObjectNode;
|
|
67
|
+
export interface PdfmakeObjectNode {
|
|
68
|
+
text?: string | PdfmakeNode | PdfmakeNode[];
|
|
69
|
+
style?: string | string[];
|
|
70
|
+
bold?: boolean;
|
|
71
|
+
italics?: boolean;
|
|
72
|
+
color?: string;
|
|
73
|
+
fontSize?: number;
|
|
74
|
+
alignment?: 'left' | 'center' | 'right' | 'justify';
|
|
75
|
+
font?: string;
|
|
76
|
+
ul?: PdfmakeNode[];
|
|
77
|
+
ol?: PdfmakeNode[];
|
|
78
|
+
table?: {
|
|
79
|
+
body: PdfmakeNode[][];
|
|
80
|
+
widths?: Array<number | string>;
|
|
81
|
+
headerRows?: number;
|
|
82
|
+
};
|
|
83
|
+
image?: string;
|
|
84
|
+
width?: number | string;
|
|
85
|
+
height?: number;
|
|
86
|
+
qr?: string;
|
|
87
|
+
fit?: number | [number, number];
|
|
88
|
+
pageBreak?: 'before' | 'after';
|
|
89
|
+
stack?: PdfmakeNode[];
|
|
90
|
+
columns?: PdfmakeNode[];
|
|
91
|
+
link?: string;
|
|
92
|
+
canvas?: unknown[];
|
|
93
|
+
}
|
|
94
|
+
export interface PdfmakeStyle {
|
|
95
|
+
fontSize?: number;
|
|
96
|
+
bold?: boolean;
|
|
97
|
+
italics?: boolean;
|
|
98
|
+
color?: string;
|
|
99
|
+
alignment?: 'left' | 'center' | 'right' | 'justify';
|
|
100
|
+
font?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface CompatOptions {
|
|
103
|
+
/**
|
|
104
|
+
* Map of pdfmake style names to pretext-pdf heading levels (1–4).
|
|
105
|
+
* Default: { header: 1, h1: 1, title: 1, subheader: 2, h2: 2, h3: 3, h4: 4 }
|
|
106
|
+
* Pass `{}` to disable heading detection entirely (everything becomes paragraphs).
|
|
107
|
+
*/
|
|
108
|
+
headingMap?: Record<string, 1 | 2 | 3 | 4>;
|
|
109
|
+
/**
|
|
110
|
+
* Called when a pdfmake feature is encountered that the shim doesn't translate
|
|
111
|
+
* (canvas, function-style headers, etc.). Default: log a one-time warning.
|
|
112
|
+
*/
|
|
113
|
+
onUnsupported?: (feature: string) => void;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Translate a pdfmake document descriptor into a pretext-pdf PdfDocument.
|
|
117
|
+
* The result can be passed straight to `render()` from the main entry point.
|
|
118
|
+
*/
|
|
119
|
+
export declare function fromPdfmake(doc: PdfmakeDocument, options?: CompatOptions): PdfDocument;
|
|
120
|
+
//# sourceMappingURL=compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"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"}
|