screenci 0.0.70 → 0.0.72

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 (108) hide show
  1. package/README.md +13 -13
  2. package/dist/cli.d.ts +9 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +184 -5
  5. package/dist/cli.js.map +1 -1
  6. package/dist/docs/manifest.d.ts +34 -34
  7. package/dist/docs/manifest.d.ts.map +1 -1
  8. package/dist/docs/manifest.js +20 -12
  9. package/dist/docs/manifest.js.map +1 -1
  10. package/dist/docs/video-sources/installation.screenci.js +13 -12
  11. package/dist/docs/video-sources/installation.screenci.js.map +1 -1
  12. package/dist/docs/video-sources/landing.screenci.js +16 -9
  13. package/dist/docs/video-sources/landing.screenci.js.map +1 -1
  14. package/dist/docs/video-sources/locator-highlight-animated.screenci.js +14 -26
  15. package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
  16. package/dist/docs/video-sources/locator-highlight-still.screenci.js +5 -10
  17. package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
  18. package/dist/docs/video-sources/product-pitch.screenci.js +97 -32
  19. package/dist/docs/video-sources/product-pitch.screenci.js.map +1 -1
  20. package/dist/docs/video-sources/public-urls.screenci.js +16 -9
  21. package/dist/docs/video-sources/public-urls.screenci.js.map +1 -1
  22. package/dist/docs/video-sources/studio.screenci.js +42 -27
  23. package/dist/docs/video-sources/studio.screenci.js.map +1 -1
  24. package/dist/docs/videos.d.ts +4 -15
  25. package/dist/docs/videos.d.ts.map +1 -1
  26. package/dist/docs/videos.js +6 -22
  27. package/dist/docs/videos.js.map +1 -1
  28. package/dist/index.d.ts +7 -5
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -4
  31. package/dist/index.js.map +1 -1
  32. package/dist/src/asset.d.ts +8 -23
  33. package/dist/src/asset.d.ts.map +1 -1
  34. package/dist/src/asset.js +10 -32
  35. package/dist/src/asset.js.map +1 -1
  36. package/dist/src/audio.d.ts +6 -24
  37. package/dist/src/audio.d.ts.map +1 -1
  38. package/dist/src/audio.js +10 -35
  39. package/dist/src/audio.js.map +1 -1
  40. package/dist/src/builder.d.ts +214 -0
  41. package/dist/src/builder.d.ts.map +1 -0
  42. package/dist/src/builder.js +212 -0
  43. package/dist/src/builder.js.map +1 -0
  44. package/dist/src/cue.d.ts +40 -123
  45. package/dist/src/cue.d.ts.map +1 -1
  46. package/dist/src/cue.js +190 -30
  47. package/dist/src/cue.js.map +1 -1
  48. package/dist/src/events.d.ts +80 -15
  49. package/dist/src/events.d.ts.map +1 -1
  50. package/dist/src/events.js +72 -6
  51. package/dist/src/events.js.map +1 -1
  52. package/dist/src/init.d.ts.map +1 -1
  53. package/dist/src/init.js +26 -14
  54. package/dist/src/init.js.map +1 -1
  55. package/dist/src/locales.d.ts +19 -0
  56. package/dist/src/locales.d.ts.map +1 -0
  57. package/dist/src/locales.js +60 -0
  58. package/dist/src/locales.js.map +1 -0
  59. package/dist/src/localize.d.ts +135 -0
  60. package/dist/src/localize.d.ts.map +1 -0
  61. package/dist/src/localize.js +195 -0
  62. package/dist/src/localize.js.map +1 -0
  63. package/dist/src/localizeRuntime.d.ts +53 -0
  64. package/dist/src/localizeRuntime.d.ts.map +1 -0
  65. package/dist/src/localizeRuntime.js +79 -0
  66. package/dist/src/localizeRuntime.js.map +1 -0
  67. package/dist/src/recordingData.d.ts +5 -4
  68. package/dist/src/recordingData.d.ts.map +1 -1
  69. package/dist/src/runtimeContext.d.ts +3 -4
  70. package/dist/src/runtimeContext.d.ts.map +1 -1
  71. package/dist/src/runtimeContext.js.map +1 -1
  72. package/dist/src/runtimeMode.d.ts +47 -0
  73. package/dist/src/runtimeMode.d.ts.map +1 -1
  74. package/dist/src/runtimeMode.js +124 -0
  75. package/dist/src/runtimeMode.js.map +1 -1
  76. package/dist/src/screenshot.d.ts +56 -2
  77. package/dist/src/screenshot.d.ts.map +1 -1
  78. package/dist/src/screenshot.js +47 -10
  79. package/dist/src/screenshot.js.map +1 -1
  80. package/dist/src/stillCapture.d.ts +2 -3
  81. package/dist/src/stillCapture.d.ts.map +1 -1
  82. package/dist/src/stillCapture.js.map +1 -1
  83. package/dist/src/studio.d.ts +55 -22
  84. package/dist/src/studio.d.ts.map +1 -1
  85. package/dist/src/studio.js +38 -12
  86. package/dist/src/studio.js.map +1 -1
  87. package/dist/src/types.d.ts +18 -5
  88. package/dist/src/types.d.ts.map +1 -1
  89. package/dist/src/types.js.map +1 -1
  90. package/dist/src/video.d.ts +149 -13
  91. package/dist/src/video.d.ts.map +1 -1
  92. package/dist/src/video.js +91 -24
  93. package/dist/src/video.js.map +1 -1
  94. package/dist/src/voiceConfig.d.ts +110 -0
  95. package/dist/src/voiceConfig.d.ts.map +1 -0
  96. package/dist/src/voiceConfig.js +2 -0
  97. package/dist/src/voiceConfig.js.map +1 -0
  98. package/dist/src/voices.d.ts +27 -23
  99. package/dist/src/voices.d.ts.map +1 -1
  100. package/dist/src/voices.js +7 -4
  101. package/dist/src/voices.js.map +1 -1
  102. package/dist/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +1 -1
  104. package/skills/screenci/SKILL.md +39 -30
  105. package/dist/docs/video-sources/cli.screenci.d.ts +0 -2
  106. package/dist/docs/video-sources/cli.screenci.d.ts.map +0 -1
  107. package/dist/docs/video-sources/cli.screenci.js +0 -36
  108. package/dist/docs/video-sources/cli.screenci.js.map +0 -1
package/dist/src/audio.js CHANGED
@@ -90,49 +90,24 @@ export function createAudio(tracks) {
90
90
  return result;
91
91
  }
92
92
  /**
93
- * Creates typed background audio controllers whose files, volume, and repeat are
94
- * configured on the ScreenCI Studio page instead of in code. Business tier only.
93
+ * Builds audio controllers for Studio-managed tracks declared via
94
+ * `video.studio({ audio: [...] })`. Each name becomes a callable controller with
95
+ * the same timeline behavior as a {@link createAudio} controller, including
96
+ * `start()`/`end()`. The audio file, volume, and repeat all come from Studio.
95
97
  *
96
- * Each key becomes a callable controller with the same timeline behavior as
97
- * {@link createAudio} controllers, including `start()`/`end()`. The audio file,
98
- * volume, and repeat all come from Studio (mirrors {@link createStudioOverlays}
99
- * for overlays).
100
- *
101
- * On the first upload of a studio-mode video, rendering is held until the video
102
- * is configured in Studio (the CLI prints a direct link). Later uploads reuse
103
- * the saved Studio configuration automatically.
104
- *
105
- * @example
106
- * ```ts
107
- * const music = createStudioAudio('theme', 'sting')
108
- *
109
- * video('Product demo', async ({ page }) => {
110
- * await music.theme() // plays under the whole video
111
- * await page.goto('/dashboard')
112
- * await music.sting.start()
113
- * await page.click('#celebrate')
114
- * await music.sting.end()
115
- * })
116
- * ```
98
+ * Internal: the `audio` fixture exposes these to the test body.
117
99
  */
118
- export function createStudioAudio(...keys) {
119
- const seen = new Set();
120
- for (const key of keys) {
121
- if (seen.has(key)) {
122
- throw new Error(`Duplicate audio key "${key}" passed to createStudioAudio. Audio keys must be unique.`);
123
- }
124
- seen.add(key);
125
- }
100
+ export function buildStudioAudioTracks(names) {
126
101
  const result = {};
127
- for (const key of keys) {
128
- result[key] = buildStudioAudioController(key);
102
+ for (const name of names) {
103
+ result[name] = buildStudioAudioController(name);
129
104
  }
130
105
  return result;
131
106
  }
132
107
  /**
133
108
  * Builds the callable/`start()`/`end()` audio controller shared by code-defined
134
- * ({@link createAudio}) and Studio ({@link createStudioAudio}) tracks. The only
135
- * difference is how `emitStart` records the start event.
109
+ * ({@link createAudio}) and Studio ({@link buildStudioAudioTracks}) tracks. The
110
+ * only difference is how `emitStart` records the start event.
136
111
  */
137
112
  function createAudioControllerCore(name, emitStart) {
138
113
  // start()/end() register a live run so end() can pair to its start and a
@@ -1 +1 @@
1
- {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/audio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ import type { TestDetails, TestInfo } from '@playwright/test';
2
+ import type { RecordOptions } from './types.js';
3
+ import type { NarrationCue } from './cue.js';
4
+ import type { OverlayController } from './asset.js';
5
+ import type { AudioController } from './audio.js';
6
+ import type { NarrationMarkers, TextValues } from './localizeRuntime.js';
7
+ import { type LocalizeSpec, type LocalizeNarrationValue, type NormalizedLocalize } from './localize.js';
8
+ import { type StudioDeclaration } from './studio.js';
9
+ /**
10
+ * One variant in a generic `video.each(...)` fan-out. Each variant produces a
11
+ * separate video (its own identity and stored history), differing only in its
12
+ * recording options and/or forwarded Playwright `use` options (e.g. a viewport
13
+ * via `recordOptions.aspectRatio`, or a theme via `use.colorScheme`).
14
+ */
15
+ export type EachVariant = {
16
+ /** Stable label appended to the video name, e.g. `'mobile'` or `'dark'`. */
17
+ key: string;
18
+ /** Recording options for this variant (merged over the video's defaults). */
19
+ recordOptions?: Partial<RecordOptions>;
20
+ /** Forwarded Playwright `use` options for this variant, e.g. `{ colorScheme: 'dark' }`. */
21
+ use?: Record<string, unknown>;
22
+ };
23
+ /** A single Playwright test to register, fully resolved from the fan-out specs. */
24
+ export type Registration = {
25
+ /** Label for the wrapping `describe` block (scopes per-test `use` options). */
26
+ describeTitle: string;
27
+ /** Unique Playwright test title (drives the per-pass `.screenci/<dir>`). */
28
+ leafTitle: string;
29
+ /** Grouping key written to `metadata.videoName`; shared across a video's languages. */
30
+ videoName: string;
31
+ /** Active language for this pass, or `null` in shared / no-localize mode. */
32
+ language: string | null;
33
+ /** Browser locale for this pass, or `null` to leave the default. */
34
+ locale: string | null;
35
+ /** Recording options patch for this pass, or `null` for none. */
36
+ recordOptions: Partial<RecordOptions> | null;
37
+ /** Forwarded Playwright `use` options for this pass, or `null` for none. */
38
+ use: Record<string, unknown> | null;
39
+ /** The normalized localize spec for this video, or `null` when not localized. */
40
+ localize: NormalizedLocalize | null;
41
+ /** The studio declaration for this video, or `null` when not studio-managed. */
42
+ studio: StudioDeclaration | null;
43
+ };
44
+ /**
45
+ * Expand the localize / each fan-out specs into the concrete list of Playwright
46
+ * tests to register. Pure and exported for testing.
47
+ *
48
+ * - With no `localize`, each variant yields a single language-agnostic test.
49
+ * - In `'shared'` mode, each variant yields one test that carries every language
50
+ * (narration is overdubbed at render); the `--languages` filter does not split
51
+ * a shared recording.
52
+ * - In `'per-language'` mode, each variant yields one test per language,
53
+ * intersected with the `--languages` filter when present. A variant whose
54
+ * languages are entirely filtered out yields nothing. The browser locale is set
55
+ * per language unless `browserLocale` is `false`.
56
+ */
57
+ export declare function expandRegistrations(params: {
58
+ baseTitle: string;
59
+ localize: NormalizedLocalize | null;
60
+ studio: StudioDeclaration | null;
61
+ eachVariants: EachVariant[] | null;
62
+ requestedLanguages: string[] | null;
63
+ }): Registration[];
64
+ type TestCall = {
65
+ (title: string, body: unknown): void;
66
+ (title: string, details: TestDetails, body: unknown): void;
67
+ };
68
+ /** Minimal view of the test API the builder needs to register tests. */
69
+ type RegistrarTest = TestCall & {
70
+ describe: (title: string, fn: () => void) => void;
71
+ use: (options: Record<string, unknown>) => void;
72
+ only: TestCall;
73
+ skip: TestCall;
74
+ fixme: TestCall;
75
+ fail: TestCall;
76
+ };
77
+ /** Converts a union type to an intersection: `A | B` -> `A & B`. */
78
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
79
+ /**
80
+ * Union of every inner key across all languages of a seeded map `M` (e.g. the
81
+ * cue names of `{ en: { intro, save }, fi: { intro, save } }`). Uses each
82
+ * language's key set before intersecting, so each language must cover the union
83
+ * (the identical-keys guarantee, enforced via {@link EnforceIdenticalKeys}).
84
+ */
85
+ type SeededKeys<M> = [M] extends [object] ? Extract<keyof UnionToIntersection<{
86
+ [L in keyof M]-?: NonNullable<M[L]> extends Record<string, unknown> ? Record<keyof NonNullable<M[L]> & string, unknown> : never;
87
+ }[keyof M]>, string> : never;
88
+ /** Studio-managed names from a `video.studio({...})` name list. */
89
+ type StudioNamesOf<N> = N extends readonly string[] ? N[number] : never;
90
+ /** Seeded cue names (declared in the per-language `narration` map). */
91
+ type CueNamesOf<S> = S extends {
92
+ narration: infer M;
93
+ } ? SeededKeys<M> : never;
94
+ /** Seeded `text` field names (declared in the per-language `text` map). */
95
+ type FieldNamesOf<S> = S extends {
96
+ text: infer T;
97
+ } ? SeededKeys<T> : never;
98
+ /**
99
+ * Constrains a seeded map so every language declares the same key set: each
100
+ * language is required to provide every key that appears in any language. A
101
+ * missing key fails to compile; an unrelated extra key is not part of the union,
102
+ * so it is rejected as excess.
103
+ */
104
+ type EnforceIdenticalKeys<M, Value> = {
105
+ [L in keyof M]: Record<SeededKeys<M>, Value>;
106
+ };
107
+ /**
108
+ * Refines a localize spec so its `narration`/`text` maps have identical keys
109
+ * across languages. Intersected with the inferred spec `S` at the `.localize`
110
+ * call site so a dropped per-language key is a compile error.
111
+ */
112
+ type ValidateLocalizeSpec<S> = (S extends {
113
+ narration: infer M;
114
+ } ? {
115
+ narration: EnforceIdenticalKeys<M, LocalizeNarrationValue>;
116
+ } : object) & (S extends {
117
+ text: infer T;
118
+ } ? {
119
+ text: EnforceIdenticalKeys<T, string>;
120
+ } : object);
121
+ type NarrationOverrideFor<S> = [CueNamesOf<S>] extends [never] ? NarrationMarkers : Record<CueNamesOf<S>, NarrationCue>;
122
+ /**
123
+ * The `text` fixture type for a spec: every field is a `string`. A seeded field
124
+ * carries its per-language value; a Studio-managed field (`studio.text`) is the
125
+ * empty string until it is set in Studio (the recording still succeeds). In
126
+ * `shared` mode there is no per-language injection, so seeded fields are also
127
+ * empty until provided.
128
+ */
129
+ type TextOverrideFor<S> = [FieldNamesOf<S>] extends [never] ? TextValues : Record<FieldNamesOf<S>, string>;
130
+ /**
131
+ * The fixture arg overrides a `localize(spec)` contributes: `narration` typed to
132
+ * the spec's cue names (only when the medium has narration) and `text` typed to
133
+ * its field names. Keys absent from `Args` (e.g. `narration` on a screenshot)
134
+ * are not added.
135
+ */
136
+ type LocalizeOverrides<Args, S> = ('narration' extends keyof Args ? {
137
+ narration: NarrationOverrideFor<S>;
138
+ } : object) & ('text' extends keyof Args ? {
139
+ text: TextOverrideFor<S>;
140
+ } : object);
141
+ /** Studio-managed names of each kind declared in a `video.studio({...})` spec. */
142
+ type StudioNarrationNamesOf<SD> = SD extends {
143
+ narration: infer N;
144
+ } ? StudioNamesOf<N> : never;
145
+ type StudioTextNamesOf<SD> = SD extends {
146
+ text: infer N;
147
+ } ? StudioNamesOf<N> : never;
148
+ type StudioOverlayNamesOf<SD> = SD extends {
149
+ overlays: infer N;
150
+ } ? StudioNamesOf<N> : never;
151
+ type StudioAudioNamesOf<SD> = SD extends {
152
+ audio: infer N;
153
+ } ? StudioNamesOf<N> : never;
154
+ /**
155
+ * The fixture arg overrides a `studio(decl)` contributes: each declared name
156
+ * list types its fixture (`narration`/`text`/`overlays`/`audio`) to the exact
157
+ * names so a typo is a compile error. Keys absent from `Args` (e.g. `narration`
158
+ * on a screenshot) or kinds not declared are not added. When combined with
159
+ * `localize(...)`, the per-fixture records intersect, unioning the names.
160
+ */
161
+ type StudioOverrides<Args, SD> = ('narration' extends keyof Args ? [StudioNarrationNamesOf<SD>] extends [never] ? object : {
162
+ narration: Record<StudioNarrationNamesOf<SD>, NarrationCue>;
163
+ } : object) & ('text' extends keyof Args ? [StudioTextNamesOf<SD>] extends [never] ? object : {
164
+ text: Record<StudioTextNamesOf<SD>, string>;
165
+ } : object) & ('overlays' extends keyof Args ? [StudioOverlayNamesOf<SD>] extends [never] ? object : {
166
+ overlays: Record<StudioOverlayNamesOf<SD>, OverlayController>;
167
+ } : object) & ('audio' extends keyof Args ? [StudioAudioNamesOf<SD>] extends [never] ? object : {
168
+ audio: Record<StudioAudioNamesOf<SD>, AudioController>;
169
+ } : object);
170
+ type MergeArgs<Args, O> = Omit<Args, keyof O> & O;
171
+ type BodyFn<Args> = (args: Args, testInfo: TestInfo) => void | Promise<void>;
172
+ /**
173
+ * A chainable fan-out builder. Callable to register the test(s), and exposes
174
+ * `.localize()` / `.each()` to refine the fan-out before the terminal call. `O`
175
+ * accumulates the typed fixture overrides from `.localize(...)` so the body sees
176
+ * `narration`/`text` typed to the spec's names.
177
+ */
178
+ type BuilderTerminal<Args, O> = {
179
+ (title: string, body: BodyFn<MergeArgs<Args, O>>): void;
180
+ (title: string, details: TestDetails, body: BodyFn<MergeArgs<Args, O>>): void;
181
+ };
182
+ export interface VideoBuilder<Args, O = object> extends BuilderTerminal<Args, O> {
183
+ /** Record one localized pass per language (or one shared capture). */
184
+ localize<const S extends LocalizeSpec>(spec: S & ValidateLocalizeSpec<S>): VideoBuilder<Args, O & LocalizeOverrides<Args, S>>;
185
+ /**
186
+ * Defer render/record options and declare Studio-managed narration, text,
187
+ * overlays, and audio (configured in the ScreenCI web app). The declared name
188
+ * lists type the matching fixtures to the exact names.
189
+ */
190
+ studio<const SD extends StudioDeclaration>(declaration: SD): VideoBuilder<Args, O & StudioOverrides<Args, SD>>;
191
+ /** Produce a separate video per variant (viewport, theme, ...). */
192
+ each(variants: EachVariant[]): VideoBuilder<Args, O>;
193
+ /** Register the localized test(s) with `test.only`. */
194
+ only: BuilderTerminal<Args, O>;
195
+ /** Register the localized test(s) with `test.skip`. */
196
+ skip: BuilderTerminal<Args, O>;
197
+ /** Register the localized test(s) with `test.fixme`. */
198
+ fixme: BuilderTerminal<Args, O>;
199
+ /** Register the localized test(s) with `test.fail`. */
200
+ fail: BuilderTerminal<Args, O>;
201
+ }
202
+ type BuilderState = {
203
+ localize: NormalizedLocalize | null;
204
+ studio: StudioDeclaration | null;
205
+ eachVariants: EachVariant[] | null;
206
+ };
207
+ /**
208
+ * Create a fan-out builder bound to a registrar test instance. `video.localize`
209
+ * and `video.each` are the `localize`/`each` methods of a root builder created
210
+ * with this factory. `Args` is the medium's fixture arg type (video/screenshot).
211
+ */
212
+ export declare function createVideoBuilder<Args>(test: RegistrarTest, state?: BuilderState): VideoBuilder<Args>;
213
+ export {};
214
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { resolveLocaleForLanguage } from './locales.js';
3
+ import { parseRequestedLanguages } from './runtimeMode.js';
4
+ import { logger } from './logger.js';
5
+ import { normalizeLocalizeSpec, } from './localize.js';
6
+ import { validateStudioDeclaration } from './studio.js';
7
+ function variantVideoName(baseTitle, variant) {
8
+ return variant === null ? baseTitle : `${baseTitle} ${variant.key}`;
9
+ }
10
+ /**
11
+ * Expand the localize / each fan-out specs into the concrete list of Playwright
12
+ * tests to register. Pure and exported for testing.
13
+ *
14
+ * - With no `localize`, each variant yields a single language-agnostic test.
15
+ * - In `'shared'` mode, each variant yields one test that carries every language
16
+ * (narration is overdubbed at render); the `--languages` filter does not split
17
+ * a shared recording.
18
+ * - In `'per-language'` mode, each variant yields one test per language,
19
+ * intersected with the `--languages` filter when present. A variant whose
20
+ * languages are entirely filtered out yields nothing. The browser locale is set
21
+ * per language unless `browserLocale` is `false`.
22
+ */
23
+ export function expandRegistrations(params) {
24
+ const { baseTitle, localize, studio, eachVariants, requestedLanguages } = params;
25
+ const variants = eachVariants ?? [null];
26
+ const registrations = [];
27
+ for (const variant of variants) {
28
+ const videoName = variantVideoName(baseTitle, variant);
29
+ const recordOptions = variant?.recordOptions ?? null;
30
+ const use = variant?.use ?? null;
31
+ const variantLabel = variant === null ? '' : `${variant.key} `;
32
+ if (localize === null) {
33
+ registrations.push({
34
+ describeTitle: variant?.key ?? baseTitle,
35
+ leafTitle: videoName,
36
+ videoName,
37
+ language: null,
38
+ locale: null,
39
+ recordOptions,
40
+ use,
41
+ localize: null,
42
+ studio,
43
+ });
44
+ continue;
45
+ }
46
+ if (localize.mode === 'shared') {
47
+ registrations.push({
48
+ describeTitle: `${variantLabel}shared`.trim(),
49
+ leafTitle: videoName,
50
+ videoName,
51
+ language: null,
52
+ locale: null,
53
+ recordOptions,
54
+ use,
55
+ localize,
56
+ studio,
57
+ });
58
+ continue;
59
+ }
60
+ const languages = requestedLanguages === null
61
+ ? localize.languages
62
+ : localize.languages.filter((lang) => requestedLanguages.includes(lang));
63
+ for (const lang of languages) {
64
+ registrations.push({
65
+ describeTitle: `${variantLabel}${lang}`,
66
+ leafTitle: `${videoName} [${lang}]`,
67
+ videoName,
68
+ language: lang,
69
+ locale: localize.browserLocale
70
+ ? resolveLocaleForLanguage(lang, localize.locales)
71
+ : null,
72
+ recordOptions,
73
+ use,
74
+ localize,
75
+ studio,
76
+ });
77
+ }
78
+ }
79
+ return registrations;
80
+ }
81
+ /** Internal option keys the page/context fixtures read off a registered test. */
82
+ const SCREENCI_LANGUAGE_OPTION = '_screenciLanguage';
83
+ const SCREENCI_VIDEO_NAME_OPTION = '_screenciVideoName';
84
+ const SCREENCI_LOCALIZE_OPTION = '_screenciLocalize';
85
+ const SCREENCI_STUDIO_OPTION = '_screenciStudio';
86
+ const SCREENCI_SOURCE_FILE_OPTION = '_screenciSourceFile';
87
+ /** Absolute path of this module, used to skip our own frames when capturing. */
88
+ const BUILDER_MODULE_PATH = fileURLToPath(import.meta.url);
89
+ /** Normalize a V8 call-site filename (which may be a `file://` URL) to a path. */
90
+ function callSiteFile(frame) {
91
+ const fileName = frame.getFileName();
92
+ if (!fileName)
93
+ return null;
94
+ return fileName.startsWith('file://') ? fileURLToPath(fileName) : fileName;
95
+ }
96
+ /**
97
+ * Capture the source file of the user's `.screenci` script that called the
98
+ * builder. Playwright attributes `testInfo.file` to this module (the test is
99
+ * registered here, not in the user's file), so asset paths authored relative to
100
+ * the script would otherwise resolve against this package. We walk the call
101
+ * stack and return the first frame outside this module, which is the script.
102
+ * Returns `null` if no such frame is found (fixtures then fall back to
103
+ * `testInfo.file`).
104
+ */
105
+ function captureSourceFile() {
106
+ const originalPrepare = Error.prepareStackTrace;
107
+ const originalLimit = Error.stackTraceLimit;
108
+ try {
109
+ Error.stackTraceLimit = 50;
110
+ Error.prepareStackTrace = (_error, stack) => stack;
111
+ const stack = new Error().stack;
112
+ if (!Array.isArray(stack))
113
+ return null;
114
+ for (const frame of stack) {
115
+ const file = callSiteFile(frame);
116
+ if (file !== null && file !== BUILDER_MODULE_PATH) {
117
+ return file;
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+ finally {
123
+ Error.prepareStackTrace = originalPrepare;
124
+ Error.stackTraceLimit = originalLimit;
125
+ }
126
+ }
127
+ function registerOne(test, reg, details, body, modifier, sourceFile) {
128
+ const useOptions = {
129
+ ...(reg.use ?? {}),
130
+ ...(reg.recordOptions !== null ? { recordOptions: reg.recordOptions } : {}),
131
+ ...(reg.locale !== null ? { locale: reg.locale } : {}),
132
+ [SCREENCI_LANGUAGE_OPTION]: reg.language ?? undefined,
133
+ [SCREENCI_VIDEO_NAME_OPTION]: reg.videoName,
134
+ [SCREENCI_LOCALIZE_OPTION]: reg.localize ?? undefined,
135
+ [SCREENCI_STUDIO_OPTION]: reg.studio ?? undefined,
136
+ [SCREENCI_SOURCE_FILE_OPTION]: sourceFile ?? undefined,
137
+ };
138
+ const register = modifier ? test[modifier] : test;
139
+ test.describe(reg.describeTitle, () => {
140
+ test.use(useOptions);
141
+ if (details !== undefined) {
142
+ register(reg.leafTitle, details, body);
143
+ }
144
+ else {
145
+ register(reg.leafTitle, body);
146
+ }
147
+ });
148
+ }
149
+ function normalizeVariants(variants) {
150
+ if (variants.length === 0) {
151
+ throw new Error('video.each() requires at least one variant, e.g. .each([{ key: "mobile" }]).');
152
+ }
153
+ const seen = new Set();
154
+ for (const variant of variants) {
155
+ if (seen.has(variant.key)) {
156
+ throw new Error(`Duplicate video.each() variant key "${variant.key}". Variant keys must be unique.`);
157
+ }
158
+ seen.add(variant.key);
159
+ }
160
+ return variants;
161
+ }
162
+ /**
163
+ * Create a fan-out builder bound to a registrar test instance. `video.localize`
164
+ * and `video.each` are the `localize`/`each` methods of a root builder created
165
+ * with this factory. `Args` is the medium's fixture arg type (video/screenshot).
166
+ */
167
+ export function createVideoBuilder(test, state = { localize: null, studio: null, eachVariants: null }) {
168
+ const runTerminal = (modifier, title, detailsOrBody, maybeBody) => {
169
+ const hasDetails = typeof detailsOrBody !== 'function';
170
+ const details = hasDetails ? detailsOrBody : undefined;
171
+ const body = (hasDetails ? maybeBody : detailsOrBody);
172
+ // Captured here, at the user's call site, so the script's path survives
173
+ // even though Playwright records the test as declared in this module.
174
+ const sourceFile = captureSourceFile();
175
+ // Studio-managed names must be unique and disjoint from the seeded localize
176
+ // names. Validate once, here, where both the localize spec and the studio
177
+ // declaration are known (they can be chained in either order).
178
+ validateStudioDeclaration(state.studio, state.localize?.narration?.seededNames ?? [], state.localize?.text?.seededNames ?? []);
179
+ const registrations = expandRegistrations({
180
+ baseTitle: title,
181
+ localize: state.localize,
182
+ studio: state.studio,
183
+ eachVariants: state.eachVariants,
184
+ requestedLanguages: parseRequestedLanguages(),
185
+ });
186
+ if (registrations.length === 0) {
187
+ logger.warn(`[screenci] "${title}" was skipped: none of its declared languages match the --languages filter.`);
188
+ return;
189
+ }
190
+ for (const reg of registrations) {
191
+ registerOne(test, reg, details, body, modifier, sourceFile);
192
+ }
193
+ };
194
+ const callable = ((title, detailsOrBody, maybeBody) => runTerminal(undefined, title, detailsOrBody, maybeBody));
195
+ for (const modifier of ['only', 'skip', 'fixme', 'fail']) {
196
+ callable[modifier] = ((title, detailsOrBody, maybeBody) => runTerminal(modifier, title, detailsOrBody, maybeBody));
197
+ }
198
+ callable.localize = ((spec) => createVideoBuilder(test, {
199
+ ...state,
200
+ localize: normalizeLocalizeSpec(spec),
201
+ }));
202
+ callable.studio = ((declaration) => createVideoBuilder(test, {
203
+ ...state,
204
+ studio: declaration,
205
+ }));
206
+ callable.each = (variants) => createVideoBuilder(test, {
207
+ ...state,
208
+ eachVariants: normalizeVariants(variants),
209
+ });
210
+ return callable;
211
+ }
212
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/builder.ts"],"names":[],"mappings":"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"}