screenci 0.0.15 → 0.0.17
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 +26 -26
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -88
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/src/browserLaunchOptions.d.ts +5 -0
- package/dist/src/browserLaunchOptions.d.ts.map +1 -0
- package/dist/src/browserLaunchOptions.js +23 -0
- package/dist/src/browserLaunchOptions.js.map +1 -0
- package/dist/src/{caption.d.ts → cue.d.ts} +80 -74
- package/dist/src/cue.d.ts.map +1 -0
- package/dist/src/{caption.js → cue.js} +120 -90
- package/dist/src/cue.js.map +1 -0
- package/dist/src/events.d.ts +27 -27
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +21 -21
- package/dist/src/events.js.map +1 -1
- package/dist/src/instrument.js +3 -3
- package/dist/src/instrument.js.map +1 -1
- package/dist/src/recordingData.d.ts +16 -16
- package/dist/src/recordingData.d.ts.map +1 -1
- package/dist/src/types.d.ts +4 -4
- 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 +3 -3
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +11 -25
- package/dist/src/video.js.map +1 -1
- package/dist/src/voices.d.ts +18 -18
- package/dist/src/voices.js +15 -15
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skills/screenci/SKILL.md +20 -18
- package/skills/screenci/references/record.md +9 -6
- package/dist/src/caption.d.ts.map +0 -1
- package/dist/src/caption.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -7,9 +7,9 @@ export { DEFAULT_ASPECT_RATIO, DEFAULT_FPS, DEFAULT_QUALITY, DEFAULT_TRACE, DEFA
|
|
|
7
7
|
export { getDimensions } from './src/dimensions.js';
|
|
8
8
|
// Re-export config function
|
|
9
9
|
export { defineConfig } from './src/config.js';
|
|
10
|
-
// Re-export video fixture and
|
|
10
|
+
// Re-export video fixture and cue
|
|
11
11
|
export { video } from './src/video.js';
|
|
12
|
-
export {
|
|
12
|
+
export { createNarration, createVideoCues } from './src/cue.js';
|
|
13
13
|
export { hide } from './src/hide.js';
|
|
14
14
|
export { autoZoom } from './src/autoZoom.js';
|
|
15
15
|
export { createAssets } from './src/asset.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,mBAAmB;AACnB,OAAO,EACL,MAAM,EACN,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AA+BxB,2BAA2B;AAC3B,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAE1B,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,4BAA4B;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,mBAAmB;AACnB,OAAO,EACL,MAAM,EACN,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AA+BxB,2BAA2B;AAC3B,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAE1B,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,4BAA4B;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,kCAAkC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAgB/D,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserLaunchOptions.d.ts","sourceRoot":"","sources":["../../src/browserLaunchOptions.ts"],"names":[],"mappings":"AAcA,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,OAAO,GAC1D;IACE,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,GACD,SAAS,CASZ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const RECORDING_CHROMIUM_ARGS = [
|
|
2
|
+
'--window-position=0,0',
|
|
3
|
+
'--kiosk',
|
|
4
|
+
'--disable-translate',
|
|
5
|
+
'--disable-spell-checking',
|
|
6
|
+
'--disable-notifications', // no permission popups
|
|
7
|
+
'--disable-save-password-bubble', // no "save password?" dialog
|
|
8
|
+
'--deny-permission-prompts',
|
|
9
|
+
'--disable-save-password-bubble', // no "save password?" dialog
|
|
10
|
+
'--disable-infobars', // no "Chrome is being controlled by..." bar
|
|
11
|
+
'--no-first-run', // skip first-run UI
|
|
12
|
+
'--hide-scrollbars', // scrollbars invisible in recordings
|
|
13
|
+
];
|
|
14
|
+
export function getChromiumLaunchOptions(shouldRecord) {
|
|
15
|
+
if (!shouldRecord) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
headless: false,
|
|
20
|
+
args: [...RECORDING_CHROMIUM_ARGS],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=browserLaunchOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserLaunchOptions.js","sourceRoot":"","sources":["../../src/browserLaunchOptions.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG;IAC9B,uBAAuB;IACvB,SAAS;IACT,qBAAqB;IACrB,0BAA0B;IAC1B,yBAAyB,EAAE,uBAAuB;IAClD,gCAAgC,EAAE,6BAA6B;IAC/D,2BAA2B;IAC3B,gCAAgC,EAAE,6BAA6B;IAC/D,oBAAoB,EAAE,4CAA4C;IAClE,gBAAgB,EAAE,oBAAoB;IACtC,mBAAmB,EAAE,qCAAqC;CAClD,CAAA;AAEV,MAAM,UAAU,wBAAwB,CAAC,YAAqB;IAM5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,CAAC,GAAG,uBAAuB,CAAC;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -2,57 +2,63 @@ import type { IEventRecorder } from './events.js';
|
|
|
2
2
|
import type { VoiceKey, VoiceForLang, Lang, CustomVoiceRef, ModelType } from './voices.js';
|
|
3
3
|
export declare const ONE_FRAME_MS: number;
|
|
4
4
|
export declare function setSleepFn(fn: (ms: number) => void): void;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
5
|
+
export declare function setActiveCueRecorder(recorder: IEventRecorder | null): void;
|
|
6
|
+
export declare function resetCueChain(): void;
|
|
7
7
|
export declare function resetRegisteredCustomVoiceRefs(): void;
|
|
8
8
|
export declare function validateCustomVoiceRefs(testFilePath: string): Promise<void>;
|
|
9
9
|
/**
|
|
10
|
-
* A
|
|
10
|
+
* A narration controller. Awaiting it starts the narration segment.
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
13
|
* ```ts
|
|
14
|
-
* await
|
|
14
|
+
* await narration.intro
|
|
15
15
|
* await page.goto('/dashboard')
|
|
16
|
-
* await
|
|
16
|
+
* await narration.nextStep
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
export type
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
export type CueController = PromiseLike<void>;
|
|
20
|
+
type NarrationCueObject = {
|
|
21
|
+
text: string;
|
|
22
|
+
} | {
|
|
23
|
+
media: string;
|
|
24
|
+
subtitle?: string;
|
|
25
|
+
} | {
|
|
22
26
|
path: string;
|
|
23
27
|
subtitle?: string;
|
|
24
28
|
};
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
/** A single narration cue value in a multi-language map. */
|
|
30
|
+
export type CueMapValue = string | NarrationCueObject;
|
|
31
|
+
export type Cues<T extends Record<string, CueMapValue>> = {
|
|
32
|
+
[K in keyof T]: CueController;
|
|
27
33
|
} & {
|
|
28
34
|
/**
|
|
29
|
-
* Waits for the current
|
|
35
|
+
* Waits for the current narration segment to finish before the next action.
|
|
30
36
|
*
|
|
31
|
-
* Only needed when an action must happen _after_
|
|
32
|
-
* Consecutive `await
|
|
37
|
+
* Only needed when an action must happen _after_ narration ends.
|
|
38
|
+
* Consecutive `await narration.x` calls sequence automatically — each
|
|
33
39
|
* one ends the previous before starting.
|
|
34
40
|
*
|
|
35
41
|
* @example
|
|
36
42
|
* ```ts
|
|
37
|
-
* await
|
|
38
|
-
* await
|
|
43
|
+
* await narration.intro
|
|
44
|
+
* await narration.wait() // wait for intro audio to finish
|
|
39
45
|
* await page.click('#next') // click happens after intro ends
|
|
40
46
|
* ```
|
|
41
47
|
*/
|
|
42
|
-
|
|
48
|
+
wait(): Promise<void>;
|
|
43
49
|
};
|
|
44
|
-
export type
|
|
50
|
+
export type VideoCueEntry = string | {
|
|
45
51
|
path: string;
|
|
46
52
|
subtitle?: string;
|
|
47
53
|
};
|
|
48
|
-
export type
|
|
49
|
-
[K in keyof T]:
|
|
54
|
+
export type VideoCues<T extends Record<string, VideoCueEntry>> = {
|
|
55
|
+
[K in keyof T]: CueController;
|
|
50
56
|
} & {
|
|
51
57
|
/**
|
|
52
|
-
* Waits for the current
|
|
53
|
-
* @see {@link
|
|
58
|
+
* Waits for the current narration segment to finish before the next action.
|
|
59
|
+
* @see {@link Cues.wait}
|
|
54
60
|
*/
|
|
55
|
-
|
|
61
|
+
wait(): Promise<void>;
|
|
56
62
|
};
|
|
57
63
|
/**
|
|
58
64
|
* Top-level voice configuration shared across all languages.
|
|
@@ -87,13 +93,13 @@ export type TopLevelVoiceConfig = {
|
|
|
87
93
|
modelType?: ModelType;
|
|
88
94
|
};
|
|
89
95
|
/**
|
|
90
|
-
* Per-language
|
|
96
|
+
* Per-language narration override. Can override the top-level voice name and
|
|
91
97
|
* optionally set a `seed` for TTS generation.
|
|
92
98
|
*
|
|
93
99
|
* Use `style` for expressive synthesis, or `modelType` for an explicit
|
|
94
100
|
* model choice. `style` and `modelType` are mutually exclusive.
|
|
95
101
|
*/
|
|
96
|
-
export type
|
|
102
|
+
export type LangNarrationOverride = {
|
|
97
103
|
name: VoiceKey | CustomVoiceRef;
|
|
98
104
|
/**
|
|
99
105
|
* Integer seed included in the audio cache key. A different seed always forces
|
|
@@ -131,18 +137,23 @@ export type LangVoiceOverride = {
|
|
|
131
137
|
/** Converts a union type to an intersection: `A | B` → `A & B` */
|
|
132
138
|
type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
133
139
|
/**
|
|
134
|
-
* Produces a record requiring every key that appears in any language's
|
|
135
|
-
* Uses each language's key set with
|
|
140
|
+
* Produces a record requiring every key that appears in any language's cues.
|
|
141
|
+
* Uses each language's key set with CueMapValue values before intersecting,
|
|
136
142
|
* so value types don't conflict (e.g. string vs { path, subtitle } for the same key).
|
|
137
143
|
*/
|
|
138
|
-
type
|
|
139
|
-
|
|
140
|
-
|
|
144
|
+
type LanguageEntryBase = {
|
|
145
|
+
voice?: LangNarrationOverride;
|
|
146
|
+
region?: string;
|
|
147
|
+
};
|
|
148
|
+
type LanguageCuesEntry<C extends Record<string, CueMapValue>> = LanguageEntryBase & {
|
|
149
|
+
cues: C;
|
|
150
|
+
};
|
|
151
|
+
type AllCues<M extends Partial<Record<Lang, LanguageCuesEntry<Record<string, CueMapValue>>>>> = UnionToIntersection<{
|
|
141
152
|
[L in keyof M]: M[L] extends {
|
|
142
|
-
|
|
143
|
-
} ? Record<keyof C & string,
|
|
144
|
-
}[keyof M]> & Record<string,
|
|
145
|
-
type
|
|
153
|
+
cues: infer C;
|
|
154
|
+
} ? Record<keyof C & string, CueMapValue> : never;
|
|
155
|
+
}[keyof M]> & Record<string, CueMapValue>;
|
|
156
|
+
type LangNarrationOverrideForLang<L extends string> = {
|
|
146
157
|
name: (L extends Lang ? VoiceForLang<L> : VoiceKey) | CustomVoiceRef;
|
|
147
158
|
seed?: number;
|
|
148
159
|
style: string;
|
|
@@ -157,114 +168,109 @@ type LangVoiceOverrideForLang<L extends string> = {
|
|
|
157
168
|
pacing?: never;
|
|
158
169
|
modelType?: ModelType;
|
|
159
170
|
};
|
|
160
|
-
type LanguagesMap<M extends Partial<Record<Lang, {
|
|
161
|
-
captions: Record<string, CaptionMapValue>;
|
|
162
|
-
}>>> = M & {
|
|
171
|
+
type LanguagesMap<M extends Partial<Record<Lang, LanguageCuesEntry<Record<string, CueMapValue>>>>> = M & {
|
|
163
172
|
[L in keyof M]: {
|
|
164
|
-
voice?: L extends string ?
|
|
173
|
+
voice?: L extends string ? LangNarrationOverrideForLang<L> : never;
|
|
165
174
|
/** BCP-47 region code for TTS synthesis, e.g. `languageRegions.en.US`. */
|
|
166
175
|
region?: string;
|
|
167
|
-
|
|
176
|
+
} & {
|
|
177
|
+
cues: AllCues<M>;
|
|
168
178
|
};
|
|
169
179
|
};
|
|
170
180
|
/**
|
|
171
|
-
* Creates a set of typed
|
|
181
|
+
* Creates a set of typed narration controllers, one per key in the map.
|
|
172
182
|
*
|
|
173
183
|
* Each controller has `start()` and `end()`.
|
|
174
|
-
* At render time screenci generates
|
|
184
|
+
* At render time screenci generates narration, and syncs the audio to the
|
|
175
185
|
* recording. You write text; the voice is handled for you.
|
|
176
186
|
*
|
|
177
187
|
* The top-level `voice` applies to all languages. Override it per-language via
|
|
178
188
|
* the `voice` field inside each language entry. Only language-level overrides
|
|
179
189
|
* may set `seed`.
|
|
180
190
|
*
|
|
181
|
-
* TypeScript enforces that every language has the same
|
|
191
|
+
* TypeScript enforces that every language has the same cue keys.
|
|
182
192
|
* Forget a translation key → compile error.
|
|
183
193
|
*
|
|
184
194
|
* @example
|
|
185
195
|
* ```ts
|
|
186
|
-
* const
|
|
196
|
+
* const narration = createNarration({
|
|
187
197
|
* voice: { name: voices.Ava, style: 'Clear and friendly' },
|
|
188
198
|
* languages: {
|
|
189
|
-
* en: {
|
|
199
|
+
* en: { cues: { intro: 'Welcome.', next: 'Click here.' } },
|
|
190
200
|
* fi: {
|
|
191
201
|
* voice: { name: voices.Nora, style: 'Selkeä opastus', seed: 42 },
|
|
192
|
-
*
|
|
202
|
+
* cues: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
|
|
193
203
|
* },
|
|
194
204
|
* },
|
|
195
205
|
* })
|
|
196
206
|
*
|
|
197
|
-
* // Await a
|
|
198
|
-
* await
|
|
207
|
+
* // Await a narration segment directly to start it:
|
|
208
|
+
* await narration.intro
|
|
199
209
|
* await page.goto('/dashboard')
|
|
200
210
|
*
|
|
201
|
-
* // Consecutive
|
|
202
|
-
* await
|
|
203
|
-
* await
|
|
211
|
+
* // Consecutive narration segments sequence automatically:
|
|
212
|
+
* await narration.intro
|
|
213
|
+
* await narration.next // ends intro, then starts next
|
|
204
214
|
*
|
|
205
215
|
* // Wait for audio to finish before an action:
|
|
206
|
-
* await
|
|
207
|
-
* await
|
|
216
|
+
* await narration.intro
|
|
217
|
+
* await narration.wait()
|
|
208
218
|
* await page.click('#start')
|
|
209
219
|
* ```
|
|
210
220
|
*/
|
|
211
|
-
export declare function
|
|
212
|
-
voice?: LangVoiceOverride;
|
|
213
|
-
region?: string;
|
|
214
|
-
captions: Record<string, CaptionMapValue>;
|
|
215
|
-
}>>>(input: {
|
|
221
|
+
export declare function createNarration<M extends Partial<Record<Lang, LanguageCuesEntry<Record<string, CueMapValue>>>>>(input: {
|
|
216
222
|
voice: TopLevelVoiceConfig;
|
|
217
223
|
languages: LanguagesMap<M>;
|
|
218
|
-
}):
|
|
224
|
+
}): Cues<AllCues<M>>;
|
|
219
225
|
type RequireAllSameVideoKeys<M extends Partial<Record<Lang, {
|
|
220
|
-
|
|
226
|
+
cues: Record<string, VideoCueEntry>;
|
|
221
227
|
}>>> = {
|
|
222
228
|
[L in keyof M]: {
|
|
223
|
-
|
|
224
|
-
|
|
229
|
+
cues: UnionToIntersection<M[keyof M] extends {
|
|
230
|
+
cues: infer C;
|
|
225
231
|
} ? C : never>;
|
|
226
232
|
};
|
|
227
233
|
};
|
|
228
234
|
/**
|
|
229
|
-
* Creates
|
|
235
|
+
* Creates cue controllers backed by pre-recorded asset files instead of
|
|
230
236
|
* TTS-generated audio. Each entry maps a name to either an asset path string
|
|
231
237
|
* or an object with `assetPath` and an optional `subtitle` text.
|
|
232
238
|
*
|
|
233
|
-
* At render time the asset file is used directly as
|
|
239
|
+
* At render time the asset file is used directly as narration audio.
|
|
234
240
|
* If `subtitle` is provided, words are spread with equal timing across the
|
|
235
241
|
* audio duration (no word-level TTS data available).
|
|
236
242
|
*
|
|
237
|
-
* Same constraints as `
|
|
243
|
+
* Same constraints as `createNarration`: cannot overlap with other cues,
|
|
238
244
|
* and cannot fall inside input events.
|
|
239
245
|
*
|
|
240
246
|
* Two overloads:
|
|
241
247
|
*
|
|
242
248
|
* **1. Single-language:**
|
|
243
249
|
* ```ts
|
|
244
|
-
* const
|
|
250
|
+
* const cues = createVideoCues({
|
|
245
251
|
* intro: '/assets/intro.mp3',
|
|
246
252
|
* demo: { assetPath: '/assets/demo.mp3', subtitle: 'Watch the demo.' },
|
|
247
253
|
* })
|
|
248
254
|
* ```
|
|
249
255
|
*
|
|
250
256
|
* **2. Multi-language (type-safe):**
|
|
251
|
-
* TypeScript enforces that every language has the same
|
|
257
|
+
* TypeScript enforces that every language has the same cue keys.
|
|
252
258
|
* ```ts
|
|
253
|
-
* const
|
|
254
|
-
* en: {
|
|
255
|
-
* fi: {
|
|
259
|
+
* const cues = createVideoCues({
|
|
260
|
+
* en: { cues: { intro: '/assets/en/intro.mp3' } },
|
|
261
|
+
* fi: { cues: { intro: '/assets/fi/intro.mp3' } },
|
|
256
262
|
* })
|
|
257
263
|
* ```
|
|
258
264
|
*/
|
|
259
|
-
export declare function
|
|
260
|
-
export declare function
|
|
265
|
+
export declare function createVideoCues<T extends Record<string, VideoCueEntry>>(cuesMap: T): VideoCues<T>;
|
|
266
|
+
export declare function createVideoCues<L extends Lang, T extends Record<string, VideoCueEntry>>(languagesMap: {
|
|
261
267
|
[K in L]: {
|
|
262
|
-
|
|
268
|
+
cues: T;
|
|
263
269
|
};
|
|
264
270
|
} & RequireAllSameVideoKeys<{
|
|
265
271
|
[K in L]: {
|
|
266
|
-
|
|
272
|
+
cues: Record<string, VideoCueEntry>;
|
|
267
273
|
};
|
|
268
|
-
}>):
|
|
274
|
+
}>): VideoCues<T & Record<string, VideoCueEntry>>;
|
|
269
275
|
export {};
|
|
270
|
-
//# sourceMappingURL=
|
|
276
|
+
//# sourceMappingURL=cue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cue.d.ts","sourceRoot":"","sources":["../../src/cue.ts"],"names":[],"mappings":"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"}
|