screenci 0.0.14 → 0.0.16

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 (42) hide show
  1. package/README.md +26 -26
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +65 -22
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.d.ts +5 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/src/browserLaunchOptions.d.ts +5 -0
  11. package/dist/src/browserLaunchOptions.d.ts.map +1 -0
  12. package/dist/src/browserLaunchOptions.js +23 -0
  13. package/dist/src/browserLaunchOptions.js.map +1 -0
  14. package/dist/src/cue.d.ts +276 -0
  15. package/dist/src/cue.d.ts.map +1 -0
  16. package/dist/src/{caption.js → cue.js} +120 -90
  17. package/dist/src/cue.js.map +1 -0
  18. package/dist/src/events.d.ts +54 -40
  19. package/dist/src/events.d.ts.map +1 -1
  20. package/dist/src/events.js +21 -21
  21. package/dist/src/events.js.map +1 -1
  22. package/dist/src/instrument.js +3 -3
  23. package/dist/src/instrument.js.map +1 -1
  24. package/dist/src/recordingData.d.ts +16 -16
  25. package/dist/src/recordingData.d.ts.map +1 -1
  26. package/dist/src/types.d.ts +4 -4
  27. package/dist/src/types.d.ts.map +1 -1
  28. package/dist/src/types.js +1 -1
  29. package/dist/src/types.js.map +1 -1
  30. package/dist/src/video.d.ts +3 -3
  31. package/dist/src/video.d.ts.map +1 -1
  32. package/dist/src/video.js +11 -25
  33. package/dist/src/video.js.map +1 -1
  34. package/dist/src/voices.d.ts +18 -18
  35. package/dist/src/voices.js +15 -15
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/skills/screenci/SKILL.md +20 -18
  39. package/skills/screenci/references/record.md +9 -6
  40. package/dist/src/caption.d.ts +0 -262
  41. package/dist/src/caption.d.ts.map +0 -1
  42. package/dist/src/caption.js.map +0 -1
@@ -3,7 +3,7 @@ import { isInsideHide } from './hide.js';
3
3
  import { access, readFile } from 'fs/promises';
4
4
  import { createHash } from 'crypto';
5
5
  import { dirname, resolve } from 'path';
6
- // One frame at 24fps — ensures at least one rendered frame captures each caption state.
6
+ // One frame at 24fps — ensures at least one rendered frame captures each cue state.
7
7
  export const ONE_FRAME_MS = 1000 / 24;
8
8
  // Blocking sleep — spin until the elapsed time has passed
9
9
  let sleepFn = (ms) => {
@@ -16,19 +16,19 @@ export function setSleepFn(fn) {
16
16
  sleepFn = fn;
17
17
  }
18
18
  let activeRecorder = null;
19
- let captionStarted = false;
19
+ let cueStarted = false;
20
20
  const registeredCustomVoiceRefs = new Set();
21
21
  /** Maps local asset path → SHA-256 hash, populated during validateCustomVoiceRefs. */
22
- const videoCaptionFileHashes = new Map();
23
- export function setActiveCaptionRecorder(recorder) {
22
+ const videoCueFileHashes = new Map();
23
+ export function setActiveCueRecorder(recorder) {
24
24
  activeRecorder = recorder;
25
25
  }
26
- export function resetCaptionChain() {
27
- captionStarted = false;
26
+ export function resetCueChain() {
27
+ cueStarted = false;
28
28
  }
29
29
  export function resetRegisteredCustomVoiceRefs() {
30
30
  registeredCustomVoiceRefs.clear();
31
- videoCaptionFileHashes.clear();
31
+ videoCueFileHashes.clear();
32
32
  }
33
33
  export async function validateCustomVoiceRefs(testFilePath) {
34
34
  const testDir = dirname(testFilePath);
@@ -53,7 +53,7 @@ export async function validateCustomVoiceRefs(testFilePath) {
53
53
  .update(fileBuffer)
54
54
  .digest('hex');
55
55
  }
56
- for (const assetPath of videoCaptionFileHashes.keys()) {
56
+ for (const assetPath of videoCueFileHashes.keys()) {
57
57
  const candidates = [assetPath, resolve(testDir, assetPath)];
58
58
  let fileBuffer = null;
59
59
  for (const candidate of candidates) {
@@ -66,9 +66,9 @@ export async function validateCustomVoiceRefs(testFilePath) {
66
66
  }
67
67
  }
68
68
  if (fileBuffer === null) {
69
- throw new Error(`Video caption asset file not found: ${assetPath}`);
69
+ throw new Error(`Video cue asset file not found: ${assetPath}`);
70
70
  }
71
- videoCaptionFileHashes.set(assetPath, createHash('sha256').update(fileBuffer).digest('hex'));
71
+ videoCueFileHashes.set(assetPath, createHash('sha256').update(fileBuffer).digest('hex'));
72
72
  }
73
73
  }
74
74
  function toRecordedVoice(voice) {
@@ -85,79 +85,98 @@ function toRecordedVoice(voice) {
85
85
  };
86
86
  }
87
87
  /**
88
- * Auto-ends any currently active caption before starting a new one.
89
- * Called internally at the start of every voiceOver controller.
88
+ * Auto-ends any currently active cue before starting a new one.
89
+ * Called internally at the start of every narration controller.
90
90
  */
91
- function captionAutoEnd() {
92
- if (!captionStarted || activeRecorder === null)
91
+ function cueAutoEnd() {
92
+ if (!cueStarted || activeRecorder === null)
93
93
  return;
94
- activeRecorder.addCaptionEnd('auto');
94
+ activeRecorder.addCueEnd('auto');
95
95
  sleepFn(2 * ONE_FRAME_MS);
96
- captionStarted = false;
96
+ cueStarted = false;
97
97
  }
98
- async function doWaitEnd() {
99
- if (activeRecorder === null || !captionStarted)
98
+ async function doWait() {
99
+ if (activeRecorder === null || !cueStarted)
100
100
  return;
101
101
  if (isInsideHide())
102
- throw new Error('Cannot call waitEnd inside hide()');
103
- activeRecorder.addCaptionEnd('waitEnd');
102
+ throw new Error('Cannot call wait() inside hide()');
103
+ activeRecorder.addCueEnd('wait');
104
104
  sleepFn(2 * ONE_FRAME_MS);
105
- captionStarted = false;
105
+ cueStarted = false;
106
106
  }
107
107
  /**
108
- * Creates a set of typed voiceover controllers, one per key in the map.
108
+ * Creates a set of typed narration controllers, one per key in the map.
109
109
  *
110
110
  * Each controller has `start()` and `end()`.
111
- * At render time screenci generates a voiceover, and syncs the audio to the
111
+ * At render time screenci generates narration, and syncs the audio to the
112
112
  * recording. You write text; the voice is handled for you.
113
113
  *
114
114
  * The top-level `voice` applies to all languages. Override it per-language via
115
115
  * the `voice` field inside each language entry. Only language-level overrides
116
116
  * may set `seed`.
117
117
  *
118
- * TypeScript enforces that every language has the same caption keys.
118
+ * TypeScript enforces that every language has the same cue keys.
119
119
  * Forget a translation key → compile error.
120
120
  *
121
121
  * @example
122
122
  * ```ts
123
- * const voiceOvers = createVoiceOvers({
123
+ * const narration = createNarration({
124
124
  * voice: { name: voices.Ava, style: 'Clear and friendly' },
125
125
  * languages: {
126
- * en: { captions: { intro: 'Welcome.', next: 'Click here.' } },
126
+ * en: { cues: { intro: 'Welcome.', next: 'Click here.' } },
127
127
  * fi: {
128
128
  * voice: { name: voices.Nora, style: 'Selkeä opastus', seed: 42 },
129
- * captions: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
129
+ * cues: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
130
130
  * },
131
131
  * },
132
132
  * })
133
133
  *
134
- * // Await a voiceOver directly to start it:
135
- * await voiceOvers.intro
134
+ * // Await a narration segment directly to start it:
135
+ * await narration.intro
136
136
  * await page.goto('/dashboard')
137
137
  *
138
- * // Consecutive voiceOvers sequence automatically:
139
- * await voiceOvers.intro
140
- * await voiceOvers.next // ends intro, then starts next
138
+ * // Consecutive narration segments sequence automatically:
139
+ * await narration.intro
140
+ * await narration.next // ends intro, then starts next
141
141
  *
142
142
  * // Wait for audio to finish before an action:
143
- * await voiceOvers.intro
144
- * await voiceOvers.waitEnd()
143
+ * await narration.intro
144
+ * await narration.wait()
145
145
  * await page.click('#start')
146
146
  * ```
147
147
  */
148
- export function createVoiceOvers(input) {
149
- return buildCaptionsFromInput(input.voice, input.languages);
148
+ export function createNarration(input) {
149
+ return buildCuesFromInput(input.voice, input.languages);
150
+ }
151
+ function normalizeCueMapValue(value) {
152
+ if (typeof value === 'string') {
153
+ return { type: 'text', text: value };
154
+ }
155
+ if ('text' in value) {
156
+ return { type: 'text', text: value.text };
157
+ }
158
+ const mediaPath = 'media' in value ? value.media : value.path;
159
+ return {
160
+ type: 'file',
161
+ path: mediaPath,
162
+ ...(value.subtitle !== undefined && { subtitle: value.subtitle }),
163
+ };
164
+ }
165
+ function getLanguageCues(entry) {
166
+ if (entry === undefined)
167
+ return undefined;
168
+ return entry.cues;
150
169
  }
151
170
  function voiceToKeyString(voice) {
152
171
  if (isCustomVoiceRef(voice))
153
172
  return `custom:${voice.path}`;
154
173
  return voice;
155
174
  }
156
- function buildCaptionsFromInput(topVoice, languages) {
175
+ function buildCuesFromInput(topVoice, languages) {
157
176
  const langs = Object.keys(languages);
158
177
  const firstLang = langs[0];
159
178
  if (firstLang === undefined) {
160
- throw new Error('createVoiceOvers requires at least one language in "languages"');
179
+ throw new Error('createNarration requires at least one language in "languages"');
161
180
  }
162
181
  // Resolve effective voice and metadata per language
163
182
  const resolvedVoices = new Map();
@@ -209,30 +228,38 @@ function buildCaptionsFromInput(topVoice, languages) {
209
228
  if (!firstEntry)
210
229
  return {};
211
230
  const result = {};
212
- for (const key in firstEntry.captions) {
231
+ const firstCues = getLanguageCues(firstEntry);
232
+ if (firstCues === undefined)
233
+ return {};
234
+ for (const key in firstCues) {
213
235
  const keyStr = key;
214
- // Determine if any language uses a file-based value for this key.
236
+ const normalizedByLang = new Map();
237
+ // Normalize shorthand values and determine if any language uses a file entry for this key.
215
238
  let hasFileEntry = false;
216
239
  for (const lang of langs) {
217
- const val = languages[lang]?.captions[keyStr];
218
- if (val !== undefined && typeof val !== 'string') {
219
- hasFileEntry = true;
220
- videoCaptionFileHashes.set(val.path, '');
240
+ const val = getLanguageCues(languages[lang])?.[keyStr];
241
+ if (val !== undefined) {
242
+ const normalized = normalizeCueMapValue(val);
243
+ normalizedByLang.set(lang, normalized);
244
+ if (normalized.type === 'file') {
245
+ hasFileEntry = true;
246
+ videoCueFileHashes.set(normalized.path, '');
247
+ }
221
248
  }
222
249
  }
223
250
  if (hasFileEntry) {
224
251
  const fileStartFn = async () => {
225
252
  if (isInsideHide())
226
- throw new Error('Cannot start a voiceOver inside hide()');
253
+ throw new Error('Cannot start narration inside hide()');
227
254
  if (activeRecorder === null)
228
255
  return;
229
- captionAutoEnd();
256
+ cueAutoEnd();
230
257
  for (const lang of langs) {
231
258
  activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
232
259
  }
233
260
  const videoTranslations = {};
234
261
  for (const lang of langs) {
235
- const val = languages[lang]?.captions[keyStr];
262
+ const val = normalizedByLang.get(lang);
236
263
  if (val === undefined)
237
264
  continue;
238
265
  const voice = resolvedVoices.get(lang);
@@ -242,9 +269,9 @@ function buildCaptionsFromInput(topVoice, languages) {
242
269
  const style = meta?.style;
243
270
  const accent = meta?.accent;
244
271
  const pacing = meta?.pacing;
245
- if (typeof val === 'string') {
272
+ if (val.type === 'text') {
246
273
  videoTranslations[lang] = {
247
- text: val,
274
+ text: val.text,
248
275
  voice: toRecordedVoice(voice),
249
276
  ...(region !== undefined && { region }),
250
277
  ...(modelType !== undefined && { modelType }),
@@ -254,12 +281,15 @@ function buildCaptionsFromInput(topVoice, languages) {
254
281
  };
255
282
  }
256
283
  else {
257
- videoTranslations[lang] = entryToVideoTranslation(val);
284
+ videoTranslations[lang] = entryToVideoTranslation({
285
+ path: val.path,
286
+ ...(val.subtitle !== undefined && { subtitle: val.subtitle }),
287
+ });
258
288
  }
259
289
  }
260
- captionStarted = true;
290
+ cueStarted = true;
261
291
  sleepFn(2 * ONE_FRAME_MS);
262
- activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, videoTranslations);
292
+ activeRecorder.addVideoCueStart(keyStr, undefined, undefined, undefined, videoTranslations);
263
293
  };
264
294
  result[keyStr] = {
265
295
  then(resolve, reject) {
@@ -270,17 +300,17 @@ function buildCaptionsFromInput(topVoice, languages) {
270
300
  else {
271
301
  const textStartFn = async () => {
272
302
  if (isInsideHide())
273
- throw new Error('Cannot start a voiceOver inside hide()');
303
+ throw new Error('Cannot start narration inside hide()');
274
304
  if (activeRecorder === null)
275
305
  return;
276
- captionAutoEnd();
306
+ cueAutoEnd();
277
307
  for (const lang of langs) {
278
308
  activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
279
309
  }
280
310
  const textTranslations = {};
281
311
  for (const lang of langs) {
282
- const val = languages[lang]?.captions[keyStr];
283
- if (val !== undefined && typeof val === 'string') {
312
+ const val = normalizedByLang.get(lang);
313
+ if (val !== undefined && val.type === 'text') {
284
314
  const voice = resolvedVoices.get(lang);
285
315
  const region = languages[lang]?.region;
286
316
  const meta = resolvedVoiceMeta.get(lang);
@@ -289,7 +319,7 @@ function buildCaptionsFromInput(topVoice, languages) {
289
319
  const accent = meta?.accent;
290
320
  const pacing = meta?.pacing;
291
321
  textTranslations[lang] = {
292
- text: val,
322
+ text: val.text,
293
323
  voice: toRecordedVoice(voice),
294
324
  ...(region !== undefined && { region }),
295
325
  ...(modelType !== undefined && { modelType }),
@@ -299,9 +329,9 @@ function buildCaptionsFromInput(topVoice, languages) {
299
329
  };
300
330
  }
301
331
  }
302
- captionStarted = true;
332
+ cueStarted = true;
303
333
  sleepFn(2 * ONE_FRAME_MS);
304
- activeRecorder.addCaptionStart('', keyStr, undefined, textTranslations);
334
+ activeRecorder.addCueStart('', keyStr, undefined, textTranslations);
305
335
  };
306
336
  result[keyStr] = {
307
337
  then(resolve, reject) {
@@ -311,54 +341,54 @@ function buildCaptionsFromInput(topVoice, languages) {
311
341
  }
312
342
  }
313
343
  ;
314
- result.waitEnd = doWaitEnd;
344
+ result.wait = doWait;
315
345
  return result;
316
346
  }
317
347
  function entryToVideoTranslation(entry) {
318
348
  const path = typeof entry === 'string' ? entry : entry.path;
319
349
  const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
320
- const assetHash = videoCaptionFileHashes.get(path);
350
+ const assetHash = videoCueFileHashes.get(path);
321
351
  if (!assetHash)
322
- throw new Error(`Video caption asset hash missing for path: ${path}`);
352
+ throw new Error(`Video cue asset hash missing for path: ${path}`);
323
353
  return {
324
354
  assetHash,
325
355
  assetPath: path,
326
356
  ...(subtitle !== undefined && { subtitle }),
327
357
  };
328
358
  }
329
- export function createVideoCaptions(firstArg) {
330
- // Distinguish single-language vs multi-language by checking if any value has a `captions` key
359
+ export function createVideoCues(firstArg) {
360
+ // Distinguish single-language vs multi-language by checking if any value has a `cues` key
331
361
  const firstValue = Object.values(firstArg)[0];
332
362
  if (firstValue !== undefined &&
333
363
  typeof firstValue === 'object' &&
334
364
  !Array.isArray(firstValue) &&
335
- 'captions' in firstValue &&
336
- typeof firstValue.captions === 'object') {
337
- return buildMultiLangVideoCaptions(firstArg);
365
+ 'cues' in firstValue &&
366
+ typeof firstValue.cues === 'object') {
367
+ return buildMultiLangVideoCues(firstArg);
338
368
  }
339
- return buildSingleLangVideoCaptions(firstArg);
369
+ return buildSingleLangVideoCues(firstArg);
340
370
  }
341
- function buildSingleLangVideoCaptions(captionsMap) {
371
+ function buildSingleLangVideoCues(cuesMap) {
342
372
  const result = {};
343
- for (const key in captionsMap) {
344
- const entry = captionsMap[key];
373
+ for (const key in cuesMap) {
374
+ const entry = cuesMap[key];
345
375
  if (entry === undefined)
346
376
  continue;
347
377
  const assetPath = typeof entry === 'string' ? entry : entry.path;
348
378
  const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
349
- videoCaptionFileHashes.set(assetPath, '');
379
+ videoCueFileHashes.set(assetPath, '');
350
380
  const startFn = async () => {
351
381
  if (isInsideHide())
352
- throw new Error('Cannot start a voiceOver inside hide()');
382
+ throw new Error('Cannot start narration inside hide()');
353
383
  if (activeRecorder === null)
354
384
  return;
355
- captionAutoEnd();
356
- const assetHash = videoCaptionFileHashes.get(assetPath);
385
+ cueAutoEnd();
386
+ const assetHash = videoCueFileHashes.get(assetPath);
357
387
  if (!assetHash)
358
- throw new Error(`Video caption asset hash missing for path: ${assetPath}`);
359
- captionStarted = true;
388
+ throw new Error(`Video cue asset hash missing for path: ${assetPath}`);
389
+ cueStarted = true;
360
390
  sleepFn(2 * ONE_FRAME_MS);
361
- activeRecorder.addVideoCaptionStart(key, assetPath, assetHash, subtitle);
391
+ activeRecorder.addVideoCueStart(key, assetPath, assetHash, subtitle);
362
392
  };
363
393
  result[key] = {
364
394
  then(resolve, reject) {
@@ -367,38 +397,38 @@ function buildSingleLangVideoCaptions(captionsMap) {
367
397
  };
368
398
  }
369
399
  ;
370
- result.waitEnd = doWaitEnd;
400
+ result.wait = doWait;
371
401
  return result;
372
402
  }
373
- function buildMultiLangVideoCaptions(languagesMap) {
403
+ function buildMultiLangVideoCues(languagesMap) {
374
404
  const langs = Object.keys(languagesMap);
375
405
  const firstLang = langs[0];
376
406
  if (firstLang === undefined) {
377
407
  const empty = {};
378
- empty.waitEnd = doWaitEnd;
408
+ empty.wait = doWait;
379
409
  return empty;
380
410
  }
381
411
  const result = {};
382
- for (const key in languagesMap[firstLang].captions) {
412
+ for (const key in languagesMap[firstLang].cues) {
383
413
  const keyStr = key;
384
414
  const translations = {};
385
415
  for (const lang of langs) {
386
- const entry = languagesMap[lang].captions[keyStr];
416
+ const entry = languagesMap[lang].cues[keyStr];
387
417
  if (entry !== undefined) {
388
418
  const assetPath = typeof entry === 'string' ? entry : entry.path;
389
- videoCaptionFileHashes.set(assetPath, '');
419
+ videoCueFileHashes.set(assetPath, '');
390
420
  translations[lang] = entryToVideoTranslation(entry);
391
421
  }
392
422
  }
393
423
  const startFn = async () => {
394
424
  if (isInsideHide())
395
- throw new Error('Cannot start a voiceOver inside hide()');
425
+ throw new Error('Cannot start narration inside hide()');
396
426
  if (activeRecorder === null)
397
427
  return;
398
- captionAutoEnd();
399
- captionStarted = true;
428
+ cueAutoEnd();
429
+ cueStarted = true;
400
430
  sleepFn(2 * ONE_FRAME_MS);
401
- activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, translations);
431
+ activeRecorder.addVideoCueStart(keyStr, undefined, undefined, undefined, translations);
402
432
  };
403
433
  result[key] = {
404
434
  then(resolve, reject) {
@@ -407,7 +437,7 @@ function buildMultiLangVideoCaptions(languagesMap) {
407
437
  };
408
438
  }
409
439
  ;
410
- result.waitEnd = doWaitEnd;
440
+ result.wait = doWait;
411
441
  return result;
412
442
  }
413
- //# sourceMappingURL=caption.js.map
443
+ //# sourceMappingURL=cue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cue.js","sourceRoot":"","sources":["../../src/cue.ts"],"names":[],"mappings":"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"}