Move composeConfigs logic from preview-web to store

This commit is contained in:
Yann Braga 2022-03-28 18:24:15 +02:00
parent c693b4b532
commit bcf7e4d03a
18 changed files with 75 additions and 257 deletions

View File

@ -3,12 +3,13 @@ import {
composeStories as originalComposeStories,
setGlobalConfig as originalSetGlobalConfig,
CSFExports,
ComposedStory,
StoriesWithPartialProps,
} from '@storybook/store';
import { ProjectAnnotations, Args } from '@storybook/csf';
import { render } from '../preview/render';
import type { Meta, ReactFramework } from '../preview/types-6-0';
import type { StoriesWithPartialProps, TestingStory } from './types';
/** Function that sets the globalConfig of your storybook. The global config is the preview module of your .storybook folder.
*
@ -64,7 +65,7 @@ const defaultProjectAnnotations: ProjectAnnotations<ReactFramework> = {
* @param [exportsName] - in case your story does not contain a name and you want it to have a name.
*/
export function composeStory<TArgs = Args>(
story: TestingStory<TArgs>,
story: ComposedStory<ReactFramework, TArgs>,
componentAnnotations: Meta<TArgs | any>,
projectAnnotations?: ProjectAnnotations<ReactFramework>,
exportsName?: string
@ -109,5 +110,8 @@ export function composeStories<TModule extends CSFExports<ReactFramework>>(
) {
const composedStories = originalComposeStories(csfExports, projectAnnotations, composeStory);
return composedStories as unknown as Omit<StoriesWithPartialProps<TModule>, keyof CSFExports>;
return composedStories as unknown as Omit<
StoriesWithPartialProps<ReactFramework, TModule>,
keyof CSFExports
>;
}

View File

@ -1,22 +0,0 @@
import type {
StoryFn as OriginalStoryFn,
TestingStory as OriginalTestingStory,
} from '@storybook/store';
import type { ReactFramework, Args } from '../preview/types-6-0';
export type TestingStory<TArgs = Args> = OriginalTestingStory<ReactFramework, TArgs>;
export type StoryFn<TArgs = Args> = OriginalStoryFn<ReactFramework, TArgs>;
/**
* T represents the whole ES module of a stories file. K of T means named exports (basically the Story type)
* 1. pick the keys K of T that have properties that are Story<AnyProps>
* 2. infer the actual prop type for each Story
* 3. reconstruct Story with Partial. Story<Props> -> Story<Partial<Props>>
*/
export type StoriesWithPartialProps<TModule> = {
// @TODO once we can use Typescript 4.0 do this to exclude nonStory exports:
// replace [K in keyof TModule] with [K in keyof TModule as TModule[K] extends TestingStory<any> ? K : never]
[K in keyof TModule]: TModule[K] extends TestingStory<infer TProps>
? StoryFn<Partial<TProps>>
: unknown;
};

View File

@ -9,14 +9,13 @@ const { Standard } = composeStories(stories);
test('renders form', async () => {
await render(<Standard />);
expect(screen.getByTestId('email')).not.toBe(null);
});
test('fills input from play function', async () => {
// @ts-ignore
const StandardEmailFilled = composeStory(stories.StandardEmailFilled, stories.default);
const { container } = await render(<StandardEmailFilled />);
// @ts-ignore
await StandardEmailFilled.play({ canvasElement: container });
const emailInput = screen.getByTestId('email') as HTMLInputElement;

View File

@ -1,6 +1,7 @@
import global from 'global';
import { composeConfigs, PreviewWeb } from '@storybook/preview-web';
import { PreviewWeb } from '@storybook/preview-web';
import { composeConfigs} from '@storybook/store';
import { ClientApi } from '@storybook/client-api';
import { addons } from '@storybook/addons';
import createPostMessageChannel from '@storybook/channel-postmessage';

View File

@ -1,6 +1,7 @@
import global from 'global';
import { composeConfigs, PreviewWeb } from '@storybook/preview-web';
import { PreviewWeb } from '@storybook/preview-web';
import { composeConfigs } from '@storybook/store';
import { ClientApi } from '@storybook/client-api';
import { addons } from '@storybook/addons';
import createPostMessageChannel from '@storybook/channel-postmessage';

View File

@ -2,12 +2,11 @@ import global from 'global';
import deprecate from 'util-deprecate';
import { ClientApi } from '@storybook/client-api';
import { PreviewWeb } from '@storybook/preview-web';
import type { WebProjectAnnotations } from '@storybook/preview-web';
import type { AnyFramework, ArgsStoryFn } from '@storybook/csf';
import createChannel from '@storybook/channel-postmessage';
import { addons } from '@storybook/addons';
import Events from '@storybook/core-events';
import type { Path } from '@storybook/store';
import type { Path, WebProjectAnnotations } from '@storybook/store';
import { Loadable } from './types';
import { executeLoadableForChanges } from './executeLoadable';

View File

@ -5,7 +5,7 @@ import Events, { IGNORED_EXCEPTION } from '@storybook/core-events';
import { logger } from '@storybook/client-logger';
import { addons, mockChannel as createMockChannel } from '@storybook/addons';
import type { AnyFramework } from '@storybook/csf';
import type { ModuleImportFn } from '@storybook/store';
import type { ModuleImportFn, WebProjectAnnotations } from '@storybook/store';
import { PreviewWeb } from './PreviewWeb';
import {
@ -22,7 +22,6 @@ import {
waitForQuiescence,
waitForRenderPhase,
} from './PreviewWeb.mockdata';
import type { WebProjectAnnotations } from './types';
jest.mock('./WebView');
const { history, document } = global;

View File

@ -13,10 +13,9 @@ import {
StoryStore,
StorySpecifier,
StoryIndex,
WebProjectAnnotations,
} from '@storybook/store';
import { WebProjectAnnotations } from './types';
import { UrlStore } from './UrlStore';
import { WebView } from './WebView';
import { PREPARE_ABORTED, StoryRender } from './StoryRender';

View File

@ -1,6 +1,5 @@
export { PreviewWeb } from './PreviewWeb';
export { composeConfigs } from './composeConfigs';
export { simulatePageLoad, simulateDOMContentLoaded } from './simulate-pageload';
export * from './types';

View File

@ -2,20 +2,14 @@ import type {
StoryId,
StoryName,
AnyFramework,
ProjectAnnotations,
StoryContextForLoaders,
ComponentTitle,
Args,
Globals,
} from '@storybook/csf';
import type { RenderContext, Story } from '@storybook/store';
import type { Story } from '@storybook/store';
import { PreviewWeb } from './PreviewWeb';
export type WebProjectAnnotations<TFramework extends AnyFramework> =
ProjectAnnotations<TFramework> & {
renderToDOM?: (context: RenderContext<TFramework>, element: Element) => Promise<void> | void;
};
export interface DocsContextProps<TFramework extends AnyFramework = AnyFramework> {
id: StoryId;
title: ComponentTitle;

View File

@ -44,7 +44,6 @@
"@storybook/client-logger": "6.5.0-alpha.50",
"@storybook/core-events": "6.5.0-alpha.50",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/preview-web": "6.5.0-alpha.50",
"core-js": "^3.8.2",
"fast-deep-equal": "^3.1.3",
"global": "^4.4.0",

View File

@ -1,21 +1,33 @@
import type { AnyFramework } from '@storybook/csf';
import { combineParameters } from '@storybook/store';
import type { ModuleExports } from '@storybook/store';
import type { WebProjectAnnotations } from './types';
function getField(moduleExportList: ModuleExports[], field: string): any[] {
import { combineParameters } from '../parameters';
import type { ModuleExports, WebProjectAnnotations } from '../types';
export function getField<TFieldType = any>(
moduleExportList: ModuleExports[],
field: string
): TFieldType | TFieldType[] {
return moduleExportList.map((xs) => xs[field]).filter(Boolean);
}
function getArrayField(moduleExportList: ModuleExports[], field: string): any[] {
return getField(moduleExportList, field).reduce((a, b) => [...a, ...b], []);
export function getArrayField<TFieldType = any>(
moduleExportList: ModuleExports[],
field: string
): TFieldType[] {
return getField(moduleExportList, field).reduce((a: any, b: any) => [...a, ...b], []);
}
function getObjectField(moduleExportList: ModuleExports[], field: string): Record<string, any> {
export function getObjectField<TFieldType = Record<string, any>>(
moduleExportList: ModuleExports[],
field: string
): TFieldType {
return Object.assign({}, ...getField(moduleExportList, field));
}
function getSingletonField(moduleExportList: ModuleExports[], field: string): any {
export function getSingletonField<TFieldType = any>(
moduleExportList: ModuleExports[],
field: string
): TFieldType {
return getField(moduleExportList, field).pop();
}

View File

@ -5,4 +5,5 @@ export * from './prepareStory';
export * from './normalizeComponentAnnotations';
export * from './normalizeProjectAnnotations';
export * from './getValuesFromArgTypes';
export * from './composeConfigs';
export * from './testing-utils';

View File

@ -9,14 +9,15 @@ import {
StoryContext,
Parameters,
} from '@storybook/csf';
import { composeConfigs } from '@storybook/preview-web';
import { composeConfigs } from '../composeConfigs';
import { prepareStory } from '../prepareStory';
import { normalizeStory } from '../normalizeStory';
import { HooksContext } from '../../hooks';
import { normalizeComponentAnnotations } from '../normalizeComponentAnnotations';
import { getValuesFromArgTypes, normalizeProjectAnnotations } from '..';
import type { CSFExports, TestingStoryPlayFn } from './types';
import { getValuesFromArgTypes } from '../getValuesFromArgTypes';
import { normalizeProjectAnnotations } from '../normalizeProjectAnnotations';
import type { CSFExports, ComposedStoryPlayFn } from './types';
export * from './types';
@ -24,6 +25,13 @@ let GLOBAL_STORYBOOK_PROJECT_ANNOTATIONS = {};
export function setGlobalConfig<TFramework extends AnyFramework = AnyFramework>(
projectAnnotations: ProjectAnnotations<TFramework> | ProjectAnnotations<TFramework>[]
) {
// deprecate this
setProjectAnnotations(projectAnnotations);
}
export function setProjectAnnotations<TFramework extends AnyFramework = AnyFramework>(
projectAnnotations: ProjectAnnotations<TFramework> | ProjectAnnotations<TFramework>[]
) {
GLOBAL_STORYBOOK_PROJECT_ANNOTATIONS = Array.isArray(projectAnnotations)
? composeConfigs(projectAnnotations)
@ -40,7 +48,7 @@ interface ComposeStory<TFramework extends AnyFramework = AnyFramework, TArgs ext
(extraArgs: Partial<TArgs>): TFramework['storyResult'];
storyName: string;
args: Args;
play: TestingStoryPlayFn;
play: ComposedStoryPlayFn;
parameters: Parameters;
};
}
@ -99,7 +107,7 @@ export function composeStory<
composedStory.storyName = storyAnnotations.storyName || storyAnnotations.name;
composedStory.args = story.initialArgs;
composedStory.play = story.playFunction as TestingStoryPlayFn;
composedStory.play = story.playFunction as ComposedStoryPlayFn;
composedStory.parameters = story.parameters;
return composedStory;

View File

@ -13,13 +13,27 @@ export type CSFExports<TFramework extends AnyFramework = AnyFramework> = {
__namedExportsOrder?: string[];
};
export type TestingStoryPlayContext = Partial<StoryContext> & Pick<StoryContext, 'canvasElement'>;
export type ComposedStoryPlayContext = Partial<StoryContext> & Pick<StoryContext, 'canvasElement'>;
export type TestingStoryPlayFn = (context: TestingStoryPlayContext) => Promise<void> | void;
export type ComposedStoryPlayFn = (context: ComposedStoryPlayContext) => Promise<void> | void;
export type StoryFn<TFramework extends AnyFramework = AnyFramework, TArgs = Args> =
AnnotatedStoryFn<TFramework, TArgs> & { play: TestingStoryPlayFn };
AnnotatedStoryFn<TFramework, TArgs> & { play: ComposedStoryPlayFn };
export type TestingStory<TFramework extends AnyFramework = AnyFramework, TArgs = Args> =
export type ComposedStory<TFramework extends AnyFramework = AnyFramework, TArgs = Args> =
| StoryFn<TFramework, TArgs>
| StoryAnnotations<TFramework, TArgs>;
/**
* T represents the whole ES module of a stories file. K of T means named exports (basically the Story type)
* 1. pick the keys K of T that have properties that are Story<AnyProps>
* 2. infer the actual prop type for each Story
* 3. reconstruct Story with Partial. Story<Props> -> Story<Partial<Props>>
*/
export type StoriesWithPartialProps<TFramework extends AnyFramework, TModule> = {
// @TODO once we can use Typescript 4.0 do this to exclude nonStory exports:
// replace [K in keyof TModule] with [K in keyof TModule as TModule[K] extends ComposedStory<any> ? K : never]
[K in keyof TModule]: TModule[K] extends ComposedStory<infer _, infer TProps>
? AnnotatedStoryFn<TFramework, Partial<TProps>>
: unknown;
};

View File

@ -29,6 +29,11 @@ export type ModuleExports = Record<string, any>;
type PromiseLike<T> = Promise<T> | SynchronousPromise<T>;
export type ModuleImportFn = (path: Path) => PromiseLike<ModuleExports>;
export type WebProjectAnnotations<TFramework extends AnyFramework> =
ProjectAnnotations<TFramework> & {
renderToDOM?: (context: RenderContext<TFramework>, element: Element) => Promise<void> | void;
};
export type NormalizedProjectAnnotations<TFramework extends AnyFramework = AnyFramework> =
ProjectAnnotations<TFramework> & {
argTypes?: StrictArgTypes;

198
yarn.lock
View File

@ -6833,28 +6833,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/addons@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/addons@npm:6.4.19"
dependencies:
"@storybook/api": 6.4.19
"@storybook/channels": 6.4.19
"@storybook/client-logger": 6.4.19
"@storybook/core-events": 6.4.19
"@storybook/csf": 0.0.2--canary.87bc651.0
"@storybook/router": 6.4.19
"@storybook/theming": 6.4.19
"@types/webpack-env": ^1.16.0
core-js: ^3.8.2
global: ^4.4.0
regenerator-runtime: ^0.13.7
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: f309622784a965ff7fd2d16f344397eeebaab0006406b6372129f43390a4015c83c16e1e6d32c6ad360517523ec2221ed4f8cac3853984d60f4ab2a3705f2a45
languageName: node
linkType: hard
"@storybook/angular@6.5.0-alpha.50, @storybook/angular@workspace:*, @storybook/angular@workspace:app/angular":
version: 0.0.0-use.local
resolution: "@storybook/angular@workspace:app/angular"
@ -7005,34 +6983,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/api@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/api@npm:6.4.19"
dependencies:
"@storybook/channels": 6.4.19
"@storybook/client-logger": 6.4.19
"@storybook/core-events": 6.4.19
"@storybook/csf": 0.0.2--canary.87bc651.0
"@storybook/router": 6.4.19
"@storybook/semver": ^7.3.2
"@storybook/theming": 6.4.19
core-js: ^3.8.2
fast-deep-equal: ^3.1.3
global: ^4.4.0
lodash: ^4.17.21
memoizerific: ^1.11.3
regenerator-runtime: ^0.13.7
store2: ^2.12.0
telejson: ^5.3.2
ts-dedent: ^2.0.0
util-deprecate: ^1.0.2
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: 77fae2be5269d45d3d30d8364ca35b7b95ffaebe5ae1780275f97c2ebb1b6d9e3fa2a260e82587bbe141feeebac5054e44add36fec19cefe6d058e01ce4810ee
languageName: node
linkType: hard
"@storybook/babel-plugin-require-context-hook@npm:1.0.1":
version: 1.0.1
resolution: "@storybook/babel-plugin-require-context-hook@npm:1.0.1"
@ -7175,21 +7125,6 @@ __metadata:
languageName: unknown
linkType: soft
"@storybook/channel-postmessage@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/channel-postmessage@npm:6.4.19"
dependencies:
"@storybook/channels": 6.4.19
"@storybook/client-logger": 6.4.19
"@storybook/core-events": 6.4.19
core-js: ^3.8.2
global: ^4.4.0
qs: ^6.10.0
telejson: ^5.3.2
checksum: ed1dfd996456ccd23246b415db1de228814651ed56692e76ee69f9b0308a6b1b0355d3a3cc7afc3603c2850d3e27ec420e574f55a93e16b08f275eb7e0d8de82
languageName: node
linkType: hard
"@storybook/channel-websocket@6.5.0-alpha.50, @storybook/channel-websocket@workspace:*, @storybook/channel-websocket@workspace:lib/channel-websocket":
version: 0.0.0-use.local
resolution: "@storybook/channel-websocket@workspace:lib/channel-websocket"
@ -7223,17 +7158,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/channels@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/channels@npm:6.4.19"
dependencies:
core-js: ^3.8.2
ts-dedent: ^2.0.0
util-deprecate: ^1.0.2
checksum: 14700d23d848f9c06e87650d4d11d764012baa6405b9c7eedb04a9f162660f49233a572f9c6a89c9bbc49ba378895ecf151dfe792fb8e6482a9a0de002d80e4e
languageName: node
linkType: hard
"@storybook/cli@6.5.0-alpha.50, @storybook/cli@workspace:*, @storybook/cli@workspace:lib/cli":
version: 0.0.0-use.local
resolution: "@storybook/cli@workspace:lib/cli"
@ -7330,16 +7254,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/client-logger@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/client-logger@npm:6.4.19"
dependencies:
core-js: ^3.8.2
global: ^4.4.0
checksum: 06e6e463ea05560280fc34faeddfd86475064b1a2eb04c1a1da230f4d761d0aebfbad5ae2978412edece7bac01f47ff09f9620a77936ffe6c9c7e20438a17acf
languageName: node
linkType: hard
"@storybook/codemod@6.5.0-alpha.50, @storybook/codemod@workspace:*, @storybook/codemod@workspace:lib/codemod":
version: 0.0.0-use.local
resolution: "@storybook/codemod@workspace:lib/codemod"
@ -7520,15 +7434,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/core-events@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/core-events@npm:6.4.19"
dependencies:
core-js: ^3.8.2
checksum: 574d1fc3adc23ec2a12246898e5f27eaad0592db664f9691dc855dd4ceddcb248d180a389e5c98d69324de2675c818d9cbae67a58d5ed5b6ff4d0e2be0346711
languageName: node
linkType: hard
"@storybook/core-server@6.5.0-alpha.50, @storybook/core-server@workspace:lib/core-server":
version: 0.0.0-use.local
resolution: "@storybook/core-server@workspace:lib/core-server"
@ -8171,33 +8076,6 @@ __metadata:
languageName: unknown
linkType: soft
"@storybook/preview-web@npm:":
version: 6.4.19
resolution: "@storybook/preview-web@npm:6.4.19"
dependencies:
"@storybook/addons": 6.4.19
"@storybook/channel-postmessage": 6.4.19
"@storybook/client-logger": 6.4.19
"@storybook/core-events": 6.4.19
"@storybook/csf": 0.0.2--canary.87bc651.0
"@storybook/store": 6.4.19
ansi-to-html: ^0.6.11
core-js: ^3.8.2
global: ^4.4.0
lodash: ^4.17.21
qs: ^6.10.0
regenerator-runtime: ^0.13.7
synchronous-promise: ^2.0.15
ts-dedent: ^2.0.0
unfetch: ^4.2.0
util-deprecate: ^1.0.2
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: 7da30e8dd1cf4ec0fa05c6cf655a1a80bf7df22fc94590126aba4d9dbe3822d5b9bb00f3fad2d7bf0ebd323ef45c9da7f4eaee16e2bcc497e9c4be946c0bb00d
languageName: node
linkType: hard
"@storybook/react-docgen-typescript-plugin@npm:1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0":
version: 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0
resolution: "@storybook/react-docgen-typescript-plugin@npm:1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0"
@ -8574,28 +8452,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/router@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/router@npm:6.4.19"
dependencies:
"@storybook/client-logger": 6.4.19
core-js: ^3.8.2
fast-deep-equal: ^3.1.3
global: ^4.4.0
history: 5.0.0
lodash: ^4.17.21
memoizerific: ^1.11.3
qs: ^6.10.0
react-router: ^6.0.0
react-router-dom: ^6.0.0
ts-dedent: ^2.0.0
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: f998c4752f0f4b7b7243e6ef271e14e6e1bc65f67109940ee4a17393b4c1c0ee50e41ff9f83e6c83d8902cd08fee3a9bb6f225cef868bbbecd968dec00b1e026
languageName: node
linkType: hard
"@storybook/semver@npm:^7.3.2":
version: 7.3.2
resolution: "@storybook/semver@npm:7.3.2"
@ -8669,7 +8525,6 @@ __metadata:
"@storybook/client-logger": 6.5.0-alpha.50
"@storybook/core-events": 6.5.0-alpha.50
"@storybook/csf": 0.0.2--canary.507502b.0
"@storybook/preview-web": ""
core-js: ^3.8.2
fast-deep-equal: ^3.1.3
global: ^4.4.0
@ -8687,32 +8542,6 @@ __metadata:
languageName: unknown
linkType: soft
"@storybook/store@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/store@npm:6.4.19"
dependencies:
"@storybook/addons": 6.4.19
"@storybook/client-logger": 6.4.19
"@storybook/core-events": 6.4.19
"@storybook/csf": 0.0.2--canary.87bc651.0
core-js: ^3.8.2
fast-deep-equal: ^3.1.3
global: ^4.4.0
lodash: ^4.17.21
memoizerific: ^1.11.3
regenerator-runtime: ^0.13.7
slash: ^3.0.0
stable: ^0.1.8
synchronous-promise: ^2.0.15
ts-dedent: ^2.0.0
util-deprecate: ^1.0.2
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: f194b0943ff10bbceea5135f60d7c8da48420bd32e6ce547be76bf6173e45821deaa1ef4292d1159cf80bc7bd12d0c3dd1145af0e8525d33a408a59e7c25222b
languageName: node
linkType: hard
"@storybook/svelte@6.5.0-alpha.50, @storybook/svelte@workspace:*, @storybook/svelte@workspace:app/svelte":
version: 0.0.0-use.local
resolution: "@storybook/svelte@workspace:app/svelte"
@ -8823,29 +8652,6 @@ __metadata:
languageName: node
linkType: hard
"@storybook/theming@npm:6.4.19":
version: 6.4.19
resolution: "@storybook/theming@npm:6.4.19"
dependencies:
"@emotion/core": ^10.1.1
"@emotion/is-prop-valid": ^0.8.6
"@emotion/styled": ^10.0.27
"@storybook/client-logger": 6.4.19
core-js: ^3.8.2
deep-object-diff: ^1.1.0
emotion-theming: ^10.0.27
global: ^4.4.0
memoizerific: ^1.11.3
polished: ^4.0.5
resolve-from: ^5.0.0
ts-dedent: ^2.0.0
peerDependencies:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
checksum: b28ba28536f3c958a29b07ff451310eb2d03c2d7c0edf98b6033c1de227aea15391d585b82d4cb9b6f670a47872b03b3beb870eee1aec93c7bd27e01e70cc087
languageName: node
linkType: hard
"@storybook/ui@6.5.0-alpha.50, @storybook/ui@workspace:*, @storybook/ui@workspace:lib/ui":
version: 0.0.0-use.local
resolution: "@storybook/ui@workspace:lib/ui"
@ -38127,7 +37933,7 @@ __metadata:
languageName: node
linkType: hard
"react-router-dom@npm:^6.0.0, react-router-dom@npm:^6.0.0-beta.8":
"react-router-dom@npm:^6.0.0-beta.8":
version: 6.2.2
resolution: "react-router-dom@npm:6.2.2"
dependencies:
@ -38151,7 +37957,7 @@ __metadata:
languageName: node
linkType: hard
"react-router@npm:6.2.2, react-router@npm:^6.0.0, react-router@npm:^6.0.0-beta.8":
"react-router@npm:6.2.2, react-router@npm:^6.0.0-beta.8":
version: 6.2.2
resolution: "react-router@npm:6.2.2"
dependencies: