@editframe/cli 0.30.2-beta.0 → 0.31.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/VERSION.js +1 -1
- package/dist/VERSION.js.map +1 -1
- package/dist/commands/render.js.map +1 -1
- package/dist/commands/webhook.js +2 -2
- package/dist/commands/webhook.js.map +1 -1
- package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js.map +1 -1
- package/dist/utils/createReadableStreamFromReadable.js.map +1 -1
- package/package.json +5 -5
package/dist/VERSION.js
CHANGED
package/dist/VERSION.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"sourcesContent":["export const VERSION = \"0.
|
|
1
|
+
{"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"sourcesContent":["export const VERSION = \"0.31.0-beta.0\";\n"],"mappings":";AAAA,MAAa,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","names":["basename","parseHTML"],"sources":["../../src/commands/render.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path, { basename, join } from \"node:path\";\nimport { PassThrough } from \"node:stream\";\nimport { inspect } from \"node:util\";\nimport { createRender, uploadRender } from \"@editframe/api\";\nimport { md5Directory, md5FilePath } from \"@editframe/assets\";\nimport { getRenderInfo, RenderInfo } from \"@editframe/elements\";\nimport { Option, program } from \"commander\";\nimport debug from \"debug\";\nimport { parse as parseHTML } from \"node-html-parser\";\nimport * as tar from \"tar\";\nimport { processRenderInfo } from \"../operations/processRenderInfo.js\";\nimport { SyncStatus } from \"../operations/syncAssetsDirectory/SyncStatus.js\";\nimport { syncAssetDirectory } from \"../operations/syncAssetsDirectory.js\";\nimport { createReadableStreamFromReadable } from \"../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../utils/index.js\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { PreviewServer } from \"../utils/startPreviewServer.js\";\nimport { validateVideoResolution } from \"../utils/validateVideoResolution.js\";\nimport { withSpinner } from \"../utils/withSpinner.js\";\n\nconst log = debug(\"ef:cli:render\");\n\nexport const buildAssetId = async (\n srcDir: string,\n src: string,\n basename: string,\n) => {\n log(`Building image asset id for ${src}\\n`);\n const assetPath = path.join(srcDir, src);\n const assetMd5 = await md5FilePath(assetPath);\n const syncStatus = new SyncStatus(\n join(srcDir, \"assets\", \".cache\", assetMd5, basename),\n );\n const info = await syncStatus.readInfo();\n if (!info) {\n throw new Error(`SyncStatus info is not found for ${syncStatus.infoPath}`);\n }\n\n return info.id;\n};\n\nprogram\n .command(\"render [directory]\")\n .description(\n \"Render a directory's index.html file as a video in the editframe cloud\",\n )\n .addOption(\n new Option(\"-s, --strategy <strategy>\", \"Render strategy\")\n .choices([\"v1\"])\n .default(\"v1\"),\n )\n .action(async (directory, options) => {\n directory ??= \".\";\n\n await syncAssetDirectory(\n join(process.cwd(), directory, \"src\", \"assets\", \".cache\"),\n );\n\n const srcDir = path.join(directory, \"src\");\n const distDir = path.join(directory, \"dist\");\n await withSpinner(\"Building\\n\", async () => {\n try {\n await withSpinner(\"Building\\n\", async () => {\n spawnSync(\n \"npx\",\n // biome-ignore format: Grouping CLI arguments\n [\n \"vite\"
|
|
1
|
+
{"version":3,"file":"render.js","names":["basename","parseHTML"],"sources":["../../src/commands/render.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path, { basename, join } from \"node:path\";\nimport { PassThrough } from \"node:stream\";\nimport { inspect } from \"node:util\";\nimport { createRender, uploadRender } from \"@editframe/api\";\nimport { md5Directory, md5FilePath } from \"@editframe/assets\";\nimport { getRenderInfo, RenderInfo } from \"@editframe/elements\";\nimport { Option, program } from \"commander\";\nimport debug from \"debug\";\nimport { parse as parseHTML } from \"node-html-parser\";\nimport * as tar from \"tar\";\nimport { processRenderInfo } from \"../operations/processRenderInfo.js\";\nimport { SyncStatus } from \"../operations/syncAssetsDirectory/SyncStatus.js\";\nimport { syncAssetDirectory } from \"../operations/syncAssetsDirectory.js\";\nimport { createReadableStreamFromReadable } from \"../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../utils/index.js\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { PreviewServer } from \"../utils/startPreviewServer.js\";\nimport { validateVideoResolution } from \"../utils/validateVideoResolution.js\";\nimport { withSpinner } from \"../utils/withSpinner.js\";\n\nconst log = debug(\"ef:cli:render\");\n\nexport const buildAssetId = async (\n srcDir: string,\n src: string,\n basename: string,\n) => {\n log(`Building image asset id for ${src}\\n`);\n const assetPath = path.join(srcDir, src);\n const assetMd5 = await md5FilePath(assetPath);\n const syncStatus = new SyncStatus(\n join(srcDir, \"assets\", \".cache\", assetMd5, basename),\n );\n const info = await syncStatus.readInfo();\n if (!info) {\n throw new Error(`SyncStatus info is not found for ${syncStatus.infoPath}`);\n }\n\n return info.id;\n};\n\nprogram\n .command(\"render [directory]\")\n .description(\n \"Render a directory's index.html file as a video in the editframe cloud\",\n )\n .addOption(\n new Option(\"-s, --strategy <strategy>\", \"Render strategy\")\n .choices([\"v1\"])\n .default(\"v1\"),\n )\n .action(async (directory, options) => {\n directory ??= \".\";\n\n await syncAssetDirectory(\n join(process.cwd(), directory, \"src\", \"assets\", \".cache\"),\n );\n\n const srcDir = path.join(directory, \"src\");\n const distDir = path.join(directory, \"dist\");\n await withSpinner(\"Building\\n\", async () => {\n try {\n await withSpinner(\"Building\\n\", async () => {\n spawnSync(\n \"npx\",\n // biome-ignore format: Grouping CLI arguments\n [\n \"vite\",\n \"build\",\n directory,\n \"--clearScreen\",\n \"false\",\n \"--logLevel\",\n \"debug\",\n ],\n {\n stdio: \"inherit\",\n },\n );\n });\n } catch (error) {\n console.error(\"Build failed:\", error);\n }\n });\n\n const previewServer = await PreviewServer.start(distDir);\n process.stderr.write(\"Preview server started at:\");\n process.stderr.write(previewServer.url);\n process.stderr.write(\"\\n\");\n await launchBrowserAndWaitForSDK(\n {\n url: previewServer.url,\n efInteractive: false,\n interactive: false,\n headless: true,\n },\n async (page) => {\n const renderInfo = RenderInfo.parse(await page.evaluate(getRenderInfo));\n\n validateVideoResolution({\n width: renderInfo.width,\n height: renderInfo.height,\n });\n\n await processRenderInfo(renderInfo);\n\n const doc = parseHTML(\n await readFile(path.join(distDir, \"index.html\"), \"utf-8\"),\n );\n\n log(\"Building asset IDs\");\n for (const element of doc.querySelectorAll(\n \"ef-image, ef-audio, ef-video\",\n )) {\n log(`Processing ${element.tagName}`);\n if (element.hasAttribute(\"asset-id\")) {\n log(\n `Asset ID for ${element.tagName} ${element.getAttribute(\"src\")} is ${element.getAttribute(\"asset-id\")}`,\n );\n continue;\n }\n const src = element.getAttribute(\"src\");\n if (!src) {\n log(`No src attribute for ${element.tagName}`);\n continue;\n }\n\n switch (element.tagName) {\n case \"EF-IMAGE\":\n element.setAttribute(\n \"asset-id\",\n await buildAssetId(srcDir, src, basename(src)),\n );\n break;\n case \"EF-AUDIO\":\n case \"EF-VIDEO\":\n element.setAttribute(\n \"asset-id\",\n await buildAssetId(srcDir, src, \"isobmff\"),\n );\n break;\n default:\n log(`Unknown element type: ${element.tagName}`);\n }\n }\n\n await writeFile(path.join(distDir, \"index.html\"), doc.toString());\n\n const md5 = await md5Directory(distDir);\n const render = await createRender(getClient(), {\n md5,\n width: renderInfo.width,\n height: renderInfo.height,\n fps: renderInfo.fps,\n duration_ms: renderInfo.durationMs,\n work_slice_ms: 4_000,\n strategy: options.strategy,\n });\n if (render?.status !== \"created\") {\n process.stderr.write(\n `Render is in '${render?.status}' status. It cannot be recreated while in this status.\\n`,\n );\n return;\n }\n /**\n * This tar stream is created with the dist directory as the root.\n * This is acheived by setting the cwd option to the dist directory.\n * And the files to be included in the tar stream are all files in the dist directory.\n *\n * The renderer expects to find the index.html file at the root of the tar stream.\n */\n const tarStream = tar.create(\n {\n gzip: true,\n cwd: distDir,\n },\n [\".\"],\n );\n const readable = new PassThrough();\n tarStream.pipe(readable);\n\n await uploadRender(\n getClient(),\n render.id,\n createReadableStreamFromReadable(readable),\n );\n process.stderr.write(\"Render assets uploaded\\n\");\n process.stderr.write(inspect(render));\n process.stderr.write(\"\\n\");\n },\n );\n });\n"],"mappings":"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"}
|
package/dist/commands/webhook.js
CHANGED
|
@@ -30,10 +30,10 @@ const webhookCommand = program.command("webhook").description("Test webhook URL
|
|
|
30
30
|
if (!webhookURL) webhookURL = await input({ message: "Enter a webhook URL:" });
|
|
31
31
|
if (!topic) topic = await select({
|
|
32
32
|
message: "Select a topic:",
|
|
33
|
-
choices:
|
|
33
|
+
choices: topics.map((topic$1) => ({
|
|
34
34
|
title: topic$1,
|
|
35
35
|
value: topic$1
|
|
36
|
-
}))
|
|
36
|
+
}))
|
|
37
37
|
});
|
|
38
38
|
const spinner = ora("Testing...").start();
|
|
39
39
|
try {
|
|
@@ -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(\n \"/api/v1/test_webhook\",\n {\n method: \"POST\",\n body: JSON.stringify({\n webhookURL,\n topic,\n }),\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:
|
|
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(\n \"/api/v1/test_webhook\",\n {\n method: \"POST\",\n body: JSON.stringify({\n webhookURL,\n topic,\n }),\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;AAWJ,SAViB,MAAM,WAAW,CAAC,mBACjC,wBACA;EACE,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB;GACA;GACD,CAAC;EACH,CACF,EACe,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 +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 CreateISOBMFFFileResult,\n createISOBMFFFile,\n type LookupISOBMFFFileByMd5Result,\n lookupISOBMFFFileByMd5,\n uploadFragmentIndex,\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
|
|
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 CreateISOBMFFFileResult,\n createISOBMFFFile,\n type LookupISOBMFFFileByMd5Result,\n lookupISOBMFFFileByMd5,\n uploadFragmentIndex,\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<CreateISOBMFFFileResult> {\n icon = \"📋\";\n label = \"fragment index\";\n syncStatus = new SyncStatus(this.path);\n fileSyncStatus = new SyncStatus(join(dirname(this.path), \"isobmff\"));\n created: CreateISOBMFFFileResult | LookupISOBMFFFileByMd5Result | 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 maybeISOBMFFFile = await lookupISOBMFFFileByMd5(\n getClient(),\n this.md5,\n );\n if (maybeISOBMFFFile) {\n this.created = maybeISOBMFFFile;\n } else {\n this.created = await createISOBMFFFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.tracks.json$/, \"\"),\n });\n }\n }\n\n isComplete() {\n return !!this.created?.fragment_index_complete;\n }\n\n async upload() {\n if (!this.created) {\n throw new Error(\n \"Fragment index not created. Should have been prevented by .isComplete()\",\n );\n }\n await uploadFragmentIndex(\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(\n Readable.from(await fs.readFile(this.path)),\n ),\n await this.byteSize(),\n );\n }\n\n async markSynced() {\n if (!this.created) {\n throw new Error(\n \"Fragment index not created. Should have been prevented by .isComplete()\",\n );\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,MAAgF;CAO9E,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cARF;eACC;oBACK,IAAI,WAAW,KAAK,KAAK;wBACrB,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,UAAU,CAAC;iBACK;;CAOzE,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,mBAAmB,MAAM,uBAC7B,WAAW,EACX,KAAK,IACN;AACD,MAAI,iBACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,kBAAkB,WAAW,EAAE;GAClD,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG;GAC5D,CAAC;;CAIN,aAAa;AACX,SAAO,CAAC,CAAC,KAAK,SAAS;;CAGzB,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MACR,0EACD;AAEH,QAAM,oBACJ,WAAW,EACX,KAAK,QAAQ,IAGb,iCACE,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAC5C,EACD,MAAM,KAAK,UAAU,CACtB;;CAGH,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MACR,0EACD;EAEH,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 +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 ||\n 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);\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,yBACP,IAAI,OAAO,UAAU,CAAC;AACxB,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,
|
|
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 ||\n 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,yBACP,IAAI,OAAO,UAAU,CAAC;AACxB,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@editframe/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0-beta.0",
|
|
4
4
|
"description": "Command line interface for EditFrame",
|
|
5
5
|
"bin": {
|
|
6
6
|
"editframe": "./dist/index.js"
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"typescript": "^5.5.4"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@editframe/api": "0.
|
|
25
|
-
"@editframe/assets": "0.
|
|
26
|
-
"@editframe/elements": "0.
|
|
27
|
-
"@editframe/vite-plugin": "0.
|
|
24
|
+
"@editframe/api": "0.31.0-beta.0",
|
|
25
|
+
"@editframe/assets": "0.31.0-beta.0",
|
|
26
|
+
"@editframe/elements": "0.31.0-beta.0",
|
|
27
|
+
"@editframe/vite-plugin": "0.31.0-beta.0",
|
|
28
28
|
"@inquirer/prompts": "^5.3.8",
|
|
29
29
|
"chalk": "^5.3.0",
|
|
30
30
|
"commander": "^12.0.0",
|