diff --git a/addons/docs/src/frameworks/angular/prepareForInline.ts b/addons/docs/src/frameworks/angular/prepareForInline.ts index 8fd22423dca8..76be79a3f4ac 100644 --- a/addons/docs/src/frameworks/angular/prepareForInline.ts +++ b/addons/docs/src/frameworks/angular/prepareForInline.ts @@ -4,7 +4,7 @@ import { nanoid } from 'nanoid'; import { AngularFramework, StoryContext } from '@storybook/angular'; import { rendererFactory } from '@storybook/angular/renderer'; -import { StoryFn } from '@storybook/csf'; +import { PartialStoryFn } from '@storybook/csf'; const limit = pLimit(1); @@ -12,7 +12,7 @@ const limit = pLimit(1); * Uses the angular renderer to generate a story. Uses p-limit to run synchronously */ export const prepareForInline = ( - storyFn: StoryFn, + storyFn: PartialStoryFn, { id, parameters }: StoryContext ) => { return React.createElement('div', { diff --git a/addons/docs/src/frameworks/angular/sourceDecorator.ts b/addons/docs/src/frameworks/angular/sourceDecorator.ts index 0f624f0029c7..496a316f55c5 100644 --- a/addons/docs/src/frameworks/angular/sourceDecorator.ts +++ b/addons/docs/src/frameworks/angular/sourceDecorator.ts @@ -1,5 +1,5 @@ import { addons } from '@storybook/addons'; -import { StoryFn } from '@storybook/csf'; +import { PartialStoryFn } from '@storybook/csf'; import { StoryContext, AngularFramework } from '@storybook/angular'; import { computesTemplateSourceFromComponent } from '@storybook/angular/renderer'; import prettierHtml from 'prettier/parser-html'; @@ -31,7 +31,10 @@ const prettyUp = (source: string) => { * @param storyFn Fn * @param context StoryContext */ -export const sourceDecorator = (storyFn: StoryFn, context: StoryContext) => { +export const sourceDecorator = ( + storyFn: PartialStoryFn, + context: StoryContext +) => { const story = storyFn(); if (skipSourceRender(context)) { return story; diff --git a/addons/docs/src/frameworks/html/prepareForInline.tsx b/addons/docs/src/frameworks/html/prepareForInline.tsx index bac3077faa71..421b9625f68c 100644 --- a/addons/docs/src/frameworks/html/prepareForInline.tsx +++ b/addons/docs/src/frameworks/html/prepareForInline.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { StoryFn } from '@storybook/csf'; +import { PartialStoryFn } from '@storybook/csf'; -export function prepareForInline(storyFn: StoryFn) { +export function prepareForInline(storyFn: PartialStoryFn) { const html = storyFn(); if (typeof html === 'string') { // eslint-disable-next-line react/no-danger diff --git a/addons/docs/src/frameworks/html/sourceDecorator.ts b/addons/docs/src/frameworks/html/sourceDecorator.ts index 97f3a15e8629..c37143f4ee2a 100644 --- a/addons/docs/src/frameworks/html/sourceDecorator.ts +++ b/addons/docs/src/frameworks/html/sourceDecorator.ts @@ -1,6 +1,6 @@ /* global window */ import { addons } from '@storybook/addons'; -import { ArgsStoryFn, StoryContext, StoryFn } from '@storybook/csf'; +import { ArgsStoryFn, PartialStoryFn, StoryContext } from '@storybook/csf'; import dedent from 'ts-dedent'; import { HtmlFramework } from '@storybook/html'; @@ -33,7 +33,7 @@ function applyTransformSource(source: string, context: StoryContext, + storyFn: PartialStoryFn, context: StoryContext ) { const story = context?.parameters.docs?.source?.excludeDecorators diff --git a/addons/docs/src/frameworks/react/config.ts b/addons/docs/src/frameworks/react/config.ts index e6ab614d0069..28ef4afc0e47 100644 --- a/addons/docs/src/frameworks/react/config.ts +++ b/addons/docs/src/frameworks/react/config.ts @@ -1,4 +1,4 @@ -import { StoryFn } from '@storybook/csf'; +import { PartialStoryFn } from '@storybook/csf'; import { ReactFramework } from '@storybook/react'; import { extractArgTypes } from './extractArgTypes'; @@ -9,7 +9,7 @@ export const parameters = { docs: { inlineStories: true, // NOTE: that the result is a react element. Hooks support is provided by the outer code. - prepareForInline: (storyFn: StoryFn) => storyFn(), + prepareForInline: (storyFn: PartialStoryFn) => storyFn(), extractArgTypes, extractComponentDescription, }, diff --git a/addons/docs/src/frameworks/react/jsxDecorator.tsx b/addons/docs/src/frameworks/react/jsxDecorator.tsx index d5730e7d55af..e3a3cc888460 100644 --- a/addons/docs/src/frameworks/react/jsxDecorator.tsx +++ b/addons/docs/src/frameworks/react/jsxDecorator.tsx @@ -4,7 +4,7 @@ import dedent from 'ts-dedent'; import deprecate from 'util-deprecate'; import { addons } from '@storybook/addons'; -import { StoryContext, StoryFn, ArgsStoryFn } from '@storybook/csf'; +import { StoryContext, ArgsStoryFn, PartialStoryFn } from '@storybook/csf'; import { logger } from '@storybook/client-logger'; import { ReactFramework } from '@storybook/react'; @@ -172,7 +172,7 @@ const mdxToJsx = (node: any) => { }; export const jsxDecorator = ( - storyFn: StoryFn, + storyFn: PartialStoryFn, context: StoryContext ) => { const story = storyFn(); diff --git a/addons/docs/src/frameworks/vue/prepareForInline.ts b/addons/docs/src/frameworks/vue/prepareForInline.ts index f96344116b99..6627db5ec96f 100644 --- a/addons/docs/src/frameworks/vue/prepareForInline.ts +++ b/addons/docs/src/frameworks/vue/prepareForInline.ts @@ -1,6 +1,6 @@ import React from 'react'; import Vue from 'vue'; -import { StoryFn, StoryContext } from '@storybook/csf'; +import { StoryContext, PartialStoryFn } from '@storybook/csf'; import { VueFramework } from '@storybook/vue'; // Inspired by https://github.com/egoist/vue-to-react, @@ -11,7 +11,7 @@ const COMPONENT = 'STORYBOOK_COMPONENT'; const VALUES = 'STORYBOOK_VALUES'; export const prepareForInline = ( - storyFn: StoryFn, + storyFn: PartialStoryFn, { args }: StoryContext ) => { const component = storyFn(); diff --git a/addons/docs/src/frameworks/vue3/prepareForInline.ts b/addons/docs/src/frameworks/vue3/prepareForInline.ts index ba86c7c1cb98..2f414504289e 100644 --- a/addons/docs/src/frameworks/vue3/prepareForInline.ts +++ b/addons/docs/src/frameworks/vue3/prepareForInline.ts @@ -1,13 +1,13 @@ import React from 'react'; import * as Vue from 'vue'; -import { StoryFn, StoryContext } from '@storybook/csf'; +import { StoryContext, PartialStoryFn } from '@storybook/csf'; import { app, VueFramework } from '@storybook/vue3'; // This is cast as `any` to workaround type errors caused by Vue 2 types const { render, h } = Vue as any; export const prepareForInline = ( - storyFn: StoryFn, + storyFn: PartialStoryFn, { args }: StoryContext ) => { const component = storyFn(); diff --git a/addons/docs/src/frameworks/web-components/prepareForInline.ts b/addons/docs/src/frameworks/web-components/prepareForInline.ts index ccc92d6f139c..dcdb86c3432b 100644 --- a/addons/docs/src/frameworks/web-components/prepareForInline.ts +++ b/addons/docs/src/frameworks/web-components/prepareForInline.ts @@ -1,10 +1,10 @@ -import type { StoryFn } from '@storybook/csf'; +import type { PartialStoryFn } from '@storybook/csf'; import { WebComponentsFramework } from '@storybook/web-components'; import React from 'react'; import { render } from 'lit-html'; -export const prepareForInline = (storyFn: StoryFn) => { +export const prepareForInline = (storyFn: PartialStoryFn) => { class Story extends React.Component { wrapperRef = React.createRef(); diff --git a/addons/docs/src/frameworks/web-components/sourceDecorator.ts b/addons/docs/src/frameworks/web-components/sourceDecorator.ts index cfe8e7451859..a6df7744944f 100644 --- a/addons/docs/src/frameworks/web-components/sourceDecorator.ts +++ b/addons/docs/src/frameworks/web-components/sourceDecorator.ts @@ -1,6 +1,6 @@ /* global window */ import { render } from 'lit-html'; -import { ArgsStoryFn, StoryContext, StoryFn } from '@storybook/csf'; +import { ArgsStoryFn, PartialStoryFn, StoryContext } from '@storybook/csf'; import { addons } from '@storybook/addons'; import { WebComponentsFramework } from '@storybook/web-components'; @@ -30,7 +30,7 @@ function applyTransformSource( } export function sourceDecorator( - storyFn: StoryFn, + storyFn: PartialStoryFn, context: StoryContext ) { const story = context?.parameters.docs?.source?.excludeDecorators diff --git a/app/angular/src/client/preview/angular/helpers.ts b/app/angular/src/client/preview/angular/helpers.ts index 3bf7a108d933..bad80b39bf93 100644 --- a/app/angular/src/client/preview/angular/helpers.ts +++ b/app/angular/src/client/preview/angular/helpers.ts @@ -5,7 +5,7 @@ import { FormsModule } from '@angular/forms'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { BrowserModule } from '@angular/platform-browser'; import { Observable, ReplaySubject, Subscriber } from 'rxjs'; -import { StoryFn } from '@storybook/csf'; +import { PartialStoryFn } from '@storybook/csf'; import { AppComponent } from './components/app.component'; import { STORY } from './app.token'; import { NgModuleMetadata, StoryFnAngularReturnType } from '../types'; @@ -133,7 +133,7 @@ const getExistenceOfComponentInModules = ( }); }; -const initModule = (storyFn: StoryFn) => { +const initModule = (storyFn: PartialStoryFn) => { const storyObj = storyFn(); const { component, template, props, styles, moduleMetadata = {} } = storyObj; @@ -201,7 +201,7 @@ const draw = (newModule: DynamicComponentType): void => { } }; -export const renderNgApp = (storyFn: StoryFn, forced: boolean) => { +export const renderNgApp = (storyFn: PartialStoryFn, forced: boolean) => { if (!forced) { draw(initModule(storyFn)); } else { diff --git a/app/angular/src/client/preview/decorateStory.ts b/app/angular/src/client/preview/decorateStory.ts index a64238706e38..0b90512d4ddc 100644 --- a/app/angular/src/client/preview/decorateStory.ts +++ b/app/angular/src/client/preview/decorateStory.ts @@ -1,15 +1,15 @@ -import { DecoratorFunction, StoryContext, StoryFn } from '@storybook/csf'; +import { DecoratorFunction, LegacyStoryFn, StoryContext, StoryFn } from '@storybook/csf'; import { sanitizeStoryContextUpdate } from '@storybook/store'; import { computesTemplateFromComponent } from './angular-beta/ComputesTemplateFromComponent'; import { AngularFramework } from './types-6-0'; export default function decorateStory( - mainStoryFn: StoryFn, + mainStoryFn: LegacyStoryFn, decorators: DecoratorFunction[] -): StoryFn { +): LegacyStoryFn { const returnDecorators = [cleanArgsDecorator, ...decorators].reduce( - (previousStoryFn: StoryFn, decorator) => ( + (previousStoryFn: LegacyStoryFn, decorator) => ( context: StoryContext ) => { const decoratedStory = decorator((update) => { diff --git a/app/svelte/src/client/preview/decorators.ts b/app/svelte/src/client/preview/decorators.ts index f1ca5fa71f67..5c81c5354ccc 100644 --- a/app/svelte/src/client/preview/decorators.ts +++ b/app/svelte/src/client/preview/decorators.ts @@ -1,4 +1,4 @@ -import { StoryFn, DecoratorFunction, StoryContext } from '@storybook/csf'; +import { DecoratorFunction, StoryContext, LegacyStoryFn } from '@storybook/csf'; import { sanitizeStoryContextUpdate } from '@storybook/store'; import SlotDecorator from './SlotDecorator.svelte'; import { SvelteFramework } from './types'; @@ -65,9 +65,10 @@ function prepareStory(context: StoryContext, story: any, origin export function decorateStory(storyFn: any, decorators: any[]) { return decorators.reduce( - (previousStoryFn: StoryFn, decorator: DecoratorFunction) => ( - context: StoryContext - ) => { + ( + previousStoryFn: LegacyStoryFn, + decorator: DecoratorFunction + ) => (context: StoryContext) => { let story; const decoratedStory = decorator((update) => { story = previousStoryFn({ diff --git a/app/vue/src/client/preview/index.ts b/app/vue/src/client/preview/index.ts index bf064f375530..f733d2b44a76 100644 --- a/app/vue/src/client/preview/index.ts +++ b/app/vue/src/client/preview/index.ts @@ -1,7 +1,7 @@ /* eslint-disable prefer-destructuring */ import Vue, { VueConstructor, ComponentOptions } from 'vue'; import { start } from '@storybook/core/client'; -import { StoryFn, DecoratorFunction, StoryContext } from '@storybook/csf'; +import { DecoratorFunction, StoryContext, LegacyStoryFn } from '@storybook/csf'; import { ClientStoryApi, Loadable } from '@storybook/addons'; import { sanitizeStoryContextUpdate } from '@storybook/store'; @@ -61,11 +61,13 @@ function prepare( } function decorateStory( - storyFn: StoryFn, + storyFn: LegacyStoryFn, decorators: DecoratorFunction[] -): StoryFn { +): LegacyStoryFn { return decorators.reduce( - (decorated: StoryFn, decorator) => (context: StoryContext) => { + (decorated: LegacyStoryFn, decorator) => ( + context: StoryContext + ) => { let story; const decoratedStory = decorator((update) => { diff --git a/app/vue3/src/client/preview/index.ts b/app/vue3/src/client/preview/index.ts index 7c8fdac5e939..e8302827ab05 100644 --- a/app/vue3/src/client/preview/index.ts +++ b/app/vue3/src/client/preview/index.ts @@ -1,7 +1,7 @@ import type { ConcreteComponent, Component, ComponentOptions, App } from 'vue'; import { h } from 'vue'; import { start } from '@storybook/core/client'; -import { StoryFn, DecoratorFunction, StoryContext, LegacyStoryFn } from '@storybook/csf'; +import { DecoratorFunction, StoryContext, LegacyStoryFn } from '@storybook/csf'; import { ClientStoryApi, Loadable } from '@storybook/addons'; import { sanitizeStoryContextUpdate } from '@storybook/store'; @@ -47,7 +47,7 @@ function prepare( } function decorateStory( - storyFn: StoryFn, + storyFn: LegacyStoryFn, decorators: DecoratorFunction[] ): LegacyStoryFn { return decorators.reduce( diff --git a/lib/store/src/StoryStore.ts b/lib/store/src/StoryStore.ts index 21be7dc43016..2df7deacd3ea 100644 --- a/lib/store/src/StoryStore.ts +++ b/lib/store/src/StoryStore.ts @@ -6,6 +6,7 @@ import { AnyFramework, ProjectAnnotations, ComponentTitle, + StoryContext, } from '@storybook/csf'; import mapValues from 'lodash/mapValues'; import pick from 'lodash/pick'; @@ -322,12 +323,14 @@ export class StoryStore { const story = this.storyFromCSFFile({ storyId, csfFile }); return { ...story, - storyFn: (context) => - story.unboundStoryFn({ + storyFn: (update) => { + const context = { ...this.getStoryContext(story), viewMode: 'story', - ...context, - }), + } as StoryContext; + + return story.unboundStoryFn({ ...context, ...update }); + }, }; } } diff --git a/lib/store/src/types.ts b/lib/store/src/types.ts index 1acbd0d4cc80..fb8d4d4f9535 100644 --- a/lib/store/src/types.ts +++ b/lib/store/src/types.ts @@ -18,6 +18,7 @@ import { StrictArgTypes, StrictGlobalTypes, ComponentId, + PartialStoryFn, } from '@storybook/csf'; export type Path = string; @@ -63,7 +64,7 @@ export type Story = StoryContextForEnhancers = Story & { - storyFn: LegacyStoryFn; + storyFn: PartialStoryFn; }; export declare type RenderContext = StoryIdentifier & { @@ -72,7 +73,7 @@ export declare type RenderContext = StoryIdenti showException: (err: Error) => void; forceRemount: boolean; storyContext: StoryContext; - storyFn: LegacyStoryFn; + storyFn: PartialStoryFn; unboundStoryFn: LegacyStoryFn; };