@editframe/cli 0.31.2-beta.0 → 0.32.0-beta.1

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/VERSION.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/VERSION.ts
2
- const VERSION = "0.31.2-beta.0";
2
+ const VERSION = "0.32.0-beta.1";
3
3
 
4
4
  //#endregion
5
5
  export { VERSION };
@@ -1 +1 @@
1
- {"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"sourcesContent":["export const VERSION = \"0.31.2-beta.0\";\n"],"mappings":";AAAA,MAAa,UAAU"}
1
+ {"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"sourcesContent":["export const VERSION = \"0.32.0-beta.1\";\n"],"mappings":";AAAA,MAAa,UAAU"}
@@ -0,0 +1,80 @@
1
+ import { withSpinner } from "../utils/withSpinner.js";
2
+ import { launchBrowserAndWaitForSDK } from "../utils/launchBrowserAndWaitForSDK.js";
3
+ import { PreviewServer } from "../utils/startPreviewServer.js";
4
+ import { program } from "commander";
5
+ import debug from "debug";
6
+ import path from "node:path";
7
+ import { readFile } from "node:fs/promises";
8
+ import { createWriteStream } from "node:fs";
9
+
10
+ //#region src/commands/local-render.ts
11
+ const log = debug("ef:cli:local-render");
12
+ program.command("local-render [directory]").description("Render a directory's index.html file as a video locally using Playwright").option("-o, --output <path>", "Output file path", "output.mp4").option("-d, --data <json>", "Custom render data (JSON string)").option("--data-file <path>", "Custom render data from JSON file").option("--fps <number>", "Frame rate", "30").option("--scale <number>", "Resolution scale (0-1)", "1").option("--include-audio", "Include audio track", true).option("--no-include-audio", "Exclude audio track").option("--from-ms <number>", "Start time in milliseconds").option("--to-ms <number>", "End time in milliseconds").action(async (directory = ".", options) => {
13
+ const srcDir = path.resolve(process.cwd(), directory);
14
+ const outputPath = path.resolve(process.cwd(), options.output);
15
+ let renderData;
16
+ if (options.dataFile) {
17
+ const dataFileContent = await readFile(options.dataFile, "utf-8");
18
+ renderData = JSON.parse(dataFileContent);
19
+ log("Loaded render data from file:", options.dataFile);
20
+ } else if (options.data) {
21
+ renderData = JSON.parse(options.data);
22
+ log("Using render data from --data option");
23
+ }
24
+ const fps = parseInt(options.fps, 10);
25
+ const scale = parseFloat(options.scale);
26
+ const fromMs = options.fromMs ? parseInt(options.fromMs, 10) : void 0;
27
+ const toMs = options.toMs ? parseInt(options.toMs, 10) : void 0;
28
+ const previewServer = await PreviewServer.start(srcDir);
29
+ log("Preview server started at:", previewServer.url);
30
+ await launchBrowserAndWaitForSDK({
31
+ url: previewServer.url,
32
+ headless: true,
33
+ interactive: false,
34
+ efInteractive: false
35
+ }, async (page) => {
36
+ const outputStream = createWriteStream(outputPath);
37
+ let chunkCount = 0;
38
+ let totalBytes = 0;
39
+ await page.exposeFunction("onRenderChunk", (chunkArray) => {
40
+ const chunk = Buffer.from(chunkArray);
41
+ outputStream.write(chunk);
42
+ chunkCount++;
43
+ totalBytes += chunk.length;
44
+ log(`Received chunk ${chunkCount}: ${chunk.length} bytes (total: ${totalBytes} bytes)`);
45
+ });
46
+ if (renderData) {
47
+ await page.evaluate((data) => {
48
+ window.EF_RENDER_DATA = data;
49
+ }, renderData);
50
+ log("Set EF_RENDER_DATA:", renderData);
51
+ }
52
+ await page.waitForFunction(() => typeof window.EF_RENDER !== "undefined", { timeout: 1e4 });
53
+ if (!await page.evaluate(() => window.EF_RENDER?.isReady())) throw new Error("Render API is not ready. No ef-timegroup found.");
54
+ await withSpinner("Rendering video...", async () => {
55
+ const renderOptions = {
56
+ fps,
57
+ scale,
58
+ includeAudio: options.includeAudio !== false
59
+ };
60
+ if (fromMs !== void 0) renderOptions.fromMs = fromMs;
61
+ if (toMs !== void 0) renderOptions.toMs = toMs;
62
+ await page.evaluate(async (opts) => {
63
+ await window.EF_RENDER.renderStreaming(opts);
64
+ }, renderOptions);
65
+ });
66
+ outputStream.end();
67
+ await new Promise((resolve, reject) => {
68
+ outputStream.on("finish", () => {
69
+ log(`Render complete: ${chunkCount} chunks, ${totalBytes} bytes written to ${outputPath}`);
70
+ resolve();
71
+ });
72
+ outputStream.on("error", reject);
73
+ });
74
+ });
75
+ process.stderr.write(`\nRender complete: ${outputPath}\n`);
76
+ });
77
+
78
+ //#endregion
79
+ export { };
80
+ //# sourceMappingURL=local-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-render.js","names":["renderData: Record<string, unknown> | undefined","renderOptions: any"],"sources":["../../src/commands/local-render.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport path from \"node:path\";\nimport { program } from \"commander\";\nimport debug from \"debug\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { PreviewServer } from \"../utils/startPreviewServer.js\";\nimport { withSpinner } from \"../utils/withSpinner.js\";\n\nconst log = debug(\"ef:cli:local-render\");\n\nprogram\n .command(\"local-render [directory]\")\n .description(\"Render a directory's index.html file as a video locally using Playwright\")\n .option(\"-o, --output <path>\", \"Output file path\", \"output.mp4\")\n .option(\"-d, --data <json>\", \"Custom render data (JSON string)\")\n .option(\"--data-file <path>\", \"Custom render data from JSON file\")\n .option(\"--fps <number>\", \"Frame rate\", \"30\")\n .option(\"--scale <number>\", \"Resolution scale (0-1)\", \"1\")\n .option(\"--include-audio\", \"Include audio track\", true)\n .option(\"--no-include-audio\", \"Exclude audio track\")\n .option(\"--from-ms <number>\", \"Start time in milliseconds\")\n .option(\"--to-ms <number>\", \"End time in milliseconds\")\n .action(async (directory = \".\", options) => {\n const srcDir = path.resolve(process.cwd(), directory);\n const outputPath = path.resolve(process.cwd(), options.output);\n\n // Parse custom data if provided\n let renderData: Record<string, unknown> | undefined;\n if (options.dataFile) {\n const dataFileContent = await readFile(options.dataFile, \"utf-8\");\n renderData = JSON.parse(dataFileContent);\n log(\"Loaded render data from file:\", options.dataFile);\n } else if (options.data) {\n renderData = JSON.parse(options.data);\n log(\"Using render data from --data option\");\n }\n\n // Parse numeric options\n const fps = parseInt(options.fps, 10);\n const scale = parseFloat(options.scale);\n const fromMs = options.fromMs ? parseInt(options.fromMs, 10) : undefined;\n const toMs = options.toMs ? parseInt(options.toMs, 10) : undefined;\n\n // Start preview server\n const previewServer = await PreviewServer.start(srcDir);\n log(\"Preview server started at:\", previewServer.url);\n\n // Launch browser and render\n await launchBrowserAndWaitForSDK(\n {\n url: previewServer.url,\n headless: true,\n interactive: false,\n efInteractive: false,\n },\n async (page) => {\n // Open output file for streaming writes\n const outputStream = createWriteStream(outputPath);\n let chunkCount = 0;\n let totalBytes = 0;\n\n // Expose chunk handler - writes directly to file\n await page.exposeFunction(\"onRenderChunk\", (chunkArray: number[]) => {\n const chunk = Buffer.from(chunkArray);\n outputStream.write(chunk);\n chunkCount++;\n totalBytes += chunk.length;\n log(`Received chunk ${chunkCount}: ${chunk.length} bytes (total: ${totalBytes} bytes)`);\n });\n\n // Set custom render data if provided\n if (renderData) {\n await page.evaluate((data) => {\n window.EF_RENDER_DATA = data;\n }, renderData);\n log(\"Set EF_RENDER_DATA:\", renderData);\n }\n\n // Wait for EF_RENDER API to be available\n await page.waitForFunction(\n () => typeof window.EF_RENDER !== \"undefined\",\n { timeout: 10_000 },\n );\n\n // Check if ready\n const isReady = await page.evaluate(() => window.EF_RENDER?.isReady());\n if (!isReady) {\n throw new Error(\"Render API is not ready. No ef-timegroup found.\");\n }\n\n // Render with streaming\n await withSpinner(\"Rendering video...\", async () => {\n const renderOptions: any = {\n fps,\n scale,\n includeAudio: options.includeAudio !== false,\n };\n\n if (fromMs !== undefined) {\n renderOptions.fromMs = fromMs;\n }\n if (toMs !== undefined) {\n renderOptions.toMs = toMs;\n }\n\n await page.evaluate(async (opts) => {\n await window.EF_RENDER!.renderStreaming(opts);\n }, renderOptions);\n });\n\n // Close the output stream\n outputStream.end();\n\n // Wait for stream to finish\n await new Promise<void>((resolve, reject) => {\n outputStream.on(\"finish\", () => {\n log(`Render complete: ${chunkCount} chunks, ${totalBytes} bytes written to ${outputPath}`);\n resolve();\n });\n outputStream.on(\"error\", reject);\n });\n },\n );\n\n process.stderr.write(`\\nRender complete: ${outputPath}\\n`);\n });\n"],"mappings":";;;;;;;;;;AASA,MAAM,MAAM,MAAM,sBAAsB;AAExC,QACG,QAAQ,2BAA2B,CACnC,YAAY,2EAA2E,CACvF,OAAO,uBAAuB,oBAAoB,aAAa,CAC/D,OAAO,qBAAqB,mCAAmC,CAC/D,OAAO,sBAAsB,oCAAoC,CACjE,OAAO,kBAAkB,cAAc,KAAK,CAC5C,OAAO,oBAAoB,0BAA0B,IAAI,CACzD,OAAO,mBAAmB,uBAAuB,KAAK,CACtD,OAAO,sBAAsB,sBAAsB,CACnD,OAAO,sBAAsB,6BAA6B,CAC1D,OAAO,oBAAoB,2BAA2B,CACtD,OAAO,OAAO,YAAY,KAAK,YAAY;CAC1C,MAAM,SAAS,KAAK,QAAQ,QAAQ,KAAK,EAAE,UAAU;CACrD,MAAM,aAAa,KAAK,QAAQ,QAAQ,KAAK,EAAE,QAAQ,OAAO;CAG9D,IAAIA;AACJ,KAAI,QAAQ,UAAU;EACpB,MAAM,kBAAkB,MAAM,SAAS,QAAQ,UAAU,QAAQ;AACjE,eAAa,KAAK,MAAM,gBAAgB;AACxC,MAAI,iCAAiC,QAAQ,SAAS;YAC7C,QAAQ,MAAM;AACvB,eAAa,KAAK,MAAM,QAAQ,KAAK;AACrC,MAAI,uCAAuC;;CAI7C,MAAM,MAAM,SAAS,QAAQ,KAAK,GAAG;CACrC,MAAM,QAAQ,WAAW,QAAQ,MAAM;CACvC,MAAM,SAAS,QAAQ,SAAS,SAAS,QAAQ,QAAQ,GAAG,GAAG;CAC/D,MAAM,OAAO,QAAQ,OAAO,SAAS,QAAQ,MAAM,GAAG,GAAG;CAGzD,MAAM,gBAAgB,MAAM,cAAc,MAAM,OAAO;AACvD,KAAI,8BAA8B,cAAc,IAAI;AAGpD,OAAM,2BACJ;EACE,KAAK,cAAc;EACnB,UAAU;EACV,aAAa;EACb,eAAe;EAChB,EACD,OAAO,SAAS;EAEd,MAAM,eAAe,kBAAkB,WAAW;EAClD,IAAI,aAAa;EACjB,IAAI,aAAa;AAGjB,QAAM,KAAK,eAAe,kBAAkB,eAAyB;GACnE,MAAM,QAAQ,OAAO,KAAK,WAAW;AACrC,gBAAa,MAAM,MAAM;AACzB;AACA,iBAAc,MAAM;AACpB,OAAI,kBAAkB,WAAW,IAAI,MAAM,OAAO,iBAAiB,WAAW,SAAS;IACvF;AAGF,MAAI,YAAY;AACd,SAAM,KAAK,UAAU,SAAS;AAC5B,WAAO,iBAAiB;MACvB,WAAW;AACd,OAAI,uBAAuB,WAAW;;AAIxC,QAAM,KAAK,sBACH,OAAO,OAAO,cAAc,aAClC,EAAE,SAAS,KAAQ,CACpB;AAID,MAAI,CADY,MAAM,KAAK,eAAe,OAAO,WAAW,SAAS,CAAC,CAEpE,OAAM,IAAI,MAAM,kDAAkD;AAIpE,QAAM,YAAY,sBAAsB,YAAY;GAClD,MAAMC,gBAAqB;IACzB;IACA;IACA,cAAc,QAAQ,iBAAiB;IACxC;AAED,OAAI,WAAW,OACb,eAAc,SAAS;AAEzB,OAAI,SAAS,OACX,eAAc,OAAO;AAGvB,SAAM,KAAK,SAAS,OAAO,SAAS;AAClC,UAAM,OAAO,UAAW,gBAAgB,KAAK;MAC5C,cAAc;IACjB;AAGF,eAAa,KAAK;AAGlB,QAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,gBAAa,GAAG,gBAAgB;AAC9B,QAAI,oBAAoB,WAAW,WAAW,WAAW,oBAAoB,aAAa;AAC1F,aAAS;KACT;AACF,gBAAa,GAAG,SAAS,OAAO;IAChC;GAEL;AAED,SAAQ,OAAO,MAAM,sBAAsB,WAAW,IAAI;EAC1D"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { VERSION } from "./VERSION.js";
3
3
  import "./commands/auth.js";
4
4
  import "./commands/sync.js";
5
5
  import "./commands/render.js";
6
+ import "./commands/local-render.js";
6
7
  import "./commands/preview.js";
7
8
  import "./commands/process.js";
8
9
  import "./commands/process-file.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Option, program } from \"commander\";\n\nimport { VERSION } from \"./VERSION.js\";\n\nprogram\n .name(\"editframe\")\n .addOption(new Option(\"-t, --token <token>\", \"API Token\").env(\"EF_TOKEN\"))\n .addOption(\n new Option(\"--ef-host <host>\", \"Editframe Host\")\n .env(\"EF_HOST\")\n .default(\"https://editframe.com\"),\n )\n .addOption(\n new Option(\"--ef-render-host <host>\", \"Editframe Render Host\")\n .env(\"EF_RENDER_HOST\")\n .default(\"https://editframe.com\"),\n )\n .version(VERSION);\n\nimport \"./commands/auth.js\";\nimport \"./commands/sync.js\";\nimport \"./commands/render.js\";\nimport \"./commands/preview.js\";\nimport \"./commands/process.js\";\nimport \"./commands/process-file.js\";\nimport \"./commands/check.js\";\nimport \"./commands/webhook.js\";\n\nprogram.parse(process.argv);\n"],"mappings":";;;;;;;;;;;;;;AAMA,QACG,KAAK,YAAY,CACjB,UAAU,IAAI,OAAO,uBAAuB,YAAY,CAAC,IAAI,WAAW,CAAC,CACzE,UACC,IAAI,OAAO,oBAAoB,iBAAiB,CAC7C,IAAI,UAAU,CACd,QAAQ,wBAAwB,CACpC,CACA,UACC,IAAI,OAAO,2BAA2B,wBAAwB,CAC3D,IAAI,iBAAiB,CACrB,QAAQ,wBAAwB,CACpC,CACA,QAAQ,QAAQ;AAWnB,QAAQ,MAAM,QAAQ,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Option, program } from \"commander\";\n\nimport { VERSION } from \"./VERSION.js\";\n\nprogram\n .name(\"editframe\")\n .addOption(new Option(\"-t, --token <token>\", \"API Token\").env(\"EF_TOKEN\"))\n .addOption(\n new Option(\"--ef-host <host>\", \"Editframe Host\")\n .env(\"EF_HOST\")\n .default(\"https://editframe.com\"),\n )\n .addOption(\n new Option(\"--ef-render-host <host>\", \"Editframe Render Host\")\n .env(\"EF_RENDER_HOST\")\n .default(\"https://editframe.com\"),\n )\n .version(VERSION);\n\nimport \"./commands/auth.js\";\nimport \"./commands/sync.js\";\nimport \"./commands/render.js\";\nimport \"./commands/local-render.js\";\nimport \"./commands/preview.js\";\nimport \"./commands/process.js\";\nimport \"./commands/process-file.js\";\nimport \"./commands/check.js\";\nimport \"./commands/webhook.js\";\n\nprogram.parse(process.argv);\n"],"mappings":";;;;;;;;;;;;;;;AAMA,QACG,KAAK,YAAY,CACjB,UAAU,IAAI,OAAO,uBAAuB,YAAY,CAAC,IAAI,WAAW,CAAC,CACzE,UACC,IAAI,OAAO,oBAAoB,iBAAiB,CAC7C,IAAI,UAAU,CACd,QAAQ,wBAAwB,CACpC,CACA,UACC,IAAI,OAAO,2BAA2B,wBAAwB,CAC3D,IAAI,iBAAiB,CACrB,QAAQ,wBAAwB,CACpC,CACA,QAAQ,QAAQ;AAYnB,QAAQ,MAAM,QAAQ,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@editframe/cli",
3
- "version": "0.31.2-beta.0",
3
+ "version": "0.32.0-beta.1",
4
4
  "description": "Command line interface for EditFrame",
5
5
  "bin": {
6
6
  "editframe": "./dist/index.js"
@@ -21,10 +21,10 @@
21
21
  "typescript": "^5.5.4"
22
22
  },
23
23
  "dependencies": {
24
- "@editframe/api": "0.31.2-beta.0",
25
- "@editframe/assets": "0.31.2-beta.0",
26
- "@editframe/elements": "0.31.2-beta.0",
27
- "@editframe/vite-plugin": "0.31.2-beta.0",
24
+ "@editframe/api": "0.32.0-beta.1",
25
+ "@editframe/assets": "0.32.0-beta.1",
26
+ "@editframe/elements": "0.32.0-beta.1",
27
+ "@editframe/vite-plugin": "0.32.0-beta.1",
28
28
  "@inquirer/prompts": "^5.3.8",
29
29
  "chalk": "^5.3.0",
30
30
  "commander": "^12.0.0",