Skip to content

Commit 1637363

Browse files
committed
.each runtime
1 parent b8fb415 commit 1637363

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed

code/core/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@
540540
"es-toolkit": "^1.36.0",
541541
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
542542
"execa": "^8.0.1",
543+
"fast-printf": "^1.6.10",
543544
"fd-package-json": "^1.2.0",
544545
"fetch-retry": "^6.0.0",
545546
"find-cache-dir": "^5.0.0",

code/core/src/csf/csf-factories.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import type {
1111
TestFunction,
1212
} from 'storybook/internal/types';
1313

14+
import { printf } from 'fast-printf';
15+
1416
import {
1517
combineParameters,
1618
composeConfigs,
@@ -20,6 +22,7 @@ import {
2022
} from '../preview-api/index';
2123
import { mountDestructured } from '../preview-api/modules/preview-web/render/mount-utils';
2224
import { getCoreAnnotations } from './core-annotations';
25+
import type { EachAnnotationsFunction, EachTestFunction } from './story';
2326

2427
export interface Preview<TRenderer extends Renderer = Renderer> {
2528
readonly _tag: 'Preview';
@@ -151,6 +154,18 @@ export interface Story<
151154
annotations: StoryAnnotations<TRenderer, TRenderer['args']>,
152155
fn: TestFunction<TRenderer>
153156
): 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;
154169
}
155170

156171
export function isStory<TRenderer extends Renderer>(input: unknown): input is Story<TRenderer> {
@@ -223,6 +238,36 @@ function defineStory<
223238

224239
return test as unknown as void;
225240
},
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+
},
226271
extend<TInput extends StoryAnnotations<TRenderer, TRenderer['args']>>(input: TInput) {
227272
return defineStory(
228273
{

code/core/src/csf/story.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,18 @@ export type TestFunction<TRenderer extends Renderer = Renderer, TArgs = TRendere
288288
context: StoryContext<TRenderer, TArgs>
289289
) => Promise<void> | void;
290290

291+
export type EachTestFunction<
292+
Parameters extends any[],
293+
TRenderer extends Renderer = Renderer,
294+
TArgs = TRenderer['args'],
295+
> = (context: StoryContext<TRenderer, TArgs>, ...parameters: Parameters) => Promise<void> | void;
296+
297+
export type EachAnnotationsFunction<
298+
Parameters extends any[],
299+
TRenderer extends Renderer = Renderer,
300+
TArgs = TRenderer['args'],
301+
> = (...parameters: Parameters) => StoryAnnotations<TRenderer, TArgs>;
302+
291303
// This is the type of story function passed to a decorator -- does not rely on being passed any context
292304
export type PartialStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (
293305
update?: StoryContextUpdate<Partial<TArgs>>

code/yarn.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14955,6 +14955,13 @@ __metadata:
1495514955
languageName: node
1495614956
linkType: hard
1495714957

14958+
"fast-printf@npm:^1.6.10":
14959+
version: 1.6.10
14960+
resolution: "fast-printf@npm:1.6.10"
14961+
checksum: 10c0/630cccbef8349a6eeada9958c9391e9d14b5bd9527dd28d9e7e9f295b006c640ddca8fc2470cff55ea5c6c92ca530488bbadbf7c24f4852ad8c34d9155da9d75
14962+
languageName: node
14963+
linkType: hard
14964+
1495814965
"fast-sourcemap-concat@npm:^2.1.0":
1495914966
version: 2.1.1
1496014967
resolution: "fast-sourcemap-concat@npm:2.1.1"
@@ -25040,6 +25047,7 @@ __metadata:
2504025047
esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0"
2504125048
esbuild-register: "npm:^3.5.0"
2504225049
execa: "npm:^8.0.1"
25050+
fast-printf: "npm:^1.6.10"
2504325051
fd-package-json: "npm:^1.2.0"
2504425052
fetch-retry: "npm:^6.0.0"
2504525053
find-cache-dir: "npm:^5.0.0"

0 commit comments

Comments
 (0)