Skip to content

Commit d6eebe0

Browse files
authored
Merge pull request #89 from ComponentDriven/next
Release 0.1.6
2 parents 206ace5 + 6b0f6fa commit d6eebe0

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/story.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ type ButtonArgs = {
3434

3535
const Button = (props: ButtonArgs) => 'Button';
3636

37+
let a = 1;
38+
async function doSomething() {
39+
a = 2;
40+
}
41+
42+
async function cleanup() {
43+
a = 1;
44+
}
45+
3746
// NOTE Various kind usages
3847
const simple: XMeta = {
3948
title: 'simple',
@@ -42,6 +51,10 @@ const simple: XMeta = {
4251
decorators: [(storyFn, context) => `withDecorator(${storyFn(context)})`],
4352
parameters: { a: () => null, b: NaN, c: Symbol('symbol') },
4453
loaders: [() => Promise.resolve({ d: '3' })],
54+
async beforeEach() {
55+
await doSomething();
56+
return cleanup;
57+
},
4558
args: { x: '1' },
4659
argTypes: { x: { type: { name: 'string' } } },
4760
};
@@ -54,6 +67,10 @@ const strict: XMeta<ButtonArgs> = {
5467
parameters: { a: () => null, b: NaN, c: Symbol('symbol') },
5568
loaders: [() => Promise.resolve({ d: '3' })],
5669
args: { x: '1' },
70+
async beforeEach() {
71+
await doSomething();
72+
return cleanup;
73+
},
5774
argTypes: { x: { type: { name: 'string' } } },
5875
};
5976

@@ -86,6 +103,10 @@ CSF1Story.story = {
86103
decorators: [(storyFn) => `Wrapped(${storyFn()}`],
87104
parameters: { a: [1, '2', {}], b: undefined, c: Button },
88105
loaders: [() => Promise.resolve({ d: '3' })],
106+
async beforeEach() {
107+
await doSomething();
108+
return cleanup;
109+
},
89110
args: { a: 1 },
90111
};
91112

src/story.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,13 @@ export type LoaderFunction<TRenderer extends Renderer = Renderer, TArgs = Args>
259259
context: StoryContextForLoaders<TRenderer, TArgs>
260260
) => Promise<Record<string, any> | void> | Record<string, any> | void;
261261

262+
type Awaitable<T> = T | PromiseLike<T>;
263+
export type CleanupCallback = () => Awaitable<unknown>;
264+
265+
export type BeforeEach<TRenderer extends Renderer = Renderer, TArgs = Args> = (
266+
context: StoryContext<TRenderer, TArgs>
267+
) => Awaitable<CleanupCallback | void>;
268+
262269
export interface StoryContext<TRenderer extends Renderer = Renderer, TArgs = Args>
263270
extends StoryContextForLoaders<TRenderer, TArgs> {
264271
loaded: Record<string, any>;
@@ -356,6 +363,16 @@ export type BaseAnnotations<TRenderer extends Renderer = Renderer, TArgs = Args>
356363
*/
357364
loaders?: LoaderFunction<TRenderer, TArgs>[] | LoaderFunction<TRenderer, TArgs>;
358365

366+
/**
367+
* Function to be called before each story. When the function is async, it will be awaited.
368+
*
369+
* `beforeEach` can be added to preview, the default export and to a specific story.
370+
* They are run (and awaited) in the order: preview, default export, story
371+
*
372+
* A cleanup function can be returned.
373+
*/
374+
beforeEach?: BeforeEach<TRenderer, TArgs>[] | BeforeEach<TRenderer, TArgs>;
375+
359376
/**
360377
* Define a custom render function for the story(ies). If not passed, a default render function by the renderer will be used.
361378
*/

0 commit comments

Comments
 (0)