@@ -11,6 +11,8 @@ import type {
11
11
TestFunction ,
12
12
} from 'storybook/internal/types' ;
13
13
14
+ import { printf } from 'fast-printf' ;
15
+
14
16
import {
15
17
combineParameters ,
16
18
composeConfigs ,
@@ -20,6 +22,7 @@ import {
20
22
} from '../preview-api/index' ;
21
23
import { mountDestructured } from '../preview-api/modules/preview-web/render/mount-utils' ;
22
24
import { getCoreAnnotations } from './core-annotations' ;
25
+ import type { EachAnnotationsFunction , EachTestFunction } from './story' ;
23
26
24
27
export interface Preview < TRenderer extends Renderer = Renderer > {
25
28
readonly _tag : 'Preview' ;
@@ -151,6 +154,18 @@ export interface Story<
151
154
annotations : StoryAnnotations < TRenderer , TRenderer [ 'args' ] > ,
152
155
fn : TestFunction < TRenderer >
153
156
) : void ;
157
+ each < T extends any [ ] > (
158
+ parameters : ReadonlyArray < T >
159
+ ) : ( name : string , fn : EachTestFunction < T , TRenderer > ) => void ;
160
+ each < T extends any [ ] > (
161
+ parameters : ReadonlyArray < T >
162
+ ) : (
163
+ name : string ,
164
+ annotations :
165
+ | StoryAnnotations < TRenderer , TRenderer [ 'args' ] >
166
+ | EachAnnotationsFunction < T , TRenderer , TRenderer [ 'args' ] > ,
167
+ fn : EachTestFunction < T , TRenderer >
168
+ ) => void ;
154
169
}
155
170
156
171
export function isStory < TRenderer extends Renderer > ( input : unknown ) : input is Story < TRenderer > {
@@ -223,6 +238,36 @@ function defineStory<
223
238
224
239
return test as unknown as void ;
225
240
} ,
241
+ each < T extends any [ ] > (
242
+ parameters : ReadonlyArray < T >
243
+ ) : (
244
+ name : string ,
245
+ overridesOrTestFn :
246
+ | EachTestFunction < T , TRenderer >
247
+ | StoryAnnotations < TRenderer , TRenderer [ 'args' ] >
248
+ | EachAnnotationsFunction < T , TRenderer , TRenderer [ 'args' ] > ,
249
+ testFn ?: EachTestFunction < T , TRenderer >
250
+ ) => void {
251
+ return ( name , overridesOrTestFn , testFn ) => {
252
+ parameters . forEach ( ( parameter ) => {
253
+ const testFunction : TestFunction < TRenderer , TRenderer [ 'args' ] > = ( context ) =>
254
+ ( testFn ?? ( overridesOrTestFn as EachTestFunction < T , TRenderer > ) ) (
255
+ context ,
256
+ ...parameter
257
+ ) ;
258
+ const annotations : StoryAnnotations < TRenderer , TRenderer [ 'args' ] > =
259
+ testFn === undefined
260
+ ? { }
261
+ : typeof overridesOrTestFn === 'function'
262
+ ? ( overridesOrTestFn as EachAnnotationsFunction < T , TRenderer , TRenderer [ 'args' ] > ) (
263
+ ...parameter
264
+ )
265
+ : overridesOrTestFn ;
266
+
267
+ this . test ( printf ( name , ...parameter ) , annotations , testFunction ) ;
268
+ } ) ;
269
+ } ;
270
+ } ,
226
271
extend < TInput extends StoryAnnotations < TRenderer , TRenderer [ 'args' ] > > ( input : TInput ) {
227
272
return defineStory (
228
273
{
0 commit comments