@lumen5/framefusion 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadurl.test.js","sourceRoot":"","sources":["../../test/downloadurl.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EAAE,MAAM,EAChB,EAAE,EACL,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,iEAAiE,CAAC;QAC9E,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;QAE7B,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAG,EAAE;QACtC,MAAM,GAAG,GAAG,iEAAiE,CAAC;QAC9E,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QAEtC,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACjD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ declare global {
2
+ namespace jest {
3
+ interface Matchers<R> {
4
+ toMatchImageSnapshot(): R;
5
+ }
6
+ }
7
+ }
8
+ export {};
@@ -0,0 +1,362 @@
1
+ import { readFileSync, readdirSync } from 'fs';
2
+ import { performance } from 'perf_hooks';
3
+ import httpServer from 'http-server';
4
+ import { rimraf } from 'rimraf';
5
+ import { describe, it, expect, beforeAll, beforeEach, afterAll } from 'vitest';
6
+ import sinon from 'sinon';
7
+ import { toMatchImageSnapshot } from 'jest-image-snapshot';
8
+ import { fileExistsSync } from 'tsconfig-paths/lib/filesystem';
9
+ import { BeamcoderExtractor } from '../framefusion';
10
+ const TEST_SERVER_PORT = 4242;
11
+ expect.extend({ toMatchImageSnapshot });
12
+ const TEST_VIDEO = './test/samples/bbb10m.mp4';
13
+ const TEST_VIDEO_SMALLER = './test/samples/bbb-smaller.mp4';
14
+ const TEST_VIDEO_LOW_FRAMERATE = './test/samples/bbb-low-fps.mp4';
15
+ // TODOS
16
+ // There are a few sleeps (timeouts) to probably remove
17
+ describe('framefusion', () => {
18
+ let server;
19
+ beforeEach(async () => {
20
+ await rimraf('./output/*', { glob: true });
21
+ console.log('Removed previous results in output/');
22
+ });
23
+ beforeAll(async () => {
24
+ await rimraf('./output/*', { glob: true });
25
+ console.log('Removed previous results in output/');
26
+ server = httpServer.createServer();
27
+ await new Promise(resolve => {
28
+ server.listen({
29
+ port: TEST_SERVER_PORT,
30
+ }, () => {
31
+ console.log(`Server running on port ${TEST_SERVER_PORT}`);
32
+ resolve();
33
+ });
34
+ });
35
+ });
36
+ afterAll(() => {
37
+ server.close();
38
+ });
39
+ it('Should get duration', async () => {
40
+ // Arrange
41
+ const extractor = await BeamcoderExtractor.create({
42
+ inputFileOrUrl: TEST_VIDEO,
43
+ outputFile: './output/frame-%04d.png',
44
+ });
45
+ // Act
46
+ const duration = extractor.duration;
47
+ // Assert
48
+ expect(duration).to.eq(10);
49
+ // Cleanup
50
+ extractor.dispose();
51
+ });
52
+ it('should get width', async () => {
53
+ // Arrange
54
+ const extractor = await BeamcoderExtractor.create({
55
+ inputFileOrUrl: TEST_VIDEO,
56
+ outputFile: './output/frame-%04d.png',
57
+ });
58
+ // Act
59
+ const width = extractor.width;
60
+ // Assert
61
+ expect(width).to.eq(1920);
62
+ // Cleanup
63
+ extractor.dispose();
64
+ });
65
+ it('Should get height', async () => {
66
+ // Arrange
67
+ const extractor = await BeamcoderExtractor.create({
68
+ inputFileOrUrl: TEST_VIDEO,
69
+ outputFile: './output/frame-%04d.png',
70
+ });
71
+ // Act
72
+ const height = extractor.height;
73
+ // Assert
74
+ expect(height).to.eq(1080);
75
+ // Cleanup
76
+ extractor.dispose();
77
+ });
78
+ describe('Continuous dumping', () => {
79
+ it('Should dump an entire mp4 [smaller video version]', async () => {
80
+ // Arrange
81
+ const extractor = await BeamcoderExtractor.create({
82
+ inputFileOrUrl: TEST_VIDEO_SMALLER,
83
+ outputFile: './output/frame-%04d.png',
84
+ threadCount: 8,
85
+ });
86
+ // Act
87
+ const p1 = performance.now();
88
+ await extractor.readFrames();
89
+ const p2 = performance.now();
90
+ console.log('Time to dump all frames (ms): ', p2 - p1);
91
+ await new Promise(resolve => setTimeout(resolve, 1000));
92
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
93
+ expect(fileExistsSync('./output/frame-0600.png')).to.be.true;
94
+ // Cleanup
95
+ extractor.dispose();
96
+ }, 50000);
97
+ it('Should read a mp4 - without dumping frames', async () => {
98
+ // Arrange
99
+ const extractor = await BeamcoderExtractor.create({
100
+ inputFileOrUrl: TEST_VIDEO_SMALLER,
101
+ threadCount: 8,
102
+ });
103
+ // Act
104
+ const onFrameAvailable = sinon.spy(() => {
105
+ return true;
106
+ });
107
+ const p1 = performance.now();
108
+ await extractor.readFrames({ onFrameAvailable });
109
+ const p2 = performance.now();
110
+ console.log('Time to dump all frames (ms): ', p2 - p1);
111
+ await new Promise(resolve => setTimeout(resolve, 1000));
112
+ expect(onFrameAvailable.callCount).to.equal(600);
113
+ // We should only have the .gitkeep
114
+ expect(readdirSync('./output/')).to.have.lengthOf(1);
115
+ // Cleanup
116
+ extractor.dispose();
117
+ }, 50000);
118
+ it.concurrent('Should read a mp4 with specified pixel format', async () => {
119
+ // Arrange
120
+ const extractor = await BeamcoderExtractor.create({
121
+ inputFileOrUrl: TEST_VIDEO_SMALLER,
122
+ threadCount: 8,
123
+ outputPixelFormat: 'argb',
124
+ });
125
+ // Act
126
+ const frame = await extractor.getFrameAtTime(1);
127
+ // Assert
128
+ expect(frame.format).to.equal('argb');
129
+ // Cleanup
130
+ extractor.dispose();
131
+ }, 50000);
132
+ it('Should seek and dump frames', async () => {
133
+ // Arrange
134
+ const extractor = await BeamcoderExtractor.create({
135
+ inputFileOrUrl: TEST_VIDEO_SMALLER,
136
+ outputFile: './output/frame-%04d.png',
137
+ threadCount: 8,
138
+ });
139
+ // Act
140
+ const p1 = performance.now();
141
+ await extractor.seekToPTS(150016);
142
+ await extractor.readFrames();
143
+ const p2 = performance.now();
144
+ console.log('Time to dump all frames (ms): ', p2 - p1);
145
+ await new Promise(resolve => setTimeout(resolve, 1000));
146
+ // Assert
147
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
148
+ expect(fileExistsSync('./output/frame-0014.png')).to.be.true;
149
+ // There are only 13 frames after 150016, so this one should not exist
150
+ expect(fileExistsSync('./output/frame-0015.png')).to.be.false;
151
+ // Cleanup
152
+ extractor.dispose();
153
+ }, 50000);
154
+ it('Should seek and dump frames precisely', async () => {
155
+ // Arrange
156
+ const extractor = await BeamcoderExtractor.create({
157
+ inputFileOrUrl: './test/samples/countTo60.mp4',
158
+ outputFile: './output/frame-%04d.png',
159
+ threadCount: 8,
160
+ });
161
+ // Act
162
+ const p1 = performance.now();
163
+ await extractor.seekToPTS(29696);
164
+ await extractor.readFrames();
165
+ const p2 = performance.now();
166
+ console.log('Time to dump all frames (ms): ', p2 - p1);
167
+ await new Promise(resolve => setTimeout(resolve, 1000));
168
+ // Assert
169
+ // There should be only 2 frames
170
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
171
+ expect(fileExistsSync('./output/frame-0002.png')).to.be.true;
172
+ expect(fileExistsSync('./output/frame-0003.png')).to.be.false;
173
+ expect(readFileSync('./output/frame-0001.png')).toMatchImageSnapshot();
174
+ expect(readFileSync('./output/frame-0002.png')).toMatchImageSnapshot();
175
+ // Cleanup
176
+ extractor.dispose();
177
+ }, 50000);
178
+ it('Should dump frames and pause in-between', async () => {
179
+ // Arrange
180
+ const extractor = await BeamcoderExtractor.create({
181
+ inputFileOrUrl: './test/samples/countTo60.mp4',
182
+ outputFile: './output/frame-%04d.png',
183
+ threadCount: 8,
184
+ });
185
+ // Act
186
+ // Array generated with
187
+ // ffprobe -show_frames samples/bbb-smaller.mp4 | grep pts_time | head -n 5 | sed 's/pts_time=//g'
188
+ await extractor.seekToTime(0);
189
+ const count = 0;
190
+ const onFrameAvailable = async (frame) => {
191
+ return count < 4;
192
+ };
193
+ await extractor.readFrames({
194
+ onFrameAvailable,
195
+ });
196
+ // Assert
197
+ expect(readFileSync('./output/frame-0001.png')).toMatchImageSnapshot();
198
+ expect(readFileSync('./output/frame-0002.png')).toMatchImageSnapshot();
199
+ expect(readFileSync('./output/frame-0003.png')).toMatchImageSnapshot();
200
+ expect(readFileSync('./output/frame-0004.png')).toMatchImageSnapshot();
201
+ // Cleanup
202
+ extractor.dispose();
203
+ }, 50000);
204
+ });
205
+ describe('Dump frame at time', () => {
206
+ it.concurrent('Should seek and dump all frames in the video', async () => {
207
+ // Arrange
208
+ const extractor = await BeamcoderExtractor.create({
209
+ inputFileOrUrl: './test/samples/countTo60.mp4',
210
+ threadCount: 8,
211
+ });
212
+ // Sample at the middle of each frame
213
+ const FRAME_SYNC_DELTA = (1 / 30.0) / 2.0;
214
+ // Act & assert
215
+ for (let i = 0; i < 60; i++) {
216
+ const frame = await extractor.getFrameAtTime(i / 30.0 + FRAME_SYNC_DELTA);
217
+ expect(Math.floor(extractor.ptsToTime(frame.pts) * 30)).to.equal(i);
218
+ }
219
+ // Cleanup
220
+ extractor.dispose();
221
+ }, 2000);
222
+ it.concurrent('Should seek and dump all frames in the video [other video]', async () => {
223
+ // Arrange
224
+ const extractor = await BeamcoderExtractor.create({
225
+ inputFileOrUrl: TEST_VIDEO_LOW_FRAMERATE,
226
+ threadCount: 8,
227
+ });
228
+ // Sample at the middle of each frame
229
+ const FRAME_SYNC_DELTA = (1 / 30.0) / 2.0;
230
+ // Act & assert
231
+ for (let i = 0; i < extractor.duration * 30.0; i++) {
232
+ const frame = await extractor.getFrameAtTime(i / 30.0 + FRAME_SYNC_DELTA);
233
+ expect(Math.floor(extractor.ptsToTime(frame.pts) * 30)).to.be.closeTo(i, 15);
234
+ }
235
+ // Cleanup
236
+ extractor.dispose();
237
+ }, 10000);
238
+ it.concurrent('Should seek and dump frames at different points in the video', async () => {
239
+ // Arrange
240
+ const extractor = await BeamcoderExtractor.create({
241
+ inputFileOrUrl: './test/samples/countTo60.mp4',
242
+ threadCount: 8,
243
+ });
244
+ // Sample at the middle of each frame
245
+ const FRAME_SYNC_DELTA = (1 / 30.0) / 2.0;
246
+ // Act & assert
247
+ // This should be the frame displaying number 10
248
+ const f1 = await extractor.getFrameAtTime(0.300000 + FRAME_SYNC_DELTA);
249
+ expect(f1.pts).to.eq(4608);
250
+ // This should be the frame displaying number 11
251
+ const f2 = await extractor.getFrameAtTime(0.333333 + FRAME_SYNC_DELTA);
252
+ expect(f2.pts).to.eq(5120);
253
+ // Now skip a few more frames:
254
+ // This should be the frame displaying number 13
255
+ const f3 = await extractor.getFrameAtTime(0.400000 + FRAME_SYNC_DELTA);
256
+ expect(f3.pts).to.eq(6144);
257
+ // Now skip pretty far:
258
+ // This should be the frame displaying number 59
259
+ const f4 = await extractor.getFrameAtTime(1.933333 + FRAME_SYNC_DELTA);
260
+ expect(f4.pts).to.eq(29696);
261
+ // This should be the frame displaying number 60
262
+ const f5 = await extractor.getFrameAtTime(1.966667 + FRAME_SYNC_DELTA);
263
+ expect(f5.pts).to.eq(30208);
264
+ // Cleanup
265
+ extractor.dispose();
266
+ }, 50000);
267
+ it.concurrent('Should seek and dump frames in a video [big video]', async () => {
268
+ // Arrange
269
+ const extractor = await BeamcoderExtractor.create({
270
+ inputFileOrUrl: TEST_VIDEO,
271
+ threadCount: 8,
272
+ });
273
+ // Sample at the middle of each frame
274
+ const FRAME_SYNC_DELTA = (1 / 60.0) / 2.0;
275
+ // Act & assert
276
+ const p1 = performance.now();
277
+ for (let i = 0; i < 3; i++) {
278
+ const frame = await extractor.getFrameAtTime(i / 60.0 + FRAME_SYNC_DELTA);
279
+ expect(Math.round(extractor.ptsToTime(frame.pts) * 60)).to.equal(i);
280
+ }
281
+ const p2 = performance.now();
282
+ console.log('Time to interpolate all frames (fast) and dump all frames (ms): ', p2 - p1);
283
+ // Cleanup
284
+ extractor.dispose();
285
+ }, 30000);
286
+ });
287
+ it('Should interpolate frames (fast)', async () => {
288
+ // Arrange
289
+ const extractor = await BeamcoderExtractor.create({
290
+ inputFileOrUrl: TEST_VIDEO_LOW_FRAMERATE,
291
+ outputFile: './output/frame-%04d.png',
292
+ threadCount: 8,
293
+ interpolateFps: 25,
294
+ interpolateMode: 'fast',
295
+ });
296
+ // Act
297
+ const p1 = performance.now();
298
+ let count = 0;
299
+ await extractor.readFrames({
300
+ async onFrameAvailable() {
301
+ count++;
302
+ return true;
303
+ },
304
+ });
305
+ const p2 = performance.now();
306
+ console.log('Time to interpolate all frames (fast) and dump all frames (ms): ', p2 - p1);
307
+ await new Promise(resolve => setTimeout(resolve, 1000));
308
+ expect(count).to.be.greaterThan(240);
309
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
310
+ expect(fileExistsSync('./output/frame-0241.png')).to.be.true;
311
+ // Cleanup
312
+ extractor.dispose();
313
+ }, 200000);
314
+ it('Should minterpolate frames (high-quality)', async () => {
315
+ // Arrange
316
+ const extractor = await BeamcoderExtractor.create({
317
+ inputFileOrUrl: TEST_VIDEO_LOW_FRAMERATE,
318
+ outputFile: './output/frame-%04d.png',
319
+ threadCount: 8,
320
+ interpolateFps: 25,
321
+ interpolateMode: 'high-quality',
322
+ });
323
+ // Act
324
+ const p1 = performance.now();
325
+ let count = 0;
326
+ await extractor.readFrames({
327
+ async onFrameAvailable() {
328
+ count++;
329
+ return true;
330
+ },
331
+ });
332
+ const p2 = performance.now();
333
+ console.log('Time to interpolate (high-quality) and dump all frames (ms): ', p2 - p1);
334
+ await new Promise(resolve => setTimeout(resolve, 1000));
335
+ expect(count).to.be.greaterThan(240);
336
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
337
+ expect(fileExistsSync('./output/frame-0241.png')).to.be.true;
338
+ // Cleanup
339
+ extractor.dispose();
340
+ }, 200000);
341
+ it('Should open a file from the network and dump all frames [smaller video version]', async () => {
342
+ // Arrange
343
+ const extractor = await BeamcoderExtractor.create({
344
+ inputFileOrUrl: `http://127.0.0.1:${TEST_SERVER_PORT}/test/samples/bbb-smaller-faststart.mp4`,
345
+ outputFile: './output/frame-%04d.png',
346
+ });
347
+ // Act
348
+ const p1 = performance.now();
349
+ await extractor.readFrames();
350
+ const p2 = performance.now();
351
+ console.log('Time to dump all frames through local network (ms): ', p2 - p1);
352
+ // Assert
353
+ expect(fileExistsSync('./output/frame-0001.png')).to.be.true;
354
+ expect(fileExistsSync('./output/frame-0600.png')).to.be.true;
355
+ // Cleanup
356
+ extractor.dispose();
357
+ }, 50000);
358
+ it.skip('Encode frames to mp4', async () => {
359
+ expect(false).to.be.true;
360
+ });
361
+ });
362
+ //# sourceMappingURL=framefusion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framefusion.test.js","sourceRoot":"","sources":["../../test/framefusion.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vite").UserConfigExport;
2
+ export default _default;
@@ -0,0 +1,35 @@
1
+ import path from 'path';
2
+ import { defineConfig } from 'vite';
3
+ import eslint from 'vite-plugin-eslint';
4
+ import autoExternal from 'rollup-plugin-auto-external';
5
+ // https://vitejs.dev/config/
6
+ export default defineConfig({
7
+ build: {
8
+ lib: {
9
+ entry: path.resolve(__dirname, 'framefusion.ts'),
10
+ name: 'framefusion.ts',
11
+ fileName: (format) => {
12
+ if (format === 'es') {
13
+ return 'framefusion.es.js';
14
+ }
15
+ if (format === 'cjs') {
16
+ return 'framefusion.cjs';
17
+ }
18
+ throw new Error(`Please provide a fileName for ${format}`);
19
+ },
20
+ formats: ['es', 'cjs'],
21
+ },
22
+ rollupOptions: {
23
+ external: ['node:https'],
24
+ },
25
+ sourcemap: true,
26
+ },
27
+ define: {
28
+ global: {},
29
+ },
30
+ optimizeDeps: {
31
+ disabled: true,
32
+ },
33
+ plugins: [autoExternal(), eslint()],
34
+ });
35
+ //# sourceMappingURL=vite.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,YAAY,MAAM,6BAA6B,CAAC;AAEvD,6BAA6B;AAC7B,eAAe,YAAY,CAAC;IACxB,KAAK,EAAE;QACH,GAAG,EAAE;YACD,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC;YAChD,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,MAAM,KAAK,IAAI,EAAE;oBACjB,OAAO,mBAAmB,CAAC;iBAC9B;gBACD,IAAI,MAAM,KAAK,KAAK,EAAE;oBAClB,OAAO,iBAAiB,CAAC;iBAC5B;gBAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;SACzB;QACD,aAAa,EAAE;YACX,QAAQ,EAAE,CAAC,YAAY,CAAC;SAC3B;QACD,SAAS,EAAE,IAAI;KAClB;IACD,MAAM,EAAE;QACJ,MAAM,EAAE,EAAE;KACb;IACD,YAAY,EAAE;QACV,QAAQ,EAAE,IAAI;KACjB;IACD,OAAO,EAAE,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;CACtC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vitest/dist/config").UserConfigExport;
2
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ // https://vitejs.dev/config/
3
+ export default defineConfig({
4
+ test: {
5
+ setupFiles: 'vitest.global.ts',
6
+ globals: true,
7
+ },
8
+ });
9
+ //# sourceMappingURL=vitest.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,6BAA6B;AAC7B,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,UAAU,EAAE,kBAAkB;QAC9B,OAAO,EAAE,IAAI;KAChB;CACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { afterEach } from 'vitest';
2
+ afterEach(() => {
3
+ // Nothing for now
4
+ });
5
+ //# sourceMappingURL=vitest.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.global.js","sourceRoot":"","sources":["../vitest.global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,SAAS,CAAC,GAAG,EAAE;IACX,kBAAkB;AACtB,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@lumen5/framefusion",
3
+ "version": "0.0.3",
4
+ "type": "module",
5
+ "scripts": {
6
+ "docs": "typedoc framefusion.ts",
7
+ "tsc": "tsc",
8
+ "build": "tsc && vite build && tsc --declaration",
9
+ "prepare": "yarn run build",
10
+ "preview": "vite preview",
11
+ "test-once": "vitest run",
12
+ "test": "vitest",
13
+ "test:debug": "vitest --inspect-brk --single-thread",
14
+ "test-ui": "vitest --ui",
15
+ "vite-node": "vite-node",
16
+ "dev": " yarn run build && node dist/framefusion.es.js",
17
+ "debug": " yarn run build && node --enable-source-maps --inspect-brk dist/framefusion.es.js",
18
+ "lint": "eslint ./ --ext .js,.ts"
19
+ },
20
+ "dependencies": {
21
+ "beamcoder": "^0.7.1",
22
+ "fs-extra": "^11.1.1",
23
+ "got": "^12.6.0",
24
+ "http-server": "^14.1.1",
25
+ "rollup-plugin-auto-external": "^2.0.0",
26
+ "tmp": "^0.2.1",
27
+ "tsconfig-paths": "^4.1.2"
28
+ },
29
+ "devDependencies": {
30
+ "@types/chai": "^4.3.4",
31
+ "@types/express": "^4.17.17",
32
+ "@types/http-server": "^0.12.1",
33
+ "@types/mocha": "^10.0.1",
34
+ "@types/node": "^18.14.6",
35
+ "@types/sinon": "^10.0.13",
36
+ "@typescript-eslint/eslint-plugin": "^5.59.0",
37
+ "@typescript-eslint/parser": "^5.59.0",
38
+ "@vitest/ui": "^0.29.8",
39
+ "eslint": "^8.38.0",
40
+ "eslint-config-standard": "^17.0.0",
41
+ "eslint-plugin-import": "^2.27.5",
42
+ "eslint-plugin-node": "^11.1.0",
43
+ "eslint-plugin-promise": "^6.1.1",
44
+ "eslint-plugin-standard": "^5.0.0",
45
+ "eslint-plugin-vitest": "^0.1.4",
46
+ "express": "^4.18.2",
47
+ "jest-image-snapshot": "^6.1.0",
48
+ "rimraf": "^4.4.1",
49
+ "sinon": "^15.0.3",
50
+ "typedoc": "^0.24.1",
51
+ "typescript": "^4.9.5",
52
+ "vite": "^4.1.0",
53
+ "vite-node": "^0.29.2",
54
+ "vite-plugin-eslint": "^1.8.1",
55
+ "vitest": "^0.29.2"
56
+ },
57
+ "description": "Video library",
58
+ "main": "./dist/framefusion.js",
59
+ "exports": {
60
+ ".": {
61
+ "require": "./dist/framefusion.cjs",
62
+ "import": "./dist/framefusion.es.js",
63
+ "types": "./dist/framefusion.d.ts"
64
+ }
65
+ },
66
+ "files": [
67
+ "dist/*"
68
+ ]
69
+ }