Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions code/core/src/csf/csf-factories.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,27 @@ test('addon parameters are inferred', () => {
});
});

test('addon parameters and globals are inferred in decorator context', () => {
const typedMeta = preview.type<{ globals: { theme: 'light' | 'dark' } }>().meta({
decorators: [
(Story, { parameters, globals }) => {
parameters.foo?.value satisfies string | undefined;
parameters.bar?.value satisfies string | undefined;
globals.theme satisfies 'light' | 'dark';

// @ts-expect-error can not treat string parameter values as numbers
parameters.foo!.value satisfies number;
// @ts-expect-error can not treat typed globals as other values
globals.theme satisfies 'sepia';

return Story();
},
],
});

typedMeta.story();
});

describe('test function', () => {
test('without overrides', async () => {
const MyStory = meta.story({ args: { label: 'foo' } });
Expand Down
21 changes: 12 additions & 9 deletions code/core/src/csf/story.ts
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,12 @@ export interface Renderer extends AddonTypes {
csf4: boolean;
}

type TypedParameters<TRenderer extends Renderer> = Parameters &
(TRenderer['csf4'] extends true ? CoreTypes['parameters'] & TRenderer['parameters'] : unknown);

type TypedGlobals<TRenderer extends Renderer> = Globals &
(TRenderer['csf4'] extends true ? CoreTypes['globals'] & TRenderer['globals'] : unknown);

/** @deprecated - Use `Renderer` */
export type AnyFramework = Renderer;

Expand All @@ -222,7 +228,7 @@ export interface StoryContextForEnhancers<
> extends StoryIdentifier {
component?: (TRenderer & { T: any })['component'];
subcomponents?: Record<string, (TRenderer & { T: any })['component']>;
parameters: Parameters;
parameters: TypedParameters<TRenderer>;
initialArgs: TArgs;
argTypes: StrictArgTypes<TArgs>;
}
Expand Down Expand Up @@ -267,6 +273,7 @@ export interface Canvas {}

export interface StoryContext<TRenderer extends Renderer = Renderer, TArgs = Args>
extends StoryContextForEnhancers<TRenderer, TArgs>, Required<StoryContextUpdate<TArgs>> {
globals: TypedGlobals<TRenderer>;
loaded: Record<string, any>;
abortSignal: AbortSignal;
canvasElement: TRenderer['canvasElement'];
Expand Down Expand Up @@ -361,8 +368,7 @@ export interface BaseAnnotations<TRenderer extends Renderer = Renderer, TArgs =
*
* @see [Parameters](https://storybook.js.org/docs/writing-stories/parameters)
*/
parameters?: Parameters &
(TRenderer['csf4'] extends true ? CoreTypes['parameters'] & TRenderer['parameters'] : unknown);
parameters?: TypedParameters<TRenderer>;

/**
* Dynamic data that are provided (and possibly updated by) Storybook and its addons.
Expand Down Expand Up @@ -441,8 +447,7 @@ export interface ProjectAnnotations<
*/
beforeAll?: BeforeAll;

initialGlobals?: Globals &
(TRenderer['csf4'] extends true ? CoreTypes['globals'] & TRenderer['globals'] : unknown);
initialGlobals?: TypedGlobals<TRenderer>;
globalTypes?: GlobalTypes;
applyDecorators?: DecoratorApplicator<TRenderer, Args>;
runStep?: StepRunner<TRenderer, TArgs>;
Expand Down Expand Up @@ -536,8 +541,7 @@ export interface ComponentAnnotations<
play?: PlayFunction<TRenderer, TArgs>;

/** Override the globals values for all stories in this component */
globals?: Globals &
(TRenderer['csf4'] extends true ? CoreTypes['globals'] & TRenderer['globals'] : unknown);
globals?: TypedGlobals<TRenderer>;
}

export type StoryAnnotations<
Expand All @@ -555,8 +559,7 @@ export type StoryAnnotations<
play?: PlayFunction<TRenderer, TArgs>;

/** Override the globals values for this story */
globals?: Globals &
(TRenderer['csf4'] extends true ? CoreTypes['globals'] & TRenderer['globals'] : unknown);
globals?: TypedGlobals<TRenderer>;

/** @deprecated */
story?: Omit<StoryAnnotations<TRenderer, TArgs>, 'story'>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ export function composeStory<TRenderer extends Renderer = Renderer, TArgs extend
mount: null!,
});

context.parameters.__isPortableStory = true;
(context.parameters as Parameters).__isPortableStory = true;

context.context = context;

Expand Down
Loading