@vibeo/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.
@@ -0,0 +1,2 @@
1
+ export declare function createCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAwFA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4GjE"}
@@ -0,0 +1,173 @@
1
+ import { resolve, join } from "node:path";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { existsSync } from "node:fs";
4
+ const TEMPLATES = {
5
+ basic: {
6
+ description: "Minimal composition with text animation and two scenes",
7
+ example: "basic-composition.tsx",
8
+ },
9
+ "audio-reactive": {
10
+ description: "Audio visualization with frequency bars and amplitude-driven effects",
11
+ example: "audio-reactive-viz.tsx",
12
+ },
13
+ transitions: {
14
+ description: "Scene transitions (fade, slide) between multiple scenes",
15
+ example: "transition-demo.tsx",
16
+ },
17
+ subtitles: {
18
+ description: "Video with SRT subtitle overlay",
19
+ example: "subtitle-overlay.tsx",
20
+ },
21
+ };
22
+ function parseArgs(args) {
23
+ const result = { name: "", template: "basic" };
24
+ for (let i = 0; i < args.length; i++) {
25
+ const arg = args[i];
26
+ const next = args[i + 1];
27
+ if (arg === "--template" && next) {
28
+ result.template = next;
29
+ i++;
30
+ }
31
+ else if (arg.startsWith("--template=")) {
32
+ result.template = arg.slice("--template=".length);
33
+ }
34
+ else if (arg === "--help" || arg === "-h") {
35
+ printHelp();
36
+ process.exit(0);
37
+ }
38
+ else if (!arg.startsWith("-") && !result.name) {
39
+ result.name = arg;
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ function printHelp() {
45
+ console.log(`
46
+ vibeo create - Create a new Vibeo project
47
+
48
+ Usage:
49
+ vibeo create <project-name> [options]
50
+
51
+ Options:
52
+ --template <name> Template to use (default: basic)
53
+ --help Show this help
54
+
55
+ Templates:`);
56
+ for (const [name, { description }] of Object.entries(TEMPLATES)) {
57
+ console.log(` ${name.padEnd(18)} ${description}`);
58
+ }
59
+ console.log(`
60
+ Examples:
61
+ vibeo create my-video
62
+ vibeo create music-viz --template audio-reactive
63
+ vibeo create intro --template transitions
64
+ `);
65
+ }
66
+ // Find the examples directory relative to the CLI package
67
+ function findExamplesDir() {
68
+ // Walk up from this file to find the repo root with examples/
69
+ let dir = import.meta.dir;
70
+ for (let i = 0; i < 6; i++) {
71
+ const candidate = join(dir, "examples");
72
+ if (existsSync(candidate))
73
+ return candidate;
74
+ dir = resolve(dir, "..");
75
+ }
76
+ throw new Error("Could not find examples directory");
77
+ }
78
+ export async function createCommand(args) {
79
+ const parsed = parseArgs(args);
80
+ if (!parsed.name) {
81
+ console.error("Error: project name is required\n");
82
+ printHelp();
83
+ process.exit(1);
84
+ }
85
+ const template = TEMPLATES[parsed.template];
86
+ if (!template) {
87
+ console.error(`Error: unknown template "${parsed.template}"`);
88
+ console.error(`Available: ${Object.keys(TEMPLATES).join(", ")}`);
89
+ process.exit(1);
90
+ }
91
+ const projectDir = resolve(parsed.name);
92
+ if (existsSync(projectDir)) {
93
+ console.error(`Error: directory "${parsed.name}" already exists`);
94
+ process.exit(1);
95
+ }
96
+ console.log(`\nCreating Vibeo project: ${parsed.name}`);
97
+ console.log(`Template: ${parsed.template}\n`);
98
+ // Create project structure
99
+ await mkdir(join(projectDir, "src"), { recursive: true });
100
+ await mkdir(join(projectDir, "public"), { recursive: true });
101
+ // Copy example as src/index.tsx
102
+ const examplesDir = findExamplesDir();
103
+ const exampleSrc = await readFile(join(examplesDir, template.example), "utf-8");
104
+ await writeFile(join(projectDir, "src", "index.tsx"), exampleSrc);
105
+ // Write package.json
106
+ const pkg = {
107
+ name: parsed.name,
108
+ version: "0.0.1",
109
+ private: true,
110
+ type: "module",
111
+ scripts: {
112
+ dev: "vibeo preview --entry src/index.tsx",
113
+ build: "vibeo render --entry src/index.tsx",
114
+ list: "vibeo list --entry src/index.tsx",
115
+ typecheck: "bunx tsc --noEmit",
116
+ },
117
+ dependencies: {
118
+ "@vibeo/core": "workspace:*",
119
+ "@vibeo/audio": "workspace:*",
120
+ "@vibeo/effects": "workspace:*",
121
+ "@vibeo/extras": "workspace:*",
122
+ "@vibeo/player": "workspace:*",
123
+ "@vibeo/renderer": "workspace:*",
124
+ "@vibeo/cli": "workspace:*",
125
+ react: "^19.0.0",
126
+ "react-dom": "^19.0.0",
127
+ },
128
+ devDependencies: {
129
+ "@types/react": "^19.0.0",
130
+ typescript: "^5.0.0",
131
+ },
132
+ };
133
+ await writeFile(join(projectDir, "package.json"), JSON.stringify(pkg, null, 2) + "\n");
134
+ // Write tsconfig.json
135
+ const tsconfig = {
136
+ compilerOptions: {
137
+ target: "ES2022",
138
+ module: "ESNext",
139
+ moduleResolution: "bundler",
140
+ jsx: "react-jsx",
141
+ strict: true,
142
+ esModuleInterop: true,
143
+ skipLibCheck: true,
144
+ outDir: "dist",
145
+ declaration: true,
146
+ declarationMap: true,
147
+ sourceMap: true,
148
+ },
149
+ include: ["src"],
150
+ };
151
+ await writeFile(join(projectDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2) + "\n");
152
+ // Write .gitignore
153
+ await writeFile(join(projectDir, ".gitignore"), `node_modules/
154
+ dist/
155
+ out/
156
+ *.tmp
157
+ .DS_Store
158
+ `);
159
+ console.log(` Created ${parsed.name}/`);
160
+ console.log(` ├── src/index.tsx`);
161
+ console.log(` ├── public/`);
162
+ console.log(` ├── package.json`);
163
+ console.log(` ├── tsconfig.json`);
164
+ console.log(` └── .gitignore`);
165
+ console.log(`
166
+ Next steps:
167
+ cd ${parsed.name}
168
+ bun install
169
+ bun run dev # preview in browser
170
+ bun run build # render to video
171
+ `);
172
+ }
173
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bundle the entry, launch a browser to evaluate it,
3
+ * extract registered compositions, and print a table.
4
+ */
5
+ export declare function listCommand(args: string[]): Promise<void>;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAsDA;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE/D"}
@@ -0,0 +1,101 @@
1
+ import { resolve } from "node:path";
2
+ import { bundle } from "@vibeo/renderer";
3
+ import { launchBrowser, createPage, closeBrowser } from "@vibeo/renderer";
4
+ function parseArgs(args) {
5
+ const result = {
6
+ entry: "",
7
+ };
8
+ for (let i = 0; i < args.length; i++) {
9
+ const arg = args[i];
10
+ const next = args[i + 1];
11
+ if (arg === "--entry" && next) {
12
+ result.entry = next;
13
+ i++;
14
+ }
15
+ else if (arg.startsWith("--entry=")) {
16
+ result.entry = arg.slice("--entry=".length);
17
+ }
18
+ else if (arg === "--help" || arg === "-h") {
19
+ printHelp();
20
+ process.exit(0);
21
+ }
22
+ }
23
+ return result;
24
+ }
25
+ function printHelp() {
26
+ console.log(`
27
+ vibeo list - List registered compositions
28
+
29
+ Usage:
30
+ vibeo list --entry <path>
31
+
32
+ Required:
33
+ --entry <path> Path to the root file with compositions
34
+
35
+ Options:
36
+ --help Show this help
37
+ `);
38
+ }
39
+ /**
40
+ * Bundle the entry, launch a browser to evaluate it,
41
+ * extract registered compositions, and print a table.
42
+ */
43
+ export async function listCommand(args) {
44
+ const parsed = parseArgs(args);
45
+ if (!parsed.entry) {
46
+ console.error("Error: --entry is required");
47
+ printHelp();
48
+ process.exit(1);
49
+ }
50
+ const entry = resolve(parsed.entry);
51
+ console.log(`Bundling ${entry}...`);
52
+ const bundleResult = await bundle(entry);
53
+ try {
54
+ const browser = await launchBrowser();
55
+ const page = await createPage(browser, 1920, 1080);
56
+ await page.goto(bundleResult.url, { waitUntil: "networkidle" });
57
+ // Wait briefly for React to register compositions
58
+ await page.waitForTimeout(2000);
59
+ // Extract composition data from the page
60
+ const compositions = await page.evaluate(() => {
61
+ const win = window;
62
+ if (typeof win.vibeo_getCompositions === "function") {
63
+ return win.vibeo_getCompositions();
64
+ }
65
+ return [];
66
+ });
67
+ await page.close();
68
+ await closeBrowser();
69
+ if (compositions.length === 0) {
70
+ console.log("\nNo compositions found.");
71
+ console.log("Make sure your entry file exports compositions via <Composition /> components.");
72
+ return;
73
+ }
74
+ // Print table
75
+ console.log("\nRegistered compositions:\n");
76
+ console.log(padRight("ID", 25) +
77
+ padRight("Width", 8) +
78
+ padRight("Height", 8) +
79
+ padRight("FPS", 6) +
80
+ padRight("Frames", 8) +
81
+ "Duration");
82
+ console.log("-".repeat(70));
83
+ for (const comp of compositions) {
84
+ const duration = (comp.durationInFrames / comp.fps).toFixed(1) + "s";
85
+ console.log(padRight(comp.id, 25) +
86
+ padRight(String(comp.width), 8) +
87
+ padRight(String(comp.height), 8) +
88
+ padRight(String(comp.fps), 6) +
89
+ padRight(String(comp.durationInFrames), 8) +
90
+ duration);
91
+ }
92
+ console.log();
93
+ }
94
+ finally {
95
+ await bundleResult.cleanup();
96
+ }
97
+ }
98
+ function padRight(str, len) {
99
+ return str.length >= len ? str : str + " ".repeat(len - str.length);
100
+ }
101
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM1E,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAa;QACvB,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWb,CAAC,CAAC;AACH,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEnD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAEhE,kDAAkD;QAClD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEhC,yCAAyC;QACzC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,MAEX,CAAC;YACF,IAAI,OAAO,GAAG,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;gBACpD,OAAO,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,YAAY,EAAE,CAAC;QAErB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CACT,gFAAgF,CACjF,CAAC;YACF,OAAO;QACT,CAAC;QAED,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACpB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrB,UAAU,CACb,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACrE,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;gBACnB,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC1C,QAAQ,CACX,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Start a dev server hosting the Player with hot reload.
3
+ */
4
+ export declare function previewCommand(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAqDA;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BlE"}
@@ -0,0 +1,74 @@
1
+ import { resolve } from "node:path";
2
+ import { bundle } from "@vibeo/renderer";
3
+ function parseArgs(args) {
4
+ const result = {
5
+ entry: "",
6
+ port: 3000,
7
+ };
8
+ for (let i = 0; i < args.length; i++) {
9
+ const arg = args[i];
10
+ const next = args[i + 1];
11
+ if (arg === "--entry" && next) {
12
+ result.entry = next;
13
+ i++;
14
+ }
15
+ else if (arg.startsWith("--entry=")) {
16
+ result.entry = arg.slice("--entry=".length);
17
+ }
18
+ else if (arg === "--port" && next) {
19
+ result.port = parseInt(next, 10);
20
+ i++;
21
+ }
22
+ else if (arg.startsWith("--port=")) {
23
+ result.port = parseInt(arg.slice("--port=".length), 10);
24
+ }
25
+ else if (arg === "--help" || arg === "-h") {
26
+ printHelp();
27
+ process.exit(0);
28
+ }
29
+ }
30
+ return result;
31
+ }
32
+ function printHelp() {
33
+ console.log(`
34
+ vibeo preview - Start a dev server with live preview
35
+
36
+ Usage:
37
+ vibeo preview --entry <path> [options]
38
+
39
+ Required:
40
+ --entry <path> Path to the root file with compositions
41
+
42
+ Options:
43
+ --port <number> Port for the dev server (default: 3000)
44
+ --help Show this help
45
+ `);
46
+ }
47
+ /**
48
+ * Start a dev server hosting the Player with hot reload.
49
+ */
50
+ export async function previewCommand(args) {
51
+ const parsed = parseArgs(args);
52
+ if (!parsed.entry) {
53
+ console.error("Error: --entry is required");
54
+ printHelp();
55
+ process.exit(1);
56
+ }
57
+ const entry = resolve(parsed.entry);
58
+ console.log(`Starting preview server...`);
59
+ console.log(` Entry: ${entry}`);
60
+ const bundleResult = await bundle(entry);
61
+ console.log(`\n Preview running at ${bundleResult.url}`);
62
+ console.log(` Press Ctrl+C to stop\n`);
63
+ // Keep the process alive until interrupted
64
+ const shutdown = async () => {
65
+ console.log("\nShutting down preview server...");
66
+ await bundleResult.cleanup();
67
+ process.exit(0);
68
+ };
69
+ process.on("SIGINT", shutdown);
70
+ process.on("SIGTERM", shutdown);
71
+ // Block forever
72
+ await new Promise(() => { });
73
+ }
74
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Execute the render command.
3
+ */
4
+ export declare function renderCommand(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAqIA;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEjE"}
@@ -0,0 +1,187 @@
1
+ import { resolve } from "node:path";
2
+ import { availableParallelism } from "node:os";
3
+ import { parseFrameRange } from "@vibeo/renderer";
4
+ import { renderComposition } from "@vibeo/renderer";
5
+ function parseArgs(args) {
6
+ const result = {
7
+ entry: "",
8
+ composition: "",
9
+ output: null,
10
+ fps: null,
11
+ frames: null,
12
+ codec: "h264",
13
+ concurrency: Math.max(1, Math.floor(availableParallelism() / 2)),
14
+ imageFormat: "png",
15
+ quality: 80,
16
+ };
17
+ for (let i = 0; i < args.length; i++) {
18
+ const arg = args[i];
19
+ const next = args[i + 1];
20
+ if (arg === "--entry" && next) {
21
+ result.entry = next;
22
+ i++;
23
+ }
24
+ else if (arg.startsWith("--entry=")) {
25
+ result.entry = arg.slice("--entry=".length);
26
+ }
27
+ else if (arg === "--composition" && next) {
28
+ result.composition = next;
29
+ i++;
30
+ }
31
+ else if (arg.startsWith("--composition=")) {
32
+ result.composition = arg.slice("--composition=".length);
33
+ }
34
+ else if (arg === "--output" && next) {
35
+ result.output = next;
36
+ i++;
37
+ }
38
+ else if (arg.startsWith("--output=")) {
39
+ result.output = arg.slice("--output=".length);
40
+ }
41
+ else if (arg === "--fps" && next) {
42
+ result.fps = parseInt(next, 10);
43
+ i++;
44
+ }
45
+ else if (arg.startsWith("--fps=")) {
46
+ result.fps = parseInt(arg.slice("--fps=".length), 10);
47
+ }
48
+ else if (arg === "--frames" && next) {
49
+ result.frames = next;
50
+ i++;
51
+ }
52
+ else if (arg.startsWith("--frames=")) {
53
+ result.frames = arg.slice("--frames=".length);
54
+ }
55
+ else if (arg === "--codec" && next) {
56
+ result.codec = next;
57
+ i++;
58
+ }
59
+ else if (arg.startsWith("--codec=")) {
60
+ result.codec = arg.slice("--codec=".length);
61
+ }
62
+ else if (arg === "--concurrency" && next) {
63
+ result.concurrency = parseInt(next, 10);
64
+ i++;
65
+ }
66
+ else if (arg.startsWith("--concurrency=")) {
67
+ result.concurrency = parseInt(arg.slice("--concurrency=".length), 10);
68
+ }
69
+ else if (arg === "--image-format" && next) {
70
+ result.imageFormat = next;
71
+ i++;
72
+ }
73
+ else if (arg.startsWith("--image-format=")) {
74
+ result.imageFormat = arg.slice("--image-format=".length);
75
+ }
76
+ else if (arg === "--quality" && next) {
77
+ result.quality = parseInt(next, 10);
78
+ i++;
79
+ }
80
+ else if (arg.startsWith("--quality=")) {
81
+ result.quality = parseInt(arg.slice("--quality=".length), 10);
82
+ }
83
+ else if (arg === "--help" || arg === "-h") {
84
+ printHelp();
85
+ process.exit(0);
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ function printHelp() {
91
+ console.log(`
92
+ vibeo render - Render a composition to video
93
+
94
+ Usage:
95
+ vibeo render --entry <path> --composition <id> [options]
96
+
97
+ Required:
98
+ --entry <path> Path to the root file with compositions
99
+ --composition <id> Composition ID to render
100
+
101
+ Options:
102
+ --output <path> Output file path (default: out/<compositionId>.mp4)
103
+ --fps <number> Override fps
104
+ --frames <range> Frame range "start-end" (e.g., "0-100")
105
+ --codec <codec> h264 | h265 | vp9 | prores (default: h264)
106
+ --concurrency <number> Parallel browser tabs (default: cpu count / 2)
107
+ --image-format <format> png | jpeg (default: png)
108
+ --quality <number> 0-100 for jpeg quality / crf (default: 80)
109
+ --help Show this help
110
+ `);
111
+ }
112
+ function formatTime(ms) {
113
+ const seconds = Math.floor(ms / 1000);
114
+ const minutes = Math.floor(seconds / 60);
115
+ const s = seconds % 60;
116
+ return `${minutes}:${String(s).padStart(2, "0")}`;
117
+ }
118
+ function renderProgressBar(progress) {
119
+ const { framesRendered, totalFrames, percent, etaMs } = progress;
120
+ const barWidth = 30;
121
+ const filled = Math.round(barWidth * percent);
122
+ const empty = barWidth - filled;
123
+ const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
124
+ const pct = (percent * 100).toFixed(1);
125
+ const eta = etaMs !== null ? ` ETA ${formatTime(etaMs)}` : "";
126
+ process.stdout.write(`\r [${bar}] ${pct}% (${framesRendered}/${totalFrames})${eta} `);
127
+ }
128
+ /**
129
+ * Execute the render command.
130
+ */
131
+ export async function renderCommand(args) {
132
+ const parsed = parseArgs(args);
133
+ if (!parsed.entry) {
134
+ console.error("Error: --entry is required");
135
+ printHelp();
136
+ process.exit(1);
137
+ }
138
+ if (!parsed.composition) {
139
+ console.error("Error: --composition is required");
140
+ printHelp();
141
+ process.exit(1);
142
+ }
143
+ const entry = resolve(parsed.entry);
144
+ const compositionId = parsed.composition;
145
+ // TODO: In a full implementation, we would bundle the entry, extract
146
+ // composition metadata, and use it here. For now we require the user
147
+ // to have the composition info available.
148
+ // This is a simplified flow that demonstrates the pipeline.
149
+ const ext = parsed.codec === "vp9" ? "webm" : parsed.codec === "prores" ? "mov" : "mp4";
150
+ const output = parsed.output
151
+ ? resolve(parsed.output)
152
+ : resolve(`out/${compositionId}.${ext}`);
153
+ console.log(`\nRendering composition "${compositionId}"`);
154
+ console.log(` Entry: ${entry}`);
155
+ console.log(` Output: ${output}`);
156
+ console.log(` Codec: ${parsed.codec}`);
157
+ console.log(` Image format: ${parsed.imageFormat}`);
158
+ console.log(` Concurrency: ${parsed.concurrency}`);
159
+ console.log();
160
+ // For a full render, we need composition info from the bundle.
161
+ // This would normally be extracted by bundling and evaluating the entry.
162
+ // Here we set up the render config and delegate to renderComposition.
163
+ const compositionInfo = {
164
+ width: 1920,
165
+ height: 1080,
166
+ fps: parsed.fps ?? 30,
167
+ durationInFrames: 300,
168
+ };
169
+ const frameRange = parseFrameRange(parsed.frames, compositionInfo.durationInFrames);
170
+ const startTime = Date.now();
171
+ await renderComposition({
172
+ entry,
173
+ compositionId,
174
+ outputPath: output,
175
+ codec: parsed.codec,
176
+ imageFormat: parsed.imageFormat,
177
+ quality: parsed.quality,
178
+ fps: parsed.fps,
179
+ frameRange,
180
+ concurrency: parsed.concurrency,
181
+ pixelFormat: "yuv420p",
182
+ onProgress: renderProgressBar,
183
+ }, compositionInfo);
184
+ const elapsed = Date.now() - startTime;
185
+ console.log(`\n\nDone in ${formatTime(elapsed)}. Output: ${output}`);
186
+ }
187
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}