screenci 0.0.75 → 0.0.78
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/cli.d.ts +62 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +699 -229
- package/dist/cli.js.map +1 -1
- package/dist/docs/manifest.d.ts +277 -91
- package/dist/docs/manifest.d.ts.map +1 -1
- package/dist/docs/manifest.js +101 -30
- package/dist/docs/manifest.js.map +1 -1
- package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts +2 -0
- package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/camera-and-zooming.screenci.js +57 -0
- package/dist/docs/video-sources/camera-and-zooming.screenci.js.map +1 -0
- package/dist/docs/video-sources/installation.screenci.js +19 -10
- package/dist/docs/video-sources/installation.screenci.js.map +1 -1
- package/dist/docs/video-sources/landing.screenci.js +6 -8
- package/dist/docs/video-sources/landing.screenci.js.map +1 -1
- package/dist/docs/video-sources/languages.screenci.d.ts +2 -0
- package/dist/docs/video-sources/languages.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/languages.screenci.js +68 -0
- package/dist/docs/video-sources/languages.screenci.js.map +1 -0
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js +4 -5
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
- package/dist/docs/video-sources/locator-highlight-still.screenci.js +3 -4
- package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
- package/dist/docs/video-sources/narration.screenci.d.ts +2 -0
- package/dist/docs/video-sources/narration.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/narration.screenci.js +71 -0
- package/dist/docs/video-sources/narration.screenci.js.map +1 -0
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts +2 -0
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.js +60 -0
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.js.map +1 -0
- package/dist/docs/video-sources/speaking-style.screenci.d.ts +2 -0
- package/dist/docs/video-sources/speaking-style.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/speaking-style.screenci.js +76 -0
- package/dist/docs/video-sources/speaking-style.screenci.js.map +1 -0
- package/dist/docs/video-sources/studio.screenci.js +8 -10
- package/dist/docs/video-sources/studio.screenci.js.map +1 -1
- package/dist/docs/video-sources/vertical-video.screenci.d.ts +2 -0
- package/dist/docs/video-sources/vertical-video.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/vertical-video.screenci.js +58 -0
- package/dist/docs/video-sources/vertical-video.screenci.js.map +1 -0
- package/dist/docs/videos.d.ts +20 -0
- package/dist/docs/videos.d.ts.map +1 -1
- package/dist/docs/videos.js +25 -0
- package/dist/docs/videos.js.map +1 -1
- package/dist/e2e/instrument.e2e.js +60 -1
- package/dist/e2e/instrument.e2e.js.map +1 -1
- package/dist/e2e/redact.e2e.d.ts +2 -0
- package/dist/e2e/redact.e2e.d.ts.map +1 -0
- package/dist/e2e/redact.e2e.js +161 -0
- package/dist/e2e/redact.e2e.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/src/asset.d.ts +174 -14
- package/dist/src/asset.d.ts.map +1 -1
- package/dist/src/asset.js +320 -39
- package/dist/src/asset.js.map +1 -1
- package/dist/src/assetHash.d.ts +27 -0
- package/dist/src/assetHash.d.ts.map +1 -0
- package/dist/src/assetHash.js +0 -0
- package/dist/src/assetHash.js.map +1 -0
- package/dist/src/audio.d.ts +20 -1
- package/dist/src/audio.d.ts.map +1 -1
- package/dist/src/audio.js +126 -24
- package/dist/src/audio.js.map +1 -1
- package/dist/src/autoZoom.d.ts.map +1 -1
- package/dist/src/autoZoom.js +3 -1
- package/dist/src/autoZoom.js.map +1 -1
- package/dist/src/browserLaunchOptions.d.ts +24 -2
- package/dist/src/browserLaunchOptions.d.ts.map +1 -1
- package/dist/src/browserLaunchOptions.js +57 -3
- package/dist/src/browserLaunchOptions.js.map +1 -1
- package/dist/src/builder.d.ts +229 -136
- package/dist/src/builder.d.ts.map +1 -1
- package/dist/src/builder.js +264 -77
- package/dist/src/builder.js.map +1 -1
- package/dist/src/callerFile.d.ts +12 -0
- package/dist/src/callerFile.d.ts.map +1 -0
- package/dist/src/callerFile.js +46 -0
- package/dist/src/callerFile.js.map +1 -0
- package/dist/src/changeFocus.d.ts.map +1 -1
- package/dist/src/changeFocus.js +109 -36
- package/dist/src/changeFocus.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +15 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/cue.d.ts +29 -17
- package/dist/src/cue.d.ts.map +1 -1
- package/dist/src/cue.js +138 -61
- package/dist/src/cue.js.map +1 -1
- package/dist/src/declare.d.ts +63 -0
- package/dist/src/declare.d.ts.map +1 -0
- package/dist/src/declare.js +111 -0
- package/dist/src/declare.js.map +1 -0
- package/dist/src/defaults.d.ts +23 -0
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +27 -3
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/events.d.ts +339 -25
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +250 -26
- package/dist/src/events.js.map +1 -1
- package/dist/src/htmlRasterizer.d.ts +10 -0
- package/dist/src/htmlRasterizer.d.ts.map +1 -1
- package/dist/src/htmlRasterizer.js +12 -2
- package/dist/src/htmlRasterizer.js.map +1 -1
- package/dist/src/init.d.ts +2 -0
- package/dist/src/init.d.ts.map +1 -1
- package/dist/src/init.js +81 -33
- package/dist/src/init.js.map +1 -1
- package/dist/src/instrument.d.ts.map +1 -1
- package/dist/src/instrument.js +164 -8
- package/dist/src/instrument.js.map +1 -1
- package/dist/src/locales.d.ts.map +1 -1
- package/dist/src/locales.js +1 -0
- package/dist/src/locales.js.map +1 -1
- package/dist/src/localize.d.ts +26 -17
- package/dist/src/localize.d.ts.map +1 -1
- package/dist/src/localize.js +19 -11
- package/dist/src/localize.js.map +1 -1
- package/dist/src/localizeRuntime.d.ts +29 -33
- package/dist/src/localizeRuntime.d.ts.map +1 -1
- package/dist/src/localizeRuntime.js +74 -49
- package/dist/src/localizeRuntime.js.map +1 -1
- package/dist/src/logger.d.ts +5 -0
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +7 -0
- package/dist/src/logger.js.map +1 -1
- package/dist/src/manualZoom.d.ts.map +1 -1
- package/dist/src/manualZoom.js +8 -5
- package/dist/src/manualZoom.js.map +1 -1
- package/dist/src/narrationVisibility.d.ts +19 -0
- package/dist/src/narrationVisibility.d.ts.map +1 -0
- package/dist/src/narrationVisibility.js +26 -0
- package/dist/src/narrationVisibility.js.map +1 -0
- package/dist/src/openBrowser.d.ts +34 -0
- package/dist/src/openBrowser.d.ts.map +1 -0
- package/dist/src/openBrowser.js +62 -0
- package/dist/src/openBrowser.js.map +1 -0
- package/dist/src/recordingData.d.ts +27 -0
- package/dist/src/recordingData.d.ts.map +1 -1
- package/dist/src/recordingSize.d.ts +32 -0
- package/dist/src/recordingSize.d.ts.map +1 -0
- package/dist/src/recordingSize.js +54 -0
- package/dist/src/recordingSize.js.map +1 -0
- package/dist/src/redact.d.ts +68 -0
- package/dist/src/redact.d.ts.map +1 -0
- package/dist/src/redact.js +138 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/redactController.d.ts +61 -0
- package/dist/src/redactController.d.ts.map +1 -0
- package/dist/src/redactController.js +232 -0
- package/dist/src/redactController.js.map +1 -0
- package/dist/src/runtimeContext.d.ts +32 -0
- package/dist/src/runtimeContext.d.ts.map +1 -1
- package/dist/src/runtimeContext.js +21 -0
- package/dist/src/runtimeContext.js.map +1 -1
- package/dist/src/runtimeMode.d.ts +15 -7
- package/dist/src/runtimeMode.d.ts.map +1 -1
- package/dist/src/runtimeMode.js +17 -6
- package/dist/src/runtimeMode.js.map +1 -1
- package/dist/src/screenAudio.d.ts +88 -0
- package/dist/src/screenAudio.d.ts.map +1 -0
- package/dist/src/screenAudio.js +0 -0
- package/dist/src/screenAudio.js.map +1 -0
- package/dist/src/screenAudioSink.d.ts +46 -0
- package/dist/src/screenAudioSink.d.ts.map +1 -0
- package/dist/src/screenAudioSink.js +77 -0
- package/dist/src/screenAudioSink.js.map +1 -0
- package/dist/src/screenshot.d.ts +27 -29
- package/dist/src/screenshot.d.ts.map +1 -1
- package/dist/src/screenshot.js +39 -24
- package/dist/src/screenshot.js.map +1 -1
- package/dist/src/sourceTrim.d.ts +29 -0
- package/dist/src/sourceTrim.d.ts.map +1 -0
- package/dist/src/sourceTrim.js +76 -0
- package/dist/src/sourceTrim.js.map +1 -0
- package/dist/src/stillCapture.d.ts +5 -0
- package/dist/src/stillCapture.d.ts.map +1 -1
- package/dist/src/stillCapture.js +11 -1
- package/dist/src/stillCapture.js.map +1 -1
- package/dist/src/studio.d.ts +69 -57
- package/dist/src/studio.d.ts.map +1 -1
- package/dist/src/studio.js +16 -38
- package/dist/src/studio.js.map +1 -1
- package/dist/src/timelineOffset.d.ts +46 -0
- package/dist/src/timelineOffset.d.ts.map +1 -0
- package/dist/src/timelineOffset.js +66 -0
- package/dist/src/timelineOffset.js.map +1 -0
- package/dist/src/titleValidation.d.ts +38 -0
- package/dist/src/titleValidation.d.ts.map +1 -1
- package/dist/src/titleValidation.js +42 -0
- package/dist/src/titleValidation.js.map +1 -1
- package/dist/src/types.d.ts +218 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/video.d.ts +74 -60
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +201 -39
- package/dist/src/video.js.map +1 -1
- package/dist/src/voiceSampleAudio.d.ts +34 -0
- package/dist/src/voiceSampleAudio.d.ts.map +1 -0
- package/dist/src/voiceSampleAudio.js +105 -0
- package/dist/src/voiceSampleAudio.js.map +1 -0
- package/dist/src/voices.d.ts +2 -2
- package/dist/src/voices.d.ts.map +1 -1
- package/dist/src/voices.js +8 -3
- package/dist/src/voices.js.map +1 -1
- package/dist/src/zoom.d.ts +1 -0
- package/dist/src/zoom.d.ts.map +1 -1
- package/dist/src/zoom.js +3 -0
- package/dist/src/zoom.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/skills/screenci/SKILL.md +2 -2
- package/skills/screenci/references/init.md +4 -3
- package/skills/screenci/references/record.md +1 -1
- package/templates/recordings/assets/logo.png +0 -0
- package/dist/docs/video-sources/public-urls.screenci.d.ts +0 -2
- package/dist/docs/video-sources/public-urls.screenci.d.ts.map +0 -1
- package/dist/docs/video-sources/public-urls.screenci.js +0 -41
- package/dist/docs/video-sources/public-urls.screenci.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openBrowser.d.ts","sourceRoot":"","sources":["../../src/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQrC,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,eAAe,CAQjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAClB,GACL,OAAO,CAAC,iBAAiB,CAAC,CAqC5B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the platform-specific command that opens a URL in the default
|
|
4
|
+
* browser: `open` on macOS, `cmd /c start` on Windows, and `xdg-open`
|
|
5
|
+
* everywhere else (Linux, BSD). The empty `""` on Windows is `start`'s window
|
|
6
|
+
* title argument, so a quoted URL is not consumed as the title.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveBrowserOpenSpec(url, platform = process.platform) {
|
|
9
|
+
if (platform === 'darwin') {
|
|
10
|
+
return { command: 'open', args: [url] };
|
|
11
|
+
}
|
|
12
|
+
if (platform === 'win32') {
|
|
13
|
+
return { command: 'cmd', args: ['/c', 'start', '', url] };
|
|
14
|
+
}
|
|
15
|
+
return { command: 'xdg-open', args: [url] };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Try to open `url` in the user's default browser. Best-effort: a synchronous
|
|
19
|
+
* spawn failure or an asynchronous launch error (e.g. `xdg-open` missing on a
|
|
20
|
+
* minimal Linux box) resolves to `{ opened: false, reason }` instead of
|
|
21
|
+
* throwing. A resolved `{ opened: true }` only means the launch was dispatched,
|
|
22
|
+
* not that a browser window actually appeared, so callers still surface the
|
|
23
|
+
* link as a fallback.
|
|
24
|
+
*
|
|
25
|
+
* Dependency-injected (`platform`, `spawnFn`) so tests can drive both outcomes
|
|
26
|
+
* without a real terminal or browser.
|
|
27
|
+
*/
|
|
28
|
+
export async function openUrlInBrowser(url, options = {}) {
|
|
29
|
+
const platform = options.platform ?? process.platform;
|
|
30
|
+
const spawnFn = options.spawnFn ?? spawn;
|
|
31
|
+
const spec = resolveBrowserOpenSpec(url, platform);
|
|
32
|
+
let child;
|
|
33
|
+
try {
|
|
34
|
+
child = spawnFn(spec.command, spec.args, {
|
|
35
|
+
stdio: 'ignore',
|
|
36
|
+
detached: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return {
|
|
41
|
+
opened: false,
|
|
42
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Keep an error listener attached for the child's lifetime so a late launch
|
|
46
|
+
// error (e.g. ENOENT) is handled rather than thrown as an unhandled event.
|
|
47
|
+
const launchError = new Promise((resolveError) => {
|
|
48
|
+
child.on('error', resolveError);
|
|
49
|
+
});
|
|
50
|
+
// Detach so the parent (login) can exit without waiting on the browser.
|
|
51
|
+
child.unref();
|
|
52
|
+
// ENOENT and friends surface on the next tick, ahead of this setImmediate, so
|
|
53
|
+
// a failed launch wins the race; otherwise we treat the dispatch as success.
|
|
54
|
+
const settled = new Promise((resolveTick) => {
|
|
55
|
+
setImmediate(() => resolveTick(null));
|
|
56
|
+
});
|
|
57
|
+
const result = await Promise.race([launchError, settled]);
|
|
58
|
+
return result === null
|
|
59
|
+
? { opened: true }
|
|
60
|
+
: { opened: false, reason: result.message };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=openBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openBrowser.js","sourceRoot":"","sources":["../../src/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAiBrC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;IACzC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,UAGI,EAAE;IAEN,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;IACxC,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAElD,IAAI,KAA+B,CAAA;IACnC,IAAI,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACvC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACC,CAAC,CAAA;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAA;IACH,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,IAAI,OAAO,CAAQ,CAAC,YAAY,EAAE,EAAE;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,wEAAwE;IACxE,KAAK,CAAC,KAAK,EAAE,CAAA;IAEb,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,WAAW,EAAE,EAAE;QAChD,YAAY,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,OAAO,MAAM,KAAK,IAAI;QACpB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAClB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -131,6 +131,10 @@ export type CueEndEvent = {
|
|
|
131
131
|
reason?: 'auto' | 'wait';
|
|
132
132
|
};
|
|
133
133
|
export type VideoCueTranslationFile = {
|
|
134
|
+
assetPath: string;
|
|
135
|
+
assetHash?: string;
|
|
136
|
+
subtitle?: string;
|
|
137
|
+
} | {
|
|
134
138
|
assetHash: string;
|
|
135
139
|
assetPath?: string;
|
|
136
140
|
subtitle?: string;
|
|
@@ -166,6 +170,22 @@ export type VideoCueStartEvent = {
|
|
|
166
170
|
*/
|
|
167
171
|
volume?: number;
|
|
168
172
|
};
|
|
173
|
+
/**
|
|
174
|
+
* A per-language override of an overlay's file/options, used in shared-capture
|
|
175
|
+
* mode where one recording carries every language. The recorder folds the active
|
|
176
|
+
* language's translation into the top-level fields before serialization (see
|
|
177
|
+
* `filterEventTranslationsToLanguage`), so the renderer only ever sees a single
|
|
178
|
+
* resolved language.
|
|
179
|
+
*/
|
|
180
|
+
export type AssetTranslation = {
|
|
181
|
+
path: string;
|
|
182
|
+
fileHash?: string;
|
|
183
|
+
durationMs?: number;
|
|
184
|
+
audio?: number;
|
|
185
|
+
fullScreen?: boolean;
|
|
186
|
+
speed?: number;
|
|
187
|
+
time?: number;
|
|
188
|
+
};
|
|
169
189
|
export type ImageAssetStartEvent = {
|
|
170
190
|
type: 'assetStart';
|
|
171
191
|
timeMs: number;
|
|
@@ -175,6 +195,8 @@ export type ImageAssetStartEvent = {
|
|
|
175
195
|
fileHash?: string;
|
|
176
196
|
durationMs?: number;
|
|
177
197
|
fullScreen: boolean;
|
|
198
|
+
/** Per-language file overrides (shared-capture mode); folded before render. */
|
|
199
|
+
translations?: Record<string, AssetTranslation>;
|
|
178
200
|
};
|
|
179
201
|
export type VideoAssetStartEvent = {
|
|
180
202
|
type: 'assetStart';
|
|
@@ -193,6 +215,8 @@ export type VideoAssetStartEvent = {
|
|
|
193
215
|
speed?: number;
|
|
194
216
|
/** Target playback duration (ms); an alternative to {@link speed}. */
|
|
195
217
|
time?: number;
|
|
218
|
+
/** Per-language file overrides (shared-capture mode); folded before render. */
|
|
219
|
+
translations?: Record<string, AssetTranslation>;
|
|
196
220
|
};
|
|
197
221
|
export type AssetStartEvent = ImageAssetStartEvent | VideoAssetStartEvent;
|
|
198
222
|
/**
|
|
@@ -261,6 +285,9 @@ export type RecordingMetadata = {
|
|
|
261
285
|
renderOptions?: boolean;
|
|
262
286
|
narration?: boolean;
|
|
263
287
|
assets?: boolean;
|
|
288
|
+
/** Web-owned language set (`video.languages(studio())`): the app may add and
|
|
289
|
+
* render languages for this video. Absent for code-defined language sets. */
|
|
290
|
+
languages?: boolean;
|
|
264
291
|
};
|
|
265
292
|
};
|
|
266
293
|
export type RecordingData = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordingData.d.ts","sourceRoot":"","sources":["../../src/recordingData.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"recordingData.d.ts","sourceRoot":"","sources":["../../src/recordingData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACN,aAAa,EACb,qBAAqB,EACtB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,CAAC,CAAA;CACV,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,EAAE;YACH,OAAO,EAAE;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;YACjC,IAAI,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAA;SAC5C,CAAA;QACD,aAAa,CAAC,EAAE;YACd,CAAC,EAAE,MAAM,CAAA;YACT,CAAC,EAAE,MAAM,CAAA;SACV,CAAA;KACF,CAAA;IACD,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EACH,OAAO,GACP,mBAAmB,GACnB,KAAK,GACL,OAAO,GACP,SAAS,GACT,QAAQ,GACR,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,OAAO,GACP,YAAY,GACZ,QAAQ,CAAA;IACZ,MAAM,EAAE,KAAK,CACT,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,YAAY,GACZ,cAAc,GACd,cAAc,GACd,cAAc,CACjB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,GAAG,uBAAuB,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,wGAAwG;IACxG,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC7C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAKD,MAAM,MAAM,uBAAuB,GAC/B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,GAAG,uBAAuB,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,sBAAsB,CAAA;AAE1B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,yGAAyG;IACzG,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAClD;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,oBAAoB,CAAA;AAEzE;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,UAAU,GACV,aAAa,GACb,WAAW,GACX,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,cAAc,GACd,YAAY,GACZ,eAAe,GACf,aAAa,GACb,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB;sFAC8E;QAC9E,SAAS,CAAC,EAAE,OAAO,CAAA;KACpB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,aAAa,EAAE,qBAAqB,CAAA;IACpC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAC7B,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Easing } from './types.js';
|
|
2
|
+
export type ResizeRecordingOptions = {
|
|
3
|
+
/** Transition duration in milliseconds. 0 or omitted = instant cut. */
|
|
4
|
+
duration?: number;
|
|
5
|
+
/** Easing function for the transition. Defaults to 'ease-out'. */
|
|
6
|
+
easing?: Easing;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Shrinks the recording to a limited size, revealing the styled background
|
|
10
|
+
* around it from this point on.
|
|
11
|
+
*
|
|
12
|
+
* `size` is a 0-1 fraction of the full frame: `1` is full screen, `0.8` shows
|
|
13
|
+
* the recording at 80% of the frame, centered. Call {@link resetRecordingSize}
|
|
14
|
+
* to return to full screen.
|
|
15
|
+
*
|
|
16
|
+
* Pass `duration` to animate the transition over that many milliseconds.
|
|
17
|
+
* Use `easing` to control the animation curve (defaults to `'ease-out'`).
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* await resizeRecording(0.8, { duration: 400, easing: 'ease-in-out' })
|
|
22
|
+
* await page.getByRole('button', { name: 'Continue' }).click()
|
|
23
|
+
* await resetRecordingSize()
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function resizeRecording(size: number, options?: ResizeRecordingOptions): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Returns the recording to full screen (size 1) from this point on. No-op when
|
|
29
|
+
* the recording is already full screen.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resetRecordingSize(): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=recordingSize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordingSize.d.ts","sourceRoot":"","sources":["../../src/recordingSize.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAgBxC,MAAM,MAAM,sBAAsB,GAAG;IACnC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKxD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ScreenciError } from './errors.js';
|
|
2
|
+
import { getActiveHideRecorder } from './timelineBlock.js';
|
|
3
|
+
import { getRuntimeRecordingSize, setRuntimeRecordingSize, } from './runtimeContext.js';
|
|
4
|
+
/**
|
|
5
|
+
* Full-screen size: the recording fills the output frame, with one side
|
|
6
|
+
* touching the background edge.
|
|
7
|
+
*/
|
|
8
|
+
const FULL_SCREEN_SIZE = 1;
|
|
9
|
+
function assertValidSize(size) {
|
|
10
|
+
if (!Number.isFinite(size) || size <= 0 || size > 1) {
|
|
11
|
+
throw new ScreenciError(`resizeRecording(size) requires size in (0, 1]; received ${size}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Shrinks the recording to a limited size, revealing the styled background
|
|
16
|
+
* around it from this point on.
|
|
17
|
+
*
|
|
18
|
+
* `size` is a 0-1 fraction of the full frame: `1` is full screen, `0.8` shows
|
|
19
|
+
* the recording at 80% of the frame, centered. Call {@link resetRecordingSize}
|
|
20
|
+
* to return to full screen.
|
|
21
|
+
*
|
|
22
|
+
* Pass `duration` to animate the transition over that many milliseconds.
|
|
23
|
+
* Use `easing` to control the animation curve (defaults to `'ease-out'`).
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* await resizeRecording(0.8, { duration: 400, easing: 'ease-in-out' })
|
|
28
|
+
* await page.getByRole('button', { name: 'Continue' }).click()
|
|
29
|
+
* await resetRecordingSize()
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function resizeRecording(size, options) {
|
|
33
|
+
assertValidSize(size);
|
|
34
|
+
const recorder = getActiveHideRecorder();
|
|
35
|
+
if (options !== undefined) {
|
|
36
|
+
recorder.addRecordingSizeStart(size, options);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
recorder.addRecordingSizeStart(size);
|
|
40
|
+
}
|
|
41
|
+
setRuntimeRecordingSize(size);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the recording to full screen (size 1) from this point on. No-op when
|
|
45
|
+
* the recording is already full screen.
|
|
46
|
+
*/
|
|
47
|
+
export async function resetRecordingSize() {
|
|
48
|
+
if (getRuntimeRecordingSize() === FULL_SCREEN_SIZE)
|
|
49
|
+
return;
|
|
50
|
+
const recorder = getActiveHideRecorder();
|
|
51
|
+
recorder.addRecordingSizeEnd();
|
|
52
|
+
setRuntimeRecordingSize(FULL_SCREEN_SIZE);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=recordingSize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordingSize.js","sourceRoot":"","sources":["../../src/recordingSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAE1B,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,aAAa,CACrB,2DAA2D,IAAI,EAAE,CAClE,CAAA;IACH,CAAC;AACH,CAAC;AASD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAgC;IAEhC,eAAe,CAAC,IAAI,CAAC,CAAA;IACrB,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAA;IACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IACD,uBAAuB,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,uBAAuB,EAAE,KAAK,gBAAgB;QAAE,OAAM;IAC1D,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAA;IACxC,QAAQ,CAAC,mBAAmB,EAAE,CAAA;IAC9B,uBAAuB,CAAC,gBAAgB,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import type { RedactHandle, RedactOptions } from './types.js';
|
|
3
|
+
import { type ResolvedRedactStyle } from './redactController.js';
|
|
4
|
+
/** Default corner radius (px) for the mask. */
|
|
5
|
+
export declare const DEFAULT_REDACT_RADIUS = 12;
|
|
6
|
+
/** Default mask shadow. Reads as a raised chip so a redaction is obvious. */
|
|
7
|
+
export declare const DEFAULT_REDACT_SHADOW = "0 2px 8px rgba(0,0,0,0.25)";
|
|
8
|
+
/**
|
|
9
|
+
* How long `redact()` waits for at least one matching element before masking,
|
|
10
|
+
* so a redact issued just before the element renders does not silently no-op.
|
|
11
|
+
*/
|
|
12
|
+
export declare const REDACT_ATTACH_TIMEOUT_MS = 5000;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve user-facing {@link RedactOptions} to the concrete pixel values the
|
|
15
|
+
* in-page controller applies. Pure (no page access), so it is unit-testable on
|
|
16
|
+
* its own.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveRedactStyle(options?: RedactOptions): ResolvedRedactStyle;
|
|
19
|
+
/**
|
|
20
|
+
* Make sure the in-page controller is installed. `addInitScript` covers every
|
|
21
|
+
* future document (registered once per recording); the extra `evaluate` covers
|
|
22
|
+
* the document that is already open when `redact()` is first called. Both are
|
|
23
|
+
* idempotent.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureRedactControllerInstalled(page: Page): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Install the in-page controller on a freshly created page, before its first
|
|
28
|
+
* navigation, so masks apply from the first painted frame. Also registers the
|
|
29
|
+
* `recordOptions.redact` first-paint selectors. Called once per page from the
|
|
30
|
+
* video fixture; the runtime flag is set on the passed context (which is not yet
|
|
31
|
+
* the active context at page-creation time).
|
|
32
|
+
*/
|
|
33
|
+
export declare function installRedactController(page: Page, redactState: {
|
|
34
|
+
controllerInstalled: boolean;
|
|
35
|
+
}, configSelectors?: string[]): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Mask the element(s) matched by `locator` so the content never enters the
|
|
38
|
+
* recording. The mask is applied client side in the live DOM, so the obscured
|
|
39
|
+
* pixels are never captured and never uploaded to screenci. This is true
|
|
40
|
+
* redaction, unlike {@link cover}, which only hides content in the published
|
|
41
|
+
* output.
|
|
42
|
+
*
|
|
43
|
+
* To hide a secret that is already on screen without a visible flash, register
|
|
44
|
+
* the mask before revealing it (inside `hide()` or via the `recordOptions.redact`
|
|
45
|
+
* config for always-secret elements).
|
|
46
|
+
*
|
|
47
|
+
* @example Persistent
|
|
48
|
+
* ```ts
|
|
49
|
+
* const handle = await redact(page.getByTestId('api-key'))
|
|
50
|
+
* // ... later
|
|
51
|
+
* await handle.unredact()
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Scoped
|
|
55
|
+
* ```ts
|
|
56
|
+
* await redact(page.getByTestId('balance'), async () => {
|
|
57
|
+
* await page.getByRole('button', { name: 'Reveal' }).click()
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function redact(locator: Locator, options?: RedactOptions): Promise<RedactHandle>;
|
|
62
|
+
export declare function redact(locator: Locator, fn: () => Promise<void> | void, options?: RedactOptions): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Remove every active mask. Called automatically at the end of each recording
|
|
65
|
+
* so masks never leak across recordings that share a browser worker.
|
|
66
|
+
*/
|
|
67
|
+
export declare function unredactAll(): Promise<void>;
|
|
68
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/redact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAA;AAI9B,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,+BAA+B,CAAA;AAEjE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,aAAa,GACtB,mBAAmB,CAUrB;AAWD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,WAAW,EAAE;IAAE,mBAAmB,EAAE,OAAO,CAAA;CAAE,EAC7C,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CASf;AAqDD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAAA;AACxB,wBAAgB,MAAM,CACpB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAAA;AAkBhB;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { redactApplyConfigSelectors, redactControllerBootstrap, } from './redactController.js';
|
|
2
|
+
import { getRuntimePage, getRuntimeRedactState } from './runtimeContext.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
/** Default corner radius (px) for the mask. */
|
|
5
|
+
export const DEFAULT_REDACT_RADIUS = 12;
|
|
6
|
+
/** Default mask shadow. Reads as a raised chip so a redaction is obvious. */
|
|
7
|
+
export const DEFAULT_REDACT_SHADOW = '0 2px 8px rgba(0,0,0,0.25)';
|
|
8
|
+
/**
|
|
9
|
+
* How long `redact()` waits for at least one matching element before masking,
|
|
10
|
+
* so a redact issued just before the element renders does not silently no-op.
|
|
11
|
+
*/
|
|
12
|
+
export const REDACT_ATTACH_TIMEOUT_MS = 5000;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve user-facing {@link RedactOptions} to the concrete pixel values the
|
|
15
|
+
* in-page controller applies. Pure (no page access), so it is unit-testable on
|
|
16
|
+
* its own.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveRedactStyle(options) {
|
|
19
|
+
const style = options?.style;
|
|
20
|
+
return {
|
|
21
|
+
// null means "sample a color from underneath" in the page.
|
|
22
|
+
color: style?.color ?? null,
|
|
23
|
+
radiusPx: style?.radius ?? DEFAULT_REDACT_RADIUS,
|
|
24
|
+
shadow: style?.shadow === false ? null : (style?.shadow ?? DEFAULT_REDACT_SHADOW),
|
|
25
|
+
css: style?.css ?? null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
let redactCounter = 0;
|
|
29
|
+
function nextRedactId() {
|
|
30
|
+
redactCounter += 1;
|
|
31
|
+
return `__screenci_redact_${redactCounter}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Make sure the in-page controller is installed. `addInitScript` covers every
|
|
35
|
+
* future document (registered once per recording); the extra `evaluate` covers
|
|
36
|
+
* the document that is already open when `redact()` is first called. Both are
|
|
37
|
+
* idempotent.
|
|
38
|
+
*/
|
|
39
|
+
export async function ensureRedactControllerInstalled(page) {
|
|
40
|
+
const state = getRuntimeRedactState();
|
|
41
|
+
if (!state.controllerInstalled) {
|
|
42
|
+
await page.addInitScript(redactControllerBootstrap);
|
|
43
|
+
state.controllerInstalled = true;
|
|
44
|
+
}
|
|
45
|
+
await page.evaluate(redactControllerBootstrap);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Install the in-page controller on a freshly created page, before its first
|
|
49
|
+
* navigation, so masks apply from the first painted frame. Also registers the
|
|
50
|
+
* `recordOptions.redact` first-paint selectors. Called once per page from the
|
|
51
|
+
* video fixture; the runtime flag is set on the passed context (which is not yet
|
|
52
|
+
* the active context at page-creation time).
|
|
53
|
+
*/
|
|
54
|
+
export async function installRedactController(page, redactState, configSelectors) {
|
|
55
|
+
await page.addInitScript(redactControllerBootstrap);
|
|
56
|
+
redactState.controllerInstalled = true;
|
|
57
|
+
if (configSelectors && configSelectors.length > 0) {
|
|
58
|
+
await page.addInitScript(redactApplyConfigSelectors, {
|
|
59
|
+
selectors: configSelectors,
|
|
60
|
+
style: resolveRedactStyle(),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function applyRedact(locator, options) {
|
|
65
|
+
const page = locator.page();
|
|
66
|
+
const resolved = resolveRedactStyle(options);
|
|
67
|
+
const id = nextRedactId();
|
|
68
|
+
await ensureRedactControllerInstalled(page);
|
|
69
|
+
// Wait for at least one match so a redact issued a beat before the element
|
|
70
|
+
// renders still masks it instead of silently doing nothing.
|
|
71
|
+
try {
|
|
72
|
+
await locator
|
|
73
|
+
.first()
|
|
74
|
+
.waitFor({ state: 'attached', timeout: REDACT_ATTACH_TIMEOUT_MS });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
logger.warn('[screenci] redact() found no matching element to mask. The selector may be wrong or the element may not have rendered yet.');
|
|
78
|
+
}
|
|
79
|
+
// Register inside the page so the controller receives the real elements
|
|
80
|
+
// (this pierces shadow DOM, which a selector re-query could not). The
|
|
81
|
+
// controller positions the mask synchronously here, so no unmasked frame
|
|
82
|
+
// escapes once this resolves.
|
|
83
|
+
await locator.evaluateAll((elements, arg) => {
|
|
84
|
+
const api = window.__screenci_redact;
|
|
85
|
+
if (api)
|
|
86
|
+
api.addElements(arg.id, elements, arg.style);
|
|
87
|
+
}, { id, style: resolved });
|
|
88
|
+
getRuntimeRedactState().activeMasks.set(id, resolved);
|
|
89
|
+
return {
|
|
90
|
+
async unredact() {
|
|
91
|
+
getRuntimeRedactState().activeMasks.delete(id);
|
|
92
|
+
try {
|
|
93
|
+
await page.evaluate((maskId) => {
|
|
94
|
+
const api = window.__screenci_redact;
|
|
95
|
+
if (api)
|
|
96
|
+
api.remove(maskId);
|
|
97
|
+
}, id);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// The page may already be closing; the mask dies with it.
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export async function redact(locator, optionsOrFn, maybeOptions) {
|
|
106
|
+
if (typeof optionsOrFn === 'function') {
|
|
107
|
+
const handle = await applyRedact(locator, maybeOptions);
|
|
108
|
+
try {
|
|
109
|
+
await optionsOrFn();
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
await handle.unredact();
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
return applyRedact(locator, optionsOrFn);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Remove every active mask. Called automatically at the end of each recording
|
|
120
|
+
* so masks never leak across recordings that share a browser worker.
|
|
121
|
+
*/
|
|
122
|
+
export async function unredactAll() {
|
|
123
|
+
getRuntimeRedactState().activeMasks.clear();
|
|
124
|
+
const page = getRuntimePage();
|
|
125
|
+
if (!page)
|
|
126
|
+
return;
|
|
127
|
+
try {
|
|
128
|
+
await page.evaluate(() => {
|
|
129
|
+
const api = window.__screenci_redact;
|
|
130
|
+
if (api)
|
|
131
|
+
api.clear();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Best effort; the page may already be closing.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-page redaction controller.
|
|
3
|
+
*
|
|
4
|
+
* screenci records the live browser page, so the only way to keep a secret out
|
|
5
|
+
* of `recording.mp4` (and therefore out of the upload) is to mask it in the DOM
|
|
6
|
+
* before Chrome captures the frame. This module is the browser-side half: a
|
|
7
|
+
* self-contained controller installed via `addInitScript` that covers target
|
|
8
|
+
* elements with an opaque panel (by default tinted to match the surface beneath
|
|
9
|
+
* them), tracking their position every animation frame so the mask follows
|
|
10
|
+
* scroll, layout, and animation.
|
|
11
|
+
*
|
|
12
|
+
* The functions here are serialized and shipped to the page by Playwright, so
|
|
13
|
+
* they must not reference anything outside their own bodies.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* A redact style resolved to concrete pixel values, ready to apply in the page.
|
|
17
|
+
* `RedactStyle` (the user-facing option) is resolved to this by
|
|
18
|
+
* `resolveRedactStyle` in `redact.ts`.
|
|
19
|
+
*/
|
|
20
|
+
export type ResolvedRedactStyle = {
|
|
21
|
+
/** Fixed fill color, or null to sample one from underneath in the page. */
|
|
22
|
+
color: string | null;
|
|
23
|
+
radiusPx: number;
|
|
24
|
+
shadow: string | null;
|
|
25
|
+
/** Extra CSS for the mask panel, or null. */
|
|
26
|
+
css: string | null;
|
|
27
|
+
};
|
|
28
|
+
/** Window global exposed by the controller for the Node side to drive. */
|
|
29
|
+
export type RedactWindowApi = {
|
|
30
|
+
/** Mask specific element handles (used by runtime `redact`; pierces shadow DOM). */
|
|
31
|
+
addElements: (id: string, elements: Element[], style: ResolvedRedactStyle) => void;
|
|
32
|
+
/** Mask everything matching a CSS selector, re-queried each frame. */
|
|
33
|
+
addSelector: (id: string, selector: string, style: ResolvedRedactStyle) => void;
|
|
34
|
+
/** Remove a mask by id, restoring the element. */
|
|
35
|
+
remove: (id: string) => void;
|
|
36
|
+
/** Remove every mask. */
|
|
37
|
+
clear: () => void;
|
|
38
|
+
};
|
|
39
|
+
/** Attribute stamped on elements masked by a runtime `redact` call. */
|
|
40
|
+
export declare const REDACT_ID_ATTRIBUTE = "data-screenci-redact-id";
|
|
41
|
+
/** Id of the fixed-position container that holds every tint div. */
|
|
42
|
+
export declare const REDACT_ROOT_ID = "__screenci_redact_root";
|
|
43
|
+
/** Name of the window global the controller installs. */
|
|
44
|
+
export declare const REDACT_WINDOW_KEY = "__screenci_redact";
|
|
45
|
+
/**
|
|
46
|
+
* The controller bootstrap. Runs in the page (via `addInitScript`) on every
|
|
47
|
+
* document. Idempotent: a second run is a no-op, so it is safe to inject more
|
|
48
|
+
* than once.
|
|
49
|
+
*/
|
|
50
|
+
export declare function redactControllerBootstrap(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Init script that masks the configured first-paint selectors. Registered after
|
|
53
|
+
* the bootstrap so `window.__screenci_redact` already exists. A CSS rule hides
|
|
54
|
+
* matches the instant they paint (race free, no JS timing), and the controller
|
|
55
|
+
* lays the opaque panel over them a frame later.
|
|
56
|
+
*/
|
|
57
|
+
export declare function redactApplyConfigSelectors(config: {
|
|
58
|
+
selectors: string[];
|
|
59
|
+
style: ResolvedRedactStyle;
|
|
60
|
+
}): void;
|
|
61
|
+
//# sourceMappingURL=redactController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactController.d.ts","sourceRoot":"","sources":["../../src/redactController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB,CAAA;AAED,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG;IAC5B,oFAAoF;IACpF,WAAW,EAAE,CACX,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,mBAAmB,KACvB,IAAI,CAAA;IACT,sEAAsE;IACtE,WAAW,EAAE,CACX,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,mBAAmB,KACvB,IAAI,CAAA;IACT,kDAAkD;IAClD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,yBAAyB;IACzB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,4BAA4B,CAAA;AAE5D,oEAAoE;AACpE,eAAO,MAAM,cAAc,2BAA2B,CAAA;AAEtD,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,sBAAsB,CAAA;AAEpD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAiMhD;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,EAAE,mBAAmB,CAAA;CAC3B,GAAG,IAAI,CA0BP"}
|