@bendyline/squisq-cli 1.1.4 → 1.1.6

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.
Files changed (41) hide show
  1. package/dist/api.d.ts +45 -14
  2. package/dist/api.js +393 -304
  3. package/dist/api.js.map +1 -1
  4. package/dist/index.d.ts +2 -12
  5. package/dist/index.js +722 -20
  6. package/dist/index.js.map +1 -1
  7. package/package.json +5 -5
  8. package/dist/__tests__/convert.test.d.ts +0 -7
  9. package/dist/__tests__/convert.test.d.ts.map +0 -1
  10. package/dist/__tests__/convert.test.js +0 -127
  11. package/dist/__tests__/convert.test.js.map +0 -1
  12. package/dist/__tests__/html-export.test.d.ts +0 -8
  13. package/dist/__tests__/html-export.test.d.ts.map +0 -1
  14. package/dist/__tests__/html-export.test.js +0 -126
  15. package/dist/__tests__/html-export.test.js.map +0 -1
  16. package/dist/__tests__/readInput.test.d.ts +0 -5
  17. package/dist/__tests__/readInput.test.d.ts.map +0 -1
  18. package/dist/__tests__/readInput.test.js +0 -120
  19. package/dist/__tests__/readInput.test.js.map +0 -1
  20. package/dist/api.d.ts.map +0 -1
  21. package/dist/commands/convert.d.ts +0 -15
  22. package/dist/commands/convert.d.ts.map +0 -1
  23. package/dist/commands/convert.js +0 -264
  24. package/dist/commands/convert.js.map +0 -1
  25. package/dist/commands/video.d.ts +0 -12
  26. package/dist/commands/video.d.ts.map +0 -1
  27. package/dist/commands/video.js +0 -122
  28. package/dist/commands/video.js.map +0 -1
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/util/detectFfmpeg.d.ts +0 -15
  31. package/dist/util/detectFfmpeg.d.ts.map +0 -1
  32. package/dist/util/detectFfmpeg.js +0 -29
  33. package/dist/util/detectFfmpeg.js.map +0 -1
  34. package/dist/util/nativeEncoder.d.ts +0 -27
  35. package/dist/util/nativeEncoder.d.ts.map +0 -1
  36. package/dist/util/nativeEncoder.js +0 -106
  37. package/dist/util/nativeEncoder.js.map +0 -1
  38. package/dist/util/readInput.d.ts +0 -31
  39. package/dist/util/readInput.d.ts.map +0 -1
  40. package/dist/util/readInput.js +0 -142
  41. package/dist/util/readInput.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"readInput.test.js","sourceRoot":"","sources":["../../src/__tests__/readInput.test.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM9E,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,kCAAkC;AAClC,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,mDAAmD;IACnD,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,gDAAgD;IAChD,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAE/B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAErC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IAEjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA8L/B;AAmID,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF"}
@@ -1,15 +0,0 @@
1
- /**
2
- * convert command
3
- *
4
- * Reads a markdown file, ZIP/DBK container, or folder and exports to
5
- * all supported formats: DOCX, PPTX, PDF, HTML, and container ZIP (.dbk).
6
- *
7
- * Supports optional --theme and --transform flags to apply a squisq theme
8
- * and/or transform style before exporting.
9
- *
10
- * Usage:
11
- * squisq convert <input> [--output-dir <dir>] [--formats <list>] [--theme <id>] [--transform <style>]
12
- */
13
- import type { Command } from 'commander';
14
- export declare function registerConvertCommand(program: Command): void;
15
- //# sourceMappingURL=convert.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB7D"}
@@ -1,264 +0,0 @@
1
- /**
2
- * convert command
3
- *
4
- * Reads a markdown file, ZIP/DBK container, or folder and exports to
5
- * all supported formats: DOCX, PPTX, PDF, HTML, and container ZIP (.dbk).
6
- *
7
- * Supports optional --theme and --transform flags to apply a squisq theme
8
- * and/or transform style before exporting.
9
- *
10
- * Usage:
11
- * squisq convert <input> [--output-dir <dir>] [--formats <list>] [--theme <id>] [--transform <style>]
12
- */
13
- import { writeFile, mkdir } from 'node:fs/promises';
14
- import { dirname, basename, extname, join, resolve } from 'node:path';
15
- import { readInput } from '../util/readInput.js';
16
- const ALL_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'htmlzip', 'epub', 'dbk'];
17
- function parseFormats(value) {
18
- const requested = value.split(',').map((s) => s.trim().toLowerCase());
19
- const valid = [];
20
- for (const r of requested) {
21
- if (ALL_FORMATS.includes(r)) {
22
- valid.push(r);
23
- }
24
- else {
25
- console.warn(`Unknown format "${r}" — skipping. Valid: ${ALL_FORMATS.join(', ')}`);
26
- }
27
- }
28
- if (valid.length === 0) {
29
- throw new Error(`No valid formats specified. Valid: ${ALL_FORMATS.join(', ')}`);
30
- }
31
- return valid;
32
- }
33
- export function registerConvertCommand(program) {
34
- program
35
- .command('convert')
36
- .description('Convert a markdown document to DOCX, PPTX, PDF, HTML, and DBK container formats')
37
- .argument('<input>', 'Path to .md file, .zip/.dbk container, or folder')
38
- .option('-o, --output-dir <dir>', 'Output directory (default: same as input)')
39
- .option('-f, --formats <list>', `Comma-separated formats to produce (default: all). Valid: ${ALL_FORMATS.join(', ')}`)
40
- .option('-t, --theme <id>', 'Squisq theme ID to apply (e.g., documentary, cinematic, bold)')
41
- .option('--transform <style>', 'Transform style to apply before export (e.g., documentary, magazine, minimal)')
42
- .action(async (inputPath, opts) => {
43
- try {
44
- await runConvert(inputPath, opts);
45
- }
46
- catch (err) {
47
- const message = err instanceof Error ? err.message : String(err);
48
- console.error(`Error: ${message}`);
49
- process.exitCode = 1;
50
- }
51
- });
52
- }
53
- async function runConvert(inputPath, opts) {
54
- const resolvedInput = resolve(inputPath);
55
- // Determine which formats to produce
56
- const formats = opts.formats ? parseFormats(opts.formats) : [...ALL_FORMATS];
57
- // Determine output directory and base filename
58
- const outputDir = opts.outputDir ? resolve(opts.outputDir) : dirname(resolvedInput);
59
- const inputBasename = basename(resolvedInput);
60
- const inputExt = extname(inputBasename);
61
- const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;
62
- // Ensure output directory exists
63
- await mkdir(outputDir, { recursive: true });
64
- // Validate theme and transform IDs
65
- if (opts.theme) {
66
- const { getAvailableThemes } = await import('@bendyline/squisq/schemas');
67
- const themes = getAvailableThemes();
68
- if (!themes.includes(opts.theme)) {
69
- throw new Error(`Unknown theme "${opts.theme}". Available: ${themes.join(', ')}`);
70
- }
71
- }
72
- if (opts.transform) {
73
- const { getTransformStyleIds } = await import('@bendyline/squisq/transform');
74
- const styles = getTransformStyleIds();
75
- if (!styles.includes(opts.transform)) {
76
- throw new Error(`Unknown transform style "${opts.transform}". Available: ${styles.join(', ')}`);
77
- }
78
- }
79
- console.error(`Reading: ${resolvedInput}`);
80
- const result = await readInput(resolvedInput);
81
- const { container } = result;
82
- if (!result.markdownDoc) {
83
- throw new Error('Convert command requires a markdown document. JSON Doc input is not supported for convert — use the video command instead.');
84
- }
85
- // Apply transform if requested
86
- let exportMarkdownDoc = result.markdownDoc;
87
- if (opts.transform) {
88
- exportMarkdownDoc = await applyTransformToMarkdown(result.markdownDoc, container, opts.transform, opts.theme);
89
- console.error(` Applied transform: ${opts.transform}`);
90
- }
91
- const themeId = opts.theme;
92
- for (const format of formats) {
93
- const outPath = join(outputDir, `${baseName}.${format}`);
94
- switch (format) {
95
- case 'docx': {
96
- const { markdownDocToDocx } = await import('@bendyline/squisq-formats/docx');
97
- const buf = await markdownDocToDocx(exportMarkdownDoc, { themeId });
98
- await writeFile(outPath, Buffer.from(buf));
99
- break;
100
- }
101
- case 'pptx': {
102
- const { markdownDocToPptx } = await import('@bendyline/squisq-formats/pptx');
103
- // Collect images from container for PPTX embedding
104
- const images = await collectContainerImages(container);
105
- const buf = await markdownDocToPptx(exportMarkdownDoc, { themeId, images });
106
- await writeFile(outPath, Buffer.from(buf));
107
- break;
108
- }
109
- case 'pdf': {
110
- const { markdownDocToPdf } = await import('@bendyline/squisq-formats/pdf');
111
- const buf = await markdownDocToPdf(exportMarkdownDoc, { themeId });
112
- await writeFile(outPath, Buffer.from(buf));
113
- break;
114
- }
115
- case 'html': {
116
- const { markdownToDoc } = await import('@bendyline/squisq/doc');
117
- const { docToHtml } = await import('@bendyline/squisq-formats/html');
118
- const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
119
- const doc = markdownToDoc(exportMarkdownDoc);
120
- const images = await collectImagesForHtml(doc, container);
121
- const html = docToHtml(doc, {
122
- playerScript: PLAYER_BUNDLE,
123
- images,
124
- title: baseName,
125
- mode: 'static',
126
- themeId,
127
- });
128
- await writeFile(outPath, html, 'utf-8');
129
- break;
130
- }
131
- case 'htmlzip': {
132
- const { markdownToDoc } = await import('@bendyline/squisq/doc');
133
- const { docToHtmlZip } = await import('@bendyline/squisq-formats/html');
134
- const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
135
- const doc = markdownToDoc(exportMarkdownDoc);
136
- const images = await collectImagesForHtml(doc, container);
137
- const blob = await docToHtmlZip(doc, {
138
- playerScript: PLAYER_BUNDLE,
139
- images,
140
- title: baseName,
141
- mode: 'static',
142
- themeId,
143
- });
144
- const buf = Buffer.from(await blob.arrayBuffer());
145
- await writeFile(outPath.replace(/\.htmlzip$/, '.html.zip'), buf);
146
- break;
147
- }
148
- case 'epub': {
149
- const { markdownDocToEpub } = await import('@bendyline/squisq-formats/epub');
150
- const images = await collectContainerImages(container);
151
- // Collect audio narration from container if Doc has audio segments
152
- const epubAudio = new Map();
153
- const audioSegments = result.doc?.audio?.segments;
154
- if (audioSegments?.length) {
155
- for (const seg of audioSegments) {
156
- const data = await container.readFile(seg.src);
157
- if (data)
158
- epubAudio.set(seg.src, data);
159
- }
160
- }
161
- const hasNarration = epubAudio.size > 0;
162
- const buf = await markdownDocToEpub(exportMarkdownDoc, {
163
- title: baseName,
164
- themeId,
165
- images,
166
- audio: hasNarration ? epubAudio : undefined,
167
- audioSegments: hasNarration ? audioSegments : undefined,
168
- totalDuration: hasNarration ? result.doc?.duration : undefined,
169
- });
170
- await writeFile(outPath, Buffer.from(buf));
171
- break;
172
- }
173
- case 'dbk': {
174
- const { containerToZip } = await import('@bendyline/squisq-formats/container');
175
- const blob = await containerToZip(container);
176
- const buf = await blob.arrayBuffer();
177
- await writeFile(outPath, Buffer.from(buf));
178
- break;
179
- }
180
- }
181
- console.error(` ✓ ${outPath}`);
182
- }
183
- console.error('Done.');
184
- }
185
- // ============================================
186
- // Transform Pipeline
187
- // ============================================
188
- /**
189
- * Apply a transform style to a MarkdownDocument.
190
- * Pipeline: MarkdownDocument → Doc → applyTransform → docToMarkdown → MarkdownDocument
191
- */
192
- async function applyTransformToMarkdown(markdownDoc, container, transformStyle, themeId) {
193
- const { markdownToDoc, docToMarkdown } = await import('@bendyline/squisq/doc');
194
- const { applyTransform, extractDocImages } = await import('@bendyline/squisq/transform');
195
- const doc = markdownToDoc(markdownDoc);
196
- // Extract image metadata from the doc for transform interleaving
197
- const images = extractDocImages(doc.blocks);
198
- const result = applyTransform(doc, transformStyle, {
199
- themeId,
200
- images,
201
- });
202
- return docToMarkdown(result.doc);
203
- }
204
- /**
205
- * Collect images for HTML export, keying each by both its container path and
206
- * its filename. The standalone player resolves by exact key first then by
207
- * filename, so both keyings handle path mismatches between how the Doc
208
- * references images and how they're stored in the container.
209
- *
210
- * Only images referenced by the Doc are included — unreferenced container
211
- * images would bloat the HTML output unnecessarily.
212
- */
213
- async function collectImagesForHtml(doc, container) {
214
- const { collectImagePaths, extractFilename } = await import('@bendyline/squisq-formats/html');
215
- const images = new Map();
216
- const docPaths = collectImagePaths(doc);
217
- // Try exact paths first
218
- const needByFilename = new Set();
219
- for (const imgPath of docPaths) {
220
- const data = await container.readFile(imgPath);
221
- if (data) {
222
- images.set(imgPath, data);
223
- const filename = extractFilename(imgPath);
224
- if (filename !== imgPath)
225
- images.set(filename, data);
226
- }
227
- else {
228
- needByFilename.add(extractFilename(imgPath));
229
- }
230
- }
231
- // For any doc paths that didn't resolve, scan the container for a file
232
- // with the same basename (handles "images/hero.jpg" vs "hero.jpg" mismatches).
233
- if (needByFilename.size > 0) {
234
- const files = await container.listFiles();
235
- for (const file of files) {
236
- const filename = extractFilename(file.path);
237
- if (needByFilename.has(filename)) {
238
- const data = await container.readFile(file.path);
239
- if (data) {
240
- images.set(filename, data);
241
- images.set(file.path, data);
242
- }
243
- }
244
- }
245
- }
246
- return images;
247
- }
248
- /**
249
- * Collect all image files from a container as a Map<path, ArrayBuffer>.
250
- */
251
- async function collectContainerImages(container) {
252
- const images = new Map();
253
- const files = await container.listFiles();
254
- for (const file of files) {
255
- if (/\.(jpg|jpeg|png|gif|webp|svg|bmp|avif)$/i.test(file.path)) {
256
- const data = await container.readFile(file.path);
257
- if (data) {
258
- images.set(file.path, data);
259
- }
260
- }
261
- }
262
- return images;
263
- }
264
- //# sourceMappingURL=convert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * video command
3
- *
4
- * Renders a squisq document to MP4 video by delegating to the
5
- * programmatic renderDocToMp4 API.
6
- *
7
- * Usage:
8
- * squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
9
- */
10
- import type { Command } from 'commander';
11
- export declare function registerVideoCommand(program: Command): void;
12
- //# sourceMappingURL=video.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC3D"}
@@ -1,122 +0,0 @@
1
- /**
2
- * video command
3
- *
4
- * Renders a squisq document to MP4 video by delegating to the
5
- * programmatic renderDocToMp4 API.
6
- *
7
- * Usage:
8
- * squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
9
- */
10
- import { mkdir } from 'node:fs/promises';
11
- import { dirname, basename, extname, resolve } from 'node:path';
12
- import { readInput } from '../util/readInput.js';
13
- import { renderDocToMp4 } from '../api.js';
14
- const VALID_QUALITIES = ['draft', 'normal', 'high'];
15
- const VALID_ORIENTATIONS = ['landscape', 'portrait'];
16
- const VALID_CAPTIONS = ['off', 'standard', 'social'];
17
- export function registerVideoCommand(program) {
18
- program
19
- .command('video')
20
- .description('Render a squisq document to MP4 video')
21
- .argument('<input>', 'Path to .md file, .zip/.dbk container, or folder')
22
- .argument('[output]', 'Output MP4 path (default: <input>.mp4)')
23
- .option('-o, --output <path>', 'Output MP4 path (default: <input>.mp4)')
24
- .option('--fps <number>', 'Frames per second (default: 30)', '30')
25
- .option('--quality <level>', `Encoding quality: ${VALID_QUALITIES.join(', ')} (default: normal)`, 'normal')
26
- .option('--orientation <orient>', `Video orientation: ${VALID_ORIENTATIONS.join(', ')} (default: landscape)`, 'landscape')
27
- .option('--captions <style>', `Caption style: ${VALID_CAPTIONS.join(', ')} (default: off)`, 'off')
28
- .option('--width <pixels>', 'Override video width')
29
- .option('--height <pixels>', 'Override video height')
30
- .action(async (inputPath, outputArg, opts) => {
31
- try {
32
- // Positional output arg takes precedence, then -o flag
33
- if (outputArg && !opts.output) {
34
- opts.output = outputArg;
35
- }
36
- await runVideo(inputPath, opts);
37
- }
38
- catch (err) {
39
- const message = err instanceof Error ? err.message : String(err);
40
- console.error(`Error: ${message}`);
41
- process.exitCode = 1;
42
- }
43
- });
44
- }
45
- async function runVideo(inputPath, opts) {
46
- const resolvedInput = resolve(inputPath);
47
- // Validate options
48
- const fps = parseInt(opts.fps ?? '30', 10);
49
- if (isNaN(fps) || fps < 1 || fps > 120) {
50
- throw new Error('FPS must be a number between 1 and 120');
51
- }
52
- const quality = opts.quality ?? 'normal';
53
- if (!VALID_QUALITIES.includes(quality)) {
54
- throw new Error(`Invalid quality "${quality}". Valid: ${VALID_QUALITIES.join(', ')}`);
55
- }
56
- const orientation = opts.orientation ?? 'landscape';
57
- if (!VALID_ORIENTATIONS.includes(orientation)) {
58
- throw new Error(`Invalid orientation "${orientation}". Valid: ${VALID_ORIENTATIONS.join(', ')}`);
59
- }
60
- const captions = opts.captions ?? 'off';
61
- if (!VALID_CAPTIONS.includes(captions)) {
62
- throw new Error(`Invalid captions "${captions}". Valid: ${VALID_CAPTIONS.join(', ')}`);
63
- }
64
- const captionStyle = captions === 'off' ? undefined : captions;
65
- // Determine output path
66
- const inputBasename = basename(resolvedInput);
67
- const inputExt = extname(inputBasename);
68
- const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;
69
- const outputPath = opts.output
70
- ? resolve(opts.output)
71
- : resolve(dirname(resolvedInput), `${baseName}.mp4`);
72
- // Ensure output directory exists
73
- await mkdir(dirname(outputPath), { recursive: true });
74
- // ── Step 1: Read input ──────────────────────────────────────────
75
- console.error(`Reading: ${resolvedInput}`);
76
- const result = await readInput(resolvedInput);
77
- const { container } = result;
78
- // ── Step 2: Get or parse Doc ────────────────────────────────────
79
- let doc;
80
- if (result.doc) {
81
- console.error('Using pre-built Doc JSON');
82
- doc = result.doc;
83
- }
84
- else if (result.markdownDoc) {
85
- const { markdownToDoc } = await import('@bendyline/squisq/doc');
86
- doc = markdownToDoc(result.markdownDoc);
87
- }
88
- else {
89
- throw new Error('No document found in input');
90
- }
91
- console.error(`Rendering: ${fps} fps, quality: ${quality}, orientation: ${orientation}, captions: ${captions}`);
92
- // ── Step 3: Render via programmatic API ─────────────────────────
93
- const result2 = await renderDocToMp4(doc, container, {
94
- outputPath,
95
- fps,
96
- quality: quality,
97
- orientation: orientation,
98
- width: opts.width ? parseInt(opts.width, 10) : undefined,
99
- height: opts.height ? parseInt(opts.height, 10) : undefined,
100
- captionStyle,
101
- coverPreRoll: 2,
102
- onProgress: (phase, percent) => {
103
- writeProgress(phase, percent, 100);
104
- },
105
- });
106
- clearProgress();
107
- console.error(` ✓ ${outputPath} (${result2.duration.toFixed(1)}s, ${result2.frameCount} frames)`);
108
- console.error('Done.');
109
- }
110
- // ── Progress helpers ──────────────────────────────────────────────
111
- const BAR_WIDTH = 30;
112
- function writeProgress(label, current, total, detail) {
113
- const pct = Math.min(100, Math.round((current / total) * 100));
114
- const filled = Math.round((pct / 100) * BAR_WIDTH);
115
- const bar = '█'.repeat(filled) + '░'.repeat(BAR_WIDTH - filled);
116
- const suffix = detail ? ` (${detail})` : '';
117
- process.stderr.write(`\r ${label}: ${bar} ${pct}%${suffix} `);
118
- }
119
- function clearProgress() {
120
- process.stderr.write('\r' + ' '.repeat(80) + '\r');
121
- }
122
- //# sourceMappingURL=video.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAgB3C,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAC7D,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,UAAU,CAAU,CAAC;AAC9D,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAU,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uCAAuC,CAAC;SACpD,QAAQ,CAAC,SAAS,EAAE,kDAAkD,CAAC;SACvE,QAAQ,CAAC,UAAU,EAAE,wCAAwC,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,IAAI,CAAC;SACjE,MAAM,CACL,mBAAmB,EACnB,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EACnE,QAAQ,CACT;SACA,MAAM,CACL,wBAAwB,EACxB,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAC1E,WAAW,CACZ;SACA,MAAM,CACL,oBAAoB,EACpB,kBAAkB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAC5D,KAAK,CACN;SACA,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,SAA6B,EAAE,IAAyB,EAAE,EAAE;QAC5F,IAAI,CAAC;YACH,uDAAuD;YACvD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAC1B,CAAC;YACD,MAAM,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,IAAyB;IAClE,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC,mBAAmB;IACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA2C,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC;IACpD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAkD,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,aAAa,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;IACxC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAA2C,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,QAAkC,CAAC;IAE1F,wBAAwB;IACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM;QAC5B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAEvD,iCAAiC;IACjC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,mEAAmE;IACnE,OAAO,CAAC,KAAK,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7B,mEAAmE;IACnE,IAAI,GAAQ,CAAC;IACb,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACnB,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAChE,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,KAAK,CACX,cAAc,GAAG,kBAAkB,OAAO,kBAAkB,WAAW,eAAe,QAAQ,EAAE,CACjG,CAAC;IAEF,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE;QACnD,UAAU;QACV,GAAG;QACH,OAAO,EAAE,OAAuB;QAChC,WAAW,EAAE,WAA+B;QAC5C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,YAAY;QACZ,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IAEH,aAAa,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CACX,OAAO,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,UAAU,CACpF,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,qEAAqE;AAErE,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa,EAAE,MAAe;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -1,15 +0,0 @@
1
- /**
2
- * detectFfmpeg
3
- *
4
- * Checks whether a native ffmpeg binary is available on the system PATH.
5
- * Returns the absolute path to the binary if found, or null if not.
6
- *
7
- * Uses `which` on macOS/Linux and `where` on Windows.
8
- */
9
- /**
10
- * Detect whether native ffmpeg is installed and available on PATH.
11
- *
12
- * @returns Absolute path to ffmpeg binary, or null if not found
13
- */
14
- export declare function detectFfmpeg(): Promise<string | null>;
15
- //# sourceMappingURL=detectFfmpeg.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detectFfmpeg.d.ts","sourceRoot":"","sources":["../../src/util/detectFfmpeg.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc3D"}
@@ -1,29 +0,0 @@
1
- /**
2
- * detectFfmpeg
3
- *
4
- * Checks whether a native ffmpeg binary is available on the system PATH.
5
- * Returns the absolute path to the binary if found, or null if not.
6
- *
7
- * Uses `which` on macOS/Linux and `where` on Windows.
8
- */
9
- import { execFile } from 'node:child_process';
10
- /**
11
- * Detect whether native ffmpeg is installed and available on PATH.
12
- *
13
- * @returns Absolute path to ffmpeg binary, or null if not found
14
- */
15
- export async function detectFfmpeg() {
16
- const command = process.platform === 'win32' ? 'where' : 'which';
17
- return new Promise((resolve) => {
18
- execFile(command, ['ffmpeg'], { timeout: 5000 }, (err, stdout) => {
19
- if (err || !stdout.trim()) {
20
- resolve(null);
21
- return;
22
- }
23
- // `which` and `where` can return multiple lines; take the first
24
- const path = stdout.trim().split('\n')[0].trim();
25
- resolve(path);
26
- });
27
- });
28
- }
29
- //# sourceMappingURL=detectFfmpeg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detectFfmpeg.js","sourceRoot":"","sources":["../../src/util/detectFfmpeg.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAC/D,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,gEAAgE;YAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Native FFmpeg Encoder
3
- *
4
- * Encodes PNG frames to MP4 using a locally installed ffmpeg binary.
5
- * Writes frames to a temporary directory, invokes ffmpeg as a child process,
6
- * and reads the resulting MP4.
7
- *
8
- * This is the fast path — used when native ffmpeg is detected on the system.
9
- * Falls back to the WASM encoder (in @bendyline/squisq-video) when unavailable.
10
- */
11
- import type { VideoExportOptions } from '@bendyline/squisq-video';
12
- /**
13
- * Encode frame PNGs to MP4 using native ffmpeg.
14
- *
15
- * @param ffmpegPath - Absolute path to the ffmpeg binary
16
- * @param frames - Array of PNG image bytes (one per frame)
17
- * @param audio - Optional audio file bytes to mux
18
- * @param outputPath - Where to write the final MP4
19
- * @param options - Encoding options (fps, quality, dimensions, progress)
20
- */
21
- export declare function framesToMp4Native(ffmpegPath: string, frames: Uint8Array[], audio: Uint8Array | null, outputPath: string, options?: VideoExportOptions): Promise<void>;
22
- /**
23
- * Encode frames using native ffmpeg and return the MP4 bytes (instead of writing to disk).
24
- * Useful when the caller needs the bytes in memory.
25
- */
26
- export declare function framesToMp4NativeBytes(ffmpegPath: string, frames: Uint8Array[], audio: Uint8Array | null, options?: VideoExportOptions): Promise<Uint8Array>;
27
- //# sourceMappingURL=nativeEncoder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeEncoder.d.ts","sourceRoot":"","sources":["../../src/util/nativeEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,EAAE,EACpB,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAuFf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,EAAE,EACpB,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAWrB"}