diff --git a/MIGRATION.md b/MIGRATION.md
index f9e4a8c3adc7..e7d2d718c1df 100644
--- a/MIGRATION.md
+++ b/MIGRATION.md
@@ -1,7 +1,8 @@
Migration
- [From version 6.0.x to 6.1.0](#from-version-60x-to-610)
- - [6.1 deprecations](#61-deprecations)
+ - [6.1 deprecations](#6dot1-deprecations)
+ - [Deprecated storyFn](#deprecated-storyfn)
- [Deprecated onBeforeRender](#deprecated-onbeforerender)
- [Deprecated grid parameter](#deprecated-grid-parameter)
- [Deprecated package-composition disabled parameter](#deprecated-package-composition-disabled-parameter)
@@ -12,7 +13,7 @@
- [CRA preset removed](#cra-preset-removed)
- [Core-JS dependency errors](#core-js-dependency-errors)
- [Args passed as first argument to story](#args-passed-as-first-argument-to-story)
- - [6.0 Docs breaking changes](#60-docs-breaking-changes)
+ - [6.0 Docs breaking changes](#6dot0-docs-breaking-changes)
- [Remove framework-specific docs presets](#remove-framework-specific-docs-presets)
- [Preview/Props renamed](#previewprops-renamed)
- [Docs theme separated](#docs-theme-separated)
@@ -21,7 +22,7 @@
- [ConfigureJSX true by default in React](#configurejsx-true-by-default-in-react)
- [User babelrc disabled by default in MDX](#user-babelrc-disabled-by-default-in-mdx)
- [Docs description parameter](#docs-description-parameter)
- - [6.0 Inline stories](#60-inline-stories)
+ - [6.0 Inline stories](#6dot0-inline-stories)
- [New addon presets](#new-addon-presets)
- [Removed babel-preset-vue from Vue preset](#removed-babel-preset-vue-from-vue-preset)
- [Removed Deprecated APIs](#removed-deprecated-apis)
@@ -36,7 +37,7 @@
- [Simplified Render Context](#simplified-render-context)
- [Story Store immutable outside of configuration](#story-store-immutable-outside-of-configuration)
- [Improved story source handling](#improved-story-source-handling)
- - [6.0 Addon API changes](#60-addon-api-changes)
+ - [6.0 Addon API changes](#6dot0-addon-api-changes)
- [Consistent local addon paths in main.js](#consistent-local-addon-paths-in-mainjs)
- [Deprecated setAddon](#deprecated-setaddon)
- [Deprecated disabled parameter](#deprecated-disabled-parameter)
@@ -45,7 +46,7 @@
- [Removed withA11y decorator](#removed-witha11y-decorator)
- [Essentials addon disables differently](#essentials-addon-disables-differently)
- [Backgrounds addon has a new api](#backgrounds-addon-has-a-new-api)
- - [6.0 Deprecations](#60-deprecations)
+ - [6.0 Deprecations](#6dot0-deprecations)
- [Deprecated addon-info, addon-notes](#deprecated-addon-info-addon-notes)
- [Deprecated addon-contexts](#deprecated-addon-contexts)
- [Removed addon-centered](#removed-addon-centered)
@@ -120,8 +121,8 @@
- [Addon story parameters](#addon-story-parameters)
- [From version 3.3.x to 3.4.x](#from-version-33x-to-34x)
- [From version 3.2.x to 3.3.x](#from-version-32x-to-33x)
- - [`babel-core` is now a peer dependency (#2494)](#babel-core-is-now-a-peer-dependency-2494)
- - [Base webpack config now contains vital plugins (#1775)](#base-webpack-config-now-contains-vital-plugins-1775)
+ - [`babel-core` is now a peer dependency #2494](#babel-core-is-now-a-peer-dependency-2494)
+ - [Base webpack config now contains vital plugins #1775](#base-webpack-config-now-contains-vital-plugins-1775)
- [Refactored Knobs](#refactored-knobs)
- [From version 3.1.x to 3.2.x](#from-version-31x-to-32x)
- [Moved TypeScript addons definitions](#moved-typescript-addons-definitions)
@@ -138,6 +139,25 @@
### 6.1 deprecations
+#### Deprecated storyFn
+
+Each item in the story store contains a field called `storyFn`, which is a fully decorated story that's applied to the denormalized story parameters. Starting in 6.0 we've stopped using this API internally, and have replaced it with a new field called `unboundStoryFn` which, unlike `storyFn`, must passed a story context, typically produced by `applyLoaders`;
+
+Before:
+
+```js
+const { storyFn } = store.fromId('some--id');
+console.log(storyFn());
+```
+
+After:
+
+```js
+const { unboundStoryFn, applyLoaders } = store.fromId('some--id');
+const context = await applyLoaders();
+console.log(unboundStoryFn(context));
+```
+
#### Deprecated onBeforeRender
The `@storybook/addon-docs` previously accepted a `jsx` option called `onBeforeRender`, which was unfortunately named as it was called after the render.
@@ -1717,7 +1737,7 @@ There are no expected breaking changes in the 3.4.x release, but 3.4 contains a
It wasn't expected that there would be any breaking changes in this release, but unfortunately it turned out that there are some. We're revisiting our [release strategy](https://github.com/storybookjs/storybook/blob/master/RELEASES.md) to follow semver more strictly.
Also read on if you're using `addon-knobs`: we advise an update to your code for efficiency's sake.
-### `babel-core` is now a peer dependency ([#2494](https://github.com/storybookjs/storybook/pull/2494))
+### `babel-core` is now a peer dependency #2494
This affects you if you don't use babel in your project. You may need to add `babel-core` as dev dependency:
@@ -1727,7 +1747,7 @@ yarn add babel-core --dev
This was done to support different major versions of babel.
-### Base webpack config now contains vital plugins ([#1775](https://github.com/storybookjs/storybook/pull/1775))
+### Base webpack config now contains vital plugins #1775
This affects you if you use custom webpack config in [Full Control Mode](https://storybook.js.org/docs/react/configure/webpack#full-control-mode) while not preserving the plugins from `storybookBaseConfig`. Before `3.3`, preserving them was a recommendation, but now it [became](https://github.com/storybookjs/storybook/pull/2578) a requirement.
diff --git a/lib/client-api/src/story_store.ts b/lib/client-api/src/story_store.ts
index c0c19ef9edac..432147988002 100644
--- a/lib/client-api/src/story_store.ts
+++ b/lib/client-api/src/story_store.ts
@@ -5,6 +5,7 @@ import stable from 'stable';
import mapValues from 'lodash/mapValues';
import pick from 'lodash/pick';
import store from 'store2';
+import deprecate from 'util-deprecate';
import { Channel } from '@storybook/channels';
import Events from '@storybook/core-events';
@@ -405,18 +406,25 @@ export default class StoryStore {
const storyParametersWithArgTypes = { ...storyParameters, argTypes, __isArgsStory };
- const storyFn: LegacyStoryFn = (runtimeContext: StoryContext) =>
- getDecorated()({
- ...identification,
- ...runtimeContext,
- // Calculate "combined" parameters at render time (NOTE: for perf we could just use combinedParameters from above?)
- parameters: this.combineStoryParameters(storyParametersWithArgTypes, kind),
- hooks,
- args: _stories[id].args,
- argTypes,
- globals: this._globals,
- viewMode: this._selection?.viewMode,
- });
+ const storyFn: LegacyStoryFn = deprecate(
+ (runtimeContext: StoryContext) =>
+ getDecorated()({
+ ...identification,
+ ...runtimeContext,
+ // Calculate "combined" parameters at render time (NOTE: for perf we could just use combinedParameters from above?)
+ parameters: this.combineStoryParameters(storyParametersWithArgTypes, kind),
+ hooks,
+ args: _stories[id].args,
+ argTypes,
+ globals: this._globals,
+ viewMode: this._selection?.viewMode,
+ }),
+ dedent`
+ \`storyFn\` is deprecated and will be removed in Storybook 7.0.
+
+ https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-storyfn
+ `
+ );
const unboundStoryFn: LegacyStoryFn = (context: StoryContext) => getDecorated()(context);