@editframe/cli 0.26.3-beta.0 → 0.30.0-beta.13

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 (39) hide show
  1. package/dist/VERSION.js +1 -1
  2. package/dist/VERSION.js.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/package.json +6 -6
  6. package/src/commands/auth.ts +0 -46
  7. package/src/commands/check.ts +0 -129
  8. package/src/commands/mux.ts +0 -10
  9. package/src/commands/preview.ts +0 -9
  10. package/src/commands/process-file.ts +0 -55
  11. package/src/commands/process.ts +0 -41
  12. package/src/commands/render.ts +0 -190
  13. package/src/commands/sync.ts +0 -13
  14. package/src/commands/test-asset.file +0 -0
  15. package/src/commands/webhook.ts +0 -76
  16. package/src/operations/processRenderInfo.ts +0 -40
  17. package/src/operations/syncAssetsDirectory/SubAssetSync.ts +0 -45
  18. package/src/operations/syncAssetsDirectory/SyncCaption.test.ts +0 -180
  19. package/src/operations/syncAssetsDirectory/SyncCaption.ts +0 -87
  20. package/src/operations/syncAssetsDirectory/SyncFragmentIndex.test.ts +0 -185
  21. package/src/operations/syncAssetsDirectory/SyncFragmentIndex.ts +0 -101
  22. package/src/operations/syncAssetsDirectory/SyncImage.test.ts +0 -162
  23. package/src/operations/syncAssetsDirectory/SyncImage.ts +0 -123
  24. package/src/operations/syncAssetsDirectory/SyncStatus.ts +0 -50
  25. package/src/operations/syncAssetsDirectory/SyncTrack.test.ts +0 -265
  26. package/src/operations/syncAssetsDirectory/SyncTrack.ts +0 -175
  27. package/src/operations/syncAssetsDirectory/doAssetSync.test.ts +0 -134
  28. package/src/operations/syncAssetsDirectory/doAssetSync.ts +0 -62
  29. package/src/operations/syncAssetsDirectory.test.ts +0 -510
  30. package/src/operations/syncAssetsDirectory.ts +0 -91
  31. package/src/utils/attachWorkbench.ts +0 -16
  32. package/src/utils/createReadableStreamFromReadable.ts +0 -113
  33. package/src/utils/getFolderSize.ts +0 -20
  34. package/src/utils/index.ts +0 -20
  35. package/src/utils/launchBrowserAndWaitForSDK.ts +0 -64
  36. package/src/utils/startDevServer.ts +0 -61
  37. package/src/utils/startPreviewServer.ts +0 -38
  38. package/src/utils/validateVideoResolution.ts +0 -36
  39. package/src/utils/withSpinner.ts +0 -16
@@ -1,510 +0,0 @@
1
- import { setupServer } from "msw/node";
2
- import { afterAll, afterEach, beforeAll, describe, it } from "vitest";
3
- import { fixture, withFixtures } from "../../test-fixtures/fixture.js";
4
- import {
5
- mockCreateImageFile,
6
- mockCreateIsobmffFile,
7
- mockCreateIsobmffTrack,
8
- mockGetUploadImageFile,
9
- mockLookupImageFileByMd5NotFound,
10
- mockLookupISOBMFFFileByMd5NotFound,
11
- mockUploadIsobmffFileIndex,
12
- } from "../../test-fixtures/network.js";
13
-
14
- const server = setupServer();
15
-
16
- describe("syncAssetsDirectory", () => {
17
- beforeAll(() => {
18
- server.listen();
19
- process.env.EF_TOKEN = "ef_SECRET_TOKEN";
20
- process.env.EF_HOST = "http://localhost:3000";
21
- });
22
- afterAll(() => server.close());
23
- afterEach(() => server.resetHandlers());
24
-
25
- describe("Image sync", () => {
26
- it("Syncs assets directory when file is already uploaded", async () => {
27
- await withFixtures(
28
- [fixture("test.png", "test.png")],
29
- async ({
30
- files: [testPng],
31
- expectCacheFiles,
32
- expectInfoFileContent,
33
- syncAssetsDirectory,
34
- cacheImage,
35
- }) => {
36
- server.use(
37
- mockLookupImageFileByMd5NotFound({
38
- md5: testPng!.md5,
39
- }),
40
- mockCreateImageFile({
41
- complete: true,
42
- id: "123",
43
- filename: "test.png",
44
- fixture: testPng!,
45
- }),
46
- );
47
- await cacheImage(testPng!);
48
- await syncAssetsDirectory();
49
- await expectCacheFiles(testPng!, ["test.png", "test.png.info"]);
50
-
51
- await expectInfoFileContent("test.png.info", testPng!, {
52
- complete: true,
53
- id: "123",
54
- });
55
- },
56
- );
57
- });
58
-
59
- it("Syncs assets directory when file is not uploaded", async () => {
60
- await withFixtures(
61
- [fixture("test.png", "test.png")],
62
- async ({
63
- files: [testPng],
64
- expectCacheFiles,
65
- expectInfoFileContent,
66
- cacheImage,
67
- syncAssetsDirectory,
68
- }) => {
69
- server.use(
70
- mockLookupImageFileByMd5NotFound({
71
- md5: testPng!.md5,
72
- }),
73
- mockCreateImageFile({
74
- complete: false,
75
- id: "123",
76
- filename: "test.png",
77
- fixture: testPng!,
78
- }),
79
- mockGetUploadImageFile({
80
- complete: true,
81
- id: "123",
82
- filename: "test.png",
83
- fixture: testPng!,
84
- }),
85
- );
86
- await cacheImage(testPng!);
87
- await syncAssetsDirectory();
88
- await expectCacheFiles(testPng!, ["test.png", "test.png.info"]);
89
-
90
- await expectInfoFileContent("test.png.info", testPng!, {
91
- complete: true,
92
- id: "123",
93
- });
94
- },
95
- );
96
- });
97
-
98
- it("Syncs assets directory when file is present with different name", async () => {
99
- await withFixtures(
100
- [fixture("test.png", "test.png"), fixture("test.png", "test2.png")],
101
- async ({
102
- files: [testPng, test2Png],
103
- cacheImage,
104
- syncAssetsDirectory,
105
- expectCacheFiles,
106
- expectInfoFileContent,
107
- }) => {
108
- server.use(
109
- mockLookupImageFileByMd5NotFound({
110
- md5: testPng!.md5,
111
- }),
112
- mockCreateImageFile({
113
- complete: false,
114
- id: "123",
115
- filename: "test.png",
116
- fixture: testPng!,
117
- }),
118
- mockGetUploadImageFile({
119
- complete: true,
120
- id: "123",
121
- filename: "test.png",
122
- fixture: testPng!,
123
- }),
124
- mockCreateImageFile({
125
- complete: false,
126
- id: "123",
127
- filename: "test.png",
128
- fixture: test2Png!,
129
- }),
130
- mockGetUploadImageFile({
131
- complete: true,
132
- id: "123",
133
- filename: "test.png",
134
- fixture: test2Png!,
135
- }),
136
- );
137
-
138
- await cacheImage(testPng!);
139
- await cacheImage(test2Png!);
140
- await syncAssetsDirectory();
141
- await expectCacheFiles(testPng!, [
142
- "test.png",
143
- "test.png.info",
144
- "test2.png",
145
- "test2.png.info",
146
- ]);
147
-
148
- await expectInfoFileContent("test.png.info", testPng!, {
149
- complete: true,
150
- id: "123",
151
- });
152
-
153
- await expectInfoFileContent("test2.png.info", testPng!, {
154
- complete: true,
155
- id: "123",
156
- });
157
- },
158
- );
159
- });
160
- });
161
-
162
- describe("A/V Sync", () => {
163
- it("Syncs assets directory when fragment index is already uploaded", async () => {
164
- await withFixtures(
165
- [fixture("test.mp4", "test.mp4")],
166
- async ({
167
- files: [testMp4],
168
- generateTrack,
169
- generateTrackFragmentIndex,
170
- syncAssetsDirectory,
171
- expectInfoFileContent,
172
- expectCacheFiles,
173
- }) => {
174
- const creationArgs = {
175
- complete: true,
176
- id: "123",
177
- filename: "test.mp4",
178
- fixture: testMp4!,
179
- };
180
- server.use(
181
- mockLookupISOBMFFFileByMd5NotFound({
182
- md5: testMp4!.md5,
183
- }),
184
-
185
- mockCreateIsobmffFile(creationArgs),
186
-
187
- mockCreateIsobmffTrack({
188
- complete: true,
189
- id: "track-1",
190
- fileId: "123",
191
- filename: "test.mp4",
192
- fixture: testMp4!,
193
- }),
194
-
195
- mockCreateIsobmffFile(creationArgs),
196
- mockCreateIsobmffTrack({
197
- complete: true,
198
- fileId: "123",
199
- id: "track-2",
200
- filename: "test.mp4",
201
- fixture: testMp4!,
202
- }),
203
-
204
- mockCreateIsobmffFile(creationArgs),
205
- mockUploadIsobmffFileIndex({
206
- id: "123",
207
- complete: true,
208
- }),
209
- );
210
- await generateTrack(testMp4!, 1);
211
- await generateTrack(testMp4!, 2);
212
- await generateTrackFragmentIndex(testMp4!);
213
-
214
- await syncAssetsDirectory();
215
-
216
- await expectCacheFiles(testMp4!, [
217
- "isobmff.info",
218
- "test.mp4.track-1.mp4",
219
- "test.mp4.track-1.mp4.info",
220
- "test.mp4.track-2.mp4",
221
- "test.mp4.track-2.mp4.info",
222
- "test.mp4.tracks.json",
223
- "test.mp4.tracks.json.info",
224
- ]);
225
-
226
- await expectInfoFileContent("isobmff.info", testMp4!, {
227
- complete: true,
228
- id: "123",
229
- byte_size: 31,
230
- });
231
-
232
- await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
233
- complete: true,
234
- id: "123",
235
- byte_size: 31,
236
- });
237
-
238
- await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
239
- complete: true,
240
- id: "123:track-1",
241
- byte_size: 26434,
242
- });
243
-
244
- await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
245
- complete: true,
246
- id: "123:track-2",
247
- byte_size: 26434,
248
- });
249
- },
250
- );
251
- });
252
-
253
- it("Syncs assets directory when fragment index is not uploaded", async () => {
254
- await withFixtures(
255
- [fixture("test.mp4", "test.mp4")],
256
- async ({
257
- files: [testMp4],
258
-
259
- syncAssetsDirectory,
260
- expectCacheFiles,
261
- expectInfoFileContent,
262
- generateTrackFragmentIndex,
263
- generateTrack,
264
- }) => {
265
- const creationArgs = {
266
- complete: false,
267
- id: "123",
268
- filename: "test.mp4",
269
- fixture: testMp4!,
270
- };
271
- server.use(
272
- mockLookupISOBMFFFileByMd5NotFound({
273
- md5: testMp4!.md5,
274
- }),
275
- mockCreateIsobmffFile(creationArgs),
276
- mockUploadIsobmffFileIndex({
277
- id: "123",
278
- complete: true,
279
- }),
280
-
281
- mockCreateIsobmffFile(creationArgs),
282
- mockCreateIsobmffTrack({
283
- complete: true,
284
- id: "track-1",
285
- fileId: "123",
286
- filename: "test.mp4",
287
- fixture: testMp4!,
288
- }),
289
-
290
- mockCreateIsobmffFile(creationArgs),
291
- mockCreateIsobmffTrack({
292
- complete: true,
293
- fileId: "123",
294
- id: "track-2",
295
- filename: "test.mp4",
296
- fixture: testMp4!,
297
- }),
298
- );
299
- await generateTrackFragmentIndex(testMp4!);
300
- await generateTrack(testMp4!, 1);
301
- await generateTrack(testMp4!, 2);
302
-
303
- await syncAssetsDirectory();
304
-
305
- await expectCacheFiles(testMp4!, [
306
- "isobmff.info",
307
- "test.mp4.track-1.mp4",
308
- "test.mp4.track-1.mp4.info",
309
- "test.mp4.track-2.mp4",
310
- "test.mp4.track-2.mp4.info",
311
- "test.mp4.tracks.json",
312
- "test.mp4.tracks.json.info",
313
- ]);
314
-
315
- await expectInfoFileContent("isobmff.info", testMp4!, {
316
- complete: true,
317
- id: "123",
318
- byte_size: 31,
319
- });
320
-
321
- await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
322
- byte_size: 31,
323
- complete: true,
324
- id: "123",
325
- });
326
-
327
- await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
328
- byte_size: 26434,
329
- complete: true,
330
- id: "123:track-1",
331
- });
332
-
333
- await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
334
- byte_size: 26434,
335
- complete: true,
336
- id: "123:track-2",
337
- });
338
- },
339
- );
340
- });
341
-
342
- it("Syncs assets when file has already been synced with a different name", async () => {
343
- await withFixtures(
344
- [fixture("test.mp4", "test.mp4"), fixture("test.mp4", "test2.mp4")],
345
- async ({
346
- files: [testMp4, test2Mp4],
347
- syncAssetsDirectory,
348
- generateTrackFragmentIndex,
349
- generateTrack,
350
- expectInfoFileContent,
351
- expectCacheFiles,
352
- }) => {
353
- server.use(
354
- mockLookupISOBMFFFileByMd5NotFound({
355
- md5: testMp4!.md5,
356
- }),
357
- mockCreateIsobmffFile({
358
- complete: true,
359
- id: "123",
360
- filename: "test.mp4",
361
- fixture: testMp4!,
362
- }),
363
- mockCreateIsobmffFile({
364
- complete: true,
365
- id: "123",
366
- filename: "test.mp4",
367
- fixture: testMp4!,
368
- }),
369
- mockCreateIsobmffFile({
370
- complete: true,
371
- id: "123",
372
- filename: "test.mp4",
373
- fixture: testMp4!,
374
- }),
375
-
376
- mockCreateIsobmffTrack({
377
- complete: true,
378
- id: "track-1",
379
- fileId: "123",
380
- filename: "test.mp4",
381
- fixture: test2Mp4!,
382
- }),
383
-
384
- mockCreateIsobmffTrack({
385
- complete: true,
386
- id: "track-2",
387
- fileId: "123",
388
- filename: "test.mp4",
389
- fixture: test2Mp4!,
390
- }),
391
-
392
- mockUploadIsobmffFileIndex({
393
- id: "123",
394
- complete: true,
395
- }),
396
- );
397
- server.use(
398
- mockCreateIsobmffFile({
399
- complete: true,
400
- id: "123",
401
- filename: "test.mp4",
402
- fixture: testMp4!,
403
- }),
404
- mockCreateIsobmffFile({
405
- complete: true,
406
- id: "123",
407
- filename: "test.mp4",
408
- fixture: testMp4!,
409
- }),
410
- mockCreateIsobmffFile({
411
- complete: true,
412
- id: "123",
413
- filename: "test.mp4",
414
- fixture: testMp4!,
415
- }),
416
-
417
- mockCreateIsobmffTrack({
418
- complete: true,
419
- id: "track-1",
420
- fileId: "123",
421
- filename: "test.mp4",
422
- fixture: test2Mp4!,
423
- }),
424
-
425
- mockCreateIsobmffTrack({
426
- complete: true,
427
- id: "track-2",
428
- fileId: "123",
429
- filename: "test.mp4",
430
- fixture: test2Mp4!,
431
- }),
432
-
433
- mockUploadIsobmffFileIndex({
434
- id: "123",
435
- complete: true,
436
- }),
437
- );
438
-
439
- await generateTrackFragmentIndex(testMp4!);
440
- await generateTrack(testMp4!, 1);
441
- await generateTrack(testMp4!, 2);
442
-
443
- await generateTrackFragmentIndex(test2Mp4!);
444
- await generateTrack(test2Mp4!, 1);
445
- await generateTrack(test2Mp4!, 2);
446
- await syncAssetsDirectory();
447
-
448
- await expectCacheFiles(test2Mp4!, [
449
- "isobmff.info",
450
- "test.mp4.track-1.mp4",
451
- "test.mp4.track-1.mp4.info",
452
- "test.mp4.track-2.mp4",
453
- "test.mp4.track-2.mp4.info",
454
- "test.mp4.tracks.json",
455
-
456
- "test.mp4.tracks.json.info",
457
- "test2.mp4.track-1.mp4",
458
- "test2.mp4.track-1.mp4.info",
459
- "test2.mp4.track-2.mp4",
460
- "test2.mp4.track-2.mp4.info",
461
- "test2.mp4.tracks.json",
462
- "test2.mp4.tracks.json.info",
463
- ]);
464
-
465
- await expectInfoFileContent("isobmff.info", testMp4!, {
466
- byte_size: 31,
467
- complete: true,
468
- id: "123",
469
- });
470
-
471
- await expectInfoFileContent("test2.mp4.tracks.json.info", testMp4!, {
472
- byte_size: 31,
473
- complete: true,
474
- id: "123",
475
- });
476
-
477
- await expectInfoFileContent("test2.mp4.track-1.mp4.info", testMp4!, {
478
- byte_size: 26434,
479
- complete: true,
480
- id: "123:track-1",
481
- });
482
-
483
- await expectInfoFileContent("test2.mp4.track-2.mp4.info", testMp4!, {
484
- byte_size: 26434,
485
- complete: true,
486
- id: "123:track-2",
487
- });
488
-
489
- await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
490
- byte_size: 31,
491
- complete: true,
492
- id: "123",
493
- });
494
-
495
- await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
496
- byte_size: 26434,
497
- complete: true,
498
- id: "123:track-1",
499
- });
500
-
501
- await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
502
- byte_size: 26434,
503
- complete: true,
504
- id: "123:track-2",
505
- });
506
- },
507
- );
508
- });
509
- });
510
- });
@@ -1,91 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- import { doAssetSync } from "./syncAssetsDirectory/doAssetSync.js";
4
- import { getAssetSync } from "./syncAssetsDirectory/SubAssetSync.js";
5
-
6
- export const syncAssetDirectory = async (
7
- /**
8
- * Project directory will be used as the base to find an assets directory.
9
- * Assets will be synced from `<projectDirectory>/src/assets`
10
- */
11
- cacheDir: string,
12
- ) => {
13
- const stat = await fs.stat(cacheDir).catch((error) => {
14
- if (error.code === "ENOENT") {
15
- return;
16
- }
17
- throw error;
18
- });
19
-
20
- if (!stat?.isDirectory()) {
21
- console.error(`No assets cache directory found at ${cacheDir}`);
22
- return;
23
- }
24
- const assets = await fs.readdir(cacheDir);
25
-
26
- process.stderr.write(`Syncing asset dir: ${cacheDir}\n`);
27
-
28
- const errors: Record<string, string[]> = {};
29
-
30
- const reportError = (path: string, message: string) => {
31
- errors[path] ||= [];
32
- errors[path].push(message);
33
- process.stderr.write(` 🚫 ${message}\n`);
34
- };
35
-
36
- const reportSuccess = (_path: string, message: string) => {
37
- process.stderr.write(` āœ… ${message}\n`);
38
- };
39
-
40
- const reportInfo = (_path: string, message: string) => {
41
- process.stderr.write(` ${message}\n`);
42
- };
43
-
44
- for (const assetMd5 of assets) {
45
- reportInfo(assetMd5, `Syncing asset: ${assetMd5}`);
46
- const assetDir = path.join(cacheDir, assetMd5);
47
- const stat = await fs.stat(assetDir);
48
- if (!stat.isDirectory()) {
49
- reportError(assetMd5, "Invalid asset. Did not find asset directory.");
50
- return;
51
- }
52
- const subAssets = await fs.readdir(assetDir);
53
-
54
- for (const subAsset of subAssets) {
55
- if (subAsset.endsWith(".info")) {
56
- // skip .info files, they are not assets
57
- continue;
58
- }
59
- const subAssetPath = path.join(assetDir, subAsset);
60
-
61
- try {
62
- const assetSync = getAssetSync(subAssetPath, assetMd5);
63
- for await (const { status, message } of doAssetSync(assetSync)) {
64
- if (status === "success") {
65
- reportSuccess(subAsset, message);
66
- } else if (status === "info") {
67
- reportInfo(subAsset, message);
68
- }
69
- }
70
- } catch (error) {
71
- if (error instanceof Error) {
72
- reportError(subAsset, error.message);
73
- } else {
74
- reportError(subAsset, "Unknown error");
75
- }
76
- }
77
- }
78
- }
79
-
80
- if (Object.keys(errors).length) {
81
- process.stderr.write("\n\nāŒ Encountered errors while syncing assets:\n");
82
- for (const [asset, messages] of Object.entries(errors)) {
83
- process.stderr.write(`\n🚫 ${asset}\n`);
84
- for (const message of messages) {
85
- process.stderr.write(` - ${message}\n`);
86
- }
87
- }
88
-
89
- throw new Error("Failed to sync assets");
90
- }
91
- };
@@ -1,16 +0,0 @@
1
- import type { EFTimegroup } from "@editframe/elements";
2
- import type { Page } from "playwright";
3
-
4
- export const attachWorkbench = (page: Page) => {
5
- page.on("load", buildWorkbench.bind(null, page));
6
- buildWorkbench(page);
7
- };
8
-
9
- const buildWorkbench = async (page: Page) => {
10
- await page.evaluate(async () => {
11
- const rootTimegroup = document.body.querySelector("ef-timegroup") as
12
- | EFTimegroup
13
- | undefined;
14
- rootTimegroup?.wrapWithWorkbench();
15
- });
16
- };