screenci 0.0.4 → 0.0.5
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/README.md +227 -0
- package/cli.ts +1111 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +896 -0
- package/dist/cli.js.map +1 -0
- package/dist/e2e/instrument.e2e.d.ts +2 -0
- package/dist/e2e/instrument.e2e.d.ts.map +1 -0
- package/dist/e2e/instrument.e2e.js +661 -0
- package/dist/e2e/instrument.e2e.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/playwright.config.d.ts +3 -0
- package/dist/playwright.config.d.ts.map +1 -0
- package/dist/playwright.config.js +21 -0
- package/dist/playwright.config.js.map +1 -0
- package/dist/reporter.d.ts +9 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +49 -0
- package/dist/reporter.js.map +1 -0
- package/dist/src/asset.d.ts +90 -0
- package/dist/src/asset.d.ts.map +1 -0
- package/dist/src/asset.js +74 -0
- package/dist/src/asset.js.map +1 -0
- package/dist/src/autoZoom.d.ts +40 -0
- package/dist/src/autoZoom.d.ts.map +1 -0
- package/dist/src/autoZoom.js +88 -0
- package/dist/src/autoZoom.js.map +1 -0
- package/dist/src/caption.d.ts +152 -0
- package/dist/src/caption.d.ts.map +1 -0
- package/dist/src/caption.js +240 -0
- package/dist/src/caption.js.map +1 -0
- package/dist/src/caption.test-d.d.ts +2 -0
- package/dist/src/caption.test-d.d.ts.map +1 -0
- package/dist/src/caption.test-d.js +50 -0
- package/dist/src/caption.test-d.js.map +1 -0
- package/dist/src/config.d.ts +42 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +147 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/defaults.d.ts +63 -0
- package/dist/src/defaults.d.ts.map +1 -0
- package/dist/src/defaults.js +66 -0
- package/dist/src/defaults.js.map +1 -0
- package/dist/src/dimensions.d.ts +29 -0
- package/dist/src/dimensions.d.ts.map +1 -0
- package/dist/src/dimensions.js +47 -0
- package/dist/src/dimensions.js.map +1 -0
- package/dist/src/events.d.ts +203 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +227 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/hide.d.ts +27 -0
- package/dist/src/hide.d.ts.map +1 -0
- package/dist/src/hide.js +49 -0
- package/dist/src/hide.js.map +1 -0
- package/dist/src/instrument.d.ts +15 -0
- package/dist/src/instrument.d.ts.map +1 -0
- package/dist/src/instrument.js +910 -0
- package/dist/src/instrument.js.map +1 -0
- package/dist/src/logger.d.ts +7 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +13 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/reporter.d.ts +9 -0
- package/dist/src/reporter.d.ts.map +1 -0
- package/dist/src/reporter.js +50 -0
- package/dist/src/reporter.js.map +1 -0
- package/dist/src/sanitize.d.ts +5 -0
- package/dist/src/sanitize.d.ts.map +1 -0
- package/dist/src/sanitize.js +11 -0
- package/dist/src/sanitize.js.map +1 -0
- package/dist/src/types.d.ts +544 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/video.d.ts +138 -0
- package/dist/src/video.d.ts.map +1 -0
- package/dist/src/video.js +415 -0
- package/dist/src/video.js.map +1 -0
- package/dist/src/voices.d.ts +60 -0
- package/dist/src/voices.d.ts.map +1 -0
- package/dist/src/voices.js +42 -0
- package/dist/src/voices.js.map +1 -0
- package/dist/src/xvfb.d.ts +22 -0
- package/dist/src/xvfb.d.ts.map +1 -0
- package/dist/src/xvfb.js +87 -0
- package/dist/src/xvfb.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +45 -4
- package/bin/index.js +0 -3
- package/index.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AspectRatio, FPS, Quality, Trace, RecordOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default zoom amount (fraction of output dimensions for the zoomed viewport)
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_ZOOM_AMOUNT: number;
|
|
6
|
+
/**
|
|
7
|
+
* Default zoom transition duration in milliseconds
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_ZOOM_DURATION: number;
|
|
10
|
+
/**
|
|
11
|
+
* Default delay in milliseconds after zoom-in and zoom-out animations
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_POST_ZOOM_IN_OUT_DELAY: number;
|
|
14
|
+
/**
|
|
15
|
+
* Default zoom transition easing function
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_ZOOM_EASING: string;
|
|
18
|
+
/**
|
|
19
|
+
* Default aspect ratio for recording and output
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_ASPECT_RATIO: AspectRatio;
|
|
22
|
+
/**
|
|
23
|
+
* Default resolution quality preset
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_QUALITY: Quality;
|
|
26
|
+
/**
|
|
27
|
+
* Default frames per second for video recording
|
|
28
|
+
*/
|
|
29
|
+
export declare const DEFAULT_FPS: FPS;
|
|
30
|
+
/**
|
|
31
|
+
* Default trace recording mode
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEFAULT_TRACE: Trace;
|
|
34
|
+
/**
|
|
35
|
+
* Default setting for sending traces to screenci.com
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_SEND_TRACES: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Default directory for video files
|
|
40
|
+
*/
|
|
41
|
+
export declare const DEFAULT_VIDEO_DIR: string;
|
|
42
|
+
/**
|
|
43
|
+
* Default test timeout in milliseconds (30 minutes)
|
|
44
|
+
*/
|
|
45
|
+
export declare const DEFAULT_TIMEOUT: number;
|
|
46
|
+
/**
|
|
47
|
+
* Default action timeout in milliseconds (30 seconds)
|
|
48
|
+
*
|
|
49
|
+
* Keeps individual actions (click, fill, etc.) at a sane timeout
|
|
50
|
+
* independent of the long test timeout.
|
|
51
|
+
*/
|
|
52
|
+
export declare const DEFAULT_ACTION_TIMEOUT: number;
|
|
53
|
+
/**
|
|
54
|
+
* Default navigation timeout in milliseconds (30 seconds)
|
|
55
|
+
*
|
|
56
|
+
* Keeps page navigations at a sane timeout independent of the long test timeout.
|
|
57
|
+
*/
|
|
58
|
+
export declare const DEFAULT_NAVIGATION_TIMEOUT: number;
|
|
59
|
+
/**
|
|
60
|
+
* Default video options combining all video-related defaults
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEFAULT_VIDEO_OPTIONS: RecordOptions;
|
|
63
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,GAAG,EACH,OAAO,EACP,KAAK,EACL,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAY,CAAA;AAE9C;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAY,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAa,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAmB,CAAA;AAErD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAoB,CAAA;AAEvD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OAAiB,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,GAAQ,CAAA;AAElC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAA2B,CAAA;AAEvD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,OAAc,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAmB,CAAA;AAEnD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAuB,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAe,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAe,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAInC,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default zoom amount (fraction of output dimensions for the zoomed viewport)
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_ZOOM_AMOUNT = 0.5;
|
|
5
|
+
/**
|
|
6
|
+
* Default zoom transition duration in milliseconds
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_ZOOM_DURATION = 500;
|
|
9
|
+
/**
|
|
10
|
+
* Default delay in milliseconds after zoom-in and zoom-out animations
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_POST_ZOOM_IN_OUT_DELAY = 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Default zoom transition easing function
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_ZOOM_EASING = 'ease-out';
|
|
17
|
+
/**
|
|
18
|
+
* Default aspect ratio for recording and output
|
|
19
|
+
*/
|
|
20
|
+
export const DEFAULT_ASPECT_RATIO = '16:9';
|
|
21
|
+
/**
|
|
22
|
+
* Default resolution quality preset
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_QUALITY = '1080p';
|
|
25
|
+
/**
|
|
26
|
+
* Default frames per second for video recording
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_FPS = 30;
|
|
29
|
+
/**
|
|
30
|
+
* Default trace recording mode
|
|
31
|
+
*/
|
|
32
|
+
export const DEFAULT_TRACE = 'retain-on-failure';
|
|
33
|
+
/**
|
|
34
|
+
* Default setting for sending traces to screenci.com
|
|
35
|
+
*/
|
|
36
|
+
export const DEFAULT_SEND_TRACES = true;
|
|
37
|
+
/**
|
|
38
|
+
* Default directory for video files
|
|
39
|
+
*/
|
|
40
|
+
export const DEFAULT_VIDEO_DIR = './videos';
|
|
41
|
+
/**
|
|
42
|
+
* Default test timeout in milliseconds (30 minutes)
|
|
43
|
+
*/
|
|
44
|
+
export const DEFAULT_TIMEOUT = 30 * 60 * 1000;
|
|
45
|
+
/**
|
|
46
|
+
* Default action timeout in milliseconds (30 seconds)
|
|
47
|
+
*
|
|
48
|
+
* Keeps individual actions (click, fill, etc.) at a sane timeout
|
|
49
|
+
* independent of the long test timeout.
|
|
50
|
+
*/
|
|
51
|
+
export const DEFAULT_ACTION_TIMEOUT = 30_000;
|
|
52
|
+
/**
|
|
53
|
+
* Default navigation timeout in milliseconds (30 seconds)
|
|
54
|
+
*
|
|
55
|
+
* Keeps page navigations at a sane timeout independent of the long test timeout.
|
|
56
|
+
*/
|
|
57
|
+
export const DEFAULT_NAVIGATION_TIMEOUT = 30_000;
|
|
58
|
+
/**
|
|
59
|
+
* Default video options combining all video-related defaults
|
|
60
|
+
*/
|
|
61
|
+
export const DEFAULT_VIDEO_OPTIONS = {
|
|
62
|
+
aspectRatio: DEFAULT_ASPECT_RATIO,
|
|
63
|
+
quality: DEFAULT_QUALITY,
|
|
64
|
+
fps: DEFAULT_FPS,
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,GAAG,CAAA;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAW,GAAG,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAW,IAAI,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,UAAU,CAAA;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAgB,MAAM,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAY,OAAO,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAQ,EAAE,CAAA;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAU,mBAAmB,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAY,IAAI,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAW,UAAU,CAAA;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAErD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAW,MAAM,CAAA;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAW,MAAM,CAAA;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAkB;IAClD,WAAW,EAAE,oBAAoB;IACjC,OAAO,EAAE,eAAe;IACxB,GAAG,EAAE,WAAW;CACjB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AspectRatio, Quality } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compute pixel dimensions from an aspect ratio and quality preset.
|
|
4
|
+
*
|
|
5
|
+
* The `quality` value determines the shorter side in pixels:
|
|
6
|
+
* - `'720p'` → 720 px
|
|
7
|
+
* - `'1080p'` → 1080 px
|
|
8
|
+
* - `'1440p'` → 1440 px
|
|
9
|
+
* - `'2160p'` → 2160 px
|
|
10
|
+
*
|
|
11
|
+
* The `aspectRatio` then sets the longer dimension. For landscape ratios
|
|
12
|
+
* (W > H) height equals the base; for portrait ratios (H > W) width equals
|
|
13
|
+
* the base. Dimension table:
|
|
14
|
+
*
|
|
15
|
+
* | Aspect Ratio | 720p | 1080p | 1440p | 2160p |
|
|
16
|
+
* |--------------|-----------|------------|------------|------------|
|
|
17
|
+
* | 16:9 | 1280×720 | 1920×1080 | 2560×1440 | 3840×2160 |
|
|
18
|
+
* | 9:16 | 720×1280 | 1080×1920 | 1440×2560 | 2160×3840 |
|
|
19
|
+
* | 1:1 | 720×720 | 1080×1080 | 1440×1440 | 2160×2160 |
|
|
20
|
+
* | 4:3 | 960×720 | 1440×1080 | 1920×1440 | 2880×2160 |
|
|
21
|
+
* | 3:4 | 720×960 | 1080×1440 | 1440×1920 | 2160×2880 |
|
|
22
|
+
* | 5:4 | 900×720 | 1350×1080 | 1800×1440 | 2700×2160 |
|
|
23
|
+
* | 4:5 | 720×900 | 1080×1350 | 1440×1800 | 2160×2700 |
|
|
24
|
+
*/
|
|
25
|
+
export declare function getDimensions(aspectRatio: AspectRatio, quality: Quality): {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../../src/dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwBnC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute pixel dimensions from an aspect ratio and quality preset.
|
|
3
|
+
*
|
|
4
|
+
* The `quality` value determines the shorter side in pixels:
|
|
5
|
+
* - `'720p'` → 720 px
|
|
6
|
+
* - `'1080p'` → 1080 px
|
|
7
|
+
* - `'1440p'` → 1440 px
|
|
8
|
+
* - `'2160p'` → 2160 px
|
|
9
|
+
*
|
|
10
|
+
* The `aspectRatio` then sets the longer dimension. For landscape ratios
|
|
11
|
+
* (W > H) height equals the base; for portrait ratios (H > W) width equals
|
|
12
|
+
* the base. Dimension table:
|
|
13
|
+
*
|
|
14
|
+
* | Aspect Ratio | 720p | 1080p | 1440p | 2160p |
|
|
15
|
+
* |--------------|-----------|------------|------------|------------|
|
|
16
|
+
* | 16:9 | 1280×720 | 1920×1080 | 2560×1440 | 3840×2160 |
|
|
17
|
+
* | 9:16 | 720×1280 | 1080×1920 | 1440×2560 | 2160×3840 |
|
|
18
|
+
* | 1:1 | 720×720 | 1080×1080 | 1440×1440 | 2160×2160 |
|
|
19
|
+
* | 4:3 | 960×720 | 1440×1080 | 1920×1440 | 2880×2160 |
|
|
20
|
+
* | 3:4 | 720×960 | 1080×1440 | 1440×1920 | 2160×2880 |
|
|
21
|
+
* | 5:4 | 900×720 | 1350×1080 | 1800×1440 | 2700×2160 |
|
|
22
|
+
* | 4:5 | 720×900 | 1080×1350 | 1440×1800 | 2160×2700 |
|
|
23
|
+
*/
|
|
24
|
+
export function getDimensions(aspectRatio, quality) {
|
|
25
|
+
// Base size is the shorter side of the output frame.
|
|
26
|
+
const baseSize = {
|
|
27
|
+
'720p': 720,
|
|
28
|
+
'1080p': 1080,
|
|
29
|
+
'1440p': 1440,
|
|
30
|
+
'2160p': 2160,
|
|
31
|
+
};
|
|
32
|
+
const base = baseSize[quality];
|
|
33
|
+
// For landscape ratios (W > H): height = base, width = base × W/H.
|
|
34
|
+
// For portrait ratios (H > W): width = base, height = base × H/W.
|
|
35
|
+
// For square (1:1): both sides equal base.
|
|
36
|
+
const dimensions = {
|
|
37
|
+
'16:9': { width: (base * 16) / 9, height: base },
|
|
38
|
+
'9:16': { width: base, height: (base * 16) / 9 },
|
|
39
|
+
'1:1': { width: base, height: base },
|
|
40
|
+
'4:3': { width: (base * 4) / 3, height: base },
|
|
41
|
+
'3:4': { width: base, height: (base * 4) / 3 },
|
|
42
|
+
'5:4': { width: (base * 5) / 4, height: base },
|
|
43
|
+
'4:5': { width: base, height: (base * 5) / 4 },
|
|
44
|
+
};
|
|
45
|
+
return dimensions[aspectRatio];
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimensions.js","sourceRoot":"","sources":["../../src/dimensions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,aAAa,CAC3B,WAAwB,EACxB,OAAgB;IAEhB,qDAAqD;IACrD,MAAM,QAAQ,GAA4B;QACxC,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;KACd,CAAA;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE9B,mEAAmE;IACnE,oEAAoE;IACpE,uDAAuD;IACvD,MAAM,UAAU,GAA2D;QACzE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAChD,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;QAChD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QACpC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9C,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;QAC9C,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9C,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;KAC/C,CAAA;IAED,OAAO,UAAU,CAAC,WAAW,CAAC,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { AutoZoomOptions, CaptionConfig, Easing, RecordOptions, RenderOptions } from './types.js';
|
|
2
|
+
import type { VoiceKey } from './voices.js';
|
|
3
|
+
export type VideoStartEvent = {
|
|
4
|
+
type: 'videoStart';
|
|
5
|
+
timeMs: 0;
|
|
6
|
+
};
|
|
7
|
+
export type ElementRect = {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
};
|
|
13
|
+
export type MouseMoveEvent = {
|
|
14
|
+
type: 'mouseMove';
|
|
15
|
+
startMs: number;
|
|
16
|
+
endMs: number;
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
easing?: Easing;
|
|
20
|
+
zoomFollow?: boolean;
|
|
21
|
+
/** Bounding rect of the element the cursor moved to — used for zoom centering hints. */
|
|
22
|
+
elementRect?: ElementRect;
|
|
23
|
+
};
|
|
24
|
+
export type MouseDownEvent = {
|
|
25
|
+
type: 'mouseDown';
|
|
26
|
+
startMs: number;
|
|
27
|
+
endMs: number;
|
|
28
|
+
mouseSize?: number;
|
|
29
|
+
easing?: Easing;
|
|
30
|
+
};
|
|
31
|
+
export type MouseUpEvent = {
|
|
32
|
+
type: 'mouseUp';
|
|
33
|
+
startMs: number;
|
|
34
|
+
endMs: number;
|
|
35
|
+
easing?: Easing;
|
|
36
|
+
};
|
|
37
|
+
export type MouseShowEvent = {
|
|
38
|
+
type: 'mouseShow';
|
|
39
|
+
startMs: number;
|
|
40
|
+
endMs: number;
|
|
41
|
+
};
|
|
42
|
+
export type MouseHideEvent = {
|
|
43
|
+
type: 'mouseHide';
|
|
44
|
+
startMs: number;
|
|
45
|
+
endMs: number;
|
|
46
|
+
};
|
|
47
|
+
export type MouseWaitEvent = {
|
|
48
|
+
type: 'mouseWait';
|
|
49
|
+
startMs: number;
|
|
50
|
+
endMs: number;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* A recorded user input action containing one or more inner mouse events.
|
|
54
|
+
* mouseMove, mouseShow, and mouseHide subtypes each contain exactly one inner event.
|
|
55
|
+
* All input events must not overlap in time; recording will throw if they do.
|
|
56
|
+
* Captions are automatically prevented from falling inside any input event's time range.
|
|
57
|
+
*/
|
|
58
|
+
export type InputEvent = {
|
|
59
|
+
type: 'input';
|
|
60
|
+
subType: 'click' | 'pressSequentially' | 'tap' | 'check' | 'uncheck' | 'select' | 'mouseMove' | 'mouseShow' | 'mouseHide' | 'hover' | 'selectText' | 'dragTo';
|
|
61
|
+
elementRect?: ElementRect;
|
|
62
|
+
events: Array<MouseMoveEvent | MouseDownEvent | MouseUpEvent | MouseShowEvent | MouseHideEvent | MouseWaitEvent>;
|
|
63
|
+
};
|
|
64
|
+
export type CaptionTranslation = {
|
|
65
|
+
text: string;
|
|
66
|
+
voice: VoiceKey;
|
|
67
|
+
};
|
|
68
|
+
export type CaptionStartEvent = {
|
|
69
|
+
type: 'captionStart';
|
|
70
|
+
timeMs: number;
|
|
71
|
+
name: string;
|
|
72
|
+
/** Single-language API (backward compat) */
|
|
73
|
+
text?: string;
|
|
74
|
+
captionConfig?: CaptionConfig;
|
|
75
|
+
/** Multi-language API — all language translations keyed by language code */
|
|
76
|
+
translations?: Record<string, CaptionTranslation>;
|
|
77
|
+
};
|
|
78
|
+
export type CaptionUntilEvent = {
|
|
79
|
+
type: 'captionUntil';
|
|
80
|
+
timeMs: number;
|
|
81
|
+
percentage: number;
|
|
82
|
+
};
|
|
83
|
+
export type CaptionEndEvent = {
|
|
84
|
+
type: 'captionEnd';
|
|
85
|
+
timeMs: number;
|
|
86
|
+
};
|
|
87
|
+
/** File-based video caption translation — uses a pre-recorded asset. */
|
|
88
|
+
export type VideoCaptionTranslationFile = {
|
|
89
|
+
assetPath: string;
|
|
90
|
+
subtitle?: string;
|
|
91
|
+
};
|
|
92
|
+
/** TTS-based video caption translation — generates audio via text-to-speech. */
|
|
93
|
+
export type VideoCaptionTranslationTTS = {
|
|
94
|
+
text: string;
|
|
95
|
+
voice: VoiceKey;
|
|
96
|
+
};
|
|
97
|
+
export type VideoCaptionTranslation = VideoCaptionTranslationFile | VideoCaptionTranslationTTS;
|
|
98
|
+
export type VideoCaptionStartEvent = {
|
|
99
|
+
type: 'videoCaptionStart';
|
|
100
|
+
timeMs: number;
|
|
101
|
+
name: string;
|
|
102
|
+
/** Single-language API: absolute path to the pre-recorded audio/video file. */
|
|
103
|
+
assetPath?: string;
|
|
104
|
+
/** Optional subtitle text. Words are spread with equal timing at render time. */
|
|
105
|
+
subtitle?: string;
|
|
106
|
+
/** Multi-language API — per-language asset paths keyed by language code. */
|
|
107
|
+
translations?: Record<string, VideoCaptionTranslation>;
|
|
108
|
+
};
|
|
109
|
+
export type AssetStartEvent = {
|
|
110
|
+
type: 'assetStart';
|
|
111
|
+
timeMs: number;
|
|
112
|
+
name: string;
|
|
113
|
+
path: string;
|
|
114
|
+
audio: number;
|
|
115
|
+
fullScreen: boolean;
|
|
116
|
+
};
|
|
117
|
+
export type AssetEndEvent = {
|
|
118
|
+
type: 'assetEnd';
|
|
119
|
+
timeMs: number;
|
|
120
|
+
name: string;
|
|
121
|
+
};
|
|
122
|
+
export type HideStartEvent = {
|
|
123
|
+
type: 'hideStart';
|
|
124
|
+
timeMs: number;
|
|
125
|
+
};
|
|
126
|
+
export type HideEndEvent = {
|
|
127
|
+
type: 'hideEnd';
|
|
128
|
+
timeMs: number;
|
|
129
|
+
};
|
|
130
|
+
export type AutoZoomStartEvent = {
|
|
131
|
+
type: 'autoZoomStart';
|
|
132
|
+
timeMs: number;
|
|
133
|
+
easing: string;
|
|
134
|
+
duration: number;
|
|
135
|
+
amount: number;
|
|
136
|
+
centering?: {
|
|
137
|
+
cursor?: number;
|
|
138
|
+
input?: number;
|
|
139
|
+
click?: number;
|
|
140
|
+
};
|
|
141
|
+
allowZoomingOut?: boolean;
|
|
142
|
+
};
|
|
143
|
+
export type AutoZoomEndEvent = {
|
|
144
|
+
type: 'autoZoomEnd';
|
|
145
|
+
timeMs: number;
|
|
146
|
+
easing: string;
|
|
147
|
+
duration: number;
|
|
148
|
+
};
|
|
149
|
+
export type RecordingEvent = VideoStartEvent | InputEvent | CaptionStartEvent | CaptionUntilEvent | CaptionEndEvent | VideoCaptionStartEvent | AssetStartEvent | AssetEndEvent | HideStartEvent | HideEndEvent | AutoZoomStartEvent | AutoZoomEndEvent;
|
|
150
|
+
export type RecordingMetadata = {
|
|
151
|
+
videoName: string;
|
|
152
|
+
/** Language codes present in multi-language captions, e.g. `['en', 'de']`. Omitted when no multi-language captions are used. */
|
|
153
|
+
languages?: string[];
|
|
154
|
+
};
|
|
155
|
+
export type RecordingData = {
|
|
156
|
+
events: RecordingEvent[];
|
|
157
|
+
renderOptions?: RenderOptions;
|
|
158
|
+
recordOptions?: RecordOptions;
|
|
159
|
+
metadata?: RecordingMetadata;
|
|
160
|
+
};
|
|
161
|
+
export interface IEventRecorder {
|
|
162
|
+
start(): void;
|
|
163
|
+
/**
|
|
164
|
+
* Records an input action. Inner event timestamps are absolute (e.g. Date.now())
|
|
165
|
+
* and are converted to recording-relative milliseconds internally.
|
|
166
|
+
* Throws if the event's time span overlaps with any previously recorded input event.
|
|
167
|
+
*/
|
|
168
|
+
addInput(subType: InputEvent['subType'], elementRect: ElementRect | undefined, events: InputEvent['events']): void;
|
|
169
|
+
addCaptionStart(text: string, name: string, captionConfig?: CaptionConfig, translations?: Record<string, CaptionTranslation>): void;
|
|
170
|
+
addCaptionUntil(percentage: number): void;
|
|
171
|
+
addCaptionEnd(): void;
|
|
172
|
+
addVideoCaptionStart(name: string, assetPath: string | undefined, subtitle?: string, translations?: Record<string, VideoCaptionTranslation>): void;
|
|
173
|
+
addAssetStart(name: string, path: string, audio: number, fullScreen: boolean): void;
|
|
174
|
+
addAssetEnd(name: string): void;
|
|
175
|
+
addHideStart(): void;
|
|
176
|
+
addHideEnd(): void;
|
|
177
|
+
addAutoZoomStart(options?: AutoZoomOptions): void;
|
|
178
|
+
addAutoZoomEnd(options?: AutoZoomOptions): void;
|
|
179
|
+
getEvents(): RecordingEvent[];
|
|
180
|
+
writeToFile(dir: string, videoName: string): Promise<void>;
|
|
181
|
+
}
|
|
182
|
+
export declare class EventRecorder implements IEventRecorder {
|
|
183
|
+
private readonly events;
|
|
184
|
+
private startTime;
|
|
185
|
+
private readonly recordOptions;
|
|
186
|
+
private readonly renderOptions;
|
|
187
|
+
constructor(renderOptions?: RenderOptions, recordOptions?: RecordOptions);
|
|
188
|
+
start(): void;
|
|
189
|
+
addInput(subType: InputEvent['subType'], elementRect: ElementRect | undefined, events: InputEvent['events']): void;
|
|
190
|
+
addCaptionStart(text: string, name: string, captionConfig?: CaptionConfig, translations?: Record<string, CaptionTranslation>): void;
|
|
191
|
+
addCaptionUntil(percentage: number): void;
|
|
192
|
+
addCaptionEnd(): void;
|
|
193
|
+
addVideoCaptionStart(name: string, assetPath: string | undefined, subtitle?: string, translations?: Record<string, VideoCaptionTranslation>): void;
|
|
194
|
+
addAssetStart(name: string, path: string, audio: number, fullScreen: boolean): void;
|
|
195
|
+
addAssetEnd(name: string): void;
|
|
196
|
+
addHideStart(): void;
|
|
197
|
+
addHideEnd(): void;
|
|
198
|
+
addAutoZoomStart(options?: AutoZoomOptions): void;
|
|
199
|
+
addAutoZoomEnd(options?: AutoZoomOptions): void;
|
|
200
|
+
getEvents(): RecordingEvent[];
|
|
201
|
+
writeToFile(dir: string, videoName: string): Promise<void>;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { writeFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { DEFAULT_ZOOM_AMOUNT, DEFAULT_ZOOM_DURATION, DEFAULT_ZOOM_EASING, } from './defaults.js';
|
|
4
|
+
import { getDimensions } from './dimensions.js';
|
|
5
|
+
export class EventRecorder {
|
|
6
|
+
events = [];
|
|
7
|
+
startTime = null;
|
|
8
|
+
recordOptions;
|
|
9
|
+
renderOptions;
|
|
10
|
+
constructor(renderOptions, recordOptions) {
|
|
11
|
+
this.recordOptions = recordOptions;
|
|
12
|
+
this.renderOptions = renderOptions;
|
|
13
|
+
}
|
|
14
|
+
start() {
|
|
15
|
+
this.startTime = Date.now();
|
|
16
|
+
this.events.push({ type: 'videoStart', timeMs: 0 });
|
|
17
|
+
}
|
|
18
|
+
addInput(subType, elementRect, events) {
|
|
19
|
+
if (this.startTime === null)
|
|
20
|
+
return;
|
|
21
|
+
if (events.length === 0)
|
|
22
|
+
return;
|
|
23
|
+
const st = this.startTime;
|
|
24
|
+
const relStart = events[0].startMs - st;
|
|
25
|
+
const relEnd = events[events.length - 1].endMs - st;
|
|
26
|
+
for (const existing of this.events) {
|
|
27
|
+
if (existing.type === 'input') {
|
|
28
|
+
const existingStart = existing.events[0].startMs;
|
|
29
|
+
const existingEnd = existing.events[existing.events.length - 1].endMs;
|
|
30
|
+
if (relStart < existingEnd && relEnd > existingStart) {
|
|
31
|
+
throw new Error(`Input event '${subType}' [${relStart}ms, ${relEnd}ms] overlaps with existing '${existing.subType}' event [${existingStart}ms, ${existingEnd}ms]`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (existing.type === 'autoZoomStart' ||
|
|
35
|
+
existing.type === 'autoZoomEnd') {
|
|
36
|
+
if (existing.timeMs > relStart && existing.timeMs < relEnd) {
|
|
37
|
+
throw new Error(`Input event '${subType}' [${relStart}ms, ${relEnd}ms] contains ${existing.type} at ${existing.timeMs}ms`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const relativeEvents = events.map((e) => ({
|
|
42
|
+
...e,
|
|
43
|
+
startMs: e.startMs - st,
|
|
44
|
+
endMs: e.endMs - st,
|
|
45
|
+
}));
|
|
46
|
+
this.events.push({
|
|
47
|
+
type: 'input',
|
|
48
|
+
subType,
|
|
49
|
+
...(elementRect !== undefined && { elementRect }),
|
|
50
|
+
events: relativeEvents,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
addCaptionStart(text, name, captionConfig, translations) {
|
|
54
|
+
if (this.startTime === null)
|
|
55
|
+
return;
|
|
56
|
+
const timeMs = Date.now() - this.startTime;
|
|
57
|
+
this.events.push({
|
|
58
|
+
type: 'captionStart',
|
|
59
|
+
timeMs,
|
|
60
|
+
name,
|
|
61
|
+
...(text.length > 0 && { text }),
|
|
62
|
+
...(captionConfig !== undefined && { captionConfig }),
|
|
63
|
+
...(translations !== undefined && { translations }),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
addCaptionUntil(percentage) {
|
|
67
|
+
if (this.startTime === null)
|
|
68
|
+
return;
|
|
69
|
+
const timeMs = Date.now() - this.startTime;
|
|
70
|
+
this.events.push({ type: 'captionUntil', timeMs, percentage });
|
|
71
|
+
}
|
|
72
|
+
addCaptionEnd() {
|
|
73
|
+
if (this.startTime === null)
|
|
74
|
+
return;
|
|
75
|
+
const timeMs = Date.now() - this.startTime;
|
|
76
|
+
this.events.push({ type: 'captionEnd', timeMs });
|
|
77
|
+
}
|
|
78
|
+
addVideoCaptionStart(name, assetPath, subtitle, translations) {
|
|
79
|
+
if (this.startTime === null)
|
|
80
|
+
return;
|
|
81
|
+
const timeMs = Date.now() - this.startTime;
|
|
82
|
+
this.events.push({
|
|
83
|
+
type: 'videoCaptionStart',
|
|
84
|
+
timeMs,
|
|
85
|
+
name,
|
|
86
|
+
...(assetPath !== undefined && { assetPath }),
|
|
87
|
+
...(subtitle !== undefined && { subtitle }),
|
|
88
|
+
...(translations !== undefined && { translations }),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
addAssetStart(name, path, audio, fullScreen) {
|
|
92
|
+
if (this.startTime === null)
|
|
93
|
+
return;
|
|
94
|
+
const timeMs = Date.now() - this.startTime;
|
|
95
|
+
this.events.push({
|
|
96
|
+
type: 'assetStart',
|
|
97
|
+
timeMs,
|
|
98
|
+
name,
|
|
99
|
+
path,
|
|
100
|
+
audio,
|
|
101
|
+
fullScreen,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
addAssetEnd(name) {
|
|
105
|
+
if (this.startTime === null)
|
|
106
|
+
return;
|
|
107
|
+
const timeMs = Date.now() - this.startTime;
|
|
108
|
+
this.events.push({ type: 'assetEnd', timeMs, name });
|
|
109
|
+
}
|
|
110
|
+
addHideStart() {
|
|
111
|
+
if (this.startTime === null)
|
|
112
|
+
return;
|
|
113
|
+
const timeMs = Date.now() - this.startTime;
|
|
114
|
+
this.events.push({ type: 'hideStart', timeMs });
|
|
115
|
+
}
|
|
116
|
+
addHideEnd() {
|
|
117
|
+
if (this.startTime === null)
|
|
118
|
+
return;
|
|
119
|
+
const timeMs = Date.now() - this.startTime;
|
|
120
|
+
this.events.push({ type: 'hideEnd', timeMs });
|
|
121
|
+
}
|
|
122
|
+
addAutoZoomStart(options) {
|
|
123
|
+
if (this.startTime === null)
|
|
124
|
+
return;
|
|
125
|
+
const timeMs = Date.now() - this.startTime;
|
|
126
|
+
for (const existing of this.events) {
|
|
127
|
+
if (existing.type !== 'input')
|
|
128
|
+
continue;
|
|
129
|
+
const existingStart = existing.events[0].startMs;
|
|
130
|
+
const existingEnd = existing.events[existing.events.length - 1].endMs;
|
|
131
|
+
if (timeMs > existingStart && timeMs < existingEnd) {
|
|
132
|
+
throw new Error(`autoZoomStart at ${timeMs}ms falls inside input '${existing.subType}' event [${existingStart}ms, ${existingEnd}ms]`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
this.events.push({
|
|
136
|
+
type: 'autoZoomStart',
|
|
137
|
+
timeMs,
|
|
138
|
+
easing: options?.easing ?? DEFAULT_ZOOM_EASING,
|
|
139
|
+
duration: options?.duration ?? DEFAULT_ZOOM_DURATION,
|
|
140
|
+
amount: options?.amount ?? DEFAULT_ZOOM_AMOUNT,
|
|
141
|
+
...(options?.centering !== undefined && {
|
|
142
|
+
centering: options.centering,
|
|
143
|
+
}),
|
|
144
|
+
...(options?.allowZoomingOut !== undefined && {
|
|
145
|
+
allowZoomingOut: options.allowZoomingOut,
|
|
146
|
+
}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
addAutoZoomEnd(options) {
|
|
150
|
+
if (this.startTime === null)
|
|
151
|
+
return;
|
|
152
|
+
const timeMs = Date.now() - this.startTime;
|
|
153
|
+
for (const existing of this.events) {
|
|
154
|
+
if (existing.type !== 'input')
|
|
155
|
+
continue;
|
|
156
|
+
const existingStart = existing.events[0].startMs;
|
|
157
|
+
const existingEnd = existing.events[existing.events.length - 1].endMs;
|
|
158
|
+
if (timeMs > existingStart && timeMs < existingEnd) {
|
|
159
|
+
throw new Error(`autoZoomEnd at ${timeMs}ms falls inside input '${existing.subType}' event [${existingStart}ms, ${existingEnd}ms]`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
this.events.push({
|
|
163
|
+
type: 'autoZoomEnd',
|
|
164
|
+
timeMs,
|
|
165
|
+
easing: options?.easing ?? DEFAULT_ZOOM_EASING,
|
|
166
|
+
duration: options?.duration ?? DEFAULT_ZOOM_DURATION,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
getEvents() {
|
|
170
|
+
return [...this.events];
|
|
171
|
+
}
|
|
172
|
+
async writeToFile(dir, videoName) {
|
|
173
|
+
const filePath = join(dir, 'data.json');
|
|
174
|
+
// Always default output.aspectRatio to '16:9' if not explicitly set.
|
|
175
|
+
const renderOptionsWithDefaults = {
|
|
176
|
+
...this.renderOptions,
|
|
177
|
+
output: {
|
|
178
|
+
...this.renderOptions?.output,
|
|
179
|
+
aspectRatio: this.renderOptions?.output?.aspectRatio ?? '16:9',
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
let serializedRenderOptions = renderOptionsWithDefaults;
|
|
183
|
+
// outputOpts is always defined because renderOptionsWithDefaults.output is always set above
|
|
184
|
+
const outputOpts = renderOptionsWithDefaults.output;
|
|
185
|
+
if (outputOpts.aspectRatio !== undefined &&
|
|
186
|
+
outputOpts.quality !== undefined) {
|
|
187
|
+
const { width, height } = getDimensions(outputOpts.aspectRatio, outputOpts.quality);
|
|
188
|
+
const { aspectRatio: _aspectRatio, quality: _quality, ...restOutput } = outputOpts;
|
|
189
|
+
serializedRenderOptions = {
|
|
190
|
+
...renderOptionsWithDefaults,
|
|
191
|
+
output: {
|
|
192
|
+
...restOutput,
|
|
193
|
+
resolution: `${width}x${height}`,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const languageSet = new Set();
|
|
198
|
+
for (const event of this.events) {
|
|
199
|
+
if (event.type === 'captionStart') {
|
|
200
|
+
if (event.translations !== undefined) {
|
|
201
|
+
for (const lang of Object.keys(event.translations)) {
|
|
202
|
+
languageSet.add(lang);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (event.captionConfig?.voice !== undefined) {
|
|
206
|
+
const lang = event.captionConfig.voice.split('.')[0];
|
|
207
|
+
if (lang)
|
|
208
|
+
languageSet.add(lang);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const languages = languageSet.size > 0 ? [...languageSet].sort() : undefined;
|
|
213
|
+
const data = {
|
|
214
|
+
events: this.events,
|
|
215
|
+
renderOptions: serializedRenderOptions,
|
|
216
|
+
...(this.recordOptions !== undefined && {
|
|
217
|
+
recordOptions: this.recordOptions,
|
|
218
|
+
}),
|
|
219
|
+
metadata: {
|
|
220
|
+
videoName,
|
|
221
|
+
...(languages !== undefined && { languages }),
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
await writeFile(filePath, JSON.stringify(data, null, 2));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=events.js.map
|