mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-09 00:19:13 +08:00
Make a start on defineConfig, meta and story factory
This commit is contained in:
parent
b9f251a86c
commit
9415e4736b
20
code/renderers/react/src/csf-factories.test.tsx
Normal file
20
code/renderers/react/src/csf-factories.test.tsx
Normal file
@ -0,0 +1,20 @@
|
||||
import { test } from 'vitest';
|
||||
|
||||
import { Button } from './__test__/Button';
|
||||
import { defineConfig } from './preview';
|
||||
|
||||
test('csf factories', () => {
|
||||
const config = defineConfig({
|
||||
addons: [
|
||||
{
|
||||
decorators: [],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const meta = config.meta({ component: Button, args: { primary: true } });
|
||||
|
||||
const MyStory = meta.story({
|
||||
args: {},
|
||||
});
|
||||
});
|
63
code/renderers/react/src/preview.tsx
Normal file
63
code/renderers/react/src/preview.tsx
Normal file
@ -0,0 +1,63 @@
|
||||
import type { ComponentProps, ComponentType } from 'react';
|
||||
|
||||
import { composeConfigs } from 'storybook/internal/preview-api';
|
||||
import { prepareStory } from 'storybook/internal/preview-api';
|
||||
import type { NormalizedProjectAnnotations } from 'storybook/internal/types';
|
||||
|
||||
import type {
|
||||
Args,
|
||||
ComponentAnnotations,
|
||||
ProjectAnnotations,
|
||||
Renderer,
|
||||
StoryAnnotations,
|
||||
} from '@storybook/csf';
|
||||
|
||||
import type { ReactRenderer } from './types';
|
||||
|
||||
export function defineConfig(config: PreviewConfigData<ReactRenderer>) {
|
||||
return new PreviewConfig(config);
|
||||
}
|
||||
|
||||
interface PreviewConfigData<TRenderer extends Renderer> {
|
||||
addons: ProjectAnnotations<TRenderer>[];
|
||||
}
|
||||
|
||||
class PreviewConfig<TRenderer extends Renderer> {
|
||||
readonly annotations: NormalizedProjectAnnotations<TRenderer>;
|
||||
|
||||
constructor(data: PreviewConfigData<TRenderer>) {
|
||||
const { addons, ...rest } = data;
|
||||
this.annotations = composeConfigs([rest, ...addons]);
|
||||
}
|
||||
|
||||
readonly meta = <TComponent extends ComponentType<any>, TMetaArgs extends Args>(
|
||||
meta: ComponentAnnotations<TRenderer, any> & { component: TComponent; args: TMetaArgs }
|
||||
) => {
|
||||
return new Meta<TRenderer, TMetaArgs>(meta as ComponentAnnotations<TRenderer, TMetaArgs>, this);
|
||||
};
|
||||
}
|
||||
|
||||
class Meta<TRenderer extends Renderer, TArgs extends Args> {
|
||||
readonly annotations: ComponentAnnotations<TRenderer, TArgs>;
|
||||
|
||||
readonly config: PreviewConfig<TRenderer>;
|
||||
|
||||
constructor(
|
||||
annotations: ComponentAnnotations<TRenderer, TArgs>,
|
||||
config: PreviewConfig<TRenderer>
|
||||
) {
|
||||
this.annotations = annotations;
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
readonly story = (story: StoryAnnotations<TRenderer, TArgs>) =>
|
||||
new Story(story, this, this.config);
|
||||
}
|
||||
|
||||
class Story<TRenderer extends Renderer, TArgs extends Args> {
|
||||
constructor(
|
||||
public annotations: StoryAnnotations<TRenderer, TArgs>,
|
||||
public meta: Meta<TRenderer, TArgs>,
|
||||
public config: PreviewConfig<TRenderer>
|
||||
) {}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user