@editframe/cli 0.47.1 → 0.48.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.
Files changed (66) hide show
  1. package/LICENSE-FULL.md +148 -0
  2. package/LICENSE.md +58 -0
  3. package/dist/VERSION.js +2 -2
  4. package/dist/VERSION.js.map +1 -1
  5. package/dist/commands/auth.js +2 -3
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/check.js +5 -6
  8. package/dist/commands/check.js.map +1 -1
  9. package/dist/commands/cloud-render.js +4 -5
  10. package/dist/commands/cloud-render.js.map +1 -1
  11. package/dist/commands/preview.js +2 -3
  12. package/dist/commands/preview.js.map +1 -1
  13. package/dist/commands/process-file.js +2 -3
  14. package/dist/commands/process-file.js.map +1 -1
  15. package/dist/commands/process.js +2 -3
  16. package/dist/commands/process.js.map +1 -1
  17. package/dist/commands/render.js +4 -5
  18. package/dist/commands/render.js.map +1 -1
  19. package/dist/commands/sync.js +2 -3
  20. package/dist/commands/sync.js.map +1 -1
  21. package/dist/commands/transcribe.js +2 -3
  22. package/dist/commands/transcribe.js.map +1 -1
  23. package/dist/commands/webhook.js +5 -6
  24. package/dist/commands/webhook.js.map +1 -1
  25. package/dist/index.d.ts +1 -3
  26. package/dist/index.js +2 -3
  27. package/dist/index.js.map +1 -1
  28. package/dist/operations/processRenderInfo.js +1 -2
  29. package/dist/operations/processRenderInfo.js.map +1 -1
  30. package/dist/operations/syncAssetsDirectory/SubAssetSync.js +1 -2
  31. package/dist/operations/syncAssetsDirectory/SubAssetSync.js.map +1 -1
  32. package/dist/operations/syncAssetsDirectory/SyncCaption.js +3 -4
  33. package/dist/operations/syncAssetsDirectory/SyncCaption.js.map +1 -1
  34. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js +3 -4
  35. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js.map +1 -1
  36. package/dist/operations/syncAssetsDirectory/SyncImage.js +3 -4
  37. package/dist/operations/syncAssetsDirectory/SyncImage.js.map +1 -1
  38. package/dist/operations/syncAssetsDirectory/SyncStatus.js +1 -2
  39. package/dist/operations/syncAssetsDirectory/SyncStatus.js.map +1 -1
  40. package/dist/operations/syncAssetsDirectory/SyncTrack.js +3 -4
  41. package/dist/operations/syncAssetsDirectory/SyncTrack.js.map +1 -1
  42. package/dist/operations/syncAssetsDirectory/doAssetSync.js +1 -1
  43. package/dist/operations/syncAssetsDirectory/doAssetSync.js.map +1 -1
  44. package/dist/operations/syncAssetsDirectory.js +4 -5
  45. package/dist/operations/syncAssetsDirectory.js.map +1 -1
  46. package/dist/utils/createReadableStreamFromReadable.js +1 -2
  47. package/dist/utils/createReadableStreamFromReadable.js.map +1 -1
  48. package/dist/utils/detectChrome.js +1 -2
  49. package/dist/utils/detectChrome.js.map +1 -1
  50. package/dist/utils/index.js +1 -2
  51. package/dist/utils/index.js.map +1 -1
  52. package/dist/utils/launchBrowserAndWaitForSDK.js +1 -2
  53. package/dist/utils/launchBrowserAndWaitForSDK.js.map +1 -1
  54. package/dist/utils/patchFragmentedMp4.js +1 -2
  55. package/dist/utils/patchFragmentedMp4.js.map +1 -1
  56. package/dist/utils/profileRender.js +1 -2
  57. package/dist/utils/profileRender.js.map +1 -1
  58. package/dist/utils/spawnViteServer.js +1 -2
  59. package/dist/utils/spawnViteServer.js.map +1 -1
  60. package/dist/utils/startPreviewServer.js +1 -2
  61. package/dist/utils/startPreviewServer.js.map +1 -1
  62. package/dist/utils/validateVideoResolution.js +1 -2
  63. package/dist/utils/validateVideoResolution.js.map +1 -1
  64. package/dist/utils/withSpinner.js +1 -2
  65. package/dist/utils/withSpinner.js.map +1 -1
  66. package/package.json +7 -9
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","names":["topic","error: any"],"sources":["../../src/commands/webhook.ts"],"sourcesContent":["import { input, select } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { Option, program } from \"commander\";\nimport debug from \"debug\";\nimport ora from \"ora\";\n\nimport { getClient } from \"../utils/index.js\";\n\nconst log = debug(\"ef:cli:auth\");\n\nexport interface APITestWebhhokResult {\n message: string;\n}\nconst topics = [\n \"render.created\",\n \"render.rendering\",\n \"render.pending\",\n \"render.failed\",\n \"render.completed\",\n];\n\nexport const testWebhookURL = async ({\n webhookURL,\n topic,\n}: {\n webhookURL: string;\n topic: string;\n}) => {\n const response = await getClient().authenticatedFetch(\"/api/v1/test_webhook\", {\n method: \"POST\",\n body: JSON.stringify({\n webhookURL,\n topic,\n }),\n });\n return response.json() as Promise<APITestWebhhokResult>;\n};\n\nconst webhookCommand = program\n .command(\"webhook\")\n .description(\"Test webhook URL with a topic\")\n .option(\"-u, --webhookURL <webhookURL>\", \"Webhook URL\")\n .addOption(new Option(\"-t, --topic <topic>\", \"Topic\").choices(topics))\n .action(async () => {\n const options = webhookCommand.opts();\n log(\"Options:\", options);\n let { webhookURL, topic } = options;\n\n if (!webhookURL) {\n const answer = await input({ message: \"Enter a webhook URL:\" });\n webhookURL = answer;\n }\n\n if (!topic) {\n const answer = await select({\n message: \"Select a topic:\",\n choices: topics.map((topic) => ({ title: topic, value: topic })),\n });\n topic = answer;\n }\n\n const spinner = ora(\"Testing...\").start();\n try {\n const apiData = await testWebhookURL({ webhookURL, topic });\n spinner.succeed(\"Webhook URL is working! 🎉\");\n process.stderr.write(chalk.green(`${apiData.message}\\n`));\n } catch (error: any) {\n spinner.fail(\"Webhook URL is not working!\");\n process.stderr.write(error?.message);\n process.stderr.write(\"\\n\");\n log(\"Error:\", error);\n }\n });\n"],"mappings":";;;;;;;;AAQA,MAAM,MAAM,MAAM,cAAc;AAKhC,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAAO,EACnC,YACA,YAII;AAQJ,SAPiB,MAAM,WAAW,CAAC,mBAAmB,wBAAwB;EAC5E,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB;GACA;GACD,CAAC;EACH,CAAC,EACc,MAAM;;AAGxB,MAAM,iBAAiB,QACpB,QAAQ,UAAU,CAClB,YAAY,gCAAgC,CAC5C,OAAO,iCAAiC,cAAc,CACtD,UAAU,IAAI,OAAO,uBAAuB,QAAQ,CAAC,QAAQ,OAAO,CAAC,CACrE,OAAO,YAAY;CAClB,MAAM,UAAU,eAAe,MAAM;AACrC,KAAI,YAAY,QAAQ;CACxB,IAAI,EAAE,YAAY,UAAU;AAE5B,KAAI,CAAC,WAEH,cADe,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAAC;AAIjE,KAAI,CAAC,MAKH,SAJe,MAAM,OAAO;EAC1B,SAAS;EACT,SAAS,OAAO,KAAK,aAAW;GAAE,OAAOA;GAAO,OAAOA;GAAO,EAAE;EACjE,CAAC;CAIJ,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AACzC,KAAI;EACF,MAAM,UAAU,MAAM,eAAe;GAAE;GAAY;GAAO,CAAC;AAC3D,UAAQ,QAAQ,6BAA6B;AAC7C,UAAQ,OAAO,MAAM,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC;UAClDC,OAAY;AACnB,UAAQ,KAAK,8BAA8B;AAC3C,UAAQ,OAAO,MAAM,OAAO,QAAQ;AACpC,UAAQ,OAAO,MAAM,KAAK;AAC1B,MAAI,UAAU,MAAM;;EAEtB"}
1
+ {"version":3,"file":"webhook.js","names":[],"sources":["../../src/commands/webhook.ts"],"mappings":";;;;;;;AAQA,MAAM,MAAM,MAAM,cAAc;AAKhC,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAAO,EACnC,YACA,YAII;AAQJ,SAPiB,MAAM,WAAW,CAAC,mBAAmB,wBAAwB;EAC5E,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB;GACA;GACD,CAAC;EACH,CAAC,EACc,MAAM;;AAGxB,MAAM,iBAAiB,QACpB,QAAQ,UAAU,CAClB,YAAY,gCAAgC,CAC5C,OAAO,iCAAiC,cAAc,CACtD,UAAU,IAAI,OAAO,uBAAuB,QAAQ,CAAC,QAAQ,OAAO,CAAC,CACrE,OAAO,YAAY;CAClB,MAAM,UAAU,eAAe,MAAM;AACrC,KAAI,YAAY,QAAQ;CACxB,IAAI,EAAE,YAAY,UAAU;AAE5B,KAAI,CAAC,WAEH,cADe,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAAC;AAIjE,KAAI,CAAC,MAKH,SAJe,MAAM,OAAO;EAC1B,SAAS;EACT,SAAS,OAAO,KAAK,WAAW;GAAE,OAAO;GAAO,OAAO;GAAO,EAAE;EACjE,CAAC;CAIJ,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AACzC,KAAI;EACF,MAAM,UAAU,MAAM,eAAe;GAAE;GAAY;GAAO,CAAC;AAC3D,UAAQ,QAAQ,6BAA6B;AAC7C,UAAQ,OAAO,MAAM,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC;UAClD,OAAY;AACnB,UAAQ,KAAK,8BAA8B;AAC3C,UAAQ,OAAO,MAAM,OAAO,QAAQ;AACpC,UAAQ,OAAO,MAAM,KAAK;AAC1B,MAAI,UAAU,MAAM;;EAEtB"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1 @@
1
- #!/usr/bin/env node
2
- import "./commands/render.js";
3
- import "dotenv/config";
1
+ export { };
package/dist/index.js CHANGED
@@ -12,11 +12,10 @@ import "./commands/webhook.js";
12
12
  import "./commands/transcribe.js";
13
13
  import "dotenv/config";
14
14
  import { Option, program } from "commander";
15
-
16
15
  //#region src/index.ts
17
16
  program.name("editframe").addOption(new Option("-t, --token <token>", "API Token").env("EF_TOKEN")).addOption(new Option("--ef-host <host>", "Editframe Host").env("EF_HOST").default("https://editframe.com")).addOption(new Option("--ef-render-host <host>", "Editframe Render Host").env("EF_RENDER_HOST").default("https://editframe.com")).version(VERSION);
18
17
  program.parse(process.argv);
19
-
20
18
  //#endregion
21
- export { };
19
+ export {};
20
+
22
21
  //# sourceMappingURL=index.js.map
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/cloud-render.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\";\nimport \"./commands/transcribe.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;AAanB,QAAQ,MAAM,QAAQ,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"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;AAanB,QAAQ,MAAM,QAAQ,KAAK"}
@@ -1,5 +1,4 @@
1
1
  import { cacheImage, findOrCreateCaptions, generateTrack } from "@editframe/assets";
2
-
3
2
  //#region src/operations/processRenderInfo.ts
4
3
  const processRenderInfo = async (renderInfo) => {
5
4
  for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {
@@ -26,7 +25,7 @@ const processRenderInfo = async (renderInfo) => {
26
25
  await findOrCreateCaptions("./src/assets", `./src${captionsAsset}`);
27
26
  }
28
27
  };
29
-
30
28
  //#endregion
31
29
  export { processRenderInfo };
30
+
32
31
  //# sourceMappingURL=processRenderInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processRenderInfo.js","names":[],"sources":["../../src/operations/processRenderInfo.ts"],"sourcesContent":["import { cacheImage, findOrCreateCaptions, generateTrack } from \"@editframe/assets\";\nimport type { getRenderInfo } from \"@editframe/elements/node\";\n\nexport const processRenderInfo = async (renderInfo: Awaited<ReturnType<typeof getRenderInfo>>) => {\n for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {\n process.stderr.write(\"Processing media asset: \");\n process.stderr.write(src);\n process.stderr.write(\"\\n\");\n for (const trackId in tracks) {\n process.stderr.write(\"Generating track: \");\n process.stderr.write(trackId);\n process.stderr.write(\"\\n\");\n await generateTrack(\"./src/assets\", `./src${src}`, `src?trackId=${trackId}`);\n }\n }\n\n for (const imageAsset of renderInfo.assets.efImage) {\n process.stderr.write(\"Processing image asset: \");\n process.stderr.write(imageAsset);\n process.stderr.write(\"\\n\");\n await cacheImage(\"./src/assets\", `./src${imageAsset}`);\n }\n\n for (const captionsAsset of renderInfo.assets.efCaptions) {\n process.stderr.write(\"Processing captions asset: \");\n process.stderr.write(captionsAsset);\n process.stderr.write(\"\\n\");\n await findOrCreateCaptions(\"./src/assets\", `./src${captionsAsset}`);\n }\n};\n"],"mappings":";;;AAGA,MAAa,oBAAoB,OAAO,eAA0D;AAChG,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,WAAW,OAAO,QAAQ,EAAE;AACrE,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,KAAK;AAC1B,OAAK,MAAM,WAAW,QAAQ;AAC5B,WAAQ,OAAO,MAAM,qBAAqB;AAC1C,WAAQ,OAAO,MAAM,QAAQ;AAC7B,WAAQ,OAAO,MAAM,KAAK;AAC1B,SAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,UAAU;;;AAIhF,MAAK,MAAM,cAAc,WAAW,OAAO,SAAS;AAClD,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,WAAW;AAChC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,WAAW,gBAAgB,QAAQ,aAAa;;AAGxD,MAAK,MAAM,iBAAiB,WAAW,OAAO,YAAY;AACxD,UAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAQ,OAAO,MAAM,cAAc;AACnC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,qBAAqB,gBAAgB,QAAQ,gBAAgB"}
1
+ {"version":3,"file":"processRenderInfo.js","names":[],"sources":["../../src/operations/processRenderInfo.ts"],"mappings":";;AAGA,MAAa,oBAAoB,OAAO,eAA0D;AAChG,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,WAAW,OAAO,QAAQ,EAAE;AACrE,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,KAAK;AAC1B,OAAK,MAAM,WAAW,QAAQ;AAC5B,WAAQ,OAAO,MAAM,qBAAqB;AAC1C,WAAQ,OAAO,MAAM,QAAQ;AAC7B,WAAQ,OAAO,MAAM,KAAK;AAC1B,SAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,UAAU;;;AAIhF,MAAK,MAAM,cAAc,WAAW,OAAO,SAAS;AAClD,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,WAAW;AAChC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,WAAW,gBAAgB,QAAQ,aAAa;;AAGxD,MAAK,MAAM,iBAAiB,WAAW,OAAO,YAAY;AACxD,UAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAQ,OAAO,MAAM,cAAc;AACnC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,qBAAqB,gBAAgB,QAAQ,gBAAgB"}
@@ -3,7 +3,6 @@ import { SyncFragmentIndex } from "./SyncFragmentIndex.js";
3
3
  import { SyncImage } from "./SyncImage.js";
4
4
  import { SyncTrack } from "./SyncTrack.js";
5
5
  import debug from "debug";
6
-
7
6
  //#region src/operations/syncAssetsDirectory/SubAssetSync.ts
8
7
  const trackMatch = /\.track-[\d]+.mp4$/i;
9
8
  const fragmentIndexMatch = /\.tracks.json$/i;
@@ -21,7 +20,7 @@ const getAssetSync = (subAssetPath, md5) => {
21
20
  if (captionsMatch.test(subAssetPath)) return new SyncCaption(subAssetPath, md5);
22
21
  throw new Error(`Unrecognized sub-asset type: ${subAssetPath}`);
23
22
  };
24
-
25
23
  //#endregion
26
24
  export { getAssetSync };
25
+
27
26
  //# sourceMappingURL=SubAssetSync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SubAssetSync.ts"],"sourcesContent":["import debug from \"debug\";\nimport { SyncCaption } from \"./SyncCaption.js\";\nimport { SyncFragmentIndex } from \"./SyncFragmentIndex.js\";\nimport { SyncImage } from \"./SyncImage.js\";\nimport type { SyncStatus } from \"./SyncStatus.js\";\nimport { SyncTrack } from \"./SyncTrack.js\";\n\nexport interface SubAssetSync<CreationType> {\n icon: string;\n label: string;\n path: string;\n md5: string;\n prepare: () => Promise<void>;\n validate: () => Promise<void>;\n create: () => Promise<void>;\n upload: () => Promise<void>;\n syncStatus: SyncStatus;\n isComplete: () => boolean;\n markSynced: () => Promise<void>;\n created: CreationType | null;\n}\n\nconst trackMatch = /\\.track-[\\d]+.mp4$/i;\nconst fragmentIndexMatch = /\\.tracks.json$/i;\nconst captionsMatch = /\\.captions.json$/i;\nconst imageMatch = /\\.(png|jpe?g|gif|webp)$/i;\n\nconst log = debug(\"ef:SubAssetSync\");\n\nexport const getAssetSync = (subAssetPath: string, md5: string) => {\n log(\"getAssetSync\", { subAssetPath, md5 });\n if (imageMatch.test(subAssetPath)) {\n return new SyncImage(subAssetPath, md5);\n }\n if (trackMatch.test(subAssetPath)) {\n return new SyncTrack(subAssetPath, md5);\n }\n if (fragmentIndexMatch.test(subAssetPath)) {\n return new SyncFragmentIndex(subAssetPath, md5);\n }\n if (captionsMatch.test(subAssetPath)) {\n return new SyncCaption(subAssetPath, md5);\n }\n throw new Error(`Unrecognized sub-asset type: ${subAssetPath}`);\n};\n"],"mappings":";;;;;;;AAsBA,MAAM,aAAa;AACnB,MAAM,qBAAqB;AAC3B,MAAM,gBAAgB;AACtB,MAAM,aAAa;AAEnB,MAAM,MAAM,MAAM,kBAAkB;AAEpC,MAAa,gBAAgB,cAAsB,QAAgB;AACjE,KAAI,gBAAgB;EAAE;EAAc;EAAK,CAAC;AAC1C,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,mBAAmB,KAAK,aAAa,CACvC,QAAO,IAAI,kBAAkB,cAAc,IAAI;AAEjD,KAAI,cAAc,KAAK,aAAa,CAClC,QAAO,IAAI,YAAY,cAAc,IAAI;AAE3C,OAAM,IAAI,MAAM,gCAAgC,eAAe"}
1
+ {"version":3,"file":"SubAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SubAssetSync.ts"],"mappings":";;;;;;AAsBA,MAAM,aAAa;AACnB,MAAM,qBAAqB;AAC3B,MAAM,gBAAgB;AACtB,MAAM,aAAa;AAEnB,MAAM,MAAM,MAAM,kBAAkB;AAEpC,MAAa,gBAAgB,cAAsB,QAAgB;AACjE,KAAI,gBAAgB;EAAE;EAAc;EAAK,CAAC;AAC1C,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,mBAAmB,KAAK,aAAa,CACvC,QAAO,IAAI,kBAAkB,cAAc,IAAI;AAEjD,KAAI,cAAc,KAAK,aAAa,CAClC,QAAO,IAAI,YAAY,cAAc,IAAI;AAE3C,OAAM,IAAI,MAAM,gCAAgC,eAAe"}
@@ -5,11 +5,10 @@ import { createFile, lookupFileByMd5, uploadFile } from "@editframe/api";
5
5
  import { basename } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { Readable } from "node:stream";
8
-
9
8
  //#region src/operations/syncAssetsDirectory/SyncCaption.ts
10
9
  var SyncCaption = class {
11
- constructor(path$1, md5) {
12
- this.path = path$1;
10
+ constructor(path, md5) {
11
+ this.path = path;
13
12
  this.md5 = md5;
14
13
  this.icon = "📝";
15
14
  this.label = "captions";
@@ -54,7 +53,7 @@ var SyncCaption = class {
54
53
  });
55
54
  }
56
55
  };
57
-
58
56
  //#endregion
59
57
  export { SyncCaption };
58
+
60
59
  //# sourceMappingURL=SyncCaption.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncCaption.js","names":["path: string","md5: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncCaption.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { Readable } from \"node:stream\";\nimport {\n type CreateFileResult,\n createFile,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFile,\n} from \"@editframe/api\";\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\nexport class SyncCaption implements SubAssetSync<CreateFileResult> {\n icon = \"📝\";\n label = \"captions\";\n syncStatus: SyncStatus = new SyncStatus(this.path);\n created: CreateFileResult | LookupFileByMd5Result | null = null;\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n async prepare() {}\n\n async validate() {}\n\n async create() {\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this.created = maybeFile;\n } else {\n this.created = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.captions.json$/, \"\"),\n type: \"caption\",\n byte_size: await this.byteSize(),\n });\n }\n }\n\n isComplete() {\n return this.created?.status === \"ready\";\n }\n\n async upload() {\n if (!this.created) {\n throw new Error(\"Caption not created. Should have been prevented by .isComplete()\");\n }\n await uploadFile(\n getClient(),\n {\n id: this.created.id,\n byte_size: await this.byteSize(),\n type: \"caption\",\n },\n // It's not clear why we need to use Readable.from here, but it seems\n // to fix an issue where the request is closed early in tests\n createReadableStreamFromReadable(Readable.from(await fs.readFile(this.path))),\n ).whenUploaded();\n }\n\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Caption not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n await this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAeA,IAAa,cAAb,MAAmE;CAKjE,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cANF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;;CAM3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,oBAAoB,GAAG;GAC7D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;AAErF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,MAAM,KAAK,UAAU;GAChC,MAAM;GACP,EAGD,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAC9E,CAAC,cAAc;;CAGlB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;EAErF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,KAAK,WAAW,WAAW;GAC/B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
1
+ {"version":3,"file":"SyncCaption.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncCaption.ts"],"mappings":";;;;;;;;AAeA,IAAa,cAAb,MAAmE;CAKjE,YACE,MACA,KACA;AAFO,OAAA,OAAA;AACA,OAAA,MAAA;cANF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;;CAM3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,oBAAoB,GAAG;GAC7D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;AAErF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,MAAM,KAAK,UAAU;GAChC,MAAM;GACP,EAGD,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAC9E,CAAC,cAAc;;CAGlB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;EAErF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,KAAK,WAAW,WAAW;GAC/B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
@@ -5,11 +5,10 @@ import { createFile, lookupFileByMd5, uploadFileIndex } from "@editframe/api";
5
5
  import { basename, dirname, join } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { Readable } from "node:stream";
8
-
9
8
  //#region src/operations/syncAssetsDirectory/SyncFragmentIndex.ts
10
9
  var SyncFragmentIndex = class {
11
- constructor(path$1, md5) {
12
- this.path = path$1;
10
+ constructor(path, md5) {
11
+ this.path = path;
13
12
  this.md5 = md5;
14
13
  this.icon = "📋";
15
14
  this.label = "fragment index";
@@ -57,7 +56,7 @@ var SyncFragmentIndex = class {
57
56
  })]);
58
57
  }
59
58
  };
60
-
61
59
  //#endregion
62
60
  export { SyncFragmentIndex };
61
+
63
62
  //# sourceMappingURL=SyncFragmentIndex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncFragmentIndex.js","names":["path: string","md5: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncFragmentIndex.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { Readable } from \"node:stream\";\n\nimport {\n type CreateFileResult,\n createFile,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFileIndex,\n} from \"@editframe/api\";\n\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\n\nexport class SyncFragmentIndex implements SubAssetSync<CreateFileResult> {\n icon = \"📋\";\n label = \"fragment index\";\n syncStatus = new SyncStatus(this.path);\n fileSyncStatus = new SyncStatus(join(dirname(this.path), \"isobmff\"));\n created: CreateFileResult | LookupFileByMd5Result | null = null;\n\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n async prepare() {}\n\n async validate() {}\n\n async create() {\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this.created = maybeFile;\n } else {\n this.created = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.tracks.json$/, \"\"),\n type: \"video\",\n byte_size: await this.byteSize(),\n });\n }\n }\n\n isComplete() {\n return this.created?.status === \"ready\";\n }\n\n async upload() {\n if (!this.created) {\n throw new Error(\"Fragment index not created. Should have been prevented by .isComplete()\");\n }\n await uploadFileIndex(\n getClient(),\n this.created.id,\n // It is unclear why we need to use Readable.from here\n // Tests fail when using createReadStream\n createReadableStreamFromReadable(Readable.from(await fs.readFile(this.path))),\n await this.byteSize(),\n );\n }\n\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Fragment index not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n await Promise.all([\n this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n }),\n this.fileSyncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n }),\n ]);\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAa,oBAAb,MAAyE;CAOvE,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cARF;eACC;oBACK,IAAI,WAAW,KAAK,KAAK;wBACrB,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,UAAU,CAAC;iBACT;;CAO3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG;GAC3D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;AAE5F,QAAM,gBACJ,WAAW,EACX,KAAK,QAAQ,IAGb,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,EAC7E,MAAM,KAAK,UAAU,CACtB;;CAGH,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;EAE5F,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,QAAQ,IAAI,CAChB,KAAK,WAAW,WAAW;GACzB,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,EACF,KAAK,eAAe,WAAW;GAC7B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"SyncFragmentIndex.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncFragmentIndex.ts"],"mappings":";;;;;;;;AAiBA,IAAa,oBAAb,MAAyE;CAOvE,YACE,MACA,KACA;AAFO,OAAA,OAAA;AACA,OAAA,MAAA;cARF;eACC;oBACK,IAAI,WAAW,KAAK,KAAK;wBACrB,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,UAAU,CAAC;iBACT;;CAO3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG;GAC3D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;AAE5F,QAAM,gBACJ,WAAW,EACX,KAAK,QAAQ,IAGb,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,EAC7E,MAAM,KAAK,UAAU,CACtB;;CAGH,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;EAE5F,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,QAAQ,IAAI,CAChB,KAAK,WAAW,WAAW;GACzB,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,EACF,KAAK,eAAe,WAAW;GAC7B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,CACH,CAAC"}
@@ -6,11 +6,10 @@ import path, { basename } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { createReadStream } from "node:fs";
8
8
  import { Probe } from "@editframe/assets";
9
-
10
9
  //#region src/operations/syncAssetsDirectory/SyncImage.ts
11
10
  var SyncImage = class {
12
- constructor(path$1, md5) {
13
- this.path = path$1;
11
+ constructor(path, md5) {
12
+ this.path = path;
14
13
  this.md5 = md5;
15
14
  this.icon = "🖞ïļ";
16
15
  this.label = "image";
@@ -74,7 +73,7 @@ var SyncImage = class {
74
73
  });
75
74
  }
76
75
  };
77
-
78
76
  //#endregion
79
77
  export { SyncImage };
78
+
80
79
  //# sourceMappingURL=SyncImage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncImage.js","names":["path: string","md5: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncImage.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path, { basename } from \"node:path\";\n\nimport {\n type CreateFileResult,\n createFile,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFile,\n} from \"@editframe/api\";\n\nimport { Probe } from \"@editframe/assets\";\n\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\n\nexport class SyncImage implements SubAssetSync<CreateFileResult> {\n icon = \"🖞ïļ\";\n label = \"image\";\n syncStatus: SyncStatus = new SyncStatus(this.path);\n created: CreateFileResult | LookupFileByMd5Result | null = null;\n\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n private _probeResult: Probe | null = null;\n\n async prepare() {\n this._probeResult = await Probe.probePath(this.path);\n }\n\n get probeResult() {\n if (!this._probeResult) {\n throw new Error(\"Probe result not found. Call prepare() first.\");\n }\n return this._probeResult;\n }\n\n get extension() {\n return path.extname(this.path).slice(1);\n }\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n async validate() {\n const [videoProbe] = this.probeResult.videoStreams;\n if (!videoProbe) {\n throw new Error(`No media info found in image: ${this.path}`);\n }\n const ext = this.extension;\n if (!(ext === \"jpg\" || ext === \"jpeg\" || ext === \"png\" || ext === \"webp\")) {\n throw new Error(`Invalid image format: ${this.path}`);\n }\n }\n async create() {\n const byteSize = (await fs.stat(this.path)).size;\n const [videoProbe] = this.probeResult.videoStreams;\n if (!videoProbe) {\n throw new Error(\"No video stream found in image. Should have been prevented by .validate()\");\n }\n\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this.created = maybeFile;\n } else {\n this.created = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path),\n type: \"image\",\n mime_type: `image/${this.extension}`,\n byte_size: byteSize,\n });\n }\n }\n isComplete() {\n return this.created?.status === \"ready\";\n }\n async upload() {\n if (!this.created) {\n throw new Error(\"Image not created. Should have been prevented by .isComplete()\");\n }\n await uploadFile(\n getClient(),\n {\n id: this.created.id,\n byte_size: Number.parseInt(this.probeResult.format.size || \"0\", 10),\n type: \"image\",\n },\n createReadableStreamFromReadable(createReadStream(this.path)),\n ).whenUploaded();\n }\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Image not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n return this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n });\n }\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAa,YAAb,MAAiE;CAM/D,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cAPF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;sBAOtB;;CAErC,MAAM,UAAU;AACd,OAAK,eAAe,MAAM,MAAM,UAAU,KAAK,KAAK;;CAGtD,IAAI,cAAc;AAChB,MAAI,CAAC,KAAK,aACR,OAAM,IAAI,MAAM,gDAAgD;AAElE,SAAO,KAAK;;CAGd,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE;;CAGzC,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,WAAW;EACf,MAAM,CAAC,cAAc,KAAK,YAAY;AACtC,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,iCAAiC,KAAK,OAAO;EAE/D,MAAM,MAAM,KAAK;AACjB,MAAI,EAAE,QAAQ,SAAS,QAAQ,UAAU,QAAQ,SAAS,QAAQ,QAChE,OAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO;;CAGzD,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;EAC5C,MAAM,CAAC,cAAc,KAAK,YAAY;AACtC,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,4EAA4E;EAG9F,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK;GAC7B,MAAM;GACN,WAAW,SAAS,KAAK;GACzB,WAAW;GACZ,CAAC;;CAGN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAElC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,iEAAiE;AAEnF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,OAAO,SAAS,KAAK,YAAY,OAAO,QAAQ,KAAK,GAAG;GACnE,MAAM;GACP,EACD,iCAAiC,iBAAiB,KAAK,KAAK,CAAC,CAC9D,CAAC,cAAc;;CAElB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,iEAAiE;EAEnF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,SAAO,KAAK,WAAW,WAAW;GAChC,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
1
+ {"version":3,"file":"SyncImage.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncImage.ts"],"mappings":";;;;;;;;;AAmBA,IAAa,YAAb,MAAiE;CAM/D,YACE,MACA,KACA;AAFO,OAAA,OAAA;AACA,OAAA,MAAA;cAPF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;sBAOtB;;CAErC,MAAM,UAAU;AACd,OAAK,eAAe,MAAM,MAAM,UAAU,KAAK,KAAK;;CAGtD,IAAI,cAAc;AAChB,MAAI,CAAC,KAAK,aACR,OAAM,IAAI,MAAM,gDAAgD;AAElE,SAAO,KAAK;;CAGd,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE;;CAGzC,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,WAAW;EACf,MAAM,CAAC,cAAc,KAAK,YAAY;AACtC,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,iCAAiC,KAAK,OAAO;EAE/D,MAAM,MAAM,KAAK;AACjB,MAAI,EAAE,QAAQ,SAAS,QAAQ,UAAU,QAAQ,SAAS,QAAQ,QAChE,OAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO;;CAGzD,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;EAC5C,MAAM,CAAC,cAAc,KAAK,YAAY;AACtC,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,4EAA4E;EAG9F,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK;GAC7B,MAAM;GACN,WAAW,SAAS,KAAK;GACzB,WAAW;GACZ,CAAC;;CAGN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAElC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,iEAAiE;AAEnF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,OAAO,SAAS,KAAK,YAAY,OAAO,QAAQ,KAAK,GAAG;GACnE,MAAM;GACP,EACD,iCAAiC,iBAAiB,KAAK,KAAK,CAAC,CAC9D,CAAC,cAAc;;CAElB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,iEAAiE;EAEnF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,SAAO,KAAK,WAAW,WAAW;GAChC,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import fs from "node:fs/promises";
2
2
  import { z } from "zod";
3
-
4
3
  //#region src/operations/syncAssetsDirectory/SyncStatus.ts
5
4
  const SYNC_VERSION = "1";
6
5
  const SyncStatusSchema = z.object({
@@ -33,7 +32,7 @@ var SyncStatus = class {
33
32
  await fs.writeFile(this.infoPath, JSON.stringify(info, null, 2), "utf-8");
34
33
  }
35
34
  };
36
-
37
35
  //#endregion
38
36
  export { SyncStatus };
37
+
39
38
  //# sourceMappingURL=SyncStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncStatus.js","names":["basePath: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncStatus.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\n\nimport { z } from \"zod\";\n\nconst SYNC_VERSION = \"1\";\n\nconst SyncStatusSchema = z.object({\n version: z.string(),\n complete: z.boolean(),\n id: z.string(),\n md5: z.string(),\n byte_size: z.number(),\n});\n\nexport interface SyncStatusInfo extends z.infer<typeof SyncStatusSchema> {}\n\nexport class SyncStatus {\n infoPath = `${this.basePath}.info`;\n\n constructor(private basePath: string) {}\n\n async isSynced() {\n const syncInfo = await this.readInfo();\n if (!syncInfo) {\n return false;\n }\n return syncInfo.version === SYNC_VERSION && syncInfo.complete;\n }\n\n async readInfo() {\n try {\n const info = await fs.readFile(this.infoPath, \"utf-8\");\n return SyncStatusSchema.parse(JSON.parse(info));\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n\n async markSynced(info: SyncStatusInfo) {\n await fs.writeFile(this.infoPath, JSON.stringify(info, null, 2), \"utf-8\");\n }\n}\n"],"mappings":";;;;AAIA,MAAM,eAAe;AAErB,MAAM,mBAAmB,EAAE,OAAO;CAChC,SAAS,EAAE,QAAQ;CACnB,UAAU,EAAE,SAAS;CACrB,IAAI,EAAE,QAAQ;CACd,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACtB,CAAC;AAIF,IAAa,aAAb,MAAwB;CAGtB,YAAY,AAAQA,UAAkB;EAAlB;kBAFT,GAAG,KAAK,SAAS;;CAI5B,MAAM,WAAW;EACf,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,MAAI,CAAC,SACH,QAAO;AAET,SAAO,SAAS,YAAY,gBAAgB,SAAS;;CAGvD,MAAM,WAAW;AACf,MAAI;GACF,MAAM,OAAO,MAAM,GAAG,SAAS,KAAK,UAAU,QAAQ;AACtD,UAAO,iBAAiB,MAAM,KAAK,MAAM,KAAK,CAAC;WACxC,OAAO;AACd,OAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,SAC9D,QAAO;AAET,SAAM;;;CAIV,MAAM,WAAW,MAAsB;AACrC,QAAM,GAAG,UAAU,KAAK,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,EAAE,QAAQ"}
1
+ {"version":3,"file":"SyncStatus.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncStatus.ts"],"mappings":";;;AAIA,MAAM,eAAe;AAErB,MAAM,mBAAmB,EAAE,OAAO;CAChC,SAAS,EAAE,QAAQ;CACnB,UAAU,EAAE,SAAS;CACrB,IAAI,EAAE,QAAQ;CACd,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACtB,CAAC;AAIF,IAAa,aAAb,MAAwB;CAGtB,YAAY,UAA0B;AAAlB,OAAA,WAAA;kBAFT,GAAG,KAAK,SAAS;;CAI5B,MAAM,WAAW;EACf,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,MAAI,CAAC,SACH,QAAO;AAET,SAAO,SAAS,YAAY,gBAAgB,SAAS;;CAGvD,MAAM,WAAW;AACf,MAAI;GACF,MAAM,OAAO,MAAM,GAAG,SAAS,KAAK,UAAU,QAAQ;AACtD,UAAO,iBAAiB,MAAM,KAAK,MAAM,KAAK,CAAC;WACxC,OAAO;AACd,OAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,SAC9D,QAAO;AAET,SAAM;;;CAIV,MAAM,WAAW,MAAsB;AACrC,QAAM,GAAG,UAAU,KAAK,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,EAAE,QAAQ"}
@@ -6,11 +6,10 @@ import { basename, dirname, join } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { createReadStream } from "node:fs";
8
8
  import { Probe } from "@editframe/assets";
9
-
10
9
  //#region src/operations/syncAssetsDirectory/SyncTrack.ts
11
10
  var SyncTrack = class {
12
- constructor(path$1, md5) {
13
- this.path = path$1;
11
+ constructor(path, md5) {
12
+ this.path = path;
14
13
  this.md5 = md5;
15
14
  this.icon = "📞";
16
15
  this.label = "track";
@@ -111,7 +110,7 @@ var SyncTrack = class {
111
110
  })]);
112
111
  }
113
112
  };
114
-
115
113
  //#endregion
116
114
  export { SyncTrack };
115
+
117
116
  //# sourceMappingURL=SyncTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncTrack.js","names":["path: string","md5: string","createPayload: CreateISOBMFFTrackPayload"],"sources":["../../../src/operations/syncAssetsDirectory/SyncTrack.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport {\n type CreateFileResult,\n type CreateISOBMFFTrackPayload,\n type CreateISOBMFFTrackResult,\n createFile,\n createFileTrack,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFileTrack,\n} from \"@editframe/api\";\nimport { Probe } from \"@editframe/assets\";\n\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\n\nexport class SyncTrack implements SubAssetSync<CreateISOBMFFTrackResult> {\n icon = \"📞\";\n label = \"track\";\n syncStatus = new SyncStatus(this.path);\n fileSyncStatus = new SyncStatus(join(dirname(this.path), \"isobmff\"));\n created: CreateISOBMFFTrackResult | null = null;\n\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n private _videoFile: CreateFileResult | LookupFileByMd5Result | null = null;\n\n get videoFile() {\n if (this._videoFile) {\n return this._videoFile;\n }\n throw new Error(\"Video file not found. Call prepare() first.\");\n }\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n private _probeResult: Probe | null = null;\n get probeResult() {\n if (this._probeResult) {\n return this._probeResult;\n }\n throw new Error(\"Probe result not found. Call prepare() first.\");\n }\n\n get track() {\n const [track] = this.probeResult.streams;\n if (track) {\n return track;\n }\n throw new Error(`No track found in track: ${this.path}`);\n }\n\n async prepare() {\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this._videoFile = maybeFile;\n } else {\n this._videoFile = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.track-[\\d]+.mp4$/, \"\"),\n type: \"video\",\n byte_size: await this.byteSize(),\n });\n }\n this._probeResult = await Probe.probePath(this.path);\n }\n\n get trackId() {\n const trackId = this.path.match(/track-([\\d]+).mp4/)?.[1];\n if (!trackId) {\n throw new Error(`No track ID found for track: ${this.path}`);\n }\n return trackId;\n }\n\n get trackDuration() {\n const track = this.track;\n if (!track.duration) {\n throw new Error(`No duration found in track: ${this.path}`);\n }\n if (typeof track.duration === \"string\") {\n return Number.parseFloat(track.duration);\n }\n return track.duration;\n }\n\n async validate() {\n void this.trackId;\n void this.videoFile;\n void this.trackDuration;\n }\n\n async create(): Promise<void> {\n const track = this.track;\n const videoFile = this.videoFile;\n\n if (track.codec_type === \"data\") {\n throw new Error(`Unsupported codec type: ${track.codec_type}`);\n }\n const createPayload: CreateISOBMFFTrackPayload =\n track.codec_type === \"audio\"\n ? {\n type: track.codec_type,\n file_id: videoFile.id,\n track_id: Number(this.trackId),\n probe_info: track,\n duration_ms: Math.round(this.trackDuration * 1000),\n codec_name: track.codec_name,\n byte_size: await this.byteSize(),\n }\n : {\n type: track.codec_type,\n file_id: videoFile.id,\n track_id: Number(this.trackId),\n probe_info: track,\n duration_ms: Math.round(this.trackDuration * 1000),\n codec_name: track.codec_name,\n byte_size: await this.byteSize(),\n };\n\n this.created = await createFileTrack(getClient(), videoFile.id, createPayload);\n }\n isComplete() {\n return !!this.created?.complete;\n }\n async upload() {\n if (!this.created) {\n throw new Error(\"Track not created. Should have been prevented by .isComplete()\");\n }\n await uploadFileTrack(\n getClient(),\n this.videoFile.id,\n Number(this.trackId),\n this.created.byte_size,\n createReadableStreamFromReadable(createReadStream(this.path)),\n ).whenUploaded();\n }\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Track not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n await Promise.all([\n this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: `${this.created.file_id}:${this.created.track_id}`,\n md5: this.md5,\n byte_size: byteSize,\n }),\n this.fileSyncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.file_id,\n md5: this.md5,\n byte_size: byteSize,\n }),\n ]);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SyncTrack.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncTrack.ts"],"mappings":"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"}
@@ -41,7 +41,7 @@ const doAssetSync = async function* (assetSync) {
41
41
  message: `Synced ${assetSync.label}: ${assetSync.path}`
42
42
  };
43
43
  };
44
-
45
44
  //#endregion
46
45
  export { doAssetSync };
46
+
47
47
  //# sourceMappingURL=doAssetSync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/doAssetSync.ts"],"sourcesContent":["import type { SubAssetSync } from \"./SubAssetSync.js\";\n\nexport const doAssetSync = async function* (assetSync: SubAssetSync<unknown>): AsyncGenerator<{\n status: \"info\" | \"success\";\n message: string;\n}> {\n if (await assetSync.syncStatus.isSynced()) {\n yield {\n status: \"info\",\n message: `Sub-asset has already been synced: ${assetSync.path}`,\n };\n return;\n }\n\n try {\n await assetSync.prepare();\n await assetSync.validate();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n\n throw new Error(`Error validating ${assetSync.label}: ${message}`);\n }\n\n yield {\n status: \"info\",\n message: `${assetSync.icon} Syncing ${assetSync.label}: ${assetSync.path}`,\n };\n\n try {\n await assetSync.create();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n\n throw new Error(`Error creating ${assetSync.label}: ${message}`);\n }\n\n if (!assetSync.isComplete()) {\n try {\n await assetSync.upload();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n\n throw new Error(`Error uploading ${assetSync.label}: ${message}`);\n }\n }\n\n try {\n await assetSync.markSynced();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n\n throw new Error(`Error marking ${assetSync.label} as synced: ${message}`);\n }\n\n yield {\n status: \"success\",\n message: `Synced ${assetSync.label}: ${assetSync.path}`,\n };\n return;\n};\n"],"mappings":";AAEA,MAAa,cAAc,iBAAiB,WAGzC;AACD,KAAI,MAAM,UAAU,WAAW,UAAU,EAAE;AACzC,QAAM;GACJ,QAAQ;GACR,SAAS,sCAAsC,UAAU;GAC1D;AACD;;AAGF,KAAI;AACF,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,UAAU;UACnB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,oBAAoB,UAAU,MAAM,IAAI,UAAU;;AAGpE,OAAM;EACJ,QAAQ;EACR,SAAS,GAAG,UAAU,KAAK,YAAY,UAAU,MAAM,IAAI,UAAU;EACtE;AAED,KAAI;AACF,QAAM,UAAU,QAAQ;UACjB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,kBAAkB,UAAU,MAAM,IAAI,UAAU;;AAGlE,KAAI,CAAC,UAAU,YAAY,CACzB,KAAI;AACF,QAAM,UAAU,QAAQ;UACjB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,mBAAmB,UAAU,MAAM,IAAI,UAAU;;AAIrE,KAAI;AACF,QAAM,UAAU,YAAY;UACrB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,iBAAiB,UAAU,MAAM,cAAc,UAAU;;AAG3E,OAAM;EACJ,QAAQ;EACR,SAAS,UAAU,UAAU,MAAM,IAAI,UAAU;EAClD"}
1
+ {"version":3,"file":"doAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/doAssetSync.ts"],"mappings":";AAEA,MAAa,cAAc,iBAAiB,WAGzC;AACD,KAAI,MAAM,UAAU,WAAW,UAAU,EAAE;AACzC,QAAM;GACJ,QAAQ;GACR,SAAS,sCAAsC,UAAU;GAC1D;AACD;;AAGF,KAAI;AACF,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,UAAU;UACnB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,oBAAoB,UAAU,MAAM,IAAI,UAAU;;AAGpE,OAAM;EACJ,QAAQ;EACR,SAAS,GAAG,UAAU,KAAK,YAAY,UAAU,MAAM,IAAI,UAAU;EACtE;AAED,KAAI;AACF,QAAM,UAAU,QAAQ;UACjB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,kBAAkB,UAAU,MAAM,IAAI,UAAU;;AAGlE,KAAI,CAAC,UAAU,YAAY,CACzB,KAAI;AACF,QAAM,UAAU,QAAQ;UACjB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,mBAAmB,UAAU,MAAM,IAAI,UAAU;;AAIrE,KAAI;AACF,QAAM,UAAU,YAAY;UACrB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,QAAM,IAAI,MAAM,iBAAiB,UAAU,MAAM,cAAc,UAAU;;AAG3E,OAAM;EACJ,QAAQ;EACR,SAAS,UAAU,UAAU,MAAM,IAAI,UAAU;EAClD"}
@@ -2,7 +2,6 @@ import { doAssetSync } from "./syncAssetsDirectory/doAssetSync.js";
2
2
  import { getAssetSync } from "./syncAssetsDirectory/SubAssetSync.js";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs/promises";
5
-
6
5
  //#region src/operations/syncAssetsDirectory.ts
7
6
  const syncAssetDirectory = async (cacheDir) => {
8
7
  if (!(await fs.stat(cacheDir).catch((error) => {
@@ -15,9 +14,9 @@ const syncAssetDirectory = async (cacheDir) => {
15
14
  const assets = await fs.readdir(cacheDir);
16
15
  process.stderr.write(`Syncing asset dir: ${cacheDir}\n`);
17
16
  const errors = {};
18
- const reportError = (path$1, message) => {
19
- errors[path$1] ||= [];
20
- errors[path$1].push(message);
17
+ const reportError = (path, message) => {
18
+ errors[path] ||= [];
19
+ errors[path].push(message);
21
20
  process.stderr.write(` ðŸšŦ ${message}\n`);
22
21
  };
23
22
  const reportSuccess = (_path, message) => {
@@ -56,7 +55,7 @@ const syncAssetDirectory = async (cacheDir) => {
56
55
  throw new Error("Failed to sync assets");
57
56
  }
58
57
  };
59
-
60
58
  //#endregion
61
59
  export { syncAssetDirectory };
60
+
62
61
  //# sourceMappingURL=syncAssetsDirectory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncAssetsDirectory.js","names":["errors: Record<string, string[]>","path"],"sources":["../../src/operations/syncAssetsDirectory.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { doAssetSync } from \"./syncAssetsDirectory/doAssetSync.js\";\nimport { getAssetSync } from \"./syncAssetsDirectory/SubAssetSync.js\";\n\nexport const syncAssetDirectory = async (\n /**\n * Project directory will be used as the base to find an assets directory.\n * Assets will be synced from `<projectDirectory>/src/assets`\n */\n cacheDir: string,\n) => {\n const stat = await fs.stat(cacheDir).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n throw error;\n });\n\n if (!stat?.isDirectory()) {\n console.error(`No assets cache directory found at ${cacheDir}`);\n return;\n }\n const assets = await fs.readdir(cacheDir);\n\n process.stderr.write(`Syncing asset dir: ${cacheDir}\\n`);\n\n const errors: Record<string, string[]> = {};\n\n const reportError = (path: string, message: string) => {\n errors[path] ||= [];\n errors[path].push(message);\n process.stderr.write(` ðŸšŦ ${message}\\n`);\n };\n\n const reportSuccess = (_path: string, message: string) => {\n process.stderr.write(` ✅ ${message}\\n`);\n };\n\n const reportInfo = (_path: string, message: string) => {\n process.stderr.write(` ${message}\\n`);\n };\n\n for (const assetMd5 of assets) {\n reportInfo(assetMd5, `Syncing asset: ${assetMd5}`);\n const assetDir = path.join(cacheDir, assetMd5);\n const stat = await fs.stat(assetDir);\n if (!stat.isDirectory()) {\n reportError(assetMd5, \"Invalid asset. Did not find asset directory.\");\n return;\n }\n const subAssets = await fs.readdir(assetDir);\n\n for (const subAsset of subAssets) {\n if (subAsset.endsWith(\".info\")) {\n // skip .info files, they are not assets\n continue;\n }\n const subAssetPath = path.join(assetDir, subAsset);\n\n try {\n const assetSync = getAssetSync(subAssetPath, assetMd5);\n for await (const { status, message } of doAssetSync(assetSync)) {\n if (status === \"success\") {\n reportSuccess(subAsset, message);\n } else if (status === \"info\") {\n reportInfo(subAsset, message);\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n reportError(subAsset, error.message);\n } else {\n reportError(subAsset, \"Unknown error\");\n }\n }\n }\n }\n\n if (Object.keys(errors).length) {\n process.stderr.write(\"\\n\\n❌ Encountered errors while syncing assets:\\n\");\n for (const [asset, messages] of Object.entries(errors)) {\n process.stderr.write(`\\nðŸšŦ ${asset}\\n`);\n for (const message of messages) {\n process.stderr.write(` - ${message}\\n`);\n }\n }\n\n throw new Error(\"Failed to sync assets\");\n }\n};\n"],"mappings":";;;;;;AAKA,MAAa,qBAAqB,OAKhC,aACG;AAQH,KAAI,EAPS,MAAM,GAAG,KAAK,SAAS,CAAC,OAAO,UAAU;AACpD,MAAI,MAAM,SAAS,SACjB;AAEF,QAAM;GACN,GAES,aAAa,EAAE;AACxB,UAAQ,MAAM,sCAAsC,WAAW;AAC/D;;CAEF,MAAM,SAAS,MAAM,GAAG,QAAQ,SAAS;AAEzC,SAAQ,OAAO,MAAM,sBAAsB,SAAS,IAAI;CAExD,MAAMA,SAAmC,EAAE;CAE3C,MAAM,eAAe,QAAc,YAAoB;AACrD,SAAOC,YAAU,EAAE;AACnB,SAAOA,QAAM,KAAK,QAAQ;AAC1B,UAAQ,OAAO,MAAM,OAAO,QAAQ,IAAI;;CAG1C,MAAM,iBAAiB,OAAe,YAAoB;AACxD,UAAQ,OAAO,MAAM,MAAM,QAAQ,IAAI;;CAGzC,MAAM,cAAc,OAAe,YAAoB;AACrD,UAAQ,OAAO,MAAM,IAAI,QAAQ,IAAI;;AAGvC,MAAK,MAAM,YAAY,QAAQ;AAC7B,aAAW,UAAU,kBAAkB,WAAW;EAClD,MAAM,WAAW,KAAK,KAAK,UAAU,SAAS;AAE9C,MAAI,EADS,MAAM,GAAG,KAAK,SAAS,EAC1B,aAAa,EAAE;AACvB,eAAY,UAAU,+CAA+C;AACrE;;EAEF,MAAM,YAAY,MAAM,GAAG,QAAQ,SAAS;AAE5C,OAAK,MAAM,YAAY,WAAW;AAChC,OAAI,SAAS,SAAS,QAAQ,CAE5B;GAEF,MAAM,eAAe,KAAK,KAAK,UAAU,SAAS;AAElD,OAAI;IACF,MAAM,YAAY,aAAa,cAAc,SAAS;AACtD,eAAW,MAAM,EAAE,QAAQ,aAAa,YAAY,UAAU,CAC5D,KAAI,WAAW,UACb,eAAc,UAAU,QAAQ;aACvB,WAAW,OACpB,YAAW,UAAU,QAAQ;YAG1B,OAAO;AACd,QAAI,iBAAiB,MACnB,aAAY,UAAU,MAAM,QAAQ;QAEpC,aAAY,UAAU,gBAAgB;;;;AAM9C,KAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;AAC9B,UAAQ,OAAO,MAAM,mDAAmD;AACxE,OAAK,MAAM,CAAC,OAAO,aAAa,OAAO,QAAQ,OAAO,EAAE;AACtD,WAAQ,OAAO,MAAM,QAAQ,MAAM,IAAI;AACvC,QAAK,MAAM,WAAW,SACpB,SAAQ,OAAO,MAAM,OAAO,QAAQ,IAAI;;AAI5C,QAAM,IAAI,MAAM,wBAAwB"}
1
+ {"version":3,"file":"syncAssetsDirectory.js","names":[],"sources":["../../src/operations/syncAssetsDirectory.ts"],"mappings":";;;;;AAKA,MAAa,qBAAqB,OAKhC,aACG;AAQH,KAAI,EAPS,MAAM,GAAG,KAAK,SAAS,CAAC,OAAO,UAAU;AACpD,MAAI,MAAM,SAAS,SACjB;AAEF,QAAM;GACN,GAES,aAAa,EAAE;AACxB,UAAQ,MAAM,sCAAsC,WAAW;AAC/D;;CAEF,MAAM,SAAS,MAAM,GAAG,QAAQ,SAAS;AAEzC,SAAQ,OAAO,MAAM,sBAAsB,SAAS,IAAI;CAExD,MAAM,SAAmC,EAAE;CAE3C,MAAM,eAAe,MAAc,YAAoB;AACrD,SAAO,UAAU,EAAE;AACnB,SAAO,MAAM,KAAK,QAAQ;AAC1B,UAAQ,OAAO,MAAM,OAAO,QAAQ,IAAI;;CAG1C,MAAM,iBAAiB,OAAe,YAAoB;AACxD,UAAQ,OAAO,MAAM,MAAM,QAAQ,IAAI;;CAGzC,MAAM,cAAc,OAAe,YAAoB;AACrD,UAAQ,OAAO,MAAM,IAAI,QAAQ,IAAI;;AAGvC,MAAK,MAAM,YAAY,QAAQ;AAC7B,aAAW,UAAU,kBAAkB,WAAW;EAClD,MAAM,WAAW,KAAK,KAAK,UAAU,SAAS;AAE9C,MAAI,EADS,MAAM,GAAG,KAAK,SAAS,EAC1B,aAAa,EAAE;AACvB,eAAY,UAAU,+CAA+C;AACrE;;EAEF,MAAM,YAAY,MAAM,GAAG,QAAQ,SAAS;AAE5C,OAAK,MAAM,YAAY,WAAW;AAChC,OAAI,SAAS,SAAS,QAAQ,CAE5B;GAEF,MAAM,eAAe,KAAK,KAAK,UAAU,SAAS;AAElD,OAAI;IACF,MAAM,YAAY,aAAa,cAAc,SAAS;AACtD,eAAW,MAAM,EAAE,QAAQ,aAAa,YAAY,UAAU,CAC5D,KAAI,WAAW,UACb,eAAc,UAAU,QAAQ;aACvB,WAAW,OACpB,YAAW,UAAU,QAAQ;YAG1B,OAAO;AACd,QAAI,iBAAiB,MACnB,aAAY,UAAU,MAAM,QAAQ;QAEpC,aAAY,UAAU,gBAAgB;;;;AAM9C,KAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;AAC9B,UAAQ,OAAO,MAAM,mDAAmD;AACxE,OAAK,MAAM,CAAC,OAAO,aAAa,OAAO,QAAQ,OAAO,EAAE;AACtD,WAAQ,OAAO,MAAM,QAAQ,MAAM,IAAI;AACvC,QAAK,MAAM,WAAW,SACpB,SAAQ,OAAO,MAAM,OAAO,QAAQ,IAAI;;AAI5C,QAAM,IAAI,MAAM,wBAAwB"}
@@ -1,5 +1,4 @@
1
1
  import { Stream } from "node:stream";
2
-
3
2
  //#region src/utils/createReadableStreamFromReadable.ts
4
3
  const createReadableStreamFromReadable = (source) => {
5
4
  const pump = new StreamPump(source);
@@ -63,7 +62,7 @@ var StreamPump = class {
63
62
  }
64
63
  }
65
64
  };
66
-
67
65
  //#endregion
68
66
  export { createReadableStreamFromReadable };
67
+
69
68
  //# sourceMappingURL=createReadableStreamFromReadable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createReadableStreamFromReadable.js","names":["_error: any"],"sources":["../../src/utils/createReadableStreamFromReadable.ts"],"sourcesContent":["import { type Readable, Stream } from \"node:stream\";\n\nexport const createReadableStreamFromReadable = (\n source: Readable & { readableHighWaterMark?: number },\n) => {\n const pump = new StreamPump(source);\n const stream = new ReadableStream(pump, pump);\n return stream;\n};\n\nclass StreamPump {\n public highWaterMark: number;\n public accumalatedSize: number;\n private stream: Stream & {\n readableHighWaterMark?: number;\n readable?: boolean;\n resume?: () => void;\n pause?: () => void;\n destroy?: (error?: Error) => void;\n };\n private controller?: ReadableStreamController<Uint8Array>;\n\n constructor(\n stream: Stream & {\n readableHighWaterMark?: number;\n readable?: boolean;\n resume?: () => void;\n pause?: () => void;\n destroy?: (error?: Error) => void;\n },\n ) {\n this.highWaterMark =\n stream.readableHighWaterMark || new Stream.Readable().readableHighWaterMark;\n this.accumalatedSize = 0;\n this.stream = stream;\n this.enqueue = this.enqueue.bind(this);\n this.error = this.error.bind(this);\n this.close = this.close.bind(this);\n }\n\n size(chunk: Uint8Array) {\n return chunk?.byteLength || 0;\n }\n\n start(controller: ReadableStreamController<Uint8Array>) {\n this.controller = controller;\n this.stream.on(\"data\", this.enqueue);\n this.stream.once(\"error\", this.error);\n this.stream.once(\"end\", this.close);\n this.stream.once(\"close\", this.close);\n }\n\n pull() {\n this.resume();\n }\n\n cancel(reason?: Error) {\n if (this.stream.destroy) {\n this.stream.destroy(reason);\n }\n\n this.stream.off(\"data\", this.enqueue);\n this.stream.off(\"error\", this.error);\n this.stream.off(\"end\", this.close);\n this.stream.off(\"close\", this.close);\n }\n\n enqueue(chunk: Uint8Array | string) {\n if (this.controller) {\n try {\n const available = (this.controller.desiredSize || 0) - chunk.length;\n this.controller.enqueue(chunk as Uint8Array<ArrayBuffer>);\n if (available <= 0) {\n this.pause();\n }\n } catch (_error: any) {\n this.controller.error(\n new Error(\n \"Could not create Buffer, chunk must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object\",\n ),\n );\n this.cancel();\n }\n }\n }\n\n pause() {\n if (this.stream.pause) {\n this.stream.pause();\n }\n }\n\n resume() {\n if (this.stream.readable && this.stream.resume) {\n this.stream.resume();\n }\n }\n\n close() {\n if (this.controller) {\n this.controller.close();\n delete this.controller;\n }\n }\n\n error(error: Error) {\n if (this.controller) {\n this.controller.error(error);\n delete this.controller;\n }\n }\n}\n"],"mappings":";;;AAEA,MAAa,oCACX,WACG;CACH,MAAM,OAAO,IAAI,WAAW,OAAO;AAEnC,QADe,IAAI,eAAe,MAAM,KAAK;;AAI/C,IAAM,aAAN,MAAiB;CAYf,YACE,QAOA;AACA,OAAK,gBACH,OAAO,yBAAyB,IAAI,OAAO,UAAU,CAAC;AACxD,OAAK,kBAAkB;AACvB,OAAK,SAAS;AACd,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;AAClC,OAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;;CAGpC,KAAK,OAAmB;AACtB,SAAO,OAAO,cAAc;;CAG9B,MAAM,YAAkD;AACtD,OAAK,aAAa;AAClB,OAAK,OAAO,GAAG,QAAQ,KAAK,QAAQ;AACpC,OAAK,OAAO,KAAK,SAAS,KAAK,MAAM;AACrC,OAAK,OAAO,KAAK,OAAO,KAAK,MAAM;AACnC,OAAK,OAAO,KAAK,SAAS,KAAK,MAAM;;CAGvC,OAAO;AACL,OAAK,QAAQ;;CAGf,OAAO,QAAgB;AACrB,MAAI,KAAK,OAAO,QACd,MAAK,OAAO,QAAQ,OAAO;AAG7B,OAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;AACrC,OAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AACpC,OAAK,OAAO,IAAI,OAAO,KAAK,MAAM;AAClC,OAAK,OAAO,IAAI,SAAS,KAAK,MAAM;;CAGtC,QAAQ,OAA4B;AAClC,MAAI,KAAK,WACP,KAAI;GACF,MAAM,aAAa,KAAK,WAAW,eAAe,KAAK,MAAM;AAC7D,QAAK,WAAW,QAAQ,MAAiC;AACzD,OAAI,aAAa,EACf,MAAK,OAAO;WAEPA,QAAa;AACpB,QAAK,WAAW,sBACd,IAAI,MACF,gIACD,CACF;AACD,QAAK,QAAQ;;;CAKnB,QAAQ;AACN,MAAI,KAAK,OAAO,MACd,MAAK,OAAO,OAAO;;CAIvB,SAAS;AACP,MAAI,KAAK,OAAO,YAAY,KAAK,OAAO,OACtC,MAAK,OAAO,QAAQ;;CAIxB,QAAQ;AACN,MAAI,KAAK,YAAY;AACnB,QAAK,WAAW,OAAO;AACvB,UAAO,KAAK;;;CAIhB,MAAM,OAAc;AAClB,MAAI,KAAK,YAAY;AACnB,QAAK,WAAW,MAAM,MAAM;AAC5B,UAAO,KAAK"}
1
+ {"version":3,"file":"createReadableStreamFromReadable.js","names":[],"sources":["../../src/utils/createReadableStreamFromReadable.ts"],"mappings":";;AAEA,MAAa,oCACX,WACG;CACH,MAAM,OAAO,IAAI,WAAW,OAAO;AAEnC,QADe,IAAI,eAAe,MAAM,KAAK;;AAI/C,IAAM,aAAN,MAAiB;CAYf,YACE,QAOA;AACA,OAAK,gBACH,OAAO,yBAAyB,IAAI,OAAO,UAAU,CAAC;AACxD,OAAK,kBAAkB;AACvB,OAAK,SAAS;AACd,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;AAClC,OAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;;CAGpC,KAAK,OAAmB;AACtB,SAAO,OAAO,cAAc;;CAG9B,MAAM,YAAkD;AACtD,OAAK,aAAa;AAClB,OAAK,OAAO,GAAG,QAAQ,KAAK,QAAQ;AACpC,OAAK,OAAO,KAAK,SAAS,KAAK,MAAM;AACrC,OAAK,OAAO,KAAK,OAAO,KAAK,MAAM;AACnC,OAAK,OAAO,KAAK,SAAS,KAAK,MAAM;;CAGvC,OAAO;AACL,OAAK,QAAQ;;CAGf,OAAO,QAAgB;AACrB,MAAI,KAAK,OAAO,QACd,MAAK,OAAO,QAAQ,OAAO;AAG7B,OAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;AACrC,OAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AACpC,OAAK,OAAO,IAAI,OAAO,KAAK,MAAM;AAClC,OAAK,OAAO,IAAI,SAAS,KAAK,MAAM;;CAGtC,QAAQ,OAA4B;AAClC,MAAI,KAAK,WACP,KAAI;GACF,MAAM,aAAa,KAAK,WAAW,eAAe,KAAK,MAAM;AAC7D,QAAK,WAAW,QAAQ,MAAiC;AACzD,OAAI,aAAa,EACf,MAAK,OAAO;WAEP,QAAa;AACpB,QAAK,WAAW,sBACd,IAAI,MACF,gIACD,CACF;AACD,QAAK,QAAQ;;;CAKnB,QAAQ;AACN,MAAI,KAAK,OAAO,MACd,MAAK,OAAO,OAAO;;CAIvB,SAAS;AACP,MAAI,KAAK,OAAO,YAAY,KAAK,OAAO,OACtC,MAAK,OAAO,QAAQ;;CAIxB,QAAQ;AACN,MAAI,KAAK,YAAY;AACnB,QAAK,WAAW,OAAO;AACvB,UAAO,KAAK;;;CAIhB,MAAM,OAAc;AAClB,MAAI,KAAK,YAAY;AACnB,QAAK,WAAW,MAAM,MAAM;AAC5B,UAAO,KAAK"}
@@ -2,7 +2,6 @@ import path from "node:path";
2
2
  import { existsSync } from "node:fs";
3
3
  import { execSync } from "node:child_process";
4
4
  import { platform } from "node:os";
5
-
6
5
  //#region src/utils/detectChrome.ts
7
6
  /**
8
7
  * Detects if Google Chrome is installed on the system.
@@ -81,7 +80,7 @@ function requireChrome() {
81
80
  if (!result.found) throw new Error("Chrome browser not found.\n\nThe render command requires Google Chrome to be installed on your system.\n\nInstall Chrome from: https://www.google.com/chrome/\n" + (result.error ? `\nDetails: ${result.error}` : ""));
82
81
  return result.path;
83
82
  }
84
-
85
83
  //#endregion
86
84
  export { requireChrome };
85
+
87
86
  //# sourceMappingURL=detectChrome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detectChrome.js","names":[],"sources":["../../src/utils/detectChrome.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ChromeDetectionResult {\n found: boolean;\n path?: string;\n error?: string;\n}\n\n/**\n * Detects if Google Chrome is installed on the system.\n * Returns the path to Chrome executable if found.\n */\nexport function detectChrome(): ChromeDetectionResult {\n const osPlatform = platform();\n\n if (osPlatform === \"darwin\") {\n // macOS: Check for Google Chrome.app\n const chromePath = \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\";\n if (existsSync(chromePath)) {\n return { found: true, path: chromePath };\n }\n\n // Also check for Chromium\n const chromiumPath = \"/Applications/Chromium.app/Contents/MacOS/Chromium\";\n if (existsSync(chromiumPath)) {\n return { found: true, path: chromiumPath };\n }\n\n return {\n found: false,\n error: \"Chrome not found in /Applications/Google Chrome.app\",\n };\n }\n\n if (osPlatform === \"linux\") {\n // Linux: Try to find chrome/chromium via which\n try {\n const chromePath = execSync(\"which google-chrome\", {\n encoding: \"utf-8\",\n }).trim();\n if (chromePath && existsSync(chromePath)) {\n return { found: true, path: chromePath };\n }\n } catch {\n // google-chrome not found, try chromium\n }\n\n try {\n const chromiumPath = execSync(\"which chromium\", {\n encoding: \"utf-8\",\n }).trim();\n if (chromiumPath && existsSync(chromiumPath)) {\n return { found: true, path: chromiumPath };\n }\n } catch {\n // chromium not found\n }\n\n try {\n const chromiumBrowserPath = execSync(\"which chromium-browser\", {\n encoding: \"utf-8\",\n }).trim();\n if (chromiumBrowserPath && existsSync(chromiumBrowserPath)) {\n return { found: true, path: chromiumBrowserPath };\n }\n } catch {\n // chromium-browser not found\n }\n\n return {\n found: false,\n error: \"Chrome not found. Install with: apt-get install google-chrome-stable\",\n };\n }\n\n if (osPlatform === \"win32\") {\n // Windows: Check common installation paths\n const possiblePaths = [\n path.join(process.env.LOCALAPPDATA || \"\", \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n path.join(process.env.PROGRAMFILES || \"\", \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n path.join(\n process.env[\"PROGRAMFILES(X86)\"] || \"\",\n \"Google\",\n \"Chrome\",\n \"Application\",\n \"chrome.exe\",\n ),\n ];\n\n for (const chromePath of possiblePaths) {\n if (existsSync(chromePath)) {\n return { found: true, path: chromePath };\n }\n }\n\n return {\n found: false,\n error: \"Chrome not found in common Windows installation paths\",\n };\n }\n\n return {\n found: false,\n error: `Unsupported platform: ${osPlatform}`,\n };\n}\n\n/**\n * Throws a user-friendly error if Chrome is not found.\n */\nexport function requireChrome(): string {\n const result = detectChrome();\n if (!result.found) {\n throw new Error(\n `Chrome browser not found.\\n\\n` +\n `The render command requires Google Chrome to be installed on your system.\\n\\n` +\n `Install Chrome from: https://www.google.com/chrome/\\n` +\n (result.error ? `\\nDetails: ${result.error}` : \"\"),\n );\n }\n return result.path!;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,eAAsC;CACpD,MAAM,aAAa,UAAU;AAE7B,KAAI,eAAe,UAAU;EAE3B,MAAM,aAAa;AACnB,MAAI,WAAW,WAAW,CACxB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAY;EAI1C,MAAM,eAAe;AACrB,MAAI,WAAW,aAAa,CAC1B,QAAO;GAAE,OAAO;GAAM,MAAM;GAAc;AAG5C,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,KAAI,eAAe,SAAS;AAE1B,MAAI;GACF,MAAM,aAAa,SAAS,uBAAuB,EACjD,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,cAAc,WAAW,WAAW,CACtC,QAAO;IAAE,OAAO;IAAM,MAAM;IAAY;UAEpC;AAIR,MAAI;GACF,MAAM,eAAe,SAAS,kBAAkB,EAC9C,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,gBAAgB,WAAW,aAAa,CAC1C,QAAO;IAAE,OAAO;IAAM,MAAM;IAAc;UAEtC;AAIR,MAAI;GACF,MAAM,sBAAsB,SAAS,0BAA0B,EAC7D,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,uBAAuB,WAAW,oBAAoB,CACxD,QAAO;IAAE,OAAO;IAAM,MAAM;IAAqB;UAE7C;AAIR,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,KAAI,eAAe,SAAS;EAE1B,MAAM,gBAAgB;GACpB,KAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,UAAU,UAAU,eAAe,aAAa;GAC1F,KAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,UAAU,UAAU,eAAe,aAAa;GAC1F,KAAK,KACH,QAAQ,IAAI,wBAAwB,IACpC,UACA,UACA,eACA,aACD;GACF;AAED,OAAK,MAAM,cAAc,cACvB,KAAI,WAAW,WAAW,CACxB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAY;AAI5C,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,QAAO;EACL,OAAO;EACP,OAAO,yBAAyB;EACjC;;;;;AAMH,SAAgB,gBAAwB;CACtC,MAAM,SAAS,cAAc;AAC7B,KAAI,CAAC,OAAO,MACV,OAAM,IAAI,MACR,qKAGG,OAAO,QAAQ,cAAc,OAAO,UAAU,IAClD;AAEH,QAAO,OAAO"}
1
+ {"version":3,"file":"detectChrome.js","names":[],"sources":["../../src/utils/detectChrome.ts"],"mappings":";;;;;;;;;AAeA,SAAgB,eAAsC;CACpD,MAAM,aAAa,UAAU;AAE7B,KAAI,eAAe,UAAU;EAE3B,MAAM,aAAa;AACnB,MAAI,WAAW,WAAW,CACxB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAY;EAI1C,MAAM,eAAe;AACrB,MAAI,WAAW,aAAa,CAC1B,QAAO;GAAE,OAAO;GAAM,MAAM;GAAc;AAG5C,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,KAAI,eAAe,SAAS;AAE1B,MAAI;GACF,MAAM,aAAa,SAAS,uBAAuB,EACjD,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,cAAc,WAAW,WAAW,CACtC,QAAO;IAAE,OAAO;IAAM,MAAM;IAAY;UAEpC;AAIR,MAAI;GACF,MAAM,eAAe,SAAS,kBAAkB,EAC9C,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,gBAAgB,WAAW,aAAa,CAC1C,QAAO;IAAE,OAAO;IAAM,MAAM;IAAc;UAEtC;AAIR,MAAI;GACF,MAAM,sBAAsB,SAAS,0BAA0B,EAC7D,UAAU,SACX,CAAC,CAAC,MAAM;AACT,OAAI,uBAAuB,WAAW,oBAAoB,CACxD,QAAO;IAAE,OAAO;IAAM,MAAM;IAAqB;UAE7C;AAIR,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,KAAI,eAAe,SAAS;EAE1B,MAAM,gBAAgB;GACpB,KAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,UAAU,UAAU,eAAe,aAAa;GAC1F,KAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,UAAU,UAAU,eAAe,aAAa;GAC1F,KAAK,KACH,QAAQ,IAAI,wBAAwB,IACpC,UACA,UACA,eACA,aACD;GACF;AAED,OAAK,MAAM,cAAc,cACvB,KAAI,WAAW,WAAW,CACxB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAY;AAI5C,SAAO;GACL,OAAO;GACP,OAAO;GACR;;AAGH,QAAO;EACL,OAAO;EACP,OAAO,yBAAyB;EACjC;;;;;AAMH,SAAgB,gBAAwB;CACtC,MAAM,SAAS,cAAc;AAC7B,KAAI,CAAC,OAAO,MACV,OAAM,IAAI,MACR,qKAGG,OAAO,QAAQ,cAAc,OAAO,UAAU,IAClD;AAEH,QAAO,OAAO"}
@@ -1,7 +1,6 @@
1
1
  import "dotenv/config";
2
2
  import { program } from "commander";
3
3
  import { Client } from "@editframe/api";
4
-
5
4
  //#region src/utils/index.ts
6
5
  let client;
7
6
  const getClient = () => {
@@ -14,7 +13,7 @@ const getClient = () => {
14
13
  }
15
14
  return client;
16
15
  };
17
-
18
16
  //#endregion
19
17
  export { getClient };
18
+
20
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["client: Client"],"sources":["../../src/utils/index.ts"],"sourcesContent":["import { program } from \"commander\";\nimport \"dotenv/config\";\nimport { Client } from \"@editframe/api\";\n\nlet client: Client;\n\nexport const getClient = () => {\n if (!client) {\n const programOpts = program.opts();\n const token = programOpts.token || process.env.EF_TOKEN;\n const efHost = programOpts.efHost || process.env.EF_HOST;\n if (!token) {\n throw new Error(\"EF_TOKEN must be set or supplied as command line argument\");\n }\n client = new Client(token, efHost);\n }\n return client;\n};\n"],"mappings":";;;;;AAIA,IAAIA;AAEJ,MAAa,kBAAkB;AAC7B,KAAI,CAAC,QAAQ;EACX,MAAM,cAAc,QAAQ,MAAM;EAClC,MAAM,QAAQ,YAAY,SAAS,QAAQ,IAAI;EAC/C,MAAM,SAAS,YAAY,UAAU,QAAQ,IAAI;AACjD,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,4DAA4D;AAE9E,WAAS,IAAI,OAAO,OAAO,OAAO;;AAEpC,QAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/utils/index.ts"],"mappings":";;;;AAIA,IAAI;AAEJ,MAAa,kBAAkB;AAC7B,KAAI,CAAC,QAAQ;EACX,MAAM,cAAc,QAAQ,MAAM;EAClC,MAAM,QAAQ,YAAY,SAAS,QAAQ,IAAI;EAC/C,MAAM,SAAS,YAAY,UAAU,QAAQ,IAAI;AACjD,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,4DAA4D;AAE9E,WAAS,IAAI,OAAO,OAAO,OAAO;;AAEpC,QAAO"}
@@ -3,7 +3,6 @@ import { withSpinner } from "./withSpinner.js";
3
3
  import chalk from "chalk";
4
4
  import debug from "debug";
5
5
  import { chromium } from "playwright";
6
-
7
6
  //#region src/utils/launchBrowserAndWaitForSDK.ts
8
7
  const browserLog = debug("ef:cli::browser");
9
8
  async function launchBrowserAndWaitForSDK(options, fn) {
@@ -58,7 +57,7 @@ async function launchBrowserAndWaitForSDK(options, fn) {
58
57
  process.exit(0);
59
58
  }
60
59
  }
61
-
62
60
  //#endregion
63
61
  export { launchBrowserAndWaitForSDK };
62
+
64
63
  //# sourceMappingURL=launchBrowserAndWaitForSDK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"launchBrowserAndWaitForSDK.js","names":["launchOptions: Parameters<typeof chromium.launch>[0]","pageOptions: Parameters<Browser[\"newPage\"]>[0]"],"sources":["../../src/utils/launchBrowserAndWaitForSDK.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport debug from \"debug\";\nimport { type Browser, chromium, type Page } from \"playwright\";\n\nimport { requireChrome } from \"./detectChrome.js\";\nimport { withSpinner } from \"./withSpinner.js\";\n\nconst browserLog = debug(\"ef:cli::browser\");\n\ninterface LaunchOptions {\n url: string;\n headless?: boolean;\n interactive?: boolean;\n efInteractive?: boolean;\n nativeRender?: boolean;\n chromePath?: string;\n profile?: boolean;\n profileOutput?: string;\n silent?: boolean; // Suppress spinner output\n}\n\nexport async function launchBrowserAndWaitForSDK(\n options: LaunchOptions,\n fn: (page: Page) => Promise<void>,\n) {\n // Detect Chrome before launching (only for non-interactive renders)\n if (options.interactive !== true && !options.chromePath) {\n requireChrome();\n }\n\n const launchBrowser = async () => {\n const launchOptions: Parameters<typeof chromium.launch>[0] = {\n channel: \"chrome\",\n headless: options.headless ?? true,\n devtools: options.interactive === true,\n };\n\n // Use custom Chrome path if provided\n if (options.chromePath) {\n launchOptions.executablePath = options.chromePath;\n // Don't use channel when providing explicit path\n delete launchOptions.channel;\n }\n\n // Enable GPU acceleration for headless rendering\n // This significantly improves canvas/WebGL performance for video rendering\n // Set EF_DISABLE_GPU=1 to disable GPU acceleration (for debugging/compatibility)\n const disableGpu = process.env.EF_DISABLE_GPU === \"1\";\n\n if (options.headless && options.interactive !== true && !disableGpu) {\n launchOptions.args = [\n // Core GPU acceleration flags\n \"--enable-gpu\", // Enable GPU hardware acceleration\n \"--use-angle=default\", // Use ANGLE for OpenGL (better compatibility)\n \"--enable-accelerated-2d-canvas\", // Hardware-accelerate canvas operations\n \"--enable-webgl\", // Enable WebGL\n \"--enable-features=VaapiVideoDecoder\", // Hardware video decoding (Linux)\n\n // Prevent fallback to software rendering\n \"--disable-software-rasterizer\",\n\n // System resource optimizations\n \"--disable-dev-shm-usage\", // Avoid /dev/shm issues (especially on Linux/Docker)\n\n // Optional: Uncomment if running in Docker or restricted environments\n // \"--no-sandbox\",\n // \"--disable-setuid-sandbox\",\n ];\n\n browserLog(\"Launching Chrome with GPU acceleration enabled\");\n } else if (disableGpu) {\n browserLog(\"GPU acceleration disabled via EF_DISABLE_GPU\");\n }\n\n return chromium.launch(launchOptions);\n };\n\n const browser = options.silent\n ? await launchBrowser()\n : await withSpinner(\"Launching chrome\", launchBrowser);\n\n const loadSDK = async () => {\n const pageOptions: Parameters<Browser[\"newPage\"]>[0] = {};\n if (options.interactive === true) {\n // By default, playwright uses its own viewport, so resizing the browser window\n // doesn't actually change the viewport. And the gui doesn't scale to fit.\n // This is not desirable for interactive mode, so we disable the viewport feature.\n pageOptions.viewport = null;\n }\n const page = await browser.newPage(pageOptions);\n page.on(\"console\", (msg) => {\n browserLog(chalk.blue(`browser (${msg.type()}) |`), msg.text());\n });\n\n // Build URL with query parameters\n const urlParams = new URLSearchParams();\n if (!options.efInteractive) {\n urlParams.set(\"EF_NONINTERACTIVE\", \"1\");\n }\n if (options.nativeRender) {\n urlParams.set(\"EF_NATIVE_RENDER\", \"1\");\n }\n const url = options.url + (urlParams.toString() ? `?${urlParams.toString()}` : \"\");\n\n browserLog(\"Loading url:\", url);\n await page.goto(url);\n await page.waitForFunction(\n () => {\n return (\n // @ts-expect-error\n window.EF_REGISTERED\n );\n },\n [],\n { timeout: 10_000 },\n );\n return page;\n };\n\n const page = options.silent\n ? await loadSDK()\n : await withSpinner(\"Loading Editframe SDK\", loadSDK);\n\n await fn(page);\n if (options.interactive !== true) {\n await browser.close();\n process.exit(0);\n }\n}\n"],"mappings":";;;;;;;AAOA,MAAM,aAAa,MAAM,kBAAkB;AAc3C,eAAsB,2BACpB,SACA,IACA;AAEA,KAAI,QAAQ,gBAAgB,QAAQ,CAAC,QAAQ,WAC3C,gBAAe;CAGjB,MAAM,gBAAgB,YAAY;EAChC,MAAMA,gBAAuD;GAC3D,SAAS;GACT,UAAU,QAAQ,YAAY;GAC9B,UAAU,QAAQ,gBAAgB;GACnC;AAGD,MAAI,QAAQ,YAAY;AACtB,iBAAc,iBAAiB,QAAQ;AAEvC,UAAO,cAAc;;EAMvB,MAAM,aAAa,QAAQ,IAAI,mBAAmB;AAElD,MAAI,QAAQ,YAAY,QAAQ,gBAAgB,QAAQ,CAAC,YAAY;AACnE,iBAAc,OAAO;IAEnB;IACA;IACA;IACA;IACA;IAGA;IAGA;IAKD;AAED,cAAW,iDAAiD;aACnD,WACT,YAAW,+CAA+C;AAG5D,SAAO,SAAS,OAAO,cAAc;;CAGvC,MAAM,UAAU,QAAQ,SACpB,MAAM,eAAe,GACrB,MAAM,YAAY,oBAAoB,cAAc;CAExD,MAAM,UAAU,YAAY;EAC1B,MAAMC,cAAiD,EAAE;AACzD,MAAI,QAAQ,gBAAgB,KAI1B,aAAY,WAAW;EAEzB,MAAM,OAAO,MAAM,QAAQ,QAAQ,YAAY;AAC/C,OAAK,GAAG,YAAY,QAAQ;AAC1B,cAAW,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC;IAC/D;EAGF,MAAM,YAAY,IAAI,iBAAiB;AACvC,MAAI,CAAC,QAAQ,cACX,WAAU,IAAI,qBAAqB,IAAI;AAEzC,MAAI,QAAQ,aACV,WAAU,IAAI,oBAAoB,IAAI;EAExC,MAAM,MAAM,QAAQ,OAAO,UAAU,UAAU,GAAG,IAAI,UAAU,UAAU,KAAK;AAE/E,aAAW,gBAAgB,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,sBACH;AACJ,UAEE,OAAO;KAGX,EAAE,EACF,EAAE,SAAS,KAAQ,CACpB;AACD,SAAO;;AAOT,OAAM,GAJO,QAAQ,SACjB,MAAM,SAAS,GACf,MAAM,YAAY,yBAAyB,QAAQ,CAEzC;AACd,KAAI,QAAQ,gBAAgB,MAAM;AAChC,QAAM,QAAQ,OAAO;AACrB,UAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"launchBrowserAndWaitForSDK.js","names":[],"sources":["../../src/utils/launchBrowserAndWaitForSDK.ts"],"mappings":";;;;;;AAOA,MAAM,aAAa,MAAM,kBAAkB;AAc3C,eAAsB,2BACpB,SACA,IACA;AAEA,KAAI,QAAQ,gBAAgB,QAAQ,CAAC,QAAQ,WAC3C,gBAAe;CAGjB,MAAM,gBAAgB,YAAY;EAChC,MAAM,gBAAuD;GAC3D,SAAS;GACT,UAAU,QAAQ,YAAY;GAC9B,UAAU,QAAQ,gBAAgB;GACnC;AAGD,MAAI,QAAQ,YAAY;AACtB,iBAAc,iBAAiB,QAAQ;AAEvC,UAAO,cAAc;;EAMvB,MAAM,aAAa,QAAQ,IAAI,mBAAmB;AAElD,MAAI,QAAQ,YAAY,QAAQ,gBAAgB,QAAQ,CAAC,YAAY;AACnE,iBAAc,OAAO;IAEnB;IACA;IACA;IACA;IACA;IAGA;IAGA;IAKD;AAED,cAAW,iDAAiD;aACnD,WACT,YAAW,+CAA+C;AAG5D,SAAO,SAAS,OAAO,cAAc;;CAGvC,MAAM,UAAU,QAAQ,SACpB,MAAM,eAAe,GACrB,MAAM,YAAY,oBAAoB,cAAc;CAExD,MAAM,UAAU,YAAY;EAC1B,MAAM,cAAiD,EAAE;AACzD,MAAI,QAAQ,gBAAgB,KAI1B,aAAY,WAAW;EAEzB,MAAM,OAAO,MAAM,QAAQ,QAAQ,YAAY;AAC/C,OAAK,GAAG,YAAY,QAAQ;AAC1B,cAAW,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC;IAC/D;EAGF,MAAM,YAAY,IAAI,iBAAiB;AACvC,MAAI,CAAC,QAAQ,cACX,WAAU,IAAI,qBAAqB,IAAI;AAEzC,MAAI,QAAQ,aACV,WAAU,IAAI,oBAAoB,IAAI;EAExC,MAAM,MAAM,QAAQ,OAAO,UAAU,UAAU,GAAG,IAAI,UAAU,UAAU,KAAK;AAE/E,aAAW,gBAAgB,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,sBACH;AACJ,UAEE,OAAO;KAGX,EAAE,EACF,EAAE,SAAS,KAAQ,CACpB;AACD,SAAO;;AAOT,OAAM,GAJO,QAAQ,SACjB,MAAM,SAAS,GACf,MAAM,YAAY,yBAAyB,QAAQ,CAEzC;AACd,KAAI,QAAQ,gBAAgB,MAAM;AAChC,QAAM,QAAQ,OAAO;AACrB,UAAQ,KAAK,EAAE"}
@@ -3,7 +3,6 @@ import { readFile, rename, unlink, writeFile } from "node:fs/promises";
3
3
  import { existsSync } from "node:fs";
4
4
  import { spawnSync } from "node:child_process";
5
5
  import ISOBoxer from "codem-isoboxer";
6
-
7
6
  //#region src/utils/patchFragmentedMp4.ts
8
7
  const log = debug("ef:cli:patch-mp4");
9
8
  /**
@@ -64,7 +63,7 @@ async function patchFragmentedMp4(outputPath, durationMs) {
64
63
  log("ffmpeg not available or remux failed (status %d), keeping patched fragmented output", result.status);
65
64
  }
66
65
  }
67
-
68
66
  //#endregion
69
67
  export { patchFragmentedMp4 };
68
+
70
69
  //# sourceMappingURL=patchFragmentedMp4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patchFragmentedMp4.js","names":["timescale: number"],"sources":["../../src/utils/patchFragmentedMp4.ts"],"sourcesContent":["import { readFile, writeFile, rename, unlink } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\nimport debug from \"debug\";\nimport ISOBoxer from \"codem-isoboxer\";\n\nconst log = debug(\"ef:cli:patch-mp4\");\n\n/**\n * Patches mvhd.duration, zeroes tkhd/mdhd durations, and removes edts boxes\n * from a fragmented MP4 buffer. This fixes mvhd.duration=0 that mediabunny\n * writes in fragmented mode, enabling duration display in VLC, QuickTime, and WMP.\n */\nexport function patchMoovDuration(arrayBuffer: ArrayBuffer, durationMs: number): ArrayBuffer {\n const iso = ISOBoxer.parseBuffer(arrayBuffer);\n\n const mvhd = iso.fetch(\"mvhd\");\n if (mvhd) {\n const timescale: number = mvhd.timescale || 1000;\n mvhd.duration = Math.ceil((durationMs / 1000) * timescale);\n }\n\n for (const tkhd of iso.fetchAll(\"tkhd\")) {\n if (tkhd) tkhd.duration = 0;\n }\n\n for (const mdhd of iso.fetchAll(\"mdhd\")) {\n if (mdhd) mdhd.duration = 0;\n }\n\n const moov = iso.fetch(\"moov\") as any;\n if (moov?.boxes) {\n for (const trak of moov.boxes.filter((b: any) => b.type === \"trak\")) {\n if (trak.boxes) {\n trak.boxes = trak.boxes.filter((b: any) => b.type !== \"edts\");\n }\n }\n }\n\n return iso.write();\n}\n\n/**\n * Post-processes a rendered fragmented MP4:\n *\n * Layer 1 (always): patches mvhd.duration so VLC, QuickTime, and WMP can\n * display duration and support seeking.\n *\n * Layer 2 (if ffmpeg on PATH): remuxes to a non-fragmented progressive MP4\n * with moov at the front, for full compatibility including Windows Explorer\n * thumbnails and social upload pipelines.\n */\nexport async function patchFragmentedMp4(outputPath: string, durationMs: number): Promise<void> {\n // Layer 1: always patch the moov\n const buf = await readFile(outputPath);\n const arrayBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n const patched = patchMoovDuration(arrayBuffer, durationMs);\n await writeFile(outputPath, Buffer.from(patched));\n log(\"Patched mvhd.duration to %dms in %s\", durationMs, outputPath);\n\n // Layer 2: remux to non-fragmented progressive MP4 if ffmpeg is available\n const tmp = outputPath + \".tmp.mp4\";\n const result = spawnSync(\n \"ffmpeg\",\n [\"-y\", \"-i\", outputPath, \"-c\", \"copy\", \"-movflags\", \"+faststart\", tmp],\n { shell: true, stdio: \"pipe\" },\n );\n\n if (result.status === 0 && existsSync(tmp)) {\n await rename(tmp, outputPath);\n log(\"Remuxed to non-fragmented MP4 via ffmpeg: %s\", outputPath);\n } else {\n if (existsSync(tmp)) {\n await unlink(tmp).catch(() => {});\n }\n process.stderr.write(\n \"Note: install ffmpeg for better MP4 compatibility (Windows Explorer thumbnails, social uploads).\\n\",\n );\n log(\n \"ffmpeg not available or remux failed (status %d), keeping patched fragmented output\",\n result.status,\n );\n }\n}\n"],"mappings":";;;;;;;AAMA,MAAM,MAAM,MAAM,mBAAmB;;;;;;AAOrC,SAAgB,kBAAkB,aAA0B,YAAiC;CAC3F,MAAM,MAAM,SAAS,YAAY,YAAY;CAE7C,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,KAAI,MAAM;EACR,MAAMA,YAAoB,KAAK,aAAa;AAC5C,OAAK,WAAW,KAAK,KAAM,aAAa,MAAQ,UAAU;;AAG5D,MAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,CACrC,KAAI,KAAM,MAAK,WAAW;AAG5B,MAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,CACrC,KAAI,KAAM,MAAK,WAAW;CAG5B,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,KAAI,MAAM,OACR;OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,MAAW,EAAE,SAAS,OAAO,CACjE,KAAI,KAAK,MACP,MAAK,QAAQ,KAAK,MAAM,QAAQ,MAAW,EAAE,SAAS,OAAO;;AAKnE,QAAO,IAAI,OAAO;;;;;;;;;;;;AAapB,eAAsB,mBAAmB,YAAoB,YAAmC;CAE9F,MAAM,MAAM,MAAM,SAAS,WAAW;CAEtC,MAAM,UAAU,kBADI,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,WAAW,EACtC,WAAW;AAC1D,OAAM,UAAU,YAAY,OAAO,KAAK,QAAQ,CAAC;AACjD,KAAI,uCAAuC,YAAY,WAAW;CAGlE,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS,UACb,UACA;EAAC;EAAM;EAAM;EAAY;EAAM;EAAQ;EAAa;EAAc;EAAI,EACtE;EAAE,OAAO;EAAM,OAAO;EAAQ,CAC/B;AAED,KAAI,OAAO,WAAW,KAAK,WAAW,IAAI,EAAE;AAC1C,QAAM,OAAO,KAAK,WAAW;AAC7B,MAAI,gDAAgD,WAAW;QAC1D;AACL,MAAI,WAAW,IAAI,CACjB,OAAM,OAAO,IAAI,CAAC,YAAY,GAAG;AAEnC,UAAQ,OAAO,MACb,qGACD;AACD,MACE,uFACA,OAAO,OACR"}
1
+ {"version":3,"file":"patchFragmentedMp4.js","names":[],"sources":["../../src/utils/patchFragmentedMp4.ts"],"mappings":";;;;;;AAMA,MAAM,MAAM,MAAM,mBAAmB;;;;;;AAOrC,SAAgB,kBAAkB,aAA0B,YAAiC;CAC3F,MAAM,MAAM,SAAS,YAAY,YAAY;CAE7C,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,KAAI,MAAM;EACR,MAAM,YAAoB,KAAK,aAAa;AAC5C,OAAK,WAAW,KAAK,KAAM,aAAa,MAAQ,UAAU;;AAG5D,MAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,CACrC,KAAI,KAAM,MAAK,WAAW;AAG5B,MAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,CACrC,KAAI,KAAM,MAAK,WAAW;CAG5B,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,KAAI,MAAM;OACH,MAAM,QAAQ,KAAK,MAAM,QAAQ,MAAW,EAAE,SAAS,OAAO,CACjE,KAAI,KAAK,MACP,MAAK,QAAQ,KAAK,MAAM,QAAQ,MAAW,EAAE,SAAS,OAAO;;AAKnE,QAAO,IAAI,OAAO;;;;;;;;;;;;AAapB,eAAsB,mBAAmB,YAAoB,YAAmC;CAE9F,MAAM,MAAM,MAAM,SAAS,WAAW;CAEtC,MAAM,UAAU,kBADI,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,WAAW,EACtC,WAAW;AAC1D,OAAM,UAAU,YAAY,OAAO,KAAK,QAAQ,CAAC;AACjD,KAAI,uCAAuC,YAAY,WAAW;CAGlE,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS,UACb,UACA;EAAC;EAAM;EAAM;EAAY;EAAM;EAAQ;EAAa;EAAc;EAAI,EACtE;EAAE,OAAO;EAAM,OAAO;EAAQ,CAC/B;AAED,KAAI,OAAO,WAAW,KAAK,WAAW,IAAI,EAAE;AAC1C,QAAM,OAAO,KAAK,WAAW;AAC7B,MAAI,gDAAgD,WAAW;QAC1D;AACL,MAAI,WAAW,IAAI,CACjB,OAAM,OAAO,IAAI,CAAC,YAAY,GAAG;AAEnC,UAAQ,OAAO,MACb,qGACD;AACD,MACE,uFACA,OAAO,OACR"}
@@ -1,6 +1,5 @@
1
1
  import path from "node:path";
2
2
  import { writeFile } from "node:fs/promises";
3
-
4
3
  //#region src/utils/profileRender.ts
5
4
  async function withProfiling(page, options, fn) {
6
5
  if (!options.enabled) return await fn();
@@ -38,7 +37,7 @@ async function withProfiling(page, options, fn) {
38
37
  }
39
38
  return result;
40
39
  }
41
-
42
40
  //#endregion
43
41
  export { withProfiling };
42
+
44
43
  //# sourceMappingURL=profileRender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profileRender.js","names":[],"sources":["../../src/utils/profileRender.ts"],"sourcesContent":["import { Page } from \"playwright\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface ProfileOptions {\n enabled: boolean;\n outputPath?: string;\n}\n\nexport async function withProfiling<T>(\n page: Page,\n options: ProfileOptions,\n fn: () => Promise<T>,\n): Promise<T> {\n if (!options.enabled) {\n return await fn();\n }\n\n // Get CDP session\n const client = await page.context().newCDPSession(page);\n\n // Start profiling\n await client.send(\"Profiler.enable\");\n await client.send(\"Profiler.setSamplingInterval\", { interval: 100 }); // 100Ξs\n await client.send(\"Profiler.start\");\n\n console.error(\"🔎 CPU profiling started...\");\n const startTime = Date.now();\n\n // Run the render\n const result = await fn();\n\n // Stop profiling\n const { profile } = await client.send(\"Profiler.stop\");\n await client.send(\"Profiler.disable\");\n\n const duration = Date.now() - startTime;\n console.error(`✅ CPU profiling complete (${(duration / 1000).toFixed(1)}s)`);\n\n // Save profile\n const outputPath = options.outputPath || \"./render-profile.cpuprofile\";\n const absolutePath = path.resolve(process.cwd(), outputPath);\n await writeFile(absolutePath, JSON.stringify(profile, null, 2));\n console.error(`ðŸ’ū Profile saved to: ${absolutePath}`);\n\n // Basic analysis\n const samples = profile.samples?.length || 0;\n console.error(`📊 Captured ${samples.toLocaleString()} samples`);\n\n // Calculate hotspots\n const hitCounts = new Map<number, number>();\n if (profile.samples) {\n for (const sample of profile.samples) {\n hitCounts.set(sample, (hitCounts.get(sample) || 0) + 1);\n }\n }\n\n // Find top functions\n const hotspots = profile.nodes\n .map((node: any) => ({\n name: node.callFrame.functionName || \"(anonymous)\",\n url: node.callFrame.url,\n line: node.callFrame.lineNumber,\n hits: hitCounts.get(node.id) || 0,\n }))\n .filter((h) => h.hits > 0)\n .sort((a, b) => b.hits - a.hits)\n .slice(0, 20);\n\n if (hotspots.length > 0) {\n console.error(\"\\n📊 Top 20 Hotspots:\");\n for (const h of hotspots) {\n const file = h.url.split(\"/\").pop() || h.url;\n console.error(` ${h.hits.toString().padStart(6)} samples | ${h.name} @ ${file}:${h.line}`);\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AASA,eAAsB,cACpB,MACA,SACA,IACY;AACZ,KAAI,CAAC,QAAQ,QACX,QAAO,MAAM,IAAI;CAInB,MAAM,SAAS,MAAM,KAAK,SAAS,CAAC,cAAc,KAAK;AAGvD,OAAM,OAAO,KAAK,kBAAkB;AACpC,OAAM,OAAO,KAAK,gCAAgC,EAAE,UAAU,KAAK,CAAC;AACpE,OAAM,OAAO,KAAK,iBAAiB;AAEnC,SAAQ,MAAM,8BAA8B;CAC5C,MAAM,YAAY,KAAK,KAAK;CAG5B,MAAM,SAAS,MAAM,IAAI;CAGzB,MAAM,EAAE,YAAY,MAAM,OAAO,KAAK,gBAAgB;AACtD,OAAM,OAAO,KAAK,mBAAmB;CAErC,MAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,SAAQ,MAAM,8BAA8B,WAAW,KAAM,QAAQ,EAAE,CAAC,IAAI;CAG5E,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAC5D,OAAM,UAAU,cAAc,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;AAC/D,SAAQ,MAAM,wBAAwB,eAAe;CAGrD,MAAM,UAAU,QAAQ,SAAS,UAAU;AAC3C,SAAQ,MAAM,eAAe,QAAQ,gBAAgB,CAAC,UAAU;CAGhE,MAAM,4BAAY,IAAI,KAAqB;AAC3C,KAAI,QAAQ,QACV,MAAK,MAAM,UAAU,QAAQ,QAC3B,WAAU,IAAI,SAAS,UAAU,IAAI,OAAO,IAAI,KAAK,EAAE;CAK3D,MAAM,WAAW,QAAQ,MACtB,KAAK,UAAe;EACnB,MAAM,KAAK,UAAU,gBAAgB;EACrC,KAAK,KAAK,UAAU;EACpB,MAAM,KAAK,UAAU;EACrB,MAAM,UAAU,IAAI,KAAK,GAAG,IAAI;EACjC,EAAE,CACF,QAAQ,MAAM,EAAE,OAAO,EAAE,CACzB,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,CAC/B,MAAM,GAAG,GAAG;AAEf,KAAI,SAAS,SAAS,GAAG;AACvB,UAAQ,MAAM,wBAAwB;AACtC,OAAK,MAAM,KAAK,UAAU;GACxB,MAAM,OAAO,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;AACzC,WAAQ,MAAM,KAAK,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO;;;AAI/F,QAAO"}
1
+ {"version":3,"file":"profileRender.js","names":[],"sources":["../../src/utils/profileRender.ts"],"mappings":";;;AASA,eAAsB,cACpB,MACA,SACA,IACY;AACZ,KAAI,CAAC,QAAQ,QACX,QAAO,MAAM,IAAI;CAInB,MAAM,SAAS,MAAM,KAAK,SAAS,CAAC,cAAc,KAAK;AAGvD,OAAM,OAAO,KAAK,kBAAkB;AACpC,OAAM,OAAO,KAAK,gCAAgC,EAAE,UAAU,KAAK,CAAC;AACpE,OAAM,OAAO,KAAK,iBAAiB;AAEnC,SAAQ,MAAM,8BAA8B;CAC5C,MAAM,YAAY,KAAK,KAAK;CAG5B,MAAM,SAAS,MAAM,IAAI;CAGzB,MAAM,EAAE,YAAY,MAAM,OAAO,KAAK,gBAAgB;AACtD,OAAM,OAAO,KAAK,mBAAmB;CAErC,MAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,SAAQ,MAAM,8BAA8B,WAAW,KAAM,QAAQ,EAAE,CAAC,IAAI;CAG5E,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAC5D,OAAM,UAAU,cAAc,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;AAC/D,SAAQ,MAAM,wBAAwB,eAAe;CAGrD,MAAM,UAAU,QAAQ,SAAS,UAAU;AAC3C,SAAQ,MAAM,eAAe,QAAQ,gBAAgB,CAAC,UAAU;CAGhE,MAAM,4BAAY,IAAI,KAAqB;AAC3C,KAAI,QAAQ,QACV,MAAK,MAAM,UAAU,QAAQ,QAC3B,WAAU,IAAI,SAAS,UAAU,IAAI,OAAO,IAAI,KAAK,EAAE;CAK3D,MAAM,WAAW,QAAQ,MACtB,KAAK,UAAe;EACnB,MAAM,KAAK,UAAU,gBAAgB;EACrC,KAAK,KAAK,UAAU;EACpB,MAAM,KAAK,UAAU;EACrB,MAAM,UAAU,IAAI,KAAK,GAAG,IAAI;EACjC,EAAE,CACF,QAAQ,MAAM,EAAE,OAAO,EAAE,CACzB,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,CAC/B,MAAM,GAAG,GAAG;AAEf,KAAI,SAAS,SAAS,GAAG;AACvB,UAAQ,MAAM,wBAAwB;AACtC,OAAK,MAAM,KAAK,UAAU;GACxB,MAAM,OAAO,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;AACzC,WAAQ,MAAM,KAAK,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO;;;AAI/F,QAAO"}
@@ -1,6 +1,5 @@
1
1
  import debug from "debug";
2
2
  import { spawn } from "node:child_process";
3
-
4
3
  //#region src/utils/spawnViteServer.ts
5
4
  const log = debug("ef:cli::spawn-vite");
6
5
  /**
@@ -66,7 +65,7 @@ async function spawnViteServer(directory) {
66
65
  }, 3e4);
67
66
  });
68
67
  }
69
-
70
68
  //#endregion
71
69
  export { spawnViteServer };
70
+
72
71
  //# sourceMappingURL=spawnViteServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawnViteServer.js","names":["url: string | null"],"sources":["../../src/utils/spawnViteServer.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport debug from \"debug\";\n\nconst log = debug(\"ef:cli::spawn-vite\");\n\nexport interface SpawnedViteServer {\n url: string;\n process: ChildProcess;\n kill: () => void;\n}\n\n/**\n * Spawn a Vite dev server as a subprocess and wait for it to be ready.\n * This allows Vite to run in its own process with full config resolution,\n * while the CLI maintains control via Playwright for rendering.\n */\nexport async function spawnViteServer(directory: string): Promise<SpawnedViteServer> {\n return new Promise((resolve, reject) => {\n log(\"Spawning vite dev server in\", directory);\n\n const viteProcess = spawn(\"npx\", [\"vite\", \"dev\"], {\n cwd: directory,\n shell: true,\n stdio: \"pipe\", // Capture output to detect when ready\n env: {\n ...process.env,\n // Disable Vite's automatic browser opening\n BROWSER: \"none\",\n },\n });\n\n let url: string | null = null;\n let stderr = \"\";\n let resolved = false;\n\n // Parse stdout to detect when Vite is ready\n viteProcess.stdout?.on(\"data\", (data: Buffer) => {\n const output = data.toString();\n log(\"vite stdout:\", output);\n\n // Look for the Local URL in Vite's output\n // Format: \" ➜ Local: http://localhost:5173/\"\n const match = output.match(/Local:\\s+(https?:\\/\\/[^\\s]+)/);\n if (match && !resolved) {\n url = match[1]!.trim();\n resolved = true;\n log(\"Vite server ready at:\", url);\n resolve({\n url,\n process: viteProcess,\n kill: () => {\n log(\"Killing vite process\");\n viteProcess.kill();\n },\n });\n }\n });\n\n // Capture stderr for error reporting\n viteProcess.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n log(\"vite stderr:\", data.toString());\n });\n\n // Handle process errors\n viteProcess.on(\"error\", (error) => {\n if (!resolved) {\n resolved = true;\n reject(new Error(`Failed to spawn vite: ${error.message}\\n${stderr}`));\n }\n });\n\n // Handle unexpected process exit\n viteProcess.on(\"exit\", (code, signal) => {\n if (!resolved) {\n resolved = true;\n reject(\n new Error(`Vite exited unexpectedly with code ${code} and signal ${signal}\\n${stderr}`),\n );\n }\n });\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n viteProcess.kill();\n reject(new Error(`Vite server did not start within 30 seconds\\nStderr: ${stderr}`));\n }\n }, 30000);\n });\n}\n"],"mappings":";;;;AAGA,MAAM,MAAM,MAAM,qBAAqB;;;;;;AAavC,eAAsB,gBAAgB,WAA+C;AACnF,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,MAAI,+BAA+B,UAAU;EAE7C,MAAM,cAAc,MAAM,OAAO,CAAC,QAAQ,MAAM,EAAE;GAChD,KAAK;GACL,OAAO;GACP,OAAO;GACP,KAAK;IACH,GAAG,QAAQ;IAEX,SAAS;IACV;GACF,CAAC;EAEF,IAAIA,MAAqB;EACzB,IAAI,SAAS;EACb,IAAI,WAAW;AAGf,cAAY,QAAQ,GAAG,SAAS,SAAiB;GAC/C,MAAM,SAAS,KAAK,UAAU;AAC9B,OAAI,gBAAgB,OAAO;GAI3B,MAAM,QAAQ,OAAO,MAAM,+BAA+B;AAC1D,OAAI,SAAS,CAAC,UAAU;AACtB,UAAM,MAAM,GAAI,MAAM;AACtB,eAAW;AACX,QAAI,yBAAyB,IAAI;AACjC,YAAQ;KACN;KACA,SAAS;KACT,YAAY;AACV,UAAI,uBAAuB;AAC3B,kBAAY,MAAM;;KAErB,CAAC;;IAEJ;AAGF,cAAY,QAAQ,GAAG,SAAS,SAAiB;AAC/C,aAAU,KAAK,UAAU;AACzB,OAAI,gBAAgB,KAAK,UAAU,CAAC;IACpC;AAGF,cAAY,GAAG,UAAU,UAAU;AACjC,OAAI,CAAC,UAAU;AACb,eAAW;AACX,2BAAO,IAAI,MAAM,yBAAyB,MAAM,QAAQ,IAAI,SAAS,CAAC;;IAExE;AAGF,cAAY,GAAG,SAAS,MAAM,WAAW;AACvC,OAAI,CAAC,UAAU;AACb,eAAW;AACX,2BACE,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,IAAI,SAAS,CACxF;;IAEH;AAGF,mBAAiB;AACf,OAAI,CAAC,UAAU;AACb,eAAW;AACX,gBAAY,MAAM;AAClB,2BAAO,IAAI,MAAM,wDAAwD,SAAS,CAAC;;KAEpF,IAAM;GACT"}
1
+ {"version":3,"file":"spawnViteServer.js","names":[],"sources":["../../src/utils/spawnViteServer.ts"],"mappings":";;;AAGA,MAAM,MAAM,MAAM,qBAAqB;;;;;;AAavC,eAAsB,gBAAgB,WAA+C;AACnF,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,MAAI,+BAA+B,UAAU;EAE7C,MAAM,cAAc,MAAM,OAAO,CAAC,QAAQ,MAAM,EAAE;GAChD,KAAK;GACL,OAAO;GACP,OAAO;GACP,KAAK;IACH,GAAG,QAAQ;IAEX,SAAS;IACV;GACF,CAAC;EAEF,IAAI,MAAqB;EACzB,IAAI,SAAS;EACb,IAAI,WAAW;AAGf,cAAY,QAAQ,GAAG,SAAS,SAAiB;GAC/C,MAAM,SAAS,KAAK,UAAU;AAC9B,OAAI,gBAAgB,OAAO;GAI3B,MAAM,QAAQ,OAAO,MAAM,+BAA+B;AAC1D,OAAI,SAAS,CAAC,UAAU;AACtB,UAAM,MAAM,GAAI,MAAM;AACtB,eAAW;AACX,QAAI,yBAAyB,IAAI;AACjC,YAAQ;KACN;KACA,SAAS;KACT,YAAY;AACV,UAAI,uBAAuB;AAC3B,kBAAY,MAAM;;KAErB,CAAC;;IAEJ;AAGF,cAAY,QAAQ,GAAG,SAAS,SAAiB;AAC/C,aAAU,KAAK,UAAU;AACzB,OAAI,gBAAgB,KAAK,UAAU,CAAC;IACpC;AAGF,cAAY,GAAG,UAAU,UAAU;AACjC,OAAI,CAAC,UAAU;AACb,eAAW;AACX,2BAAO,IAAI,MAAM,yBAAyB,MAAM,QAAQ,IAAI,SAAS,CAAC;;IAExE;AAGF,cAAY,GAAG,SAAS,MAAM,WAAW;AACvC,OAAI,CAAC,UAAU;AACb,eAAW;AACX,2BACE,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,IAAI,SAAS,CACxF;;IAEH;AAGF,mBAAiB;AACf,OAAI,CAAC,UAAU;AACb,eAAW;AACX,gBAAY,MAAM;AAClB,2BAAO,IAAI,MAAM,wDAAwD,SAAS,CAAC;;KAEpF,IAAM;GACT"}