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.
Files changed (40) hide show
  1. package/README.md +26 -26
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +10 -88
  4. package/dist/cli.js.map +1 -1
  5. package/dist/index.d.ts +5 -5
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/browserLaunchOptions.d.ts +5 -0
  10. package/dist/src/browserLaunchOptions.d.ts.map +1 -0
  11. package/dist/src/browserLaunchOptions.js +23 -0
  12. package/dist/src/browserLaunchOptions.js.map +1 -0
  13. package/dist/src/{caption.d.ts → cue.d.ts} +80 -74
  14. package/dist/src/cue.d.ts.map +1 -0
  15. package/dist/src/{caption.js → cue.js} +120 -90
  16. package/dist/src/cue.js.map +1 -0
  17. package/dist/src/events.d.ts +27 -27
  18. package/dist/src/events.d.ts.map +1 -1
  19. package/dist/src/events.js +21 -21
  20. package/dist/src/events.js.map +1 -1
  21. package/dist/src/instrument.js +3 -3
  22. package/dist/src/instrument.js.map +1 -1
  23. package/dist/src/recordingData.d.ts +16 -16
  24. package/dist/src/recordingData.d.ts.map +1 -1
  25. package/dist/src/types.d.ts +4 -4
  26. package/dist/src/types.d.ts.map +1 -1
  27. package/dist/src/types.js +1 -1
  28. package/dist/src/types.js.map +1 -1
  29. package/dist/src/video.d.ts +3 -3
  30. package/dist/src/video.d.ts.map +1 -1
  31. package/dist/src/video.js +11 -25
  32. package/dist/src/video.js.map +1 -1
  33. package/dist/src/voices.d.ts +18 -18
  34. package/dist/src/voices.js +15 -15
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +1 -1
  37. package/skills/screenci/SKILL.md +20 -18
  38. package/skills/screenci/references/record.md +9 -6
  39. package/dist/src/caption.d.ts.map +0 -1
  40. 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 caption
10
+ // Re-export video fixture and cue
11
11
  export { video } from './src/video.js';
12
- export { createVoiceOvers, createVideoCaptions } from './src/caption.js';
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,sCAAsC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEtC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAgBxE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
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,5 @@
1
+ export declare function getChromiumLaunchOptions(shouldRecord: boolean): {
2
+ headless: false;
3
+ args: string[];
4
+ } | undefined;
5
+ //# sourceMappingURL=browserLaunchOptions.d.ts.map
@@ -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 setActiveCaptionRecorder(recorder: IEventRecorder | null): void;
6
- export declare function resetCaptionChain(): void;
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 voiceOver controller. Awaiting it starts the voiceover.
10
+ * A narration controller. Awaiting it starts the narration segment.
11
11
  *
12
12
  * @example
13
13
  * ```ts
14
- * await voiceOvers.intro
14
+ * await narration.intro
15
15
  * await page.goto('/dashboard')
16
- * await voiceOvers.nextStep
16
+ * await narration.nextStep
17
17
  * ```
18
18
  */
19
- export type CaptionController = PromiseLike<void>;
20
- /** A single caption value in a multi-language map: either TTS text or a file-based entry. */
21
- export type CaptionMapValue = string | {
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
- export type Captions<T extends Record<string, CaptionMapValue>> = {
26
- [K in keyof T]: CaptionController;
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 voiceOver to finish before the next action.
35
+ * Waits for the current narration segment to finish before the next action.
30
36
  *
31
- * Only needed when an action must happen _after_ a voiceOver ends.
32
- * Consecutive `await voiceOvers.x` calls sequence automatically — each
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 voiceOvers.intro
38
- * await voiceOvers.waitEnd() // wait for intro audio to finish
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
- waitEnd(): Promise<void>;
48
+ wait(): Promise<void>;
43
49
  };
44
- export type VideoCaptionEntry = string | {
50
+ export type VideoCueEntry = string | {
45
51
  path: string;
46
52
  subtitle?: string;
47
53
  };
48
- export type VideoCaptions<T extends Record<string, VideoCaptionEntry>> = {
49
- [K in keyof T]: CaptionController;
54
+ export type VideoCues<T extends Record<string, VideoCueEntry>> = {
55
+ [K in keyof T]: CueController;
50
56
  } & {
51
57
  /**
52
- * Waits for the current voiceOver to finish before the next action.
53
- * @see {@link Captions.waitEnd}
58
+ * Waits for the current narration segment to finish before the next action.
59
+ * @see {@link Cues.wait}
54
60
  */
55
- waitEnd(): Promise<void>;
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 voice override. Can override the top-level voice name and
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 LangVoiceOverride = {
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 captions.
135
- * Uses each language's key set with CaptionMapValue values before intersecting,
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 AllCaptions<M extends Partial<Record<Lang, {
139
- captions: Record<string, CaptionMapValue>;
140
- }>>> = UnionToIntersection<{
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
- captions: infer C;
143
- } ? Record<keyof C & string, CaptionMapValue> : never;
144
- }[keyof M]> & Record<string, CaptionMapValue>;
145
- type LangVoiceOverrideForLang<L extends string> = {
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 ? LangVoiceOverrideForLang<L> : never;
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
- captions: AllCaptions<M>;
176
+ } & {
177
+ cues: AllCues<M>;
168
178
  };
169
179
  };
170
180
  /**
171
- * Creates a set of typed voiceover controllers, one per key in the map.
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 a voiceover, and syncs the audio to the
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 caption keys.
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 voiceOvers = createVoiceOvers({
196
+ * const narration = createNarration({
187
197
  * voice: { name: voices.Ava, style: 'Clear and friendly' },
188
198
  * languages: {
189
- * en: { captions: { intro: 'Welcome.', next: 'Click here.' } },
199
+ * en: { cues: { intro: 'Welcome.', next: 'Click here.' } },
190
200
  * fi: {
191
201
  * voice: { name: voices.Nora, style: 'Selkeä opastus', seed: 42 },
192
- * captions: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
202
+ * cues: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
193
203
  * },
194
204
  * },
195
205
  * })
196
206
  *
197
- * // Await a voiceOver directly to start it:
198
- * await voiceOvers.intro
207
+ * // Await a narration segment directly to start it:
208
+ * await narration.intro
199
209
  * await page.goto('/dashboard')
200
210
  *
201
- * // Consecutive voiceOvers sequence automatically:
202
- * await voiceOvers.intro
203
- * await voiceOvers.next // ends intro, then starts next
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 voiceOvers.intro
207
- * await voiceOvers.waitEnd()
216
+ * await narration.intro
217
+ * await narration.wait()
208
218
  * await page.click('#start')
209
219
  * ```
210
220
  */
211
- export declare function createVoiceOvers<M extends Partial<Record<Lang, {
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
- }): Captions<AllCaptions<M>>;
224
+ }): Cues<AllCues<M>>;
219
225
  type RequireAllSameVideoKeys<M extends Partial<Record<Lang, {
220
- captions: Record<string, VideoCaptionEntry>;
226
+ cues: Record<string, VideoCueEntry>;
221
227
  }>>> = {
222
228
  [L in keyof M]: {
223
- captions: UnionToIntersection<M[keyof M] extends {
224
- captions: infer C;
229
+ cues: UnionToIntersection<M[keyof M] extends {
230
+ cues: infer C;
225
231
  } ? C : never>;
226
232
  };
227
233
  };
228
234
  /**
229
- * Creates caption controllers backed by pre-recorded asset files instead of
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 the voiceover audio.
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 `createVoiceOvers`: cannot overlap with other captions,
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 captions = createVideoCaptions({
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 caption keys.
257
+ * TypeScript enforces that every language has the same cue keys.
252
258
  * ```ts
253
- * const captions = createVideoCaptions({
254
- * en: { captions: { intro: '/assets/en/intro.mp3' } },
255
- * fi: { captions: { intro: '/assets/fi/intro.mp3' } },
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 createVideoCaptions<T extends Record<string, VideoCaptionEntry>>(captionsMap: T): VideoCaptions<T>;
260
- export declare function createVideoCaptions<L extends Lang, T extends Record<string, VideoCaptionEntry>>(languagesMap: {
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
- captions: T;
268
+ cues: T;
263
269
  };
264
270
  } & RequireAllSameVideoKeys<{
265
271
  [K in L]: {
266
- captions: Record<string, VideoCaptionEntry>;
272
+ cues: Record<string, VideoCueEntry>;
267
273
  };
268
- }>): VideoCaptions<T & Record<string, VideoCaptionEntry>>;
274
+ }>): VideoCues<T & Record<string, VideoCueEntry>>;
269
275
  export {};
270
- //# sourceMappingURL=caption.d.ts.map
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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"}