Skip to content

Commit

Permalink
Allow empty render functions in CSF4
Browse files Browse the repository at this point in the history
  • Loading branch information
kasperpeulen committed Feb 18, 2025
1 parent c8844ba commit b5aa1f2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
2 changes: 1 addition & 1 deletion code/core/src/csf/csf-factories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export interface Meta<TRenderer extends Renderer, TArgs extends Args = Args> {
composed: NormalizedComponentAnnotations<TRenderer>;
preview: Preview<TRenderer>;

story(input: ComponentAnnotations<TRenderer, TArgs>): Story<TRenderer, TArgs>;
story(input: StoryAnnotations<TRenderer, TArgs>): Story<TRenderer, TArgs>;
}

export function isMeta(input: unknown): input is Meta<Renderer> {
Expand Down
29 changes: 27 additions & 2 deletions code/renderers/react/src/csf-factories.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ describe('Args can be provided in multiple ways', () => {
it('❌ The combined shape of meta args and story args must match the required args.', () => {
{
const meta = preview.meta({ component: Button });
// @ts-expect-error disabled not provided ❌
const Basic = meta.story({
// @ts-expect-error disabled not provided ❌
args: { label: 'good' },
});
}
Expand All @@ -80,12 +80,37 @@ describe('Args can be provided in multiple ways', () => {
}
{
const meta = preview.meta({ component: Button });
// @ts-expect-error disabled not provided ❌
const Basic = meta.story({
// @ts-expect-error disabled not provided ❌
args: { label: 'good' },
});
}
});

it("✅ Required args don't need to be provided when the user uses an empty render", () => {
const meta = preview.meta({
component: Button,
args: { label: 'good' },
});
const Basic = meta.story({
args: {},
render: () => <div>Hello world</div>,
});
});

it('❌ Required args need to be provided when the user uses a non-empty render', () => {
const meta = preview.meta({
component: Button,
args: { label: 'good' },
});
// @ts-expect-error disabled not provided ❌
const Basic = meta.story({
args: {
label: 'good',
},
render: (args) => <div>Hello world</div>,
});
});
});

it('✅ Void functions are not changed', () => {
Expand Down
8 changes: 8 additions & 0 deletions code/renderers/react/src/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ interface ReactMeta<
Context extends { args: Args },
MetaInput extends ComponentAnnotations<ReactRenderer>,
> extends Meta<ReactRenderer, Context['args']> {
story<
TInput extends StoryAnnotations<ReactRenderer, Context['args']> & {
render: () => ReactRenderer['storyResult'];
},
>(
story: TInput
): ReactStory;

story<
const TInput extends Simplify<
StoryAnnotations<
Expand Down

0 comments on commit b5aa1f2

Please sign in to comment.