From 0dbda33933b33af430d91cc0a8d0d5fbdcb880be Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 1 Apr 2024 23:57:41 +0200 Subject: [PATCH 001/180] Add SaveFromControls action bar --- .../ArgsTable/SaveFromControls.stories.tsx | 22 ++++ .../components/ArgsTable/SaveFromControls.tsx | 113 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx create mode 100644 code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx new file mode 100644 index 000000000000..bb8fdf558f70 --- /dev/null +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx @@ -0,0 +1,22 @@ +import { action } from '@storybook/addon-actions'; +import type { Meta, StoryObj } from '@storybook/react'; + +import { SaveFromControls } from './SaveFromControls'; + +const meta = { + component: SaveFromControls, + title: 'Components/ArgsTable/SaveFromControls', + args: { + saveStory: action('saveStory'), + createStory: action('createStory'), + resetArgs: action('resetArgs'), + }, + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx new file mode 100644 index 000000000000..3a1aefc5f434 --- /dev/null +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -0,0 +1,113 @@ +import { Bar as BaseBar, IconButton, TooltipNote, WithTooltip } from '@storybook/components'; +import { AddIcon, BookmarkHollowIcon, InfoIcon, UndoIcon } from '@storybook/icons'; +import { styled } from '@storybook/theming'; +import React from 'react'; + +const Bar = styled(BaseBar)(({ theme }) => ({ + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + justifyContent: 'space-between', + gap: 6, + padding: '6px 10px', + fontSize: theme.typography.size.s2, + containerType: 'size', + background: theme.background.bar, + borderTop: `1px solid ${theme.color.border}`, + overflow: 'visible', +})); + +const Content = styled.div({ + display: 'flex', + alignItems: 'center', + marginLeft: 10, + gap: 6, + + 'span:last-of-type': { + display: 'none', + }, + '@container (min-width: 800px)': { + 'span:first-of-type': { + display: 'none', + }, + 'span:last-of-type': { + display: 'inline', + }, + }, +}); + +const Actions = styled.div(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: 2, + color: theme.color.mediumdark, + fontSize: theme.typography.size.s2, +})); + +const ActionButton = styled(IconButton)({ + span: { + display: 'none', + '@container (min-width: 800px)': { + display: 'inline', + }, + }, +}); + +type SaveFromControlsProps = { + saveStory: () => void; + createStory: () => void; + resetArgs: () => void; +}; + +export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFromControlsProps) => { + return ( + + + + Unsaved changes + You modified this story. Do you want to save your changes? + + + + } + > + saveStory()}> + + Save + + + + } + > + createStory()} + > + + Create new story + + + + } + > + resetArgs()}> + + Reset + + + + + ); +}; From 8cbd0127e00b6ad559d2f3e28147a121c768cd00 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 08:45:56 +0200 Subject: [PATCH 002/180] Add SaveFromControls bar to Controls panel --- .../ArgsTable/ArgsTable.stories.tsx | 48 +++++++++++-------- .../src/components/ArgsTable/ArgsTable.tsx | 16 +++++-- .../components/ArgsTable/SaveFromControls.tsx | 2 + 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx index 39ed63dc6299..159b65b5df03 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx @@ -52,27 +52,6 @@ export const Compact = { args: { ...Normal.args, compact: true }, }; -const AddonPanelLayout = styled.div(({ theme }) => ({ - fontSize: theme.typography.size.s2 - 1, - background: theme.background.content, -})); - -export const InAddonPanel = { - args: { ...Normal.args, inAddonPanel: true }, - decorators: [(storyFn: any) => {storyFn()}], -}; - -export const InAddonPanelNoControls = { - render: (args: any) => , - args: { - rows: { - stringType: { ...stringType, control: false }, - numberType: { ...numberType, control: false }, - }, - }, - decorators: InAddonPanel.decorators, -}; - export const Sections = { args: { rows: { @@ -137,6 +116,33 @@ export const AllControls = { }, }; +const AddonPanelLayout = styled.div(({ theme }) => ({ + fontSize: theme.typography.size.s2 - 1, + background: theme.background.content, +})); + +export const InAddonPanel = { + args: { + ...Normal.args, + inAddonPanel: true, + rows: SectionsAndSubsections.args.rows, + }, + decorators: [(storyFn: any) => {storyFn()}], + parameters: { + layout: 'fullscreen', + }, +}; + +export const InAddonPanelNoControls = { + ...InAddonPanel, + args: { + ...InAddonPanel.args, + rows: Object.fromEntries( + Object.entries(InAddonPanel.args.rows).map(([k, v]) => [k, { ...v, control: null }]) + ), + }, +}; + export const Error = { args: { error: ArgsTableError.NO_COMPONENT, diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx index 8ad18ff4257c..71ace3f8a966 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx @@ -15,6 +15,12 @@ import type { ArgType, ArgTypes, Args, Globals } from './types'; import { EmptyBlock } from '..'; import { Skeleton } from './Skeleton'; import { Empty } from './Empty'; +import { SaveFromControls } from './SaveFromControls'; + +const ContentWrapper = styled(ResetWrapper)({ + maxHeight: '100vh', + overflow: 'auto', +}); export const TableWrapper = styled.table<{ compact?: boolean; @@ -356,7 +362,7 @@ export const ArgsTable: FC = (props) => { const common = { updateArgs, compact, inAddonPanel, initialExpandedArgs }; return ( - + @@ -377,7 +383,7 @@ export const ArgsTable: FC = (props) => { Control{' '} - {!isLoading && resetArgs && ( + {!isLoading && !inAddonPanel && resetArgs && ( resetArgs()} title="Reset controls"> @@ -433,6 +439,10 @@ export const ArgsTable: FC = (props) => { ))} - + + {inAddonPanel && ( + {}} createStory={() => {}} resetArgs={resetArgs} /> + )} + ); }; diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index 3a1aefc5f434..f8ce7e1ed88f 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -4,6 +4,8 @@ import { styled } from '@storybook/theming'; import React from 'react'; const Bar = styled(BaseBar)(({ theme }) => ({ + position: 'sticky', + bottom: 0, display: 'flex', flexWrap: 'wrap', alignItems: 'center', From 48c14e838009c479aa51143d5bd9b5b708b5a113 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 2 Apr 2024 10:09:26 +0200 Subject: [PATCH 003/180] add events --- code/lib/core-events/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 7542d0aa4e57..d23644f124d8 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -73,6 +73,9 @@ enum events { SET_WHATS_NEW_CACHE = 'setWhatsNewCache', TOGGLE_WHATS_NEW_NOTIFICATIONS = 'toggleWhatsNewNotifications', TELEMETRY_ERROR = 'telemetryError', + + SAVE_STORY_REQUEST = 'saveStoryRequest', + SAVE_STORY_RESULT = 'saveStoryResult', } // Enables: `import Events from ...` From 2a15187f26c8ad786bf149ff1ed632c5a8393ac2 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 2 Apr 2024 10:25:40 +0200 Subject: [PATCH 004/180] move code for whatsnew to new file to not over-complicate the common preset. add scaffolding for save-from-controls --- code/lib/core-events/src/index.ts | 2 + .../core-server/src/presets/common-preset.ts | 114 ++--------------- .../src/utils/save-from-controls.ts | 28 +++++ code/lib/core-server/src/utils/whats-new.ts | 119 ++++++++++++++++++ 4 files changed, 156 insertions(+), 107 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-from-controls.ts create mode 100644 code/lib/core-server/src/utils/whats-new.ts diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index d23644f124d8..094f26f8b7b6 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -130,6 +130,8 @@ export const { SET_WHATS_NEW_CACHE, TOGGLE_WHATS_NEW_NOTIFICATIONS, TELEMETRY_ERROR, + SAVE_STORY_REQUEST, + SAVE_STORY_RESULT, } = events; export interface WhatsNewCache { diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 6dcd6366eff0..0153eb7b529f 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -1,8 +1,7 @@ -import fs, { pathExists, readFile } from 'fs-extra'; +import { pathExists, readFile } from 'fs-extra'; import { logger } from '@storybook/node-logger'; import { telemetry } from '@storybook/telemetry'; import { - findConfigFile, getDirectoryFromWorkingDir, getPreviewBodyTemplate, getPreviewHeadTemplate, @@ -17,23 +16,15 @@ import type { PresetPropertyFn, PresetProperty, } from '@storybook/types'; -import { printConfig, readConfig, readCsf } from '@storybook/csf-tools'; +import { readCsf } from '@storybook/csf-tools'; import { join, dirname, isAbsolute } from 'path'; import { dedent } from 'ts-dedent'; -import fetch from 'node-fetch'; import type { Channel } from '@storybook/channels'; -import type { WhatsNewCache, WhatsNewData } from '@storybook/core-events'; -import { - REQUEST_WHATS_NEW_DATA, - RESULT_WHATS_NEW_DATA, - TELEMETRY_ERROR, - SET_WHATS_NEW_CACHE, - TOGGLE_WHATS_NEW_NOTIFICATIONS, -} from '@storybook/core-events'; -import invariant from 'tiny-invariant'; import { parseStaticDir } from '../utils/server-statics'; import { defaultStaticDirs } from '../utils/constants'; -import { sendTelemetryError } from '../withTelemetry'; +import type { OptionsWithRequiredCache } from '../utils/whats-new'; +import { initializeWhatsNew } from '../utils/whats-new'; +import { initializeSaveFromControls } from '../utils/save-from-controls'; const interpolate = (string: string, data: Record = {}) => Object.entries(data).reduce((acc, [k, v]) => acc.replace(new RegExp(`%${k}%`, 'g'), v), string); @@ -239,20 +230,6 @@ export const managerHead = async (_: any, options: Options) => { return ''; }; -const WHATS_NEW_CACHE = 'whats-new-cache'; -const WHATS_NEW_URL = 'https://storybook.js.org/whats-new/v1'; - -// Grabbed from the implementation: https://github.com/storybookjs/dx-functions/blob/main/netlify/functions/whats-new.ts -type WhatsNewResponse = { - title: string; - url: string; - blogUrl?: string; - publishedAt: string; - excerpt: string; -}; - -type OptionsWithRequiredCache = Exclude & Required>; - // eslint-disable-next-line @typescript-eslint/naming-convention export const experimental_serverChannel = async ( channel: Channel, @@ -260,85 +237,8 @@ export const experimental_serverChannel = async ( ) => { const coreOptions = await options.presets.apply('core'); - channel.on(SET_WHATS_NEW_CACHE, async (data: WhatsNewCache) => { - const cache: WhatsNewCache = await options.cache.get(WHATS_NEW_CACHE).catch((e) => { - logger.verbose(e); - return {}; - }); - await options.cache.set(WHATS_NEW_CACHE, { ...cache, ...data }); - }); - - channel.on(REQUEST_WHATS_NEW_DATA, async () => { - try { - const post = (await fetch(WHATS_NEW_URL).then(async (response) => { - if (response.ok) return response.json(); - // eslint-disable-next-line @typescript-eslint/no-throw-literal - throw response; - })) as WhatsNewResponse; - - const configFileName = findConfigFile('main', options.configDir); - if (!configFileName) - throw new Error(`unable to find storybook main file in ${options.configDir}`); - const main = await readConfig(configFileName); - const disableWhatsNewNotifications = main.getFieldValue([ - 'core', - 'disableWhatsNewNotifications', - ]); - - const cache: WhatsNewCache = (await options.cache.get(WHATS_NEW_CACHE)) ?? {}; - const data = { - ...post, - status: 'SUCCESS', - postIsRead: post.url === cache.lastReadPost, - showNotification: post.url !== cache.lastDismissedPost && post.url !== cache.lastReadPost, - disableWhatsNewNotifications, - } satisfies WhatsNewData; - channel.emit(RESULT_WHATS_NEW_DATA, { data }); - } catch (e) { - logger.verbose(e instanceof Error ? e.message : String(e)); - channel.emit(RESULT_WHATS_NEW_DATA, { - data: { status: 'ERROR' } satisfies WhatsNewData, - }); - } - }); - - channel.on( - TOGGLE_WHATS_NEW_NOTIFICATIONS, - async ({ disableWhatsNewNotifications }: { disableWhatsNewNotifications: boolean }) => { - const isTelemetryEnabled = coreOptions.disableTelemetry !== true; - try { - const mainPath = findConfigFile('main', options.configDir); - invariant(mainPath, `unable to find storybook main file in ${options.configDir}`); - const main = await readConfig(mainPath); - main.setFieldValue(['core', 'disableWhatsNewNotifications'], disableWhatsNewNotifications); - await fs.writeFile(mainPath, printConfig(main).code); - if (isTelemetryEnabled) { - await telemetry('core-config', { disableWhatsNewNotifications }); - } - } catch (error) { - invariant(error instanceof Error); - if (isTelemetryEnabled) { - await sendTelemetryError(error, 'core-config', { - cliOptions: options, - presetOptions: { ...options, corePresets: [], overridePresets: [] }, - skipPrompt: true, - }); - } - } - } - ); - - channel.on(TELEMETRY_ERROR, async (error) => { - const isTelemetryEnabled = coreOptions.disableTelemetry !== true; - - if (isTelemetryEnabled) { - await sendTelemetryError(error, 'browser', { - cliOptions: options, - presetOptions: { ...options, corePresets: [], overridePresets: [] }, - skipPrompt: true, - }); - } - }); + initializeWhatsNew(channel, options, coreOptions); + initializeSaveFromControls(channel, options, coreOptions); return channel; }; diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls.ts new file mode 100644 index 000000000000..b6434013be4d --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls.ts @@ -0,0 +1,28 @@ +import type { CoreConfig } from '@storybook/types'; +import type { Channel } from '@storybook/channels'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; +import type { OptionsWithRequiredCache } from './whats-new'; +// import { sendTelemetryError } from '../withTelemetry'; + +interface RequestSaveStoryPayload { + // The id of the request. It might be simply the story Title + id: string; + // The path of the Story + importPath: string; + // The updated list of set args + args: Record; + // The exported name of the Story -> This information doesn't exist in the index.json yet. + name: string; +} + +export function initializeSaveFromControls( + channel: Channel, + options: OptionsWithRequiredCache, + coreOptions: CoreConfig +) { + channel.on(SAVE_STORY_REQUEST, async (data: RequestSaveStoryPayload) => { + // TODO: Implement the save story logic + + channel.emit(SAVE_STORY_RESULT, { id: data.id, success: true }); + }); +} diff --git a/code/lib/core-server/src/utils/whats-new.ts b/code/lib/core-server/src/utils/whats-new.ts new file mode 100644 index 000000000000..3392c93d201f --- /dev/null +++ b/code/lib/core-server/src/utils/whats-new.ts @@ -0,0 +1,119 @@ +import fs from 'fs-extra'; +import { logger } from '@storybook/node-logger'; +import { telemetry } from '@storybook/telemetry'; +import { findConfigFile } from '@storybook/core-common'; +import type { CoreConfig, Options } from '@storybook/types'; +import { printConfig, readConfig } from '@storybook/csf-tools'; +import fetch from 'node-fetch'; +import type { Channel } from '@storybook/channels'; +import type { WhatsNewCache, WhatsNewData } from '@storybook/core-events'; +import { + REQUEST_WHATS_NEW_DATA, + RESULT_WHATS_NEW_DATA, + TELEMETRY_ERROR, + SET_WHATS_NEW_CACHE, + TOGGLE_WHATS_NEW_NOTIFICATIONS, +} from '@storybook/core-events'; +import invariant from 'tiny-invariant'; +import { sendTelemetryError } from '../withTelemetry'; + +export type OptionsWithRequiredCache = Exclude & Required>; + +// Grabbed from the implementation: https://github.com/storybookjs/dx-functions/blob/main/netlify/functions/whats-new.ts +export type WhatsNewResponse = { + title: string; + url: string; + blogUrl?: string; + publishedAt: string; + excerpt: string; +}; + +const WHATS_NEW_CACHE = 'whats-new-cache'; +const WHATS_NEW_URL = 'https://storybook.js.org/whats-new/v1'; + +export function initializeWhatsNew( + channel: Channel, + options: OptionsWithRequiredCache, + coreOptions: CoreConfig +) { + channel.on(SET_WHATS_NEW_CACHE, async (data: WhatsNewCache) => { + const cache: WhatsNewCache = await options.cache.get(WHATS_NEW_CACHE).catch((e) => { + logger.verbose(e); + return {}; + }); + await options.cache.set(WHATS_NEW_CACHE, { ...cache, ...data }); + }); + + channel.on(REQUEST_WHATS_NEW_DATA, async () => { + try { + const post = (await fetch(WHATS_NEW_URL).then(async (response) => { + if (response.ok) return response.json(); + // eslint-disable-next-line @typescript-eslint/no-throw-literal + throw response; + })) as WhatsNewResponse; + + const configFileName = findConfigFile('main', options.configDir); + if (!configFileName) { + throw new Error(`unable to find storybook main file in ${options.configDir}`); + } + const main = await readConfig(configFileName); + const disableWhatsNewNotifications = main.getFieldValue([ + 'core', + 'disableWhatsNewNotifications', + ]); + + const cache: WhatsNewCache = (await options.cache.get(WHATS_NEW_CACHE)) ?? {}; + const data = { + ...post, + status: 'SUCCESS', + postIsRead: post.url === cache.lastReadPost, + showNotification: post.url !== cache.lastDismissedPost && post.url !== cache.lastReadPost, + disableWhatsNewNotifications, + } satisfies WhatsNewData; + channel.emit(RESULT_WHATS_NEW_DATA, { data }); + } catch (e) { + logger.verbose(e instanceof Error ? e.message : String(e)); + channel.emit(RESULT_WHATS_NEW_DATA, { + data: { status: 'ERROR' } satisfies WhatsNewData, + }); + } + }); + + channel.on( + TOGGLE_WHATS_NEW_NOTIFICATIONS, + async ({ disableWhatsNewNotifications }: { disableWhatsNewNotifications: boolean }) => { + const isTelemetryEnabled = coreOptions.disableTelemetry !== true; + try { + const mainPath = findConfigFile('main', options.configDir); + invariant(mainPath, `unable to find storybook main file in ${options.configDir}`); + const main = await readConfig(mainPath); + main.setFieldValue(['core', 'disableWhatsNewNotifications'], disableWhatsNewNotifications); + await fs.writeFile(mainPath, printConfig(main).code); + if (isTelemetryEnabled) { + await telemetry('core-config', { disableWhatsNewNotifications }); + } + } catch (error) { + invariant(error instanceof Error); + if (isTelemetryEnabled) { + await sendTelemetryError(error, 'core-config', { + cliOptions: options, + presetOptions: { ...options, corePresets: [], overridePresets: [] }, + skipPrompt: true, + }); + } + } + } + ); + + channel.on(TELEMETRY_ERROR, async (error) => { + const isTelemetryEnabled = coreOptions.disableTelemetry !== true; + + if (isTelemetryEnabled) { + await sendTelemetryError(error, 'browser', { + cliOptions: options, + presetOptions: { ...options, corePresets: [], overridePresets: [] }, + skipPrompt: true, + }); + } + }); +} From d5b573a254b68fc757c66e6f256ef643822b05f4 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 2 Apr 2024 11:19:58 +0200 Subject: [PATCH 005/180] more scaffolding --- .../src/utils/save-from-controls.ts | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls.ts index b6434013be4d..9b14ed0295dd 100644 --- a/code/lib/core-server/src/utils/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls.ts @@ -2,6 +2,7 @@ import type { CoreConfig } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; import type { OptionsWithRequiredCache } from './whats-new'; +import { readCsf, writeCsf } from '@storybook/csf-tools'; // import { sendTelemetryError } from '../withTelemetry'; interface RequestSaveStoryPayload { @@ -21,8 +22,32 @@ export function initializeSaveFromControls( coreOptions: CoreConfig ) { channel.on(SAVE_STORY_REQUEST, async (data: RequestSaveStoryPayload) => { - // TODO: Implement the save story logic + try { + // open the story file + const csf = await readCsf(data.importPath, { makeTitle: () => data.name }); + const parsed = csf.parse(); - channel.emit(SAVE_STORY_RESULT, { id: data.id, success: true }); + // find the AST node for the story + const found = !!parsed.stories.find((s) => s.id === data.id); + let node = csf.getStoryExport(data.id); + + // if none can be found, create one + if (!found) { + // @ts-expect-error (TODO) + node = undefined; + throw new Error(`creation of new story: not yet implemented`); + } + + // modify the AST node with the new args + // node + + // save the file + await writeCsf(csf); + + channel.emit(SAVE_STORY_RESULT, { id: data.id, success: true }); + } catch (e) { + // sendTelemetryError(channel, e); + channel.emit(SAVE_STORY_RESULT, { id: data.id, success: false }); + } }); } From 06d3ab8764d932a995725d1b89a308571dd607f9 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 12:24:59 +0200 Subject: [PATCH 006/180] Fix bar height --- code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index f8ce7e1ed88f..3a3e71f8bca6 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -7,16 +7,15 @@ const Bar = styled(BaseBar)(({ theme }) => ({ position: 'sticky', bottom: 0, display: 'flex', - flexWrap: 'wrap', alignItems: 'center', justifyContent: 'space-between', + height: 39, gap: 6, padding: '6px 10px', fontSize: theme.typography.size.s2, containerType: 'size', background: theme.background.bar, - borderTop: `1px solid ${theme.color.border}`, - overflow: 'visible', + borderTop: `1px solid ${theme.appBorderColor}`, })); const Content = styled.div({ From ebd07b44eff19e25f295b83e9309798fa46f5b8a Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 12:28:07 +0200 Subject: [PATCH 007/180] Implement new story form --- .../ArgsTable/SaveFromControls.stories.tsx | 28 +++- .../components/ArgsTable/SaveFromControls.tsx | 157 +++++++++++++----- 2 files changed, 142 insertions(+), 43 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx index bb8fdf558f70..37acbec5ff70 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx @@ -2,14 +2,15 @@ import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; import { SaveFromControls } from './SaveFromControls'; +import { expect, fn, userEvent, within } from '@storybook/test'; const meta = { component: SaveFromControls, title: 'Components/ArgsTable/SaveFromControls', args: { - saveStory: action('saveStory'), - createStory: action('createStory'), - resetArgs: action('resetArgs'), + saveStory: fn(action('saveStory')), + createStory: fn(action('createStory')), + resetArgs: fn(action('resetArgs')), }, parameters: { layout: 'fullscreen', @@ -20,3 +21,24 @@ export default meta; type Story = StoryObj; export const Default: Story = {}; + +export const Creating: Story = { + play: async ({ canvasElement }) => { + const createButton = await within(canvasElement).findByRole('button', { name: /create/i }); + await userEvent.click(createButton); + }, +}; + +export const Created: Story = { + play: async (context) => { + await Creating.play(context); + const { canvasElement, args } = context; + + const input = await within(canvasElement).findByRole('textbox'); + await userEvent.type(input, 'MyNewStory'); + const submitButton = await within(canvasElement).findByRole('button', { name: /save/i }); + await userEvent.click(submitButton); + + await expect(args.createStory).toHaveBeenCalledWith('MyNewStory'); + }, +}; diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index 3a3e71f8bca6..ca5e932a9a21 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -1,5 +1,5 @@ -import { Bar as BaseBar, IconButton, TooltipNote, WithTooltip } from '@storybook/components'; -import { AddIcon, BookmarkHollowIcon, InfoIcon, UndoIcon } from '@storybook/icons'; +import { Bar as BaseBar, IconButton, TooltipNote, WithTooltip, Form } from '@storybook/components'; +import { AddIcon, CheckIcon, UndoIcon } from '@storybook/icons'; import { styled } from '@storybook/theming'; import React from 'react'; @@ -37,6 +37,26 @@ const Content = styled.div({ }, }); +const InlineForm = styled(Form)({ + display: 'flex', + alignItems: 'center', + gap: 2, + width: 'auto', +}); + +const InlineInput = styled(Form.Input)(({ theme }) => ({ + height: 28, + minHeight: 28, + marginRight: 4, + + '::placeholder': { + color: theme.color.mediumdark, + }, + '&:invalid:not(:placeholder-shown)': { + boxShadow: `${theme.color.negative} 0 0 0 1px inset`, + }, +})); + const Actions = styled.div(({ theme }) => ({ display: 'flex', alignItems: 'center', @@ -56,59 +76,116 @@ const ActionButton = styled(IconButton)({ type SaveFromControlsProps = { saveStory: () => void; - createStory: () => void; + createStory: (storyName: string) => void; resetArgs: () => void; }; export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFromControlsProps) => { + const inputRef = React.useRef(null); + const [saving, setSaving] = React.useState(false); + const [creating, setCreating] = React.useState(false); + const [storyName, setStoryName] = React.useState(''); + + const onSaveStory = () => { + setSaving(true); + saveStory(); + setTimeout(() => setSaving(false), 1000); + }; + + const onShowForm = () => { + setCreating(true); + setStoryName(''); + setTimeout(() => inputRef.current?.focus(), 0); + }; + const onChange = (e: React.ChangeEvent) => { + const value = e.target.value + .replace(/[^a-z-_ ]/gi, '') + .replaceAll(/([-_ ]+[a-z])/gi, (match) => match.toUpperCase().replace(/[-_ ]/g, '')); + setStoryName(value.charAt(0).toUpperCase() + value.slice(1)); + }; + const onSubmitForm = (e: React.FormEvent) => { + e.preventDefault(); + if (saving) return; + setSaving(true); + createStory(storyName.replaceAll(/[^a-z]/gi, '')); + setTimeout(() => { + setSaving(false); + setCreating(false); + }, 1000); + }; + const onCancelForm = () => { + setCreating(false); + }; + return ( - Unsaved changes You modified this story. Do you want to save your changes? - - } - > - saveStory()}> - - Save - - - - } - > + {creating ? ( + + createStory()} + aria-label="Save story to file system" + disabled={saving || !storyName} + type="submit" > - - Create new story + Save - - - } - > - resetArgs()}> - - Reset + + Cancel - - + + ) : ( + + } + > + + + Update story + + + + } + > + + + Create new story + + + + } + > + resetArgs()}> + + Reset + + + + )} ); }; From fd7fd6b5f48eeb87af2b62245111a33756cc6cca Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 14:40:51 +0200 Subject: [PATCH 008/180] Fix bar position when there's extra vertical space --- .../src/components/ArgsTable/ArgsTable.tsx | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx index 71ace3f8a966..8febbe3aa20a 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx @@ -17,9 +17,12 @@ import { Skeleton } from './Skeleton'; import { Empty } from './Empty'; import { SaveFromControls } from './SaveFromControls'; -const ContentWrapper = styled(ResetWrapper)({ +const AddonWrapper = styled.div({ + display: 'grid', + gridTemplateRows: '1fr 39px', + height: '100%', maxHeight: '100vh', - overflow: 'auto', + overflowY: 'auto', }); export const TableWrapper = styled.table<{ @@ -361,8 +364,8 @@ export const ArgsTable: FC = (props) => { const common = { updateArgs, compact, inAddonPanel, initialExpandedArgs }; - return ( - + const table = ( + @@ -439,10 +442,15 @@ export const ArgsTable: FC = (props) => { ))} + + ); - {inAddonPanel && ( - {}} createStory={() => {}} resetArgs={resetArgs} /> - )} - + if (!inAddonPanel) return table; + + return ( + + {table} + {}} createStory={() => {}} resetArgs={resetArgs} /> + ); }; From 4b8f2dda4845a07b27afe6957f5d50b03b3f6a99 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 16:05:04 +0200 Subject: [PATCH 009/180] Add slideIn animation and improve short label display --- .../src/components/ArgsTable/ArgsTable.tsx | 3 + .../components/ArgsTable/SaveFromControls.tsx | 69 +++++++++---------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx index 8febbe3aa20a..4377a28bf503 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx @@ -447,6 +447,9 @@ export const ArgsTable: FC = (props) => { if (!inAddonPanel) return table; + const hasControls = Object.values(rows).some((row) => row?.control); + if (!hasControls) return table; + return ( {table} diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index ca5e932a9a21..fb2e009f7357 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -1,8 +1,13 @@ import { Bar as BaseBar, IconButton, TooltipNote, WithTooltip, Form } from '@storybook/components'; import { AddIcon, CheckIcon, UndoIcon } from '@storybook/icons'; -import { styled } from '@storybook/theming'; +import { keyframes, styled } from '@storybook/theming'; import React from 'react'; +const slideIn = keyframes({ + from: { transform: 'translateY(40px)' }, + to: { transform: 'translateY(0)' }, +}); + const Bar = styled(BaseBar)(({ theme }) => ({ position: 'sticky', bottom: 0, @@ -16,6 +21,7 @@ const Bar = styled(BaseBar)(({ theme }) => ({ containerType: 'size', background: theme.background.bar, borderTop: `1px solid ${theme.appBorderColor}`, + animation: `${slideIn} 300ms forwards`, })); const Content = styled.div({ @@ -23,16 +29,17 @@ const Content = styled.div({ alignItems: 'center', marginLeft: 10, gap: 6, +}); - 'span:last-of-type': { - display: 'none', - }, - '@container (min-width: 800px)': { - 'span:first-of-type': { - display: 'none', - }, - 'span:last-of-type': { - display: 'inline', +const Label = styled.div({ + '@container (max-width: 799px)': { + lineHeight: 0, + textIndent: '-9999px', + '&::after': { + content: 'attr(data-short-label)', + display: 'block', + lineHeight: 'initial', + textIndent: '0', }, }, }); @@ -65,15 +72,6 @@ const Actions = styled.div(({ theme }) => ({ fontSize: theme.typography.size.s2, })); -const ActionButton = styled(IconButton)({ - span: { - display: 'none', - '@container (min-width: 800px)': { - display: 'inline', - }, - }, -}); - type SaveFromControlsProps = { saveStory: () => void; createStory: (storyName: string) => void; @@ -120,8 +118,9 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom return ( - Unsaved changes - You modified this story. Do you want to save your changes? + {creating ? ( @@ -132,16 +131,16 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom ref={inputRef} value={storyName} /> - Save - - + + Cancel - + ) : ( @@ -151,14 +150,10 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom trigger="hover" tooltip={} > - + - Update story - + + } > - + - Create new story - + + } > - resetArgs()}> + resetArgs()}> Reset - + )} From ba76685265416856d320632e2c016df4136dfacc Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 2 Apr 2024 16:21:30 +0200 Subject: [PATCH 010/180] Avoid scrollbar while animating --- .../components/ArgsTable/SaveFromControls.tsx | 148 ++++++++++-------- 1 file changed, 79 insertions(+), 69 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index fb2e009f7357..3e7abf5b4ab7 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -8,20 +8,24 @@ const slideIn = keyframes({ to: { transform: 'translateY(0)' }, }); -const Bar = styled(BaseBar)(({ theme }) => ({ +const Container = styled.div({ + containerType: 'size', position: 'sticky', bottom: 0, + height: 39, + overflow: 'hidden', +}); + +const Bar = styled(BaseBar)(({ theme }) => ({ display: 'flex', alignItems: 'center', justifyContent: 'space-between', - height: 39, gap: 6, padding: '6px 10px', - fontSize: theme.typography.size.s2, - containerType: 'size', + animation: `${slideIn} 300ms forwards`, background: theme.background.bar, borderTop: `1px solid ${theme.appBorderColor}`, - animation: `${slideIn} 300ms forwards`, + fontSize: theme.typography.size.s2, })); const Content = styled.div({ @@ -116,71 +120,77 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom }; return ( - - - - - - {creating ? ( - - - - Save - - - Cancel - - - ) : ( - - } - > - - - - - - - } - > - - - + + + + + + + {creating ? ( + + + + Save - - - } - > - resetArgs()}> - - Reset + + Cancel - - - )} - + + ) : ( + + } + > + + + + + + + } + > + + + + + + + } + > + resetArgs()}> + + Reset + + + + )} + + ); }; From 0414d507f21596ca26dc0b88d7640a3d91401764 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 9 Apr 2024 13:50:40 +0200 Subject: [PATCH 011/180] Move Modal component from addon-onboarding to @storybook/components, refactor its API for simplicity and use it for SaveFromControls --- .../src/components/Modal/Modal.styled.tsx | 50 --- .../features/WelcomeModal/WelcomeModal.tsx | 48 ++- .../WriteStoriesModal/WriteStoriesModal.tsx | 368 +++++++++--------- .../ArgsTable/SaveFromControls.stories.tsx | 20 +- .../components/ArgsTable/SaveFromControls.tsx | 151 ++++--- code/ui/components/package.json | 1 + .../src/components/Modal/Modal.stories.tsx | 68 ++-- .../src/components/Modal/Modal.styled.tsx | 105 +++++ .../src/components/Modal/Modal.tsx | 31 +- code/ui/components/src/index.ts | 1 + code/ui/manager/src/globals/exports.ts | 1 + code/yarn.lock | 1 + 12 files changed, 458 insertions(+), 387 deletions(-) delete mode 100644 code/addons/onboarding/src/components/Modal/Modal.styled.tsx rename code/{addons/onboarding => ui/components}/src/components/Modal/Modal.stories.tsx (64%) create mode 100644 code/ui/components/src/components/Modal/Modal.styled.tsx rename code/{addons/onboarding => ui/components}/src/components/Modal/Modal.tsx (60%) diff --git a/code/addons/onboarding/src/components/Modal/Modal.styled.tsx b/code/addons/onboarding/src/components/Modal/Modal.styled.tsx deleted file mode 100644 index 42cf6537dd36..000000000000 --- a/code/addons/onboarding/src/components/Modal/Modal.styled.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { css, styled } from '@storybook/theming'; -import * as Dialog from '@radix-ui/react-dialog'; -import React from 'react'; - -export const StyledOverlay = styled.div` - background-color: rgba(27, 28, 29, 0.48); - position: fixed; - inset: 0px; - width: 100%; - height: 100%; - z-index: 10; -`; - -export const StyledContent = styled.div<{ - width: number; - height: number; -}>( - ({ width, height }) => css` - background-color: white; - border-radius: 6px; - box-shadow: rgba(14, 18, 22, 0.35) 0px 10px 38px -10px; - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: ${width ?? 740}px; - height: ${height ? `${height}px` : 'auto'}; - max-width: calc(100% - 40px); - max-height: 85vh; - overflow: hidden; - z-index: 11; - - &:focus-visible { - outline: none; - } - ` -); - -export const ContentWrapper = React.forwardRef< - HTMLDivElement, - React.ComponentProps & React.ComponentProps ->(function ContentWrapper({ width, height, children, ...contentProps }, ref) { - return ( - - - {children} - - - ); -}); diff --git a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx index 9459529970e9..c971eecfa22f 100644 --- a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx +++ b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx @@ -1,8 +1,8 @@ +import { Modal } from '@storybook/components'; import type { FC } from 'react'; import React from 'react'; import { Button } from '../../components/Button/Button'; -import { Modal } from '../../components/Modal/Modal'; import { StorybookLogo } from './StorybookLogo'; import { ModalContentWrapper, @@ -26,30 +26,28 @@ export const WelcomeModal: FC = ({ onProceed, skipOnboarding return (
- {({ Close }) => ( - - - - Welcome to Storybook - - Storybook helps you develop UI components faster. Learn the basics in a few simple - steps. - - - - - Skip tour - - - - - - - - - )} + + + + Welcome to Storybook + + Storybook helps you develop UI components faster. Learn the basics in a few simple + steps. + + + + + Skip tour + + + + + + + +
); diff --git a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx index b456b02240c9..7bfb4ea3a2e9 100644 --- a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx +++ b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx @@ -1,6 +1,4 @@ import React, { useCallback, useState, type FC } from 'react'; -import { Button } from '../../components/Button/Button'; -import { Modal } from '../../components/Modal/Modal'; import useMeasure from 'react-use-measure'; import { Background, @@ -17,6 +15,7 @@ import { SpanHighlight, Step2Text, } from './WriteStoriesModal.styled'; +import { Button } from '../../components/Button/Button'; import { SyntaxHighlighter } from '../../components/SyntaxHighlighter/SyntaxHighlighter'; import { List } from '../../components/List/List'; import { ListItem } from '../../components/List/ListItem/ListItem'; @@ -31,6 +30,7 @@ import { STORYBOOK_ADDON_ONBOARDING_CHANNEL } from '../../constants'; import { useTheme } from '@storybook/theming'; import type { CodeSnippets } from './code/types'; import { BookmarkHollowIcon, CrossIcon } from '@storybook/icons'; +import { Modal } from '@storybook/components'; // TODO: Add warning if backdropBoundary && !warningButtonStatus?.data is not true. // backdropBoundary && !warningButtonStatus?.data @@ -92,200 +92,198 @@ export const WriteStoriesModal: FC = ({ return ( - {({ Title, Description, Close }) => ( - - {codeSnippets ? ( - - ) : null} - {step === 'customStory' && backdropBoundary && !warningButtonStatus?.data && ( - - )} -
-
- - <ModalTitle> - <BookmarkHollowIcon width={13} /> - <span>How to write a story</span> - </ModalTitle> - - - - -
- - - {step === 'imports' && ( - <> -
-

Imports

- {isJavascript ? ( -

Import a component. In this case, the Button component.

- ) : ( - <> -

- First, import Meta and{' '} - StoryObj for type safety and - autocompletion in TypeScript stories. -

-

Next, import a component. In this case, the Button component.

- - )} -
- + )} +
+
+ + + + How to write a story + + + + + +
+ + + {step === 'imports' && ( + <> +
+

Imports

+ {isJavascript ? ( +

Import a component. In this case, the Button component.

+ ) : ( + <> +

+ First, import Meta and{' '} + StoryObj for type safety and autocompletion + in TypeScript stories. +

+

Next, import a component. In this case, the Button component.

+ + )} +
+ + + )} + {step === 'meta' && ( + <> +
+

Meta

+

+ The default export, Meta, contains metadata about this component's stories. + The title field (optional) controls where stories appear in the sidebar. +

+ Title property pointing to Storybook's sidebar +
+ + - - )} - {step === 'meta' && ( - <> -
-

Meta

-

- The default export, Meta, contains metadata about this component's stories. - The title field (optional) controls where stories appear in the sidebar. -

- Title property pointing to Storybook's sidebar -
- - - - - - )} - {step === 'story' && ( - <> -
-

Story

-

- Each named export is a story. Its contents specify how the story is rendered - in addition to other configuration options. -

- Story export pointing to the sidebar entry of the story -
- - - - - - )} - {step === 'args' && ( + +
+ + )} + {step === 'story' && ( + <> +
+

Story

+

+ Each named export is a story. Its contents specify how the story is rendered + in addition to other configuration options. +

+ Story export pointing to the sidebar entry of the story +
+ + + + + + )} + {step === 'args' && ( + <> +
+

Args

+

+ Args are inputs that are passed to the component, which Storybook uses to + render the component in different states. In React, args = props. They also + specify the initial control values for the story. +

+ Args mapped to their controls in Storybook +
+ + + + + + )} + {step === 'customStory' && + (!warningButtonStatus?.error ? ( <>
-

Args

+

Create your first story

- Args are inputs that are passed to the component, which Storybook uses to - render the component in different states. In React, args = props. They also - specify the initial control values for the story. + Now it's your turn. See how easy it is to create your first story by + following these steps below.

- Args mapped to their controls in Storybook + + + Copy the Warning story. + + + + Open the Button story in your current working directory. + + {buttonPath?.data && ( + // Replace '/' by '/' to properly break line + + {buttonPath.data.replaceAll('/', '/​').replaceAll('\\', '\\​')} + + )} + + + Paste it at the bottom of the file and save. + +
- - + {warningButtonStatus?.data ? ( + + ) : null} - )} - {step === 'customStory' && - (!warningButtonStatus?.error ? ( - <> -
-

Create your first story

-

- Now it's your turn. See how easy it is to create your first story by - following these steps below. -

- - - Copy the Warning story. - - - - Open the Button story in your current working directory. - - {buttonPath?.data && ( - // Replace '/' by '/' to properly break line - - {buttonPath.data.replaceAll('/', '/​').replaceAll('\\', '\\​')} - - )} - - - Paste it at the bottom of the file and save. - - -
- - - {warningButtonStatus?.data ? ( - - ) : null} - - - ) : null)} -
- - - - - - -
- - )} + ) : null)} +
+ + + + + + +
+
); }; diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx index 37acbec5ff70..39204f2d2488 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; import { SaveFromControls } from './SaveFromControls'; -import { expect, fn, userEvent, within } from '@storybook/test'; +import { expect, fireEvent, fn, userEvent, waitFor, within } from '@storybook/test'; const meta = { component: SaveFromControls, @@ -24,21 +24,23 @@ export const Default: Story = {}; export const Creating: Story = { play: async ({ canvasElement }) => { - const createButton = await within(canvasElement).findByRole('button', { name: /create/i }); - await userEvent.click(createButton); + const createButton = await within(canvasElement).findByRole('button', { name: /Create/i }); + await fireEvent.click(createButton); }, }; export const Created: Story = { play: async (context) => { await Creating.play(context); - const { canvasElement, args } = context; - const input = await within(canvasElement).findByRole('textbox'); - await userEvent.type(input, 'MyNewStory'); - const submitButton = await within(canvasElement).findByRole('button', { name: /save/i }); - await userEvent.click(submitButton); + await waitFor(async () => { + const dialog = await within(document.body).findByRole('dialog'); + const input = await within(dialog).findByRole('textbox'); + await userEvent.type(input, 'MyNewStory'); + const submitButton = await within(dialog).findByRole('button', { name: /Create/i }); + await userEvent.click(submitButton); + }); - await expect(args.createStory).toHaveBeenCalledWith('MyNewStory'); + await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); }, }; diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index 3e7abf5b4ab7..5332ff7632f9 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -1,4 +1,12 @@ -import { Bar as BaseBar, IconButton, TooltipNote, WithTooltip, Form } from '@storybook/components'; +import { + Bar as BaseBar, + Button, + Form, + IconButton, + Modal, + TooltipNote, + WithTooltip, +} from '@storybook/components'; import { AddIcon, CheckIcon, UndoIcon } from '@storybook/icons'; import { keyframes, styled } from '@storybook/theming'; import React from 'react'; @@ -48,18 +56,7 @@ const Label = styled.div({ }, }); -const InlineForm = styled(Form)({ - display: 'flex', - alignItems: 'center', - gap: 2, - width: 'auto', -}); - -const InlineInput = styled(Form.Input)(({ theme }) => ({ - height: 28, - minHeight: 28, - marginRight: 4, - +const ModalInput = styled(Form.Input)(({ theme }) => ({ '::placeholder': { color: theme.color.mediumdark, }, @@ -115,9 +112,6 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom setCreating(false); }, 1000); }; - const onCancelForm = () => { - setCreating(false); - }; return ( @@ -128,68 +122,73 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom - {creating ? ( - - - - Save + + } + > + + + + + + + } + > + + + - - Cancel + + + } + > + resetArgs()}> + + Reset - - ) : ( - - } - > - - - - - - - } - > - - - - - - - } - > - resetArgs()}> - - Reset - - - - )} + + + + +
+ + + Create new story + + This will add a new story to your existing stories file. + + + + + + + + + + +
+
); diff --git a/code/ui/components/package.json b/code/ui/components/package.json index 7fecbf93625a..d42b97f87749 100644 --- a/code/ui/components/package.json +++ b/code/ui/components/package.json @@ -59,6 +59,7 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-slot": "^1.0.2", "@storybook/client-logger": "workspace:*", "@storybook/csf": "^0.1.2", diff --git a/code/addons/onboarding/src/components/Modal/Modal.stories.tsx b/code/ui/components/src/components/Modal/Modal.stories.tsx similarity index 64% rename from code/addons/onboarding/src/components/Modal/Modal.stories.tsx rename to code/ui/components/src/components/Modal/Modal.stories.tsx index 527aa87d4323..0c2add0dbe2e 100644 --- a/code/addons/onboarding/src/components/Modal/Modal.stories.tsx +++ b/code/ui/components/src/components/Modal/Modal.stories.tsx @@ -3,6 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { userEvent, within, expect } from '@storybook/test'; import { Modal } from './Modal'; +import { Button } from '../Button/Button'; const meta: Meta = { component: Modal, @@ -24,12 +25,10 @@ export const Default: Story = { return ( <> - {({ Close }) => ( -
-
Hello world!
- setOpen(false)}>Close -
- )} +
+
Hello world!
+ setOpen(false)}>Close +
@@ -54,12 +53,10 @@ export const FixedWidth: Story = { return ( <> - {({ Close }) => ( -
-
Hello world!
- setOpen(false)}>Close -
- )} +
+
Hello world!
+ setOpen(false)}>Close +
@@ -84,12 +81,10 @@ export const FixedHeight: Story = { return ( <> - {({ Close }) => ( -
-
Hello world!
- setOpen(false)}>Close -
- )} +
+
Hello world!
+ setOpen(false)}>Close +
@@ -115,12 +110,10 @@ export const FixedWidthAndHeight: Story = { return ( <> - {({ Close }) => ( -
-
Hello world!
- setOpen(false)}>Close -
- )} +
+
Hello world!
+ setOpen(false)}>Close +
@@ -133,3 +126,30 @@ export const FixedWidthAndHeight: Story = { await expect(canvas.findByText('Hello world!')).resolves.toBeInTheDocument(); }, }; + +export const StyledComponents = { + render: () => ( + + + + Hello + Lorem ipsum dolor sit amet. + + + + One + Two + + Right + + Another section + + + + + + + + + ), +}; diff --git a/code/ui/components/src/components/Modal/Modal.styled.tsx b/code/ui/components/src/components/Modal/Modal.styled.tsx new file mode 100644 index 000000000000..9a4c53e8cb22 --- /dev/null +++ b/code/ui/components/src/components/Modal/Modal.styled.tsx @@ -0,0 +1,105 @@ +import { keyframes, styled } from '@storybook/theming'; +import * as Dialog from '@radix-ui/react-dialog'; +import React from 'react'; + +import { IconButton } from '../IconButton/IconButton'; +import { CrossIcon } from '@storybook/icons'; + +const fadeIn = keyframes({ + from: { opacity: 0 }, + to: { opacity: 1 }, +}); + +const zoomIn = keyframes({ + from: { + opacity: 0, + transform: 'translate(-50%, -50%) scale(0.9)', + }, + to: { + opacity: 1, + transform: 'translate(-50%, -50%) scale(1)', + }, +}); + +export const Overlay = styled.div({ + backgroundColor: 'rgba(27, 28, 29, 0.2)', + position: 'fixed', + inset: 0, + width: '100%', + height: '100%', + zIndex: 10, + animation: `${fadeIn} 200ms forwards`, +}); + +export const Container = styled.div<{ width?: number; height?: number }>(({ width, height }) => ({ + backgroundColor: 'white', + borderRadius: 6, + boxShadow: 'rgba(14, 18, 22, 0.35) 0px 10px 38px -10px', + position: 'fixed', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: width ?? 740, + height: height ?? 'auto', + maxWidth: 'calc(100% - 40px)', + maxHeight: '85vh', + overflow: 'hidden', + zIndex: 11, + animation: `${zoomIn} 200ms forwards`, + + '&:focus-visible': { + outline: 'none', + }, +})); + +export const CloseButton = (props: React.ComponentProps) => ( + + + + + +); + +export const Content = styled.div({ + display: 'flex', + flexDirection: 'column', + margin: 16, + gap: 16, +}); + +export const Row = styled.div({ + display: 'flex', + justifyContent: 'space-between', + gap: 16, +}); + +export const Col = styled.div({ + display: 'flex', + flexDirection: 'column', + gap: 4, +}); + +export const Header = (props: React.ComponentProps) => ( + + + + +); + +export const Title = styled(Dialog.Title)(({ theme }) => ({ + margin: 0, + fontSize: theme.typography.size.s3, + fontWeight: theme.typography.weight.bold, +})); + +export const Description = styled(Dialog.Description)(({ theme }) => ({ + margin: 0, + fontSize: theme.typography.size.s2, + color: theme.color.mediumdark, +})); + +export const Actions = styled.div({ + display: 'flex', + flexDirection: 'row-reverse', + gap: 8, +}); diff --git a/code/addons/onboarding/src/components/Modal/Modal.tsx b/code/ui/components/src/components/Modal/Modal.tsx similarity index 60% rename from code/addons/onboarding/src/components/Modal/Modal.tsx rename to code/ui/components/src/components/Modal/Modal.tsx index 4c8bd9bec66d..ab9b59a27693 100644 --- a/code/addons/onboarding/src/components/Modal/Modal.tsx +++ b/code/ui/components/src/components/Modal/Modal.tsx @@ -1,17 +1,13 @@ import React from 'react'; import * as Dialog from '@radix-ui/react-dialog'; -import { ContentWrapper, StyledOverlay } from './Modal.styled'; +import * as Components from './Modal.styled'; -type ContentProps = React.ComponentProps; +type ContentProps = React.ComponentProps; interface ModalProps extends Omit, 'children'> { width?: number; height?: number; - children: (props: { - Title: typeof Dialog.Title; - Description: typeof Dialog.Description; - Close: typeof Dialog.Close; - }) => React.ReactNode; + children: React.ReactNode; onEscapeKeyDown?: ContentProps['onEscapeKeyDown']; onInteractOutside?: ContentProps['onInteractOutside']; } @@ -20,7 +16,7 @@ export const initial = { opacity: 0 }; export const animate = { opacity: 1, transition: { duration: 0.3 } }; export const exit = { opacity: 0, transition: { duration: 0.3 } }; -export function Modal({ +function BaseModal({ children, width, height, @@ -32,21 +28,20 @@ export function Modal({ - + - - {children({ - Title: Dialog.Title, - Description: Dialog.Description, - Close: Dialog.Close, - })} - + + {children} + + ); } + +export const Modal = Object.assign(BaseModal, Components, { Dialog }); diff --git a/code/ui/components/src/index.ts b/code/ui/components/src/index.ts index ffe4a08d699f..372a684c315d 100644 --- a/code/ui/components/src/index.ts +++ b/code/ui/components/src/index.ts @@ -42,6 +42,7 @@ export { createCopyToClipboardFunction } from './components/syntaxhighlighter/sy // UI export { ActionBar } from './components/ActionBar/ActionBar'; +export { Modal } from './components/Modal/Modal'; export { Spaced } from './components/spaced/Spaced'; export { Placeholder } from './components/placeholder/placeholder'; export { ScrollArea } from './components/ScrollArea/ScrollArea'; diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 73881b9b5919..ecc5c47ede3f 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -86,6 +86,7 @@ export default { 'Link', 'ListItem', 'Loader', + 'Modal', 'OL', 'P', 'Placeholder', diff --git a/code/yarn.lock b/code/yarn.lock index 472dd503b241..8ede4c413982 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -5479,6 +5479,7 @@ __metadata: resolution: "@storybook/components@workspace:ui/components" dependencies: "@popperjs/core": "npm:^2.6.0" + "@radix-ui/react-dialog": "npm:^1.0.5" "@radix-ui/react-scroll-area": "npm:^1.0.5" "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" From 68de9efc86541b75dc337195641e2ae30aaba8da Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 9 Apr 2024 17:10:05 +0200 Subject: [PATCH 012/180] No need for 'forwards' modifier --- code/ui/components/src/components/Modal/Modal.styled.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.styled.tsx b/code/ui/components/src/components/Modal/Modal.styled.tsx index 9a4c53e8cb22..c62722265399 100644 --- a/code/ui/components/src/components/Modal/Modal.styled.tsx +++ b/code/ui/components/src/components/Modal/Modal.styled.tsx @@ -28,7 +28,7 @@ export const Overlay = styled.div({ width: '100%', height: '100%', zIndex: 10, - animation: `${fadeIn} 200ms forwards`, + animation: `${fadeIn} 200ms`, }); export const Container = styled.div<{ width?: number; height?: number }>(({ width, height }) => ({ @@ -45,7 +45,7 @@ export const Container = styled.div<{ width?: number; height?: number }>(({ widt maxHeight: '85vh', overflow: 'hidden', zIndex: 11, - animation: `${zoomIn} 200ms forwards`, + animation: `${zoomIn} 200ms`, '&:focus-visible': { outline: 'none', From 9fbf59b4d22bae9c76c2a3f0603a4689619522e4 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 09:58:26 +0200 Subject: [PATCH 013/180] find the AST node successfully --- .../lib/core-server/src/utils/get-story-id.ts | 44 ++++++++++++++++++ .../src/utils/save-from-controls.ts | 38 +++++++++++---- code/ui/.storybook/manager.tsx | 46 ++++++++++++++++++- code/ui/manager/src/globals/exports.ts | 2 + 4 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 code/lib/core-server/src/utils/get-story-id.ts diff --git a/code/lib/core-server/src/utils/get-story-id.ts b/code/lib/core-server/src/utils/get-story-id.ts new file mode 100644 index 000000000000..299a9eadaaf5 --- /dev/null +++ b/code/lib/core-server/src/utils/get-story-id.ts @@ -0,0 +1,44 @@ +import type { Options } from '@storybook/types'; +import dedent from 'ts-dedent'; +import { normalizeStories, normalizeStoryPath } from '@storybook/core-common'; +import path from 'path'; +import { storyNameFromExport, toId } from '@storybook/csf'; +import slash from 'slash'; +import { userOrAutoTitleFromSpecifier } from '@storybook/preview-api'; + +interface Data { + storyFilePath: string; + exportedStoryName: string; +} + +export async function getStoryId(data: Data, options: Options) { + const stories = await options.presets.apply('stories', [], options); + + const workingDir = process.cwd(); + + const normalizedStories = normalizeStories(stories, { + configDir: options.configDir, + workingDir, + }); + + const relativePath = path.relative(workingDir, data.storyFilePath); + const importPath = slash(normalizeStoryPath(relativePath)); + + const autoTitle = normalizedStories + .map((normalizeStory) => userOrAutoTitleFromSpecifier(importPath, normalizeStory)) + .filter(Boolean)[0]; + + if (autoTitle === undefined) { + // eslint-disable-next-line local-rules/no-uncategorized-errors + throw new Error(dedent` + The generation of your new Story file was successful! But it seems that we are unable to index it. + Please make sure that the new Story file is matched by the 'stories' glob pattern in your Storybook configuration. + The location of the new Story file is: ${relativePath} + `); + } + + const storyName = storyNameFromExport(data.exportedStoryName); + const storyId = toId(autoTitle as string, storyName); + + return storyId; +} diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls.ts index 9b14ed0295dd..2ebeea309fbe 100644 --- a/code/lib/core-server/src/utils/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls.ts @@ -1,8 +1,10 @@ +/* eslint-disable no-underscore-dangle */ import type { CoreConfig } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; import type { OptionsWithRequiredCache } from './whats-new'; import { readCsf, writeCsf } from '@storybook/csf-tools'; +import { join } from 'path'; // import { sendTelemetryError } from '../withTelemetry'; interface RequestSaveStoryPayload { @@ -13,7 +15,7 @@ interface RequestSaveStoryPayload { // The updated list of set args args: Record; // The exported name of the Story -> This information doesn't exist in the index.json yet. - name: string; + name?: string; } export function initializeSaveFromControls( @@ -22,32 +24,50 @@ export function initializeSaveFromControls( coreOptions: CoreConfig ) { channel.on(SAVE_STORY_REQUEST, async (data: RequestSaveStoryPayload) => { + console.log('SAVE_STORY_REQUEST', data); + const id = data.id.split('--')[1]; try { + const location = join(process.cwd(), data.importPath); + console.log({ location }); // open the story file - const csf = await readCsf(data.importPath, { makeTitle: () => data.name }); + const csf = await readCsf(location, { + makeTitle: (userTitle: string) => userTitle, + }); + const parsed = csf.parse(); + // console.log(parsed._stories); // find the AST node for the story - const found = !!parsed.stories.find((s) => s.id === data.id); - let node = csf.getStoryExport(data.id); + + const [name, result] = + Object.entries(parsed._stories).find(([key, value]) => value.id.endsWith(`--${id}`)) || []; + + console.log({ name, result }); + let node; // if none can be found, create one - if (!found) { - // @ts-expect-error (TODO) + if (!name) { node = undefined; throw new Error(`creation of new story: not yet implemented`); + } else { + node = csf.getStoryExport(name); } // modify the AST node with the new args // node + console.log({ node }); // save the file - await writeCsf(csf); + await writeCsf(csf, location); channel.emit(SAVE_STORY_RESULT, { id: data.id, success: true }); - } catch (e) { + } catch (e: any) { // sendTelemetryError(channel, e); - channel.emit(SAVE_STORY_RESULT, { id: data.id, success: false }); + channel.emit(SAVE_STORY_RESULT, { + id: data.id, + success: false, + error: e.stack || e.message || e.toString(), + }); } }); } diff --git a/code/ui/.storybook/manager.tsx b/code/ui/.storybook/manager.tsx index 7cdbda8d32e9..49962eefa8d1 100644 --- a/code/ui/.storybook/manager.tsx +++ b/code/ui/.storybook/manager.tsx @@ -1,9 +1,53 @@ import React from 'react'; -import { addons, types } from '@storybook/manager-api'; +import { addons, types, useArgs } from '@storybook/manager-api'; import startCase from 'lodash/startCase.js'; +import { add } from 'lodash'; +import { SAVE_STORY_REQUEST } from '@storybook/core-events'; +import { satisfies } from 'semver'; addons.setConfig({ sidebar: { renderLabel: ({ name, type }) => (type === 'story' ? name : startCase(name)), }, }); + +interface RequestSaveStoryPayload { + // The id of the request. It might be simply the story Title + id: string; + // The path of the Story + importPath: string; + // The updated list of set args + args: Record; + // The exported name of the Story -> This information doesn't exist in the index.json yet. + name: string; +} + +addons.register('my-addon', (api) => { + addons.add('my-addon/panel', { + type: types.PANEL, + title: 'My Addon', + render: ({ active }) => { + const [args] = useArgs(); + + return active ? ( +
+ +
+ ) : null; + }, + }); +}); diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 73881b9b5919..124d0a0cd64e 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -148,6 +148,8 @@ export default { 'REQUEST_WHATS_NEW_DATA', 'RESET_STORY_ARGS', 'RESULT_WHATS_NEW_DATA', + 'SAVE_STORY_REQUEST', + 'SAVE_STORY_RESULT', 'SELECT_STORY', 'SET_CONFIG', 'SET_CURRENT_STORY', From 9c8864ec5eddf8bd3a060667f48dc129ec5c1595 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 10:16:16 +0200 Subject: [PATCH 014/180] cleanup --- .../core-server/src/utils/save-from-controls.ts | 15 ++++++--------- code/ui/.storybook/manager.tsx | 10 +++++++++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls.ts index 2ebeea309fbe..92fccee89a40 100644 --- a/code/lib/core-server/src/utils/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls.ts @@ -24,28 +24,24 @@ export function initializeSaveFromControls( coreOptions: CoreConfig ) { channel.on(SAVE_STORY_REQUEST, async (data: RequestSaveStoryPayload) => { - console.log('SAVE_STORY_REQUEST', data); const id = data.id.split('--')[1]; try { const location = join(process.cwd(), data.importPath); - console.log({ location }); + // open the story file const csf = await readCsf(location, { makeTitle: (userTitle: string) => userTitle, }); const parsed = csf.parse(); - // console.log(parsed._stories); - - // find the AST node for the story - const [name, result] = + // find the export_name for the id + const [name] = Object.entries(parsed._stories).find(([key, value]) => value.id.endsWith(`--${id}`)) || []; - console.log({ name, result }); let node; - // if none can be found, create one + // find the AST node for the export_name, if none can be found, create a new story if (!name) { node = undefined; throw new Error(`creation of new story: not yet implemented`); @@ -54,7 +50,6 @@ export function initializeSaveFromControls( } // modify the AST node with the new args - // node console.log({ node }); // save the file @@ -68,6 +63,8 @@ export function initializeSaveFromControls( success: false, error: e.stack || e.message || e.toString(), }); + + console.error(e.stack || e.message || e.toString()); } }); } diff --git a/code/ui/.storybook/manager.tsx b/code/ui/.storybook/manager.tsx index 49962eefa8d1..75e5201f68a0 100644 --- a/code/ui/.storybook/manager.tsx +++ b/code/ui/.storybook/manager.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { addons, types, useArgs } from '@storybook/manager-api'; import startCase from 'lodash/startCase.js'; import { add } from 'lodash'; -import { SAVE_STORY_REQUEST } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; import { satisfies } from 'semver'; addons.setConfig({ @@ -23,6 +23,14 @@ interface RequestSaveStoryPayload { } addons.register('my-addon', (api) => { + api.on(SAVE_STORY_RESULT, (data) => { + if (data.error) { + api.addNotification({ + content: { headline: `Error saving story`, subHeadline: ` ${data.error}` }, + id: 'save-story-error', + }); + } + }); addons.add('my-addon/panel', { type: types.PANEL, title: 'My Addon', From 7bd6ecede4a5d5f3bc7a2222b108a52803985f35 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 10:17:22 +0200 Subject: [PATCH 015/180] Fix error message in save-from-controls.ts --- code/lib/core-server/src/utils/save-from-controls.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls.ts index 92fccee89a40..48899f1ec5d3 100644 --- a/code/lib/core-server/src/utils/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls.ts @@ -61,7 +61,7 @@ export function initializeSaveFromControls( channel.emit(SAVE_STORY_RESULT, { id: data.id, success: false, - error: e.stack || e.message || e.toString(), + error: `writing to CSF-file failed, is it a valid CSF-file?`, }); console.error(e.stack || e.message || e.toString()); From 154adcaae3245e1708b7e4d0e745f80bbf33e8e9 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 10:22:58 +0200 Subject: [PATCH 016/180] Add notification icons for save story success and error --- code/ui/.storybook/manager.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/ui/.storybook/manager.tsx b/code/ui/.storybook/manager.tsx index 75e5201f68a0..d7a53b88ea81 100644 --- a/code/ui/.storybook/manager.tsx +++ b/code/ui/.storybook/manager.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { addons, types, useArgs } from '@storybook/manager-api'; import startCase from 'lodash/startCase.js'; -import { add } from 'lodash'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; -import { satisfies } from 'semver'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { CheckIcon, AlertIcon } from '@storybook/icons'; addons.setConfig({ sidebar: { @@ -28,6 +28,14 @@ addons.register('my-addon', (api) => { api.addNotification({ content: { headline: `Error saving story`, subHeadline: ` ${data.error}` }, id: 'save-story-error', + icon: , + }); + } else { + api.addNotification({ + content: { headline: `Story saved`, subHeadline: ` ${data.id}` }, + duration: 2000, + icon: , + id: 'save-story-success', }); } }); From 22920d450bed4c602eebfa77810cb149943d2e60 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 10:39:24 +0200 Subject: [PATCH 017/180] wip --- .../core-server/src/presets/common-preset.ts | 2 +- .../save-from-controls.ts | 2 +- .../update-args-in-csf-file.test.ts | 14 ++++++++ .../update-args-in-csf-file.ts | 32 +++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) rename code/lib/core-server/src/utils/{ => save-from-controls}/save-from-controls.ts (97%) create mode 100644 code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts create mode 100644 code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 0153eb7b529f..7c693a7ee659 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -24,7 +24,7 @@ import { parseStaticDir } from '../utils/server-statics'; import { defaultStaticDirs } from '../utils/constants'; import type { OptionsWithRequiredCache } from '../utils/whats-new'; import { initializeWhatsNew } from '../utils/whats-new'; -import { initializeSaveFromControls } from '../utils/save-from-controls'; +import { initializeSaveFromControls } from '../utils/save-from-controls/save-from-controls'; const interpolate = (string: string, data: Record = {}) => Object.entries(data).reduce((acc, [k, v]) => acc.replace(new RegExp(`%${k}%`, 'g'), v), string); diff --git a/code/lib/core-server/src/utils/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts similarity index 97% rename from code/lib/core-server/src/utils/save-from-controls.ts rename to code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 48899f1ec5d3..18ff90195e7b 100644 --- a/code/lib/core-server/src/utils/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -2,7 +2,7 @@ import type { CoreConfig } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; -import type { OptionsWithRequiredCache } from './whats-new'; +import type { OptionsWithRequiredCache } from '../whats-new'; import { readCsf, writeCsf } from '@storybook/csf-tools'; import { join } from 'path'; // import { sendTelemetryError } from '../withTelemetry'; diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts new file mode 100644 index 000000000000..f638a368a48c --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -0,0 +1,14 @@ +import { describe, test, expect } from 'vitest'; +import { readCsf, babelPrint } from '@storybook/csf-tools'; +import { readFile } from 'fs/promises'; + +describe('success', () => { + test('should return success', async () => { + const before = await readFile('path/to/file', 'utf-8'); + const CSF = await readCsf('path/to/file', { makeTitle: (userTitle: string) => userTitle }); + + const parsed = CSF.parse(); + + // parsed._stories + }); +}); diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts new file mode 100644 index 000000000000..947e70d2a02a --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts @@ -0,0 +1,32 @@ +import type * as t from '@babel/types'; +import * as traverse from '@babel/traverse'; + +export const updateArgsInCsfFile = async (node: t.Node, args: Record) => { + traverse.default(node, { + ObjectExpression(path) { + const properties = path.get('properties'); + properties.forEach((property) => { + if (property.isObjectProperty()) { + const key = property.get('key'); + if (key.isIdentifier() && key.node.name === 'args') { + const value = property.get('value'); + if (value.isObjectExpression()) { + args = { + ...args, + ...value.node.properties.reduce((acc, prop) => { + if (prop.type === 'ObjectProperty') { + const k = prop.key; + if (k.type === 'Identifier') { + acc[k.name] = prop.value; + } + } + return acc; + }, {}), + }; + } + } + } + }); + }, + }); +}; From 4515e78c1d6968a2aac08e498b110c59b7adff98 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 2 Apr 2024 10:09:26 +0200 Subject: [PATCH 018/180] add events --- code/lib/core-events/src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 82978a994d07..f9ad1e4a7d9f 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -75,6 +75,8 @@ enum events { TELEMETRY_ERROR = 'telemetryError', FILE_COMPONENT_SEARCH = 'fileComponentSearch', FILE_COMPONENT_SEARCH_RESULT = 'fileComponentSearchResult', + SAVE_STORY_REQUEST = 'saveStoryRequest', + SAVE_STORY_RESULT = 'saveStoryResult', } // Enables: `import Events from ...` From 3d23b0cf6b16f7c54e83a4a3e496f3b7973dca8e Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 14:59:24 +0200 Subject: [PATCH 019/180] iteration on actually being able to add args --- .../src/utils/save-from-controls/astify.ts | 38 +++++++++++ .../save-from-controls/save-from-controls.ts | 3 +- .../update-args-in-csf-file.test.ts | 27 ++++++-- .../update-args-in-csf-file.ts | 66 +++++++++++++------ 4 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-from-controls/astify.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/astify.ts b/code/lib/core-server/src/utils/save-from-controls/astify.ts new file mode 100644 index 000000000000..95378a732421 --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/astify.ts @@ -0,0 +1,38 @@ +import * as t from '@babel/types'; +import * as babylon from '@babel/parser'; +import traverse from '@babel/traverse'; + +export function astify(literal: T) { + if (literal === null) { + return t.nullLiteral(); + } + switch (typeof literal) { + case 'function': + const ast = babylon.parse(literal.toString(), { + allowReturnOutsideFunction: true, + allowSuperOutsideMethod: true, + }); + return traverse.removeProperties(ast); + case 'number': + return t.numericLiteral(literal); + case 'string': + return t.stringLiteral(literal); + case 'boolean': + return t.booleanLiteral(literal); + case 'undefined': + return t.unaryExpression('void', t.numericLiteral(0), true); + default: + if (Array.isArray(literal)) { + return t.arrayExpression(literal.map(astify)); + } + return t.objectExpression( + Object.keys(literal) + .filter((k) => { + return typeof literal[k] !== 'undefined'; + }) + .map((k) => { + return t.objectProperty(t.stringLiteral(k), astify(literal[k])); + }) + ); + } +} diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 18ff90195e7b..7ac906c16fdb 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -5,6 +5,7 @@ import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; import type { OptionsWithRequiredCache } from '../whats-new'; import { readCsf, writeCsf } from '@storybook/csf-tools'; import { join } from 'path'; +import { updateArgsInCsfFile } from './update-args-in-csf-file'; // import { sendTelemetryError } from '../withTelemetry'; interface RequestSaveStoryPayload { @@ -50,7 +51,7 @@ export function initializeSaveFromControls( } // modify the AST node with the new args - console.log({ node }); + updateArgsInCsfFile(node, data.args); // save the file await writeCsf(csf, location); diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts index f638a368a48c..c44e4d15fe7a 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -1,14 +1,33 @@ +/* eslint-disable no-underscore-dangle */ import { describe, test, expect } from 'vitest'; -import { readCsf, babelPrint } from '@storybook/csf-tools'; +import { readCsf, printCsf } from '@storybook/csf-tools'; +import { join } from 'path'; +import { getProjectRoot } from '@storybook/core-common'; + +import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { readFile } from 'fs/promises'; +const makeTitle = (userTitle: string) => userTitle; + +const FILES = { + tab: join(getProjectRoot(), 'code/ui/components/src/components/tabs/tabs.stories.tsx'), +}; + +// console.log(FILES); + describe('success', () => { test('should return success', async () => { - const before = await readFile('path/to/file', 'utf-8'); - const CSF = await readCsf('path/to/file', { makeTitle: (userTitle: string) => userTitle }); + const before = await readFile(FILES.tab, 'utf-8'); + const CSF = await readCsf(FILES.tab, { makeTitle }); const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + const nodes = names.map((name) => CSF.getStoryExport(name)); + + updateArgsInCsfFile(nodes[0], { active: true, selected: 'test1' }); + + const after = printCsf(parsed); - // parsed._stories + expect(after.code).not.toBe(before); }); }); diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts index 947e70d2a02a..b4e3f3bb1c67 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts @@ -1,32 +1,58 @@ -import type * as t from '@babel/types'; +import * as t from '@babel/types'; import * as traverse from '@babel/traverse'; +import { astify } from './astify'; + +export const updateArgsInCsfFile = async (node: t.Node, input: Record) => { + let found = false; + const args = Object.fromEntries( + Object.entries(input).map(([k, v]) => { + return [k, astify(v)]; + }) + ); -export const updateArgsInCsfFile = async (node: t.Node, args: Record) => { traverse.default(node, { ObjectExpression(path) { + if (found) { + return; + } + + found = true; const properties = path.get('properties'); - properties.forEach((property) => { + const argsProperty = properties.find((property) => { if (property.isObjectProperty()) { const key = property.get('key'); - if (key.isIdentifier() && key.node.name === 'args') { - const value = property.get('value'); - if (value.isObjectExpression()) { - args = { - ...args, - ...value.node.properties.reduce((acc, prop) => { - if (prop.type === 'ObjectProperty') { - const k = prop.key; - if (k.type === 'Identifier') { - acc[k.name] = prop.value; - } - } - return acc; - }, {}), - }; - } - } + return key.isIdentifier() && key.node.name === 'args'; } + return false; }); + + if (argsProperty) { + const v = argsProperty.get('value'); + if (t.isObjectExpression(v)) { + argsProperty.replaceWith( + t.objectProperty( + t.identifier('args'), + t.objectExpression( + Object.entries(args).map(([key, value]) => + t.objectProperty(t.identifier(key), value) + ) + ) + ) + ); + } + } else { + path.pushContainer( + 'properties', + t.objectProperty( + t.identifier('args'), + t.objectExpression( + Object.entries(args).map(([key, value]) => t.objectProperty(t.identifier(key), value)) + ) + ) + ); + } }, + + noScope: true, }); }; From 3893f71e8d68a84cf6deac7df0fbe3c09c270ed0 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 16:08:43 +0200 Subject: [PATCH 020/180] wip --- .../utils/save-from-controls/update-args-in-csf-file.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts index c44e4d15fe7a..5e4fd1323a88 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -13,8 +13,6 @@ const FILES = { tab: join(getProjectRoot(), 'code/ui/components/src/components/tabs/tabs.stories.tsx'), }; -// console.log(FILES); - describe('success', () => { test('should return success', async () => { const before = await readFile(FILES.tab, 'utf-8'); @@ -29,5 +27,7 @@ describe('success', () => { const after = printCsf(parsed); expect(after.code).not.toBe(before); + + // TODO, how to assert the change? without diffing the whole file }); }); From 218b865e91195ecf948322fcbc1956f5c37ca516 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 10 Apr 2024 16:25:40 +0200 Subject: [PATCH 021/180] Hide info text on overflow --- .../components/ArgsTable/SaveFromControls.tsx | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx index 5332ff7632f9..e1daafc80dbc 100644 --- a/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx +++ b/code/ui/blocks/src/components/ArgsTable/SaveFromControls.tsx @@ -26,8 +26,10 @@ const Container = styled.div({ const Bar = styled(BaseBar)(({ theme }) => ({ display: 'flex', + flexDirection: 'row-reverse', // hide Info rather than Actions on overflow alignItems: 'center', justifyContent: 'space-between', + flexWrap: 'wrap', gap: 6, padding: '6px 10px', animation: `${slideIn} 300ms forwards`, @@ -36,13 +38,23 @@ const Bar = styled(BaseBar)(({ theme }) => ({ fontSize: theme.typography.size.s2, })); -const Content = styled.div({ +const Info = styled.div({ display: 'flex', + flex: '99 0 auto', alignItems: 'center', marginLeft: 10, gap: 6, }); +const Actions = styled.div(({ theme }) => ({ + display: 'flex', + flex: '1 0 0', + alignItems: 'center', + gap: 2, + color: theme.color.mediumdark, + fontSize: theme.typography.size.s2, +})); + const Label = styled.div({ '@container (max-width: 799px)': { lineHeight: 0, @@ -65,14 +77,6 @@ const ModalInput = styled(Form.Input)(({ theme }) => ({ }, })); -const Actions = styled.div(({ theme }) => ({ - display: 'flex', - alignItems: 'center', - gap: 2, - color: theme.color.mediumdark, - fontSize: theme.typography.size.s2, -})); - type SaveFromControlsProps = { saveStory: () => void; createStory: (storyName: string) => void; @@ -116,12 +120,6 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom return ( - - - - + + + +
From bcbca9b0f838c4a1777dc430462b83501a9087ae Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 10 Apr 2024 16:32:41 +0200 Subject: [PATCH 022/180] Update story definition to use satisfies keyword --- .../ui/components/src/components/Modal/Modal.stories.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.stories.tsx b/code/ui/components/src/components/Modal/Modal.stories.tsx index 0c2add0dbe2e..e117c56f4787 100644 --- a/code/ui/components/src/components/Modal/Modal.stories.tsx +++ b/code/ui/components/src/components/Modal/Modal.stories.tsx @@ -5,17 +5,18 @@ import { userEvent, within, expect } from '@storybook/test'; import { Modal } from './Modal'; import { Button } from '../Button/Button'; -const meta: Meta = { +type Story = StoryObj; + +const meta = { component: Modal, decorators: [(storyFn) =>
{storyFn()}
], -}; +} satisfies Meta; export default meta; -type Story = StoryObj; - export const Default: Story = { args: { + children: undefined, width: undefined, height: undefined, }, From 499864f800027f250cb0cae714ac4d54a2ceccd2 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 10 Apr 2024 21:57:12 +0200 Subject: [PATCH 023/180] get the tests the way I want them, add support for existing prop overrides --- code/lib/core-server/package.json | 2 + .../src/utils/save-from-controls/getDiff.ts | 66 +++++++++++++++++ .../mocks/satisfies.stories.tsx | 68 +++++++++++++++++ .../update-args-in-csf-file.test.ts | 73 +++++++++++++++++-- .../update-args-in-csf-file.ts | 35 +++++---- code/yarn.lock | 11 ++- 6 files changed, 233 insertions(+), 22 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-from-controls/getDiff.ts create mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx diff --git a/code/lib/core-server/package.json b/code/lib/core-server/package.json index 58f6be3c9d46..53b2df152952 100644 --- a/code/lib/core-server/package.json +++ b/code/lib/core-server/package.json @@ -73,6 +73,7 @@ "@storybook/telemetry": "workspace:*", "@storybook/types": "workspace:*", "@types/detect-port": "^1.3.0", + "@types/diff": "^5.0.9", "@types/node": "^18.0.0", "@types/pretty-hrtime": "^1.0.0", "@types/semver": "^7.3.4", @@ -81,6 +82,7 @@ "cli-table3": "^0.6.1", "compression": "^1.7.4", "detect-port": "^1.3.0", + "diff": "^5.2.0", "express": "^4.17.3", "fs-extra": "^11.1.0", "globby": "^14.0.1", diff --git a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts new file mode 100644 index 000000000000..95cc88b91d57 --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts @@ -0,0 +1,66 @@ +import { diffLines } from 'diff'; + +/** + * Get a diff between two strings + * @param before The original string + * @param after The new string + * @returns The diff as a string + * @example + * ```ts + * const before = 'foo\nbar\nbaz'; + * const after = 'foo\nbaz'; + * const diff = getDiff(before, after); + * console.log(diff); + * // foo + * // - bar + * // baz + * ``` + */ +export function getDiff(before: string, after: string): string { + const context = 4; + return diffLines(before, after, { newlineIsToken: true }) + .map((r, index, l) => { + if (r.removed) { + return r.value + .split('\n') + .map((v) => `- ${v}`) + .join('\n'); + } + if (r.added) { + return r.value + .split('\n') + .map((v) => `+ ${v}`) + .join('\n'); + } + + if (index === 0) { + return ( + `...\n` + + r.value + .split('\n') + .slice(0 - context) + .map((v) => ` ${v}`) + .join('\n') + ); + } + + if (index === l.length - 1) { + return ( + r.value + .split('\n') + .slice(0, context) + .map((v) => ` ${v}`) + .join('\n') + `\n...` + ); + } + + const all = r.value.split('\n').map((v) => ` ${v}`); + return [ + // + ...all.slice(0, context), + '...', + ...all.slice(0 - context), + ].join('\n'); + }) + .join('\n'); +} diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx new file mode 100644 index 000000000000..2ad65206b43b --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; +import { TabsState } from '@storybook/components/src/components/tabs/tabs'; + +export default { + title: 'Tabs', + args: { + menuName: 'Addons', + }, +} satisfies Meta; + +type Story = StoryObj; + +export const RenderNoArgs = { + render: (args) => ( + +
+ { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any + } +
+
+
test2 is always active (but visually hidden)
+
+
+ ), +} satisfies Story; + +export const RenderArgs = { + args: { + absolute: true, + }, + render: (args) => ( + +
+ { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any + } +
+
+
test2 is always active (but visually hidden)
+
+
+ ), +} satisfies Story; + +export const RenderExistingArgs = { + args: { + absolute: true, + bordered: true, + initial: 'test2', + }, + render: (args) => ( + +
+ { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any + } +
+
+
test2 is always active (but visually hidden)
+
+
+ ), +} satisfies Story; diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts index 5e4fd1323a88..db5e5d06baf9 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -1,33 +1,90 @@ /* eslint-disable no-underscore-dangle */ import { describe, test, expect } from 'vitest'; import { readCsf, printCsf } from '@storybook/csf-tools'; -import { join } from 'path'; -import { getProjectRoot } from '@storybook/core-common'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { readFile } from 'fs/promises'; +import { join } from 'path'; +import { getDiff } from './getDiff'; const makeTitle = (userTitle: string) => userTitle; const FILES = { - tab: join(getProjectRoot(), 'code/ui/components/src/components/tabs/tabs.stories.tsx'), + satisfies: join(__dirname, 'mocks/satisfies.stories.tsx'), }; describe('success', () => { - test('should return success', async () => { - const before = await readFile(FILES.tab, 'utf-8'); - const CSF = await readCsf(FILES.tab, { makeTitle }); + test('TS satisfies', async () => { + const newArgs = { bordered: true, initial: 'test1' }; + + const before = await readFile(FILES.satisfies, 'utf-8'); + const CSF = await readCsf(FILES.satisfies, { makeTitle }); const parsed = CSF.parse(); const names = Object.keys(parsed._stories); const nodes = names.map((name) => CSF.getStoryExport(name)); - updateArgsInCsfFile(nodes[0], { active: true, selected: 'test1' }); + nodes.forEach((node) => { + updateArgsInCsfFile(node, newArgs); + }); const after = printCsf(parsed); + // check if the code was updated at all expect(after.code).not.toBe(before); - // TODO, how to assert the change? without diffing the whole file + // check if the code was updated correctly + expect(getDiff(before, after.code)).toMatchInlineSnapshot(` + "... + type Story = StoryObj; + + export const RenderNoArgs = { + + + args: { + + bordered: true, + + initial: "test1" + + }, + + + + + render: (args) => ( + +
+ { + ... +
test2 is always active (but visually hidden)
+
+
+ + - ), + + ) + + } satisfies Story; + + export const RenderArgs = { + ... + export const RenderArgs = { + args: { + absolute: true, + + + bordered: true, + + initial: "test1" + + + }, + render: (args) => ( + +
+ ... + args: { + absolute: true, + bordered: true, + + - initial: 'test2', + + initial: "test1", + + }, + render: (args) => ( + + ..." + `); }); }); diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts index b4e3f3bb1c67..2b31b21745f2 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts @@ -27,21 +27,30 @@ export const updateArgsInCsfFile = async (node: t.Node, input: Record - t.objectProperty(t.identifier(key), value) - ) - ) - ) - ); + if (argsProperty.isObjectProperty()) { + // for each key in input, try to find the key in argsProperty>value>entries when found, replace the value with the new value + const a = argsProperty.get('value'); + if (a.isObjectExpression()) { + a.traverse({ + ObjectProperty(p) { + const key = p.get('key'); + if (key.isIdentifier() && key.node.name in args) { + p.get('value').replaceWith(args[key.node.name]); + delete args[key.node.name]; + } + }, + }); + + const remainder = Object.entries(args); + if (Object.keys(args).length) { + remainder.forEach(([key, value]) => { + a.pushContainer('properties', t.objectProperty(t.identifier(key), value)); + }); + } + } } } else { - path.pushContainer( + path.unshiftContainer( 'properties', t.objectProperty( t.identifier('args'), diff --git a/code/yarn.lock b/code/yarn.lock index 472dd503b241..302ffcb003c5 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -5587,6 +5587,7 @@ __metadata: "@storybook/types": "workspace:*" "@types/compression": "npm:^1.7.0" "@types/detect-port": "npm:^1.3.0" + "@types/diff": "npm:^5.0.9" "@types/ip": "npm:^1.1.0" "@types/node": "npm:^18.0.0" "@types/node-fetch": "npm:^2.5.7" @@ -5599,6 +5600,7 @@ __metadata: cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" + diff: "npm:^5.2.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -7322,6 +7324,13 @@ __metadata: languageName: node linkType: hard +"@types/diff@npm:^5.0.9": + version: 5.0.9 + resolution: "@types/diff@npm:5.0.9" + checksum: 10c0/038e4d831f6d9826f0019fa07ec821a1f966160cd0d62aede6fc6ab269fc969ac6e665f7849fb2189fb92f7865488dcaabcb278c3df877d0d3581f2a7e1a67b2 + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -12816,7 +12825,7 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.0.0": +"diff@npm:^5.0.0, diff@npm:^5.2.0": version: 5.2.0 resolution: "diff@npm:5.2.0" checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 From 5cadefcfceee0d79d0e7d082e56d735a43b36e2d Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 11 Apr 2024 11:20:18 +0200 Subject: [PATCH 024/180] add tests to verify the update works in a variation of scenarios --- .../src/utils/save-from-controls/getDiff.ts | 37 +- .../mocks/csf-variances.stories.tsx | 61 ++++ .../mocks/data-variances.stories.tsx | 45 +++ .../mocks/export-variances.stories.tsx | 37 ++ .../mocks/satisfies.stories.tsx | 68 ---- .../mocks/typescript-constructs.stories.tsx | 41 +++ .../update-args-in-csf-file.test.ts | 330 ++++++++++++++++-- .../update-args-in-csf-file.ts | 50 ++- .../{astify.ts => valueToAST.ts} | 20 +- 9 files changed, 561 insertions(+), 128 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx create mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx create mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx delete mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx create mode 100644 code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx rename code/lib/core-server/src/utils/save-from-controls/{astify.ts => valueToAST.ts} (54%) diff --git a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts index 95cc88b91d57..f243fdb522fe 100644 --- a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts +++ b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts @@ -20,6 +20,8 @@ export function getDiff(before: string, after: string): string { const context = 4; return diffLines(before, after, { newlineIsToken: true }) .map((r, index, l) => { + const lines = r.value.split('\n'); + if (r.removed) { return r.value .split('\n') @@ -34,32 +36,31 @@ export function getDiff(before: string, after: string): string { } if (index === 0) { - return ( - `...\n` + - r.value - .split('\n') - .slice(0 - context) - .map((v) => ` ${v}`) - .join('\n') - ); + const sliced = lines.slice(0 - context); + + if (sliced.length !== lines.length) { + sliced.unshift('...'); + } + return sliced.map((v) => ` ${v}`).join('\n'); } if (index === l.length - 1) { - return ( - r.value - .split('\n') - .slice(0, context) - .map((v) => ` ${v}`) - .join('\n') + `\n...` - ); + const sliced = lines.slice(0, context); + + if (sliced.length !== lines.length) { + sliced.push('...'); + } + return sliced.map((v) => ` ${v}`).join('\n'); } - const all = r.value.split('\n').map((v) => ` ${v}`); + if (lines.length <= context * 2 + 1) { + return lines.map((v) => ` ${v}`).join('\n'); + } return [ // - ...all.slice(0, context), + ...lines.slice(0, context).map((v) => ` ${v}`), '...', - ...all.slice(0 - context), + ...lines.slice(0 - context).map((v) => ` ${v}`), ].join('\n'); }) .join('\n'); diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx new file mode 100644 index 000000000000..1d7f81398e6a --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import type { FC } from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; + +export default { + title: 'MyComponent', + args: { + initial: 'foo', + }, +} satisfies Meta; + +type Story = StoryObj; + +// dummy component +const MyComponent: FC<{ absolute: boolean; bordered: boolean; initial: string }> = (props) => ( +
{JSON.stringify(props)}
+); + +export const Empty = {} satisfies Story; + +export const EmptyWithComment = { + // this is a useless comment, to test that it is preserved +} satisfies Story; + +export const OnlyArgs = { + args: { + absolute: true, + }, +} satisfies Story; + +export const RenderNoArgs = { + render: (args) => , +} satisfies Story; + +export const RenderArgs = { + args: { + absolute: true, + }, + render: (args) => , +} satisfies Story; + +export const RenderExistingArgs = { + args: { + absolute: true, + bordered: true, + initial: 'test2', + }, + render: (args) => , +} satisfies Story; + +// The order of both the properties of the story and the order or args should be preserved +export const OrderedArgs = { + args: { + bordered: true, + initial: 'test2', + absolute: true, + }, + render: (args) => , +} satisfies Story; + +export const CSF2 = () => ; diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx new file mode 100644 index 000000000000..ea2f79bdcc3b --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import type { FC } from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; + +export default { + title: 'MyComponent', + args: { + myString: 'foo', + }, +} satisfies Meta; + +type Story = StoryObj; + +// dummy component +const MyComponent: FC<{ + myUndefined: undefined; + myNull: null; + myBoolean: boolean; + myString: string; + myNumber: number; + myArray: string[]; + myArrayDeep: string[][]; + myObject: object; + myFunction: () => void; +}> = (props) =>
{JSON.stringify(props)}
; + +export const All = { + args: { + myArray: ['foo', 'bar'], + myArrayDeep: [['foo'], ['bar']], + myBoolean: true, + myFunction: () => {}, + myNull: null, + myNumber: 42, + myObject: { + foo: 'bar', + }, + myString: 'foo', + myUndefined: undefined, + }, +} satisfies Story; + +export const None = { + args: {}, +} satisfies Story; diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx new file mode 100644 index 000000000000..7c853f484468 --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import type { FC } from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; + +export default { + title: 'MyComponent', + args: { + initial: 'foo', + }, +} satisfies Meta; + +type Story = StoryObj; + +// dummy component +const MyComponent: FC<{ absolute: boolean; bordered: boolean; initial: string }> = (props) => ( +
{JSON.stringify(props)}
+); + +export const DirectExport: Story = { + args: { + initial: 'bar', + }, +}; + +const BlockExport: Story = { + args: { + initial: 'bar', + }, +}; + +const NotYetRenamedExport: Story = { + args: { + initial: 'bar', + }, +}; + +export { BlockExport, NotYetRenamedExport as RenamedExport }; diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx deleted file mode 100644 index 2ad65206b43b..000000000000 --- a/code/lib/core-server/src/utils/save-from-controls/mocks/satisfies.stories.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import React from 'react'; -import type { Meta, StoryObj } from '@storybook/react'; -import { TabsState } from '@storybook/components/src/components/tabs/tabs'; - -export default { - title: 'Tabs', - args: { - menuName: 'Addons', - }, -} satisfies Meta; - -type Story = StoryObj; - -export const RenderNoArgs = { - render: (args) => ( - -
- { - (({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null) as any - } -
-
-
test2 is always active (but visually hidden)
-
-
- ), -} satisfies Story; - -export const RenderArgs = { - args: { - absolute: true, - }, - render: (args) => ( - -
- { - (({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null) as any - } -
-
-
test2 is always active (but visually hidden)
-
-
- ), -} satisfies Story; - -export const RenderExistingArgs = { - args: { - absolute: true, - bordered: true, - initial: 'test2', - }, - render: (args) => ( - -
- { - (({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null) as any - } -
-
-
test2 is always active (but visually hidden)
-
-
- ), -} satisfies Story; diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx new file mode 100644 index 000000000000..d44c95c446be --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import type { FC } from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; + +export default { + title: 'MyComponent', + args: { + initial: 'foo', + }, +} satisfies Meta; + +type Story = StoryObj; + +// dummy component +const MyComponent: FC<{ absolute: boolean; bordered: boolean; initial: string }> = (props) => ( +
{JSON.stringify(props)}
+); + +export const Cast: Story = { + args: { + initial: 'bar', + }, +}; + +export const As = { + args: { + initial: 'bar', + }, +} as Story; + +export const Satisfies = { + args: { + initial: 'bar', + }, +} satisfies Story; + +export const None = { + args: { + initial: 'bar', + }, +}; diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts index db5e5d06baf9..23b3411cd63f 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -5,20 +5,26 @@ import { readCsf, printCsf } from '@storybook/csf-tools'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { readFile } from 'fs/promises'; import { join } from 'path'; +import { format } from 'prettier'; import { getDiff } from './getDiff'; const makeTitle = (userTitle: string) => userTitle; const FILES = { - satisfies: join(__dirname, 'mocks/satisfies.stories.tsx'), + typescriptConstructs: join(__dirname, 'mocks/typescript-constructs.stories.tsx'), + csfVariances: join(__dirname, 'mocks/csf-variances.stories.tsx'), + exportVariances: join(__dirname, 'mocks/export-variances.stories.tsx'), + dataVariances: join(__dirname, 'mocks/data-variances.stories.tsx'), }; describe('success', () => { - test('TS satisfies', async () => { + test('Typescript Constructs', async () => { const newArgs = { bordered: true, initial: 'test1' }; - const before = await readFile(FILES.satisfies, 'utf-8'); - const CSF = await readCsf(FILES.satisfies, { makeTitle }); + const before = await format(await readFile(FILES.typescriptConstructs, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.typescriptConstructs, { makeTitle }); const parsed = CSF.parse(); const names = Object.keys(parsed._stories); @@ -28,63 +34,323 @@ describe('success', () => { updateArgsInCsfFile(node, newArgs); }); - const after = printCsf(parsed); + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); // check if the code was updated at all - expect(after.code).not.toBe(before); + expect(after).not.toBe(before); // check if the code was updated correctly - expect(getDiff(before, after.code)).toMatchInlineSnapshot(` - "... - type Story = StoryObj; + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + + export const Cast: Story = { + args: { + + - initial: "bar", + + initial: "test1", + + + + bordered: true, + + + }, + }; + + export const As = { + args: { + + - initial: "bar", + + initial: "test1", + + + + bordered: true, + + + }, + } as Story; + + export const Satisfies = { + args: { + + - initial: "bar", + + initial: "test1", + + + + bordered: true, + + + }, + } satisfies Story; + + export const None = { + args: { + + - initial: "bar", + + initial: "test1", + + + + bordered: true, + + + }, + }; + " + `); + }); + test('CSF Variances', async () => { + const newArgs = { bordered: true, initial: 'test1' }; + + const before = await format(await readFile(FILES.csfVariances, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.csfVariances, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + const nodes = names.map((name) => CSF.getStoryExport(name)); + + nodes.forEach((node) => { + updateArgsInCsfFile(node, newArgs); + }); + + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + // TODO, the comment is not preserved!!! + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + initial: string; + }> = (props) =>
{JSON.stringify(props)}
; + + + - export const Empty = {} satisfies Story; + + export const Empty = { - export const RenderNoArgs = { + args: { + + + bordered: true, - + initial: "test1" + + initial: "test1", + }, + + } satisfies Story; + + - render: (args) => ( - -
- { - ... -
test2 is always active (but visually hidden)
-
-
+ export const EmptyWithComment = { + + - // this is a useless comment, to test that it is preserved + + args: { - - ), - + ) + + bordered: true, + + initial: "test1", + + }, + + + } satisfies Story; + + export const OnlyArgs = { + args: { + absolute: true, + + + bordered: true, + + initial: "test1", + + + }, + } satisfies Story; + + export const RenderNoArgs = { + + + args: { + + bordered: true, + + initial: "test1", + + }, + + + + + render: (args) => , } satisfies Story; - export const RenderArgs = { - ... export const RenderArgs = { args: { absolute: true, + bordered: true, - + initial: "test1" + + initial: "test1", + }, - render: (args) => ( - -
- ... + render: (args) => , + } satisfies Story; + + export const RenderExistingArgs = { args: { absolute: true, bordered: true, - - initial: 'test2', + - initial: "test2", + + initial: "test1", + + }, + render: (args) => , + } satisfies Story; + ... + export const OrderedArgs = { + args: { + bordered: true, + + - initial: "test2", + + initial: "test1", + + absolute: true, + }, + render: (args) => , + ..." + `); + }); + test('Export Variances', async () => { + const newArgs = { bordered: true, initial: 'test1' }; + + const before = await format(await readFile(FILES.exportVariances, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.exportVariances, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + const nodes = names.map((name) => CSF.getStoryExport(name)); + + nodes.forEach((node) => { + if (node === undefined) { + return; + } + updateArgsInCsfFile(node, newArgs); + }); + + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + // TODO this is incomplete due to no support for export variances in csf-tools + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + + export const DirectExport: Story = { + args: { + + - initial: "bar", + initial: "test1", + + + bordered: true, + + + }, + }; + + const BlockExport: Story = { + ..." + `); + }); + test('Data Variances', async () => { + const newArgs = { + myArray: ['FOO', 'BAR'], + myArrayDeep: [['FOO'], ['BAR']], + myBoolean: true, + myFunction: () => {}, + myNull: null, + myNumber: 41, + myObject: { + FOO: 'BAR', + }, + myString: 'FOO', + myUndefined: undefined, + }; + + const before = await format(await readFile(FILES.dataVariances, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.dataVariances, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + const nodes = names.map((name) => CSF.getStoryExport(name)); + + nodes.forEach((node) => { + if (node === undefined) { + return; + } + updateArgsInCsfFile(node, newArgs); + }); + + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + + export const All = { + args: { + + - myArray: ["foo", "bar"], + + myArray: ["FOO", "BAR"], + + + - myArrayDeep: [["foo"], ["bar"]], + + myArrayDeep: [["FOO"], ["BAR"]], + + myBoolean: true, + myFunction: () => {}, + myNull: null, + + - myNumber: 42, + + myNumber: 41, + + myObject: { + + - foo: "bar", + + FOO: "BAR", + + }, + + - myString: "foo", + + myString: "FOO", + + myUndefined: undefined, }, - render: (args) => ( - - ..." + } satisfies Story; + + export const None = { + + - args: {}, + + args: { + + + + myArray: ["FOO", "BAR"], + + myArrayDeep: [["FOO"], ["BAR"]], + + myBoolean: true, + + myFunction: () => {}, + + myNull: null, + + myNumber: 41, + + + + myObject: { + + FOO: "BAR", + + }, + + + + myString: "FOO", + + myUndefined: undefined, + + }, + + + } satisfies Story; + " `); }); }); diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts index 2b31b21745f2..b3737893625b 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts @@ -1,15 +1,60 @@ import * as t from '@babel/types'; import * as traverse from '@babel/traverse'; -import { astify } from './astify'; +import { valueToAST } from './valueToAST'; export const updateArgsInCsfFile = async (node: t.Node, input: Record) => { let found = false; const args = Object.fromEntries( Object.entries(input).map(([k, v]) => { - return [k, astify(v)]; + return [k, valueToAST(v)]; }) ); + if (t.isObjectExpression(node)) { + const properties = node.properties; + const argsProperty = properties.find((property) => { + if (t.isObjectProperty(property)) { + const key = property.key; + return t.isIdentifier(key) && key.name === 'args'; + } + return false; + }); + + if (argsProperty) { + if (t.isObjectProperty(argsProperty)) { + const a = argsProperty.value; + if (t.isObjectExpression(a)) { + a.properties.forEach((p) => { + if (t.isObjectProperty(p)) { + const key = p.key; + if (t.isIdentifier(key) && key.name in args) { + p.value = args[key.name]; + delete args[key.name]; + } + } + }); + + const remainder = Object.entries(args); + if (Object.keys(args).length) { + remainder.forEach(([key, value]) => { + a.properties.push(t.objectProperty(t.identifier(key), value)); + }); + } + } + } + } else { + properties.unshift( + t.objectProperty( + t.identifier('args'), + t.objectExpression( + Object.entries(args).map(([key, value]) => t.objectProperty(t.identifier(key), value)) + ) + ) + ); + } + return; + } + traverse.default(node, { ObjectExpression(path) { if (found) { @@ -28,7 +73,6 @@ export const updateArgsInCsfFile = async (node: t.Node, input: Recordvalue>entries when found, replace the value with the new value const a = argsProperty.get('value'); if (a.isObjectExpression()) { a.traverse({ diff --git a/code/lib/core-server/src/utils/save-from-controls/astify.ts b/code/lib/core-server/src/utils/save-from-controls/valueToAST.ts similarity index 54% rename from code/lib/core-server/src/utils/save-from-controls/astify.ts rename to code/lib/core-server/src/utils/save-from-controls/valueToAST.ts index 95378a732421..f09dd7b65a64 100644 --- a/code/lib/core-server/src/utils/save-from-controls/astify.ts +++ b/code/lib/core-server/src/utils/save-from-controls/valueToAST.ts @@ -1,8 +1,7 @@ import * as t from '@babel/types'; import * as babylon from '@babel/parser'; -import traverse from '@babel/traverse'; -export function astify(literal: T) { +export function valueToAST(literal: T): any { if (literal === null) { return t.nullLiteral(); } @@ -12,7 +11,10 @@ export function astify(literal: T) { allowReturnOutsideFunction: true, allowSuperOutsideMethod: true, }); - return traverse.removeProperties(ast); + + // @ts-expect-error (it's the contents of the function, it's an expression, trust me) + return ast.program.body[0]?.expression; + case 'number': return t.numericLiteral(literal); case 'string': @@ -20,18 +22,22 @@ export function astify(literal: T) { case 'boolean': return t.booleanLiteral(literal); case 'undefined': - return t.unaryExpression('void', t.numericLiteral(0), true); + return t.identifier('undefined'); default: if (Array.isArray(literal)) { - return t.arrayExpression(literal.map(astify)); + return t.arrayExpression(literal.map(valueToAST)); } return t.objectExpression( Object.keys(literal) .filter((k) => { - return typeof literal[k] !== 'undefined'; + // @ts-expect-error (it's a completely unknown object) + const value = literal[k]; + return typeof value !== 'undefined'; }) .map((k) => { - return t.objectProperty(t.stringLiteral(k), astify(literal[k])); + // @ts-expect-error (it's a completely unknown object) + const value = literal[k]; + return t.objectProperty(t.stringLiteral(k), valueToAST(value)); }) ); } From 6e9a4932900d39f424efbe7a54b292b4a4c221d1 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 11 Apr 2024 11:52:16 +0200 Subject: [PATCH 025/180] improve diff --- .../src/utils/save-from-controls/getDiff.ts | 2 +- .../mocks/csf-variances.stories.tsx | 15 +++++ .../update-args-in-csf-file.test.ts | 67 +++++++++++-------- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts index f243fdb522fe..df3462c9ea08 100644 --- a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts +++ b/code/lib/core-server/src/utils/save-from-controls/getDiff.ts @@ -18,7 +18,7 @@ import { diffLines } from 'diff'; */ export function getDiff(before: string, after: string): string { const context = 4; - return diffLines(before, after, { newlineIsToken: true }) + return diffLines(before, after, {}) .map((r, index, l) => { const lines = r.value.split('\n'); diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx b/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx index 1d7f81398e6a..e8eedcd3bccc 100644 --- a/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx +++ b/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx @@ -58,4 +58,19 @@ export const OrderedArgs = { render: (args) => , } satisfies Story; +// The order of both the properties of the story and the order or args should be preserved +export const HasPlayFunction = { + args: { + bordered: true, + initial: 'test2', + absolute: true, + }, + play: async ({ canvasElement }) => { + console.log('play'); + + canvasElement.style.backgroundColor = 'red'; + }, +} satisfies Story; + +// editing this should fail export const CSF2 = () => ; diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts index 23b3411cd63f..bcaee0576e92 100644 --- a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts @@ -49,9 +49,8 @@ describe('success', () => { args: { - initial: "bar", + - + initial: "test1", - - + bordered: true, + }, @@ -61,9 +60,8 @@ describe('success', () => { args: { - initial: "bar", + - + initial: "test1", - - + bordered: true, + }, @@ -73,9 +71,8 @@ describe('success', () => { args: { - initial: "bar", + - + initial: "test1", - - + bordered: true, + }, @@ -85,9 +82,8 @@ describe('success', () => { args: { - initial: "bar", + - + initial: "test1", - - + bordered: true, + }, @@ -127,24 +123,20 @@ describe('success', () => { - export const Empty = {} satisfies Story; + - + export const Empty = { - - + args: { - - + bordered: true, + initial: "test1", + }, + } satisfies Story; + - + + export const EmptyWithComment = { - // this is a useless comment, to test that it is preserved + - + args: { - - + bordered: true, + initial: "test1", + }, @@ -189,22 +181,39 @@ describe('success', () => { bordered: true, - initial: "test2", + - + initial: "test1", - + + }, render: (args) => , } satisfies Story; - ... + + // The order of both the properties of the story and the order or args should be preserved export const OrderedArgs = { args: { bordered: true, - initial: "test2", + - + initial: "test1", - + + absolute: true, }, render: (args) => , + } satisfies Story; + ... + export const HasPlayFunction = { + args: { + bordered: true, + + - initial: "test2", + - + + initial: "test1", + + + absolute: true, + }, + play: async ({ canvasElement }) => { + console.log("play"); ..." `); }); @@ -243,9 +252,8 @@ describe('success', () => { args: { - initial: "bar", + - + initial: "test1", - - + bordered: true, + }, @@ -301,29 +309,31 @@ describe('success', () => { args: { - myArray: ["foo", "bar"], - + myArray: ["FOO", "BAR"], - - - myArrayDeep: [["foo"], ["bar"]], + - + + myArray: ["FOO", "BAR"], + myArrayDeep: [["FOO"], ["BAR"]], - + + myBoolean: true, myFunction: () => {}, myNull: null, - myNumber: 42, + - + myNumber: 41, - + + myObject: { - foo: "bar", + - + FOO: "BAR", - + + }, - myString: "foo", + - + myString: "FOO", - + + myUndefined: undefined, }, } satisfies Story; @@ -331,9 +341,8 @@ describe('success', () => { export const None = { - args: {}, + - + args: { - - + myArray: ["FOO", "BAR"], + myArrayDeep: [["FOO"], ["BAR"]], + myBoolean: true, From 8fe99de8a7437b2cb3dcf3b819d1d262bc0b56a0 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 11 Apr 2024 17:03:44 +0200 Subject: [PATCH 026/180] support generating a new story cloned from an existing one --- .../duplicate-story-with-new-name.test.ts | 114 ++++++++++++++++++ .../duplicate-story-with-new-name.ts | 44 +++++++ .../save-from-controls/save-from-controls.ts | 11 +- code/ui/.storybook/manager.tsx | 5 +- 4 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts create mode 100644 code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts new file mode 100644 index 000000000000..42131e534578 --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts @@ -0,0 +1,114 @@ +/* eslint-disable no-underscore-dangle */ +import { describe, test, expect } from 'vitest'; +import { readCsf, printCsf } from '@storybook/csf-tools'; + +import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; +import { readFile } from 'fs/promises'; +import { join } from 'path'; +import { format } from 'prettier'; +import { getDiff } from './getDiff'; + +const makeTitle = (userTitle: string) => userTitle; + +const FILES = { + csfVariances: join(__dirname, 'mocks/csf-variances.stories.tsx'), + typescriptConstructs: join(__dirname, 'mocks/typescript-constructs.stories.tsx'), +}; + +describe('success', () => { + test('CSF Variances', async () => { + const before = await format(await readFile(FILES.csfVariances, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.csfVariances, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + + names.forEach((name) => { + duplicateStoryWithNewName(parsed, name, name + 'Duplicated'); + }); + + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + + // editing this should fail + export const CSF2 = () => ; + + + export const EmptyDuplicated = {} satisfies Story; + + export const EmptyWithCommentDuplicated = {} satisfies Story; + + export const OnlyArgsDuplicated = {} satisfies Story; + + + + export const RenderNoArgsDuplicated = { + + render: (args) => , + + } satisfies Story; + + + + export const RenderArgsDuplicated = { + + render: (args) => , + + } satisfies Story; + + + + export const RenderExistingArgsDuplicated = { + + render: (args) => , + + } satisfies Story; + + + + export const OrderedArgsDuplicated = { + + render: (args) => , + + } satisfies Story; + + + + export const HasPlayFunctionDuplicated = { + + play: async ({ canvasElement }) => { + + console.log("play"); + + + + canvasElement.style.backgroundColor = "red"; + + }, + + } satisfies Story; + + + + export const CSF2Duplicated = () => ( + + + + ); + + " + `); + }); + test('Typescript Constructs', async () => { + const before = await format(await readFile(FILES.typescriptConstructs, 'utf-8'), { + parser: 'typescript', + }); + const CSF = await readCsf(FILES.typescriptConstructs, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + + names.forEach((name) => { + duplicateStoryWithNewName(parsed, name, name + 'Duplicated'); + }); + + const after = await format(printCsf(parsed).code, { + parser: 'typescript', + }); + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + initial: "bar", + }, + }; + + + export const CastDuplicated: Story = {}; + + export const AsDuplicated = {} as Story; + + export const SatisfiesDuplicated = {} satisfies Story; + + export const NoneDuplicated = {}; + + " + `); + }); +}); diff --git a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts new file mode 100644 index 000000000000..6651fbc2ead9 --- /dev/null +++ b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-underscore-dangle */ +import type { CsfFile } from '@storybook/csf-tools'; +import * as traverse from '@babel/traverse'; +import * as t from '@babel/types'; + +type In = ReturnType; + +export const duplicateStoryWithNewName = (csfFile: In, storyName: string, newStoryName: string) => { + const node = csfFile._storyExports[storyName]; + const cloned = t.cloneNode(node) as t.VariableDeclarator; + + let found = false; + traverse.default(cloned, { + Identifier(path) { + if (found) { + return; + } + + if (path.node.name === storyName) { + found = true; + path.node.name = newStoryName; + } + }, + ObjectProperty(path) { + const key = path.get('key'); + if (key.isIdentifier() && key.node.name === 'args') { + path.remove(); + } + }, + + noScope: true, + }); + + traverse.default(csfFile._ast, { + Program(path) { + path.pushContainer( + 'body', + t.exportNamedDeclaration(t.variableDeclaration('const', [cloned])) + ); + }, + }); + + return cloned; +}; diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 7ac906c16fdb..e74c632b1f95 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -6,6 +6,7 @@ import type { OptionsWithRequiredCache } from '../whats-new'; import { readCsf, writeCsf } from '@storybook/csf-tools'; import { join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; +import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; // import { sendTelemetryError } from '../withTelemetry'; interface RequestSaveStoryPayload { @@ -38,13 +39,17 @@ export function initializeSaveFromControls( // find the export_name for the id const [name] = - Object.entries(parsed._stories).find(([key, value]) => value.id.endsWith(`--${id}`)) || []; + Object.entries(parsed._stories).find(([_, value]) => value.id.endsWith(`--${id}`)) || []; let node; - // find the AST node for the export_name, if none can be found, create a new story if (!name) { - node = undefined; + throw new Error(`no story found with id: ${id}`); + } + + // find the AST node for the export_name, if none can be found, create a new story + if (data.name) { + node = duplicateStoryWithNewName(parsed, data.name, name); throw new Error(`creation of new story: not yet implemented`); } else { node = csf.getStoryExport(name); diff --git a/code/ui/.storybook/manager.tsx b/code/ui/.storybook/manager.tsx index d7a53b88ea81..f3dbe1e4d2cc 100644 --- a/code/ui/.storybook/manager.tsx +++ b/code/ui/.storybook/manager.tsx @@ -19,7 +19,7 @@ interface RequestSaveStoryPayload { // The updated list of set args args: Record; // The exported name of the Story -> This information doesn't exist in the index.json yet. - name: string; + name?: string; } addons.register('my-addon', (api) => { @@ -50,12 +50,11 @@ addons.register('my-addon', (api) => { -
- ) : null; - }, - }); -}); From 463ea88a80ca3bc26e62316b65610abd0092abf7 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Fri, 12 Apr 2024 14:51:19 +0200 Subject: [PATCH 049/180] Fix cloning issue in duplicateStoryWithNewName function --- .../utils/save-from-controls/duplicate-story-with-new-name.ts | 4 ++++ .../src/utils/save-from-controls/save-from-controls.ts | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts index 6651fbc2ead9..05dae1d39e38 100644 --- a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts +++ b/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts @@ -9,6 +9,10 @@ export const duplicateStoryWithNewName = (csfFile: In, storyName: string, newSto const node = csfFile._storyExports[storyName]; const cloned = t.cloneNode(node) as t.VariableDeclarator; + if (!cloned) { + throw new Error(`cannot clone Node`); + } + let found = false; traverse.default(cloned, { Identifier(path) { diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index e74c632b1f95..7853aecff365 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -49,8 +49,7 @@ export function initializeSaveFromControls( // find the AST node for the export_name, if none can be found, create a new story if (data.name) { - node = duplicateStoryWithNewName(parsed, data.name, name); - throw new Error(`creation of new story: not yet implemented`); + node = duplicateStoryWithNewName(parsed, name, data.name); } else { node = csf.getStoryExport(name); } From 4091421ede5f284a53ae095fcff9402da1b39068 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 12 Apr 2024 16:24:12 +0200 Subject: [PATCH 050/180] Restore original focus style for solid buttons --- code/ui/components/src/components/Button/Button.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/code/ui/components/src/components/Button/Button.tsx b/code/ui/components/src/components/Button/Button.tsx index d4a42154cd43..6e77f668b8df 100644 --- a/code/ui/components/src/components/Button/Button.tsx +++ b/code/ui/components/src/components/Button/Button.tsx @@ -237,13 +237,7 @@ const StyledButton = styled('button', { }, '&:focus': { - boxShadow: `${ - variant === 'solid' - ? theme.base === 'light' - ? rgba(darken(0.2, theme.color.secondary), 1) - : 'rgba(255, 255, 255, 0.75)' - : rgba(theme.color.secondary, 1) - } 0 0 0 1px inset`, + boxShadow: `${rgba(theme.color.secondary, 1)} 0 0 0 1px inset`, outline: 'none', }, From 6de99c001cd0a946cf3ce1a9c93976e0cf2f11bc Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 15 Apr 2024 09:04:49 +0200 Subject: [PATCH 051/180] Adjust top position of code in search field --- code/ui/manager/src/components/sidebar/Search.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 441653e44234..8708a05dad6a 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -130,7 +130,7 @@ const Input = styled.input(({ theme }) => ({ const FocusKey = styled.code(({ theme }) => ({ position: 'absolute', - top: 8, + top: 6, right: 9, height: 16, zIndex: 1, From 83a2c1aeb641a6b85c2ee48eb5d0ff358dab21ba Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 15 Apr 2024 09:18:37 +0200 Subject: [PATCH 052/180] Update exports --- code/ui/manager/src/globals/exports.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 794741a69e8b..d3da898e844c 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -133,6 +133,8 @@ export default { 'CHANNEL_CREATED', 'CHANNEL_WS_DISCONNECT', 'CONFIG_ERROR', + 'CREATE_NEW_STORYFILE', + 'CREATE_NEW_STORYFILE_RESULT', 'CURRENT_STORY_WAS_SET', 'DOCS_PREPARED', 'DOCS_RENDERED', From c8f10028937013725ce29f35561e99de1a0c8028 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 15 Apr 2024 12:21:35 +0200 Subject: [PATCH 053/180] Fix makeTitle fallback value in save-from-controls.ts --- .../src/utils/save-from-controls/save-from-controls.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 7853aecff365..3b4e65f0da16 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -32,7 +32,7 @@ export function initializeSaveFromControls( // open the story file const csf = await readCsf(location, { - makeTitle: (userTitle: string) => userTitle, + makeTitle: (userTitle: string) => userTitle || 'myTitle', }); const parsed = csf.parse(); From 71ff85bb9075271d50bc70729fb12e64e4bc2e0a Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 15 Apr 2024 12:55:24 +0200 Subject: [PATCH 054/180] fix bad ts --- code/addons/controls/src/ControlsPanel.tsx | 2 +- code/addons/controls/src/SaveFromControls.stories.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index 7eebdc5c6bd2..adf4db26cfeb 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -12,7 +12,7 @@ import { import { PureArgsTable as ArgsTable, type PresetColor, type SortType } from '@storybook/blocks'; import { styled } from '@storybook/theming'; import type { ArgTypes } from '@storybook/types'; -import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST } from '@storybook/core-events'; import { PARAM_KEY } from './constants'; import { SaveFromControls } from './SaveFromControls'; diff --git a/code/addons/controls/src/SaveFromControls.stories.tsx b/code/addons/controls/src/SaveFromControls.stories.tsx index 39204f2d2488..6b9345da0bc0 100644 --- a/code/addons/controls/src/SaveFromControls.stories.tsx +++ b/code/addons/controls/src/SaveFromControls.stories.tsx @@ -22,12 +22,12 @@ type Story = StoryObj; export const Default: Story = {}; -export const Creating: Story = { +export const Creating = { play: async ({ canvasElement }) => { const createButton = await within(canvasElement).findByRole('button', { name: /Create/i }); await fireEvent.click(createButton); }, -}; +} satisfies Story; export const Created: Story = { play: async (context) => { From 37dbae3ccd689e5a4b387125ef8e796547cbdf2f Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 15 Apr 2024 13:05:05 +0200 Subject: [PATCH 055/180] Update directory path for controls addon in .storybook/main.ts --- code/ui/.storybook/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index ab3df9b98610..85ed32cf08c4 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -20,7 +20,7 @@ const allStories = [ titlePrefix: '@blocks', }, { - directory: '../../addons/controls', // TODO other addons? + directory: '../../addons/controls/src', // TODO other addons? titlePrefix: '@addons', }, ]; From 51e2294c6c2e1198aec6d4e1ba91696c2344bdf8 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 15 Apr 2024 13:40:10 +0200 Subject: [PATCH 056/180] Don't hide reset button in addon panel --- code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx index e874da243d7a..8ad18ff4257c 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx @@ -377,7 +377,7 @@ export const ArgsTable: FC = (props) => { Control{' '} - {!isLoading && !inAddonPanel && resetArgs && ( + {!isLoading && resetArgs && ( resetArgs()} title="Reset controls"> From 46c8cc097706b88bc47e7d5a52be59d89e694d30 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 15 Apr 2024 13:48:15 +0200 Subject: [PATCH 057/180] Only show SaveFromControls in dev mode --- code/addons/controls/src/ControlsPanel.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index adf4db26cfeb..75616ea71d58 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -1,6 +1,7 @@ import { dequal as deepEqual } from 'dequal'; import type { FC } from 'react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { global } from '@storybook/global'; import { useArgs, useGlobals, @@ -108,7 +109,7 @@ export const ControlsPanel: FC = () => { sort={sort} isLoading={isLoading} /> - {hasControls && hasUpdatedArgs && ( + {hasControls && hasUpdatedArgs && global.CONFIG_TYPE === 'DEVELOPMENT' && ( )} From 8d21fb2cf04e025f578da2aae06b28bf6dbb7d9b Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 15 Apr 2024 13:59:07 +0200 Subject: [PATCH 058/180] Add typings.d.ts file for controls addon --- code/addons/controls/src/typings.d.ts | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 code/addons/controls/src/typings.d.ts diff --git a/code/addons/controls/src/typings.d.ts b/code/addons/controls/src/typings.d.ts new file mode 100644 index 000000000000..c51fcc2f2f86 --- /dev/null +++ b/code/addons/controls/src/typings.d.ts @@ -0,0 +1,29 @@ +/* eslint-disable no-underscore-dangle, @typescript-eslint/naming-convention */ + +declare var DOCS_OPTIONS: any; +declare var CONFIG_TYPE: 'DEVELOPMENT' | 'PRODUCTION'; +declare var PREVIEW_URL: any; + +declare var __STORYBOOK_ADDONS_MANAGER: any; +declare var RELEASE_NOTES_DATA: any; + +declare var FEATURES: import('@storybook/types').StorybookConfigRaw['features']; + +declare var REFS: any; +declare var VERSIONCHECK: any; +declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; + +declare var __REACT__: any; +declare var __REACT_DOM__: any; +declare var __STORYBOOK_COMPONENTS__: any; +declare var __STORYBOOK_CHANNELS__: any; +declare var __STORYBOOK_CORE_EVENTS__: any; +declare var __STORYBOOK_CORE_EVENTS_MANAGER_ERRORS__: any; +declare var __STORYBOOK_ROUTER__: any; +declare var __STORYBOOK_THEMING__: any; +declare var __STORYBOOK_API__: any; +declare var __STORYBOOK_ICONS__: any; +declare var __STORYBOOK_CLIENT_LOGGER__: any; +declare var __STORYBOOK_ADDONS_CHANNEL__: any; +declare var __STORYBOOK_TYPES__: any; +declare var sendTelemetryError: (error: any) => void; From 6778ee7faa83bde2ac5252b8a042e0e47c9e88d0 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 15 Apr 2024 21:18:25 +0200 Subject: [PATCH 059/180] Allow numbers in story name --- code/addons/controls/src/SaveFromControls.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/addons/controls/src/SaveFromControls.tsx b/code/addons/controls/src/SaveFromControls.tsx index 9ab36685e0b6..aee2387e2c71 100644 --- a/code/addons/controls/src/SaveFromControls.tsx +++ b/code/addons/controls/src/SaveFromControls.tsx @@ -108,15 +108,16 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom }; const onChange = (e: React.ChangeEvent) => { const value = e.target.value - .replace(/[^a-z-_ ]/gi, '') - .replaceAll(/([-_ ]+[a-z])/gi, (match) => match.toUpperCase().replace(/[-_ ]/g, '')); + .replace(/^[^a-z]/i, '') + .replace(/[^a-z0-9-_ ]/gi, '') + .replaceAll(/([-_ ]+[a-z0-9])/gi, (match) => match.toUpperCase().replace(/[-_ ]/g, '')); setStoryName(value.charAt(0).toUpperCase() + value.slice(1)); }; const onSubmitForm = (e: React.FormEvent) => { e.preventDefault(); if (saving) return; setSaving(true); - createStory(storyName.replaceAll(/[^a-z]/gi, '')); + createStory(storyName.replace(/^[^a-z]/i, '').replaceAll(/[^a-z0-9]/gi, '')); setTimeout(() => { setSaving(false); setCreating(false); From b42e1e23ed19b9c91cd0866c2aaa8fe2634e090d Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 15 Apr 2024 21:44:16 +0200 Subject: [PATCH 060/180] Improve error handling and fix edge cases --- code/addons/controls/src/manager.tsx | 79 ++++++++++--- .../core-server/src/presets/common-preset.ts | 2 +- .../save-from-controls/save-from-controls.ts | 109 +++++++++++------- 3 files changed, 135 insertions(+), 55 deletions(-) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 760d3d6d7c31..e1be06668b60 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -1,10 +1,10 @@ import React from 'react'; -import { addons, types, useArgTypes } from '@storybook/manager-api'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; +import { SAVE_STORY_RESULT } from '@storybook/core-events'; +import { addons, types, useArgTypes } from '@storybook/manager-api'; +import { color } from '@storybook/theming'; import { ControlsPanel } from './ControlsPanel'; import { ADDON_ID, PARAM_KEY } from './constants'; -import { AlertIcon, CheckIcon } from '@storybook/icons'; -import { SAVE_STORY_RESULT } from '@storybook/core-events'; function Title() { const rows = useArgTypes(); @@ -23,6 +23,16 @@ function Title() { ); } +// It might take a little while for a new story to be available, so we retry a few times +const selectNewStory = (selectStory: (id: string) => void, storyId: string, attempt = 1) => { + if (attempt > 5) return; + try { + selectStory(storyId); + } catch (e) { + setTimeout(() => selectNewStory(selectStory, storyId, attempt + 1), 500); + } +}; + addons.register(ADDON_ID, (api) => { addons.add(ADDON_ID, { title: Title, @@ -40,20 +50,59 @@ addons.register(ADDON_ID, (api) => { }, }); - api.on(SAVE_STORY_RESULT, (data) => { - if (data.error) { - api.addNotification({ - content: { headline: `Error saving story`, subHeadline: ` ${data.error}` }, - id: 'save-story-error', - icon: , - }); - } else { + api.on( + SAVE_STORY_RESULT, + ({ errorMessage, newStoryId, newStoryName, sourceFileName, sourceStoryName }) => { + if (errorMessage) { + api.addNotification({ + id: 'save-story-error', + content: { + headline: newStoryName ? 'Failed to add new story' : 'Failed to update story', + subHeadline: newStoryName ? ( + <> + Could not add story to {sourceFileName}. {errorMessage} + + ) : ( + <> + Could not update story in {sourceFileName}. {errorMessage} + + ), + }, + duration: 20_000, + icon: { + name: 'failed', + color: color.negative, + }, + }); + return; + } + + if (newStoryId) { + const data = api.getCurrentStoryData(); + if (data.type === 'story') api.resetStoryArgs(data); + selectNewStory(api.selectStory, newStoryId); + } + api.addNotification({ - content: { headline: `Story saved`, subHeadline: ` ${data.id}` }, - duration: 2000, - icon: , id: 'save-story-success', + content: { + headline: newStoryName ? 'Story created' : 'Story saved', + subHeadline: newStoryName ? ( + <> + Added story {newStoryName} based on {sourceStoryName}. + + ) : ( + <> + Updated story {sourceStoryName}. + + ), + }, + duration: 8_000, + icon: { + name: 'passed', + color: color.positive, + }, }); } - }); + ); }); diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index ca665bc08510..5cbe1737dbca 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -88,7 +88,7 @@ export const favicon = async ( if (flatlist.length > 1) { logger.warn(dedent` Looks like multiple favicons were detected. Using the first one. - + ${flatlist.join(', ')} `); } diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 3b4e65f0da16..770d49f354cb 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -1,10 +1,12 @@ /* eslint-disable no-underscore-dangle */ -import type { CoreConfig } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; -import type { OptionsWithRequiredCache } from '../whats-new'; +import { storyNameFromExport, toId } from '@storybook/csf'; import { readCsf, writeCsf } from '@storybook/csf-tools'; -import { join } from 'path'; +import type { CoreConfig } from '@storybook/types'; + +import type { OptionsWithRequiredCache } from '../whats-new'; +import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; // import { sendTelemetryError } from '../withTelemetry'; @@ -20,56 +22,85 @@ interface RequestSaveStoryPayload { name?: string; } +type RequestSaveStoryResultPayload = ( + | { id: string; success: true } + | { id: string; success: false; errorMessage: string } +) & { + newStoryId?: string; + newStoryName?: string; + sourceFileName?: string; + sourceStoryName?: string; +}; + export function initializeSaveFromControls( channel: Channel, options: OptionsWithRequiredCache, coreOptions: CoreConfig ) { - channel.on(SAVE_STORY_REQUEST, async (data: RequestSaveStoryPayload) => { - const id = data.id.split('--')[1]; - try { - const location = join(process.cwd(), data.importPath); + channel.on( + SAVE_STORY_REQUEST, + async ({ id, importPath, args, name }: RequestSaveStoryPayload) => { + let newStoryId; + let newStoryName; + let sourceFileName; + let sourceFilePath; + let sourceStoryName; - // open the story file - const csf = await readCsf(location, { - makeTitle: (userTitle: string) => userTitle || 'myTitle', - }); + try { + sourceFileName = basename(importPath); + sourceFilePath = join(process.cwd(), importPath); - const parsed = csf.parse(); + // open the story file + const csf = await readCsf(sourceFilePath, { + makeTitle: (userTitle: string) => userTitle || 'myTitle', + }); - // find the export_name for the id - const [name] = - Object.entries(parsed._stories).find(([_, value]) => value.id.endsWith(`--${id}`)) || []; + const parsed = csf.parse(); + const stories = Object.entries(parsed._stories); - let node; + const [componentId, storyId] = id.split('--'); + newStoryName = name && storyNameFromExport(name); + newStoryId = newStoryName && toId(componentId, newStoryName); - if (!name) { - throw new Error(`no story found with id: ${id}`); - } + // find the export_name for the id + const [storyName] = stories.find(([key, value]) => value.id.endsWith(`--${storyId}`)) || []; + if (!storyName) throw new Error(`Source story not found.`); + if (name && csf.getStoryExport(name)) throw new Error(`Story already exists.`); - // find the AST node for the export_name, if none can be found, create a new story - if (data.name) { - node = duplicateStoryWithNewName(parsed, name, data.name); - } else { - node = csf.getStoryExport(name); - } + sourceStoryName = storyNameFromExport(storyName); - // modify the AST node with the new args - updateArgsInCsfFile(node, data.args); + const node = name + ? duplicateStoryWithNewName(parsed, storyName, name) + : csf.getStoryExport(storyName); - // save the file - await writeCsf(csf, location); + // modify the AST node with the new args + updateArgsInCsfFile(node, args); - channel.emit(SAVE_STORY_RESULT, { id: data.id, success: true }); - } catch (e: any) { - // sendTelemetryError(channel, e); - channel.emit(SAVE_STORY_RESULT, { - id: data.id, - success: false, - error: `writing to CSF-file failed, is it a valid CSF-file?`, - }); + // save the file + await writeCsf(csf, sourceFilePath); - console.error(e.stack || e.message || e.toString()); + channel.emit(SAVE_STORY_RESULT, { + id, + success: true, + newStoryId, + newStoryName, + sourceFileName, + sourceStoryName, + } satisfies RequestSaveStoryResultPayload); + } catch (e: any) { + // sendTelemetryError(channel, e); + channel.emit(SAVE_STORY_RESULT, { + id, + success: false, + errorMessage: e.message, + newStoryId, + newStoryName, + sourceFileName, + sourceStoryName, + } satisfies RequestSaveStoryResultPayload); + + console.error(`Error writing to ${sourceFilePath}:`, e.stack || e.message || e.toString()); + } } - }); + ); } From 9a8d83e33c140412399d901237b2be539a2925a4 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 15 Apr 2024 21:44:56 +0200 Subject: [PATCH 061/180] Fix Storybook structure --- code/ui/.storybook/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index 85ed32cf08c4..7c67fa3d58d8 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -21,7 +21,7 @@ const allStories = [ }, { directory: '../../addons/controls/src', // TODO other addons? - titlePrefix: '@addons', + titlePrefix: '@addons/controls', }, ]; From 3e7059bddd432038b787d21bd3aae773b356a525 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 16 Apr 2024 12:05:13 +0200 Subject: [PATCH 062/180] Move error display to modal and refactor channel request/response messaging --- code/addons/controls/src/ControlsPanel.tsx | 36 +--- .../controls/src/SaveFromControls.stories.tsx | 23 ++- code/addons/controls/src/SaveFromControls.tsx | 39 +++-- code/addons/controls/src/manager.tsx | 148 +++++++++++------ code/lib/core-events/src/index.ts | 4 +- .../save-from-controls/save-from-controls.ts | 157 +++++++++--------- code/ui/manager/src/globals/exports.ts | 2 +- 7 files changed, 229 insertions(+), 180 deletions(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index 75616ea71d58..6a2b678444c1 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -1,6 +1,5 @@ import { dequal as deepEqual } from 'dequal'; -import type { FC } from 'react'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import { global } from '@storybook/global'; import { useArgs, @@ -8,12 +7,10 @@ import { useArgTypes, useParameter, useStorybookState, - useStorybookApi, } from '@storybook/manager-api'; import { PureArgsTable as ArgsTable, type PresetColor, type SortType } from '@storybook/blocks'; import { styled } from '@storybook/theming'; import type { ArgTypes } from '@storybook/types'; -import { SAVE_STORY_REQUEST } from '@storybook/core-events'; import { PARAM_KEY } from './constants'; import { SaveFromControls } from './SaveFromControls'; @@ -39,8 +36,12 @@ interface ControlsParameters { presetColors?: PresetColor[]; } -export const ControlsPanel: FC = () => { - const api = useStorybookApi(); +interface ControlsPanelProps { + saveStory: () => Promise; + createStory: (storyName: string) => Promise; +} + +export const ControlsPanel = ({ saveStory, createStory }: ControlsPanelProps) => { const [isLoading, setIsLoading] = useState(true); const [args, updateArgs, resetArgs, initialArgs] = useArgs(); const [globals] = useGlobals(); @@ -72,29 +73,6 @@ export const ControlsPanel: FC = () => { [args, initialArgs] ); - const saveStory = useCallback(() => { - const data = api.getCurrentStoryData(); - - api.emit(SAVE_STORY_REQUEST, { - args: currentArgsRef.current, - id: data.id, - importPath: data.importPath, - }); - }, [api]); - const createStory = useCallback( - (name: string) => { - const data = api.getCurrentStoryData(); - - api.emit(SAVE_STORY_REQUEST, { - args: currentArgsRef.current, - id: data.id, - importPath: data.importPath, - name, - }); - }, - [api] - ); - return ( Promise.resolve(fn(action('saveStory'))(...args)), + createStory: (...args) => Promise.resolve(fn(action('createStory'))(...args)), resetArgs: fn(action('resetArgs')), }, parameters: { @@ -44,3 +44,22 @@ export const Created: Story = { await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); }, }; + +export const CreatingFailed: Story = { + args: { + createStory: () => Promise.reject(new Error('Story already exists.')), + }, + play: async (context) => { + await Creating.play(context); + + await waitFor(async () => { + const dialog = await within(document.body).findByRole('dialog'); + const input = await within(dialog).findByRole('textbox'); + await userEvent.type(input, 'MyNewStory'); + const submitButton = await within(dialog).findByRole('button', { name: /Create/i }); + await userEvent.click(submitButton); + }); + + await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); + }, +}; diff --git a/code/addons/controls/src/SaveFromControls.tsx b/code/addons/controls/src/SaveFromControls.tsx index aee2387e2c71..7d631fdd098b 100644 --- a/code/addons/controls/src/SaveFromControls.tsx +++ b/code/addons/controls/src/SaveFromControls.tsx @@ -84,8 +84,8 @@ const ModalInput = styled(Form.Input)(({ theme }) => ({ })); type SaveFromControlsProps = { - saveStory: () => void; - createStory: (storyName: string) => void; + saveStory: () => Promise; + createStory: (storyName: string) => Promise; resetArgs: () => void; }; @@ -94,11 +94,19 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom const [saving, setSaving] = React.useState(false); const [creating, setCreating] = React.useState(false); const [storyName, setStoryName] = React.useState(''); + const [errorMessage, setErrorMessage] = React.useState(null); - const onSaveStory = () => { - setSaving(true); - saveStory(); - setTimeout(() => setSaving(false), 1000); + const onSaveStory = async () => { + if (saving) return; + try { + setErrorMessage(null); + setSaving(true); + await saveStory(); + setSaving(false); + } catch (e: any) { + setErrorMessage(e.message); + setSaving(false); + } }; const onShowForm = () => { @@ -113,15 +121,19 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom .replaceAll(/([-_ ]+[a-z0-9])/gi, (match) => match.toUpperCase().replace(/[-_ ]/g, '')); setStoryName(value.charAt(0).toUpperCase() + value.slice(1)); }; - const onSubmitForm = (e: React.FormEvent) => { - e.preventDefault(); + const onSubmitForm = async (event: React.FormEvent) => { + event.preventDefault(); if (saving) return; - setSaving(true); - createStory(storyName.replace(/^[^a-z]/i, '').replaceAll(/[^a-z0-9]/gi, '')); - setTimeout(() => { - setSaving(false); + try { + setErrorMessage(null); + setSaving(true); + await createStory(storyName.replace(/^[^a-z]/i, '').replaceAll(/[^a-z0-9]/gi, '')); setCreating(false); - }, 1000); + setSaving(false); + } catch (e: any) { + setErrorMessage(e.message); + setSaving(false); + } }; return ( @@ -199,6 +211,7 @@ export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFrom + {errorMessage && {errorMessage}} diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index e1be06668b60..b1f60e015a72 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; -import { SAVE_STORY_RESULT } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; +import type { API } from '@storybook/manager-api'; import { addons, types, useArgTypes } from '@storybook/manager-api'; import { color } from '@storybook/theming'; import { ControlsPanel } from './ControlsPanel'; @@ -25,7 +26,7 @@ function Title() { // It might take a little while for a new story to be available, so we retry a few times const selectNewStory = (selectStory: (id: string) => void, storyId: string, attempt = 1) => { - if (attempt > 5) return; + if (attempt > 10) return; try { selectStory(storyId); } catch (e) { @@ -33,7 +34,63 @@ const selectNewStory = (selectStory: (id: string) => void, storyId: string, atte } }; +interface ResponseData { + id: string; + success: boolean; + error?: string; + payload?: any; +} + +const requestResponse = ( + api: API, + requestEvent: string, + responseEvent: string, + payload: any, + timeout = 5000 +) => { + let timeoutId: NodeJS.Timeout; + return new Promise((resolve, reject) => { + const requestId = Math.random().toString(16).slice(2); + const responseHandler = (response: ResponseData) => { + if (response.id !== requestId) return; + clearTimeout(timeoutId); + api.off(responseEvent, responseHandler); + if (response.success) resolve(response.payload); + else reject(new Error(response.error)); + }; + + api.emit(requestEvent, { id: requestId, payload }); + api.on(responseEvent, responseHandler); + + timeoutId = setTimeout(() => { + api.off(responseEvent, responseHandler); + reject(new Error('Timed out waiting for response')); + }, timeout); + }); +}; + addons.register(ADDON_ID, (api) => { + const saveStory = async () => { + const data = api.getCurrentStoryData(); + if (data.type !== 'story') throw new Error('Not a story'); + return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { + args: data.args, + csfId: data.id, + importPath: data.importPath, + }); + }; + + const createStory = async (name: string) => { + const data = api.getCurrentStoryData(); + if (data.type !== 'story') throw new Error('Not a story'); + return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { + args: data.args, + csfId: data.id, + importPath: data.importPath, + name, + }); + }; + addons.add(ADDON_ID, { title: Title, type: types.PANEL, @@ -44,65 +101,46 @@ addons.register(ADDON_ID, (api) => { } return ( - + ); }, }); - api.on( - SAVE_STORY_RESULT, - ({ errorMessage, newStoryId, newStoryName, sourceFileName, sourceStoryName }) => { - if (errorMessage) { - api.addNotification({ - id: 'save-story-error', - content: { - headline: newStoryName ? 'Failed to add new story' : 'Failed to update story', - subHeadline: newStoryName ? ( - <> - Could not add story to {sourceFileName}. {errorMessage} - - ) : ( - <> - Could not update story in {sourceFileName}. {errorMessage} - - ), - }, - duration: 20_000, - icon: { - name: 'failed', - color: color.negative, - }, - }); - return; - } + api.on(SAVE_STORY_RESPONSE, ({ success, payload }) => { + if (!success) return; - if (newStoryId) { - const data = api.getCurrentStoryData(); - if (data.type === 'story') api.resetStoryArgs(data); - selectNewStory(api.selectStory, newStoryId); - } + const { newStoryId, newStoryName, sourceStoryName } = payload; - api.addNotification({ - id: 'save-story-success', - content: { - headline: newStoryName ? 'Story created' : 'Story saved', - subHeadline: newStoryName ? ( - <> - Added story {newStoryName} based on {sourceStoryName}. - - ) : ( - <> - Updated story {sourceStoryName}. - - ), - }, - duration: 8_000, - icon: { - name: 'passed', - color: color.positive, - }, - }); + if (newStoryId) { + const data = api.getCurrentStoryData(); + if (data.type === 'story') api.resetStoryArgs(data); + selectNewStory(api.selectStory, newStoryId); } - ); + + api.addNotification({ + id: 'save-story-success', + content: { + headline: newStoryName ? 'Story created' : 'Story saved', + subHeadline: newStoryName ? ( + <> + Added story {newStoryName} based on {sourceStoryName}. + + ) : ( + <> + Updated story {sourceStoryName}. + + ), + }, + duration: 8_000, + onClick: ({ onDismiss }) => { + onDismiss(); + if (newStoryId) api.selectStory(newStoryId); + }, + icon: { + name: 'passed', + color: color.positive, + }, + }); + }); }); diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 5b29d5175481..37452d0a8d76 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -77,7 +77,7 @@ enum events { FILE_COMPONENT_SEARCH = 'fileComponentSearch', FILE_COMPONENT_SEARCH_RESULT = 'fileComponentSearchResult', SAVE_STORY_REQUEST = 'saveStoryRequest', - SAVE_STORY_RESULT = 'saveStoryResult', + SAVE_STORY_RESPONSE = 'saveStoryResponse', CREATE_NEW_STORYFILE = 'createNewStoryfile', CREATE_NEW_STORYFILE_RESULT = 'createNewStoryfileResult', } @@ -139,7 +139,7 @@ export const { TOGGLE_WHATS_NEW_NOTIFICATIONS, TELEMETRY_ERROR, SAVE_STORY_REQUEST, - SAVE_STORY_RESULT, + SAVE_STORY_RESPONSE, } = events; export interface WhatsNewCache { diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts index 770d49f354cb..44f1b4c1ecaf 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts @@ -1,106 +1,107 @@ /* eslint-disable no-underscore-dangle */ import type { Channel } from '@storybook/channels'; -import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; import { readCsf, writeCsf } from '@storybook/csf-tools'; -import type { CoreConfig } from '@storybook/types'; -import type { OptionsWithRequiredCache } from '../whats-new'; import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; // import { sendTelemetryError } from '../withTelemetry'; -interface RequestSaveStoryPayload { - // The id of the request. It might be simply the story Title +interface SaveStoryRequest { id: string; - // The path of the Story - importPath: string; - // The updated list of set args - args: Record; - // The exported name of the Story -> This information doesn't exist in the index.json yet. - name?: string; + payload: { + csfId: string; + importPath: string; + args: Record; + name?: string; + }; } -type RequestSaveStoryResultPayload = ( +type SaveStoryResponse = ( | { id: string; success: true } - | { id: string; success: false; errorMessage: string } + | { id: string; success: false; error: string } ) & { - newStoryId?: string; - newStoryName?: string; - sourceFileName?: string; - sourceStoryName?: string; + payload: { + csfId: string; + newStoryId?: string; + newStoryName?: string; + sourceFileName?: string; + sourceStoryName?: string; + }; }; -export function initializeSaveFromControls( - channel: Channel, - options: OptionsWithRequiredCache, - coreOptions: CoreConfig -) { - channel.on( - SAVE_STORY_REQUEST, - async ({ id, importPath, args, name }: RequestSaveStoryPayload) => { - let newStoryId; - let newStoryName; - let sourceFileName; - let sourceFilePath; - let sourceStoryName; - - try { - sourceFileName = basename(importPath); - sourceFilePath = join(process.cwd(), importPath); - - // open the story file - const csf = await readCsf(sourceFilePath, { - makeTitle: (userTitle: string) => userTitle || 'myTitle', - }); - - const parsed = csf.parse(); - const stories = Object.entries(parsed._stories); - - const [componentId, storyId] = id.split('--'); - newStoryName = name && storyNameFromExport(name); - newStoryId = newStoryName && toId(componentId, newStoryName); - - // find the export_name for the id - const [storyName] = stories.find(([key, value]) => value.id.endsWith(`--${storyId}`)) || []; - if (!storyName) throw new Error(`Source story not found.`); - if (name && csf.getStoryExport(name)) throw new Error(`Story already exists.`); - - sourceStoryName = storyNameFromExport(storyName); - - const node = name - ? duplicateStoryWithNewName(parsed, storyName, name) - : csf.getStoryExport(storyName); - - // modify the AST node with the new args - updateArgsInCsfFile(node, args); - - // save the file - await writeCsf(csf, sourceFilePath); - - channel.emit(SAVE_STORY_RESULT, { - id, - success: true, +export function initializeSaveFromControls(channel: Channel) { + channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: SaveStoryRequest) => { + const { csfId, importPath, args, name } = payload; + + let newStoryId; + let newStoryName; + let sourceFileName; + let sourceFilePath; + let sourceStoryName; + + try { + sourceFileName = basename(importPath); + sourceFilePath = join(process.cwd(), importPath); + + // open the story file + const csf = await readCsf(sourceFilePath, { + makeTitle: (userTitle: string) => userTitle || 'myTitle', + }); + + const parsed = csf.parse(); + const stories = Object.entries(parsed._stories); + + const [componentId, storyId] = csfId.split('--'); + newStoryName = name && storyNameFromExport(name); + newStoryId = newStoryName && toId(componentId, newStoryName); + + // find the export_name for the id + const [storyName] = stories.find(([key, value]) => value.id.endsWith(`--${storyId}`)) || []; + if (!storyName) throw new Error(`Source story not found.`); + if (name && csf.getStoryExport(name)) throw new Error(`Story already exists.`); + + sourceStoryName = storyNameFromExport(storyName); + + const node = name + ? duplicateStoryWithNewName(parsed, storyName, name) + : csf.getStoryExport(storyName); + + // modify the AST node with the new args + updateArgsInCsfFile(node, args); + + // save the file + await writeCsf(csf, sourceFilePath); + + channel.emit(SAVE_STORY_RESPONSE, { + id, + success: true, + payload: { + csfId, newStoryId, newStoryName, sourceFileName, sourceStoryName, - } satisfies RequestSaveStoryResultPayload); - } catch (e: any) { - // sendTelemetryError(channel, e); - channel.emit(SAVE_STORY_RESULT, { - id, - success: false, - errorMessage: e.message, + }, + } satisfies SaveStoryResponse); + } catch (e: any) { + // sendTelemetryError(channel, e); + channel.emit(SAVE_STORY_RESPONSE, { + id, + success: false, + error: e.message, + payload: { + csfId, newStoryId, newStoryName, sourceFileName, sourceStoryName, - } satisfies RequestSaveStoryResultPayload); + }, + } satisfies SaveStoryResponse); - console.error(`Error writing to ${sourceFilePath}:`, e.stack || e.message || e.toString()); - } + console.error(`Error writing to ${sourceFilePath}:`, e.stack || e.message || e.toString()); } - ); + }); } diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index c0d38e4f8cbc..f76f146adca5 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -154,7 +154,7 @@ export default { 'RESET_STORY_ARGS', 'RESULT_WHATS_NEW_DATA', 'SAVE_STORY_REQUEST', - 'SAVE_STORY_RESULT', + 'SAVE_STORY_RESPONSE', 'SELECT_STORY', 'SET_CONFIG', 'SET_CURRENT_STORY', From b97b1e1b7ee54df600028e63001524dee2c20a0c Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 16 Apr 2024 12:37:51 +0200 Subject: [PATCH 063/180] Fix type error --- code/addons/controls/src/SaveFromControls.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/addons/controls/src/SaveFromControls.stories.tsx b/code/addons/controls/src/SaveFromControls.stories.tsx index 7262ad9d7e92..ef39d4ead289 100644 --- a/code/addons/controls/src/SaveFromControls.stories.tsx +++ b/code/addons/controls/src/SaveFromControls.stories.tsx @@ -47,7 +47,7 @@ export const Created: Story = { export const CreatingFailed: Story = { args: { - createStory: () => Promise.reject(new Error('Story already exists.')), + createStory: () => Promise.reject(new Error('Story already exists.')), }, play: async (context) => { await Creating.play(context); From 07e705bf5079a7a16ad7941483acc4b043e3ff8c Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 16 Apr 2024 13:18:56 +0200 Subject: [PATCH 064/180] Fix initialization of SaveFromControls in common-preset.ts --- code/lib/core-server/src/presets/common-preset.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 5cbe1737dbca..7c11984721be 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -239,8 +239,7 @@ export const experimental_serverChannel = async ( const coreOptions = await options.presets.apply('core'); initializeWhatsNew(channel, options, coreOptions); - initializeSaveFromControls(channel, options, coreOptions); - + initializeSaveFromControls(channel); initFileSearchChannel(channel, options); initCreateNewStoryChannel(channel, options); From 69324cf9171ca473d98038a2f66609d16841e378 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 16 Apr 2024 12:45:18 +0200 Subject: [PATCH 065/180] Also reset args when updating existing story --- code/addons/controls/src/manager.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index b1f60e015a72..5d9b6eb19cd6 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -112,11 +112,9 @@ addons.register(ADDON_ID, (api) => { const { newStoryId, newStoryName, sourceStoryName } = payload; - if (newStoryId) { - const data = api.getCurrentStoryData(); - if (data.type === 'story') api.resetStoryArgs(data); - selectNewStory(api.selectStory, newStoryId); - } + const data = api.getCurrentStoryData(); + if (data.type === 'story') api.resetStoryArgs(data); + if (newStoryId) selectNewStory(api.selectStory, newStoryId); api.addNotification({ id: 'save-story-success', From ebe1fe8c2945aa12f214e8525ea9771b62b04102 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 16 Apr 2024 16:07:39 +0200 Subject: [PATCH 066/180] Rename SaveFromControls to SaveStory and add telemetry --- code/addons/controls/src/ControlsPanel.tsx | 4 +- ...rols.stories.tsx => SaveStory.stories.tsx} | 8 +-- .../{SaveFromControls.tsx => SaveStory.tsx} | 4 +- .../core-server/src/presets/common-preset.ts | 5 +- .../duplicate-story-with-new-name.test.ts | 0 .../duplicate-story-with-new-name.ts | 0 .../getDiff.ts | 0 .../mocks/csf-variances.stories.tsx | 0 .../mocks/data-variances.stories.tsx | 0 .../mocks/export-variances.stories.tsx | 0 .../mocks/typescript-constructs.stories.tsx | 0 .../save-story.ts} | 54 ++++++++++++------- .../update-args-in-csf-file.test.ts | 0 .../update-args-in-csf-file.ts | 0 .../valueToAST.ts | 0 code/lib/telemetry/src/types.ts | 3 +- 16 files changed, 49 insertions(+), 29 deletions(-) rename code/addons/controls/src/{SaveFromControls.stories.tsx => SaveStory.stories.tsx} (91%) rename code/addons/controls/src/{SaveFromControls.tsx => SaveStory.tsx} (97%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/duplicate-story-with-new-name.test.ts (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/duplicate-story-with-new-name.ts (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/getDiff.ts (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/mocks/csf-variances.stories.tsx (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/mocks/data-variances.stories.tsx (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/mocks/export-variances.stories.tsx (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/mocks/typescript-constructs.stories.tsx (100%) rename code/lib/core-server/src/utils/{save-from-controls/save-from-controls.ts => save-story/save-story.ts} (65%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/update-args-in-csf-file.test.ts (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/update-args-in-csf-file.ts (100%) rename code/lib/core-server/src/utils/{save-from-controls => save-story}/valueToAST.ts (100%) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index 6a2b678444c1..3541d8aeb2da 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -13,7 +13,7 @@ import { styled } from '@storybook/theming'; import type { ArgTypes } from '@storybook/types'; import { PARAM_KEY } from './constants'; -import { SaveFromControls } from './SaveFromControls'; +import { SaveStory } from './SaveStory'; // Remove undefined values (top-level only) const clean = (obj: { [key: string]: any }) => @@ -88,7 +88,7 @@ export const ControlsPanel = ({ saveStory, createStory }: ControlsPanelProps) => isLoading={isLoading} /> {hasControls && hasUpdatedArgs && global.CONFIG_TYPE === 'DEVELOPMENT' && ( - + )} ); diff --git a/code/addons/controls/src/SaveFromControls.stories.tsx b/code/addons/controls/src/SaveStory.stories.tsx similarity index 91% rename from code/addons/controls/src/SaveFromControls.stories.tsx rename to code/addons/controls/src/SaveStory.stories.tsx index ef39d4ead289..d66b952dd6ca 100644 --- a/code/addons/controls/src/SaveFromControls.stories.tsx +++ b/code/addons/controls/src/SaveStory.stories.tsx @@ -1,12 +1,11 @@ import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; -import { SaveFromControls } from './SaveFromControls'; +import { SaveStory } from './SaveStory'; import { expect, fireEvent, fn, userEvent, waitFor, within } from '@storybook/test'; const meta = { - component: SaveFromControls, - title: 'Components/ArgsTable/SaveFromControls', + component: SaveStory, args: { saveStory: (...args) => Promise.resolve(fn(action('saveStory'))(...args)), createStory: (...args) => Promise.resolve(fn(action('createStory'))(...args)), @@ -15,7 +14,7 @@ const meta = { parameters: { layout: 'fullscreen', }, -} satisfies Meta; +} satisfies Meta; export default meta; type Story = StoryObj; @@ -47,6 +46,7 @@ export const Created: Story = { export const CreatingFailed: Story = { args: { + // eslint-disable-next-line local-rules/no-uncategorized-errors createStory: () => Promise.reject(new Error('Story already exists.')), }, play: async (context) => { diff --git a/code/addons/controls/src/SaveFromControls.tsx b/code/addons/controls/src/SaveStory.tsx similarity index 97% rename from code/addons/controls/src/SaveFromControls.tsx rename to code/addons/controls/src/SaveStory.tsx index 7d631fdd098b..8a7368ba9d6c 100644 --- a/code/addons/controls/src/SaveFromControls.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -83,13 +83,13 @@ const ModalInput = styled(Form.Input)(({ theme }) => ({ }, })); -type SaveFromControlsProps = { +type SaveStoryProps = { saveStory: () => Promise; createStory: (storyName: string) => Promise; resetArgs: () => void; }; -export const SaveFromControls = ({ saveStory, createStory, resetArgs }: SaveFromControlsProps) => { +export const SaveStory = ({ saveStory, createStory, resetArgs }: SaveStoryProps) => { const inputRef = React.useRef(null); const [saving, setSaving] = React.useState(false); const [creating, setCreating] = React.useState(false); diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 7c11984721be..2450812dd8d9 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -23,7 +23,7 @@ import type { Channel } from '@storybook/channels'; import { parseStaticDir } from '../utils/server-statics'; import { defaultStaticDirs } from '../utils/constants'; import { initializeWhatsNew, type OptionsWithRequiredCache } from '../utils/whats-new'; -import { initializeSaveFromControls } from '../utils/save-from-controls/save-from-controls'; +import { initializeSaveStory } from '../utils/save-story/save-story'; import { initFileSearchChannel } from '../server-channel/file-search-channel'; import { initCreateNewStoryChannel } from '../server-channel/create-new-story-channel'; @@ -239,7 +239,8 @@ export const experimental_serverChannel = async ( const coreOptions = await options.presets.apply('core'); initializeWhatsNew(channel, options, coreOptions); - initializeSaveFromControls(channel); + initializeSaveStory(channel, options, coreOptions); + initFileSearchChannel(channel, options); initCreateNewStoryChannel(channel, options); diff --git a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.test.ts rename to code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/duplicate-story-with-new-name.ts rename to code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/getDiff.ts b/code/lib/core-server/src/utils/save-story/getDiff.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/getDiff.ts rename to code/lib/core-server/src/utils/save-story/getDiff.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/mocks/csf-variances.stories.tsx rename to code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/data-variances.stories.tsx similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/mocks/data-variances.stories.tsx rename to code/lib/core-server/src/utils/save-story/mocks/data-variances.stories.tsx diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/export-variances.stories.tsx similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/mocks/export-variances.stories.tsx rename to code/lib/core-server/src/utils/save-story/mocks/export-variances.stories.tsx diff --git a/code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/typescript-constructs.stories.tsx similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/mocks/typescript-constructs.stories.tsx rename to code/lib/core-server/src/utils/save-story/mocks/typescript-constructs.stories.tsx diff --git a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts b/code/lib/core-server/src/utils/save-story/save-story.ts similarity index 65% rename from code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts rename to code/lib/core-server/src/utils/save-story/save-story.ts index 44f1b4c1ecaf..5ddb8f8e0fd6 100644 --- a/code/lib/core-server/src/utils/save-from-controls/save-from-controls.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -7,7 +7,9 @@ import { readCsf, writeCsf } from '@storybook/csf-tools'; import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; -// import { sendTelemetryError } from '../withTelemetry'; +import type { CoreConfig, Options } from '@storybook/types'; +import { telemetry } from '@storybook/telemetry'; +import { logger } from '@storybook/node-logger'; interface SaveStoryRequest { id: string; @@ -32,7 +34,9 @@ type SaveStoryResponse = ( }; }; -export function initializeSaveFromControls(channel: Channel) { +class SaveStoryError extends Error {} + +export function initializeSaveStory(channel: Channel, options: Options, coreConfig: CoreConfig) { channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: SaveStoryRequest) => { const { csfId, importPath, args, name } = payload; @@ -46,7 +50,6 @@ export function initializeSaveFromControls(channel: Channel) { sourceFileName = basename(importPath); sourceFilePath = join(process.cwd(), importPath); - // open the story file const csf = await readCsf(sourceFilePath, { makeTitle: (userTitle: string) => userTitle || 'myTitle', }); @@ -58,21 +61,20 @@ export function initializeSaveFromControls(channel: Channel) { newStoryName = name && storyNameFromExport(name); newStoryId = newStoryName && toId(componentId, newStoryName); - // find the export_name for the id const [storyName] = stories.find(([key, value]) => value.id.endsWith(`--${storyId}`)) || []; - if (!storyName) throw new Error(`Source story not found.`); - if (name && csf.getStoryExport(name)) throw new Error(`Story already exists.`); + if (!storyName) { + throw new SaveStoryError(`Source story not found.`); + } + if (name && csf.getStoryExport(name)) { + throw new SaveStoryError(`Story already exists.`); + } sourceStoryName = storyNameFromExport(storyName); - const node = name - ? duplicateStoryWithNewName(parsed, storyName, name) - : csf.getStoryExport(storyName); - - // modify the AST node with the new args - updateArgsInCsfFile(node, args); - - // save the file + await updateArgsInCsfFile( + name ? duplicateStoryWithNewName(parsed, storyName, name) : csf.getStoryExport(storyName), + args + ); await writeCsf(csf, sourceFilePath); channel.emit(SAVE_STORY_RESPONSE, { @@ -86,12 +88,18 @@ export function initializeSaveFromControls(channel: Channel) { sourceStoryName, }, } satisfies SaveStoryResponse); - } catch (e: any) { - // sendTelemetryError(channel, e); + + if (!coreConfig.disableTelemetry) { + await telemetry('save-story', { + action: name ? 'createStory' : 'updateStory', + success: true, + }); + } + } catch (error: any) { channel.emit(SAVE_STORY_RESPONSE, { id, success: false, - error: e.message, + error: error.message, payload: { csfId, newStoryId, @@ -101,7 +109,17 @@ export function initializeSaveFromControls(channel: Channel) { }, } satisfies SaveStoryResponse); - console.error(`Error writing to ${sourceFilePath}:`, e.stack || e.message || e.toString()); + logger.error( + `Error writing to ${sourceFilePath}:\n${error.stack || error.message || error.toString()}` + ); + + if (!coreConfig.disableTelemetry && !(error instanceof SaveStoryError)) { + await telemetry('save-story', { + action: name ? 'createStory' : 'updateStory', + success: false, + error, + }); + } } }); } diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.test.ts rename to code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/update-args-in-csf-file.ts rename to code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts diff --git a/code/lib/core-server/src/utils/save-from-controls/valueToAST.ts b/code/lib/core-server/src/utils/save-story/valueToAST.ts similarity index 100% rename from code/lib/core-server/src/utils/save-from-controls/valueToAST.ts rename to code/lib/core-server/src/utils/save-story/valueToAST.ts diff --git a/code/lib/telemetry/src/types.ts b/code/lib/telemetry/src/types.ts index 846e7adb9556..4d45b59ea21d 100644 --- a/code/lib/telemetry/src/types.ts +++ b/code/lib/telemetry/src/types.ts @@ -16,7 +16,8 @@ export type EventType = | 'error-metadata' | 'version-update' | 'core-config' - | 'remove'; + | 'remove' + | 'save-story'; export interface Dependency { version: string | undefined; From cd3ccac93286d7c93f15b784846bdd04fe5d2bb8 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Tue, 16 Apr 2024 17:03:33 +0200 Subject: [PATCH 067/180] Improve error display in modal --- .../addons/controls/src/SaveStory.stories.tsx | 20 +++---------- .../src/components/Modal/Modal.stories.tsx | 5 +--- .../src/components/Modal/Modal.styled.tsx | 29 ++++++++++++++++--- .../src/components/form/form.stories.tsx | 26 +++++++++++++++++ 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/code/addons/controls/src/SaveStory.stories.tsx b/code/addons/controls/src/SaveStory.stories.tsx index d66b952dd6ca..948ebf87fb0e 100644 --- a/code/addons/controls/src/SaveStory.stories.tsx +++ b/code/addons/controls/src/SaveStory.stories.tsx @@ -7,8 +7,8 @@ import { expect, fireEvent, fn, userEvent, waitFor, within } from '@storybook/te const meta = { component: SaveStory, args: { - saveStory: (...args) => Promise.resolve(fn(action('saveStory'))(...args)), - createStory: (...args) => Promise.resolve(fn(action('createStory'))(...args)), + saveStory: fn((...args) => Promise.resolve(action('saveStory')(...args))), + createStory: fn((...args) => Promise.resolve(action('createStory')(...args))), resetArgs: fn(action('resetArgs')), }, parameters: { @@ -47,19 +47,7 @@ export const Created: Story = { export const CreatingFailed: Story = { args: { // eslint-disable-next-line local-rules/no-uncategorized-errors - createStory: () => Promise.reject(new Error('Story already exists.')), - }, - play: async (context) => { - await Creating.play(context); - - await waitFor(async () => { - const dialog = await within(document.body).findByRole('dialog'); - const input = await within(dialog).findByRole('textbox'); - await userEvent.type(input, 'MyNewStory'); - const submitButton = await within(dialog).findByRole('button', { name: /Create/i }); - await userEvent.click(submitButton); - }); - - await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); + createStory: fn((...args) => Promise.reject(new Error('Story already exists.'))), }, + play: Created.play, }; diff --git a/code/ui/components/src/components/Modal/Modal.stories.tsx b/code/ui/components/src/components/Modal/Modal.stories.tsx index fa4a72fd1d88..8e825c28d95a 100644 --- a/code/ui/components/src/components/Modal/Modal.stories.tsx +++ b/code/ui/components/src/components/Modal/Modal.stories.tsx @@ -152,10 +152,7 @@ export const StyledComponents = { - - Oops. Something went wrong. - - + Oops. Something went wrong. ), }; diff --git a/code/ui/components/src/components/Modal/Modal.styled.tsx b/code/ui/components/src/components/Modal/Modal.styled.tsx index 04ac8c7f573d..12a96e81b194 100644 --- a/code/ui/components/src/components/Modal/Modal.styled.tsx +++ b/code/ui/components/src/components/Modal/Modal.styled.tsx @@ -1,5 +1,6 @@ import { keyframes, styled } from '@storybook/theming'; import * as Dialog from '@radix-ui/react-dialog'; +import type { ComponentProps } from 'react'; import React from 'react'; import { IconButton } from '../IconButton/IconButton'; @@ -10,6 +11,11 @@ const fadeIn = keyframes({ to: { opacity: 1 }, }); +const expand = keyframes({ + from: { maxHeight: 0 }, + to: {}, +}); + const zoomIn = keyframes({ from: { opacity: 0, @@ -106,10 +112,25 @@ export const Actions = styled.div({ gap: 8, }); -export const Error = styled(Row)(({ theme }) => ({ - alignItems: 'center', - padding: '8px 16px', +export const ErrorWrapper = styled.div(({ theme }) => ({ + maxHeight: 100, + overflow: 'auto', + animation: `${expand} 300ms, ${fadeIn} 300ms`, backgroundColor: theme.background.critical, - fontSize: theme.typography.size.s2, color: theme.color.lightest, + fontSize: theme.typography.size.s2, + + '& > div': { + position: 'relative', + padding: '8px 16px', + }, })); + +export const Error = ({ + children, + ...props +}: { children: React.ReactNode } & ComponentProps) => ( + +
{children}
+
+); diff --git a/code/ui/components/src/components/form/form.stories.tsx b/code/ui/components/src/components/form/form.stories.tsx index fb6070100d41..fc472dfdaa84 100644 --- a/code/ui/components/src/components/form/form.stories.tsx +++ b/code/ui/components/src/components/form/form.stories.tsx @@ -121,3 +121,29 @@ export const Input = { }, }, }; + +export const Field2 = { + args: { + label: 'field', + }, + + render: (args: any) => ( + + + + + + + + ), + + argTypes: { + label: { + defaultValue: 'label', + + control: { + type: 'text', + }, + }, + }, +}; From 897becde40cf841f945b039127c7ef8e9534d292 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 09:24:01 +0200 Subject: [PATCH 068/180] cleanup --- code/ui/components/src/components/Modal/Modal.stories.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/code/ui/components/src/components/Modal/Modal.stories.tsx b/code/ui/components/src/components/Modal/Modal.stories.tsx index 8e825c28d95a..20af542e2c31 100644 --- a/code/ui/components/src/components/Modal/Modal.stories.tsx +++ b/code/ui/components/src/components/Modal/Modal.stories.tsx @@ -4,7 +4,6 @@ import { userEvent, within, expect } from '@storybook/test'; import { Modal } from './Modal'; import { Button } from '../Button/Button'; -import { CrossIcon } from '@storybook/icons'; type Story = StoryObj; From e6cba317ae97e0e43889ebb7b9f25583779bb8cd Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 10 Apr 2024 11:03:47 +0200 Subject: [PATCH 069/180] Add 'Create a new story' button to sidebar --- code/package.json | 2 +- .../src/components/Button/Button.tsx | 2 +- .../manager/src/components/sidebar/Search.tsx | 82 ++++++++++++------- code/yarn.lock | 20 ++--- 4 files changed, 65 insertions(+), 41 deletions(-) diff --git a/code/package.json b/code/package.json index 29dc543f11e8..80e9cb11f74a 100644 --- a/code/package.json +++ b/code/package.json @@ -90,7 +90,7 @@ "type-fest": "~2.19" }, "dependencies": { - "@chromatic-com/storybook": "^1.2.18", + "@chromatic-com/storybook": "^1.3.2", "@nx/eslint": "18.0.6", "@nx/vite": "18.0.6", "@nx/workspace": "18.0.6", diff --git a/code/ui/components/src/components/Button/Button.tsx b/code/ui/components/src/components/Button/Button.tsx index 6e77f668b8df..2b070dcb7b00 100644 --- a/code/ui/components/src/components/Button/Button.tsx +++ b/code/ui/components/src/components/Button/Button.tsx @@ -202,7 +202,7 @@ const StyledButton = styled('button', { : {}), color: (() => { if (variant === 'solid') return theme.color.lightest; - if (variant === 'outline') return theme.input.color; + if (variant === 'outline') return theme.color.mediumdark; if (variant === 'ghost' && active) return theme.color.secondary; if (variant === 'ghost') return theme.color.mediumdark; return theme.input.color; diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 0df164a2d35b..834f8fab8e94 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -6,7 +6,8 @@ import type { FuseOptions } from 'fuse.js'; import Fuse from 'fuse.js'; import { global } from '@storybook/global'; import React, { useRef, useState, useCallback } from 'react'; -import { CloseIcon, SearchIcon } from '@storybook/icons'; +import { CloseIcon, PlusIcon, SearchIcon } from '@storybook/icons'; +import { IconButton, TooltipNote, WithTooltip } from '@storybook/components'; import { DEFAULT_REF_ID } from './Sidebar'; import type { CombinedDataset, @@ -43,6 +44,16 @@ const options = { ], } as FuseOptions; +const SearchBar = styled.div({ + display: 'flex', + flexDirection: 'row', + columnGap: 6, +}); + +const TooltipNoteWrapper = styled(TooltipNote)({ + margin: 0, +}); + const ScreenReaderLabel = styled.label({ position: 'absolute', left: -10000, @@ -67,15 +78,17 @@ const SearchIconWrapper = styled.div(({ theme }) => ({ const SearchField = styled.div({ display: 'flex', flexDirection: 'column', + flexGrow: 1, position: 'relative', }); const Input = styled.input(({ theme }) => ({ appearance: 'none', - height: 32, + height: 28, paddingLeft: 28, paddingRight: 28, - border: `1px solid ${theme.appBorderColor}`, + border: 0, + boxShadow: `${theme.button.border} 0 0 0 1px inset`, background: 'transparent', borderRadius: 4, fontSize: `${theme.typography.size.s1 + 1}px`, @@ -352,32 +365,43 @@ export const Search = React.memo<{ return ( <> Search for components - - - - - {/* @ts-expect-error (TODO) */} - - {!isMobile && enableShortcuts && !isOpen && ( - - {searchShortcut === '⌘ K' ? ( - <> - K - - ) : ( - searchShortcut - )} - - )} - {isOpen && ( - clearSelection()}> - - - )} - + + + + + + {/* @ts-expect-error (TODO) */} + + {!isMobile && enableShortcuts && !isOpen && ( + + {searchShortcut === '⌘ K' ? ( + <> + K + + ) : ( + searchShortcut + )} + + )} + {isOpen && ( + clearSelection()}> + + + )} + + } + > + + + + + {children({ query: input, diff --git a/code/yarn.lock b/code/yarn.lock index 98f4bc6749aa..41342dd442fa 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -2077,16 +2077,16 @@ __metadata: languageName: node linkType: hard -"@chromatic-com/storybook@npm:^1.2.18": - version: 1.2.18 - resolution: "@chromatic-com/storybook@npm:1.2.18" +"@chromatic-com/storybook@npm:^1.3.2": + version: 1.3.2 + resolution: "@chromatic-com/storybook@npm:1.3.2" dependencies: - chromatic: "npm:^11.0.0" + chromatic: "npm:^11.3.0" filesize: "npm:^10.0.12" jsonfile: "npm:^6.1.0" react-confetti: "npm:^6.1.0" strip-ansi: "npm:^7.1.0" - checksum: 10c0/b0b4c48dba1d6cddcc2b2541ba970ac4be7861583387f9525d60797663459fdb8db25fe99759c7e51ebb256daf185116450f5f33a04e35e0a2aa458f0ab24541 + checksum: 10c0/30f7d946e41d031d45991ea8cf2f42b64330a12ddb1330a5a0bfe9734511e36f0691f897b0075c41c4c9fa5de6382598e98179a5ac2f9139bd619fc46487bbeb languageName: node linkType: hard @@ -6537,7 +6537,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/root@workspace:." dependencies: - "@chromatic-com/storybook": "npm:^1.2.18" + "@chromatic-com/storybook": "npm:^1.3.2" "@nx/eslint": "npm:18.0.6" "@nx/vite": "npm:18.0.6" "@nx/workspace": "npm:18.0.6" @@ -11477,9 +11477,9 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^11.0.0": - version: 11.0.8 - resolution: "chromatic@npm:11.0.8" +"chromatic@npm:^11.3.0": + version: 11.3.0 + resolution: "chromatic@npm:11.3.0" peerDependencies: "@chromatic-com/cypress": ^0.*.* || ^1.0.0 "@chromatic-com/playwright": ^0.*.* || ^1.0.0 @@ -11492,7 +11492,7 @@ __metadata: chroma: dist/bin.js chromatic: dist/bin.js chromatic-cli: dist/bin.js - checksum: 10c0/422ab9afd9667f94813b2355144092fe5abe6538394e308619411050fea8265b9531a88a13b8563bf40172bd99b47de3c89642f34ec2d1f1bc42c958568e2902 + checksum: 10c0/e977ef43a43ebb0250ec8fc46f5751c8cb9b798f75fcf9ec52485c1127caf9d6cef0346a9dd1660a8967faf1a7cde579571a0ac130cfaf475d6f22e4929003b6 languageName: node linkType: hard From 0675bb43703fffdf18b3e3d6f271b27226c366b6 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 10 Apr 2024 11:59:06 +0200 Subject: [PATCH 070/180] Add stories to 'Create a new story' button --- .../src/components/sidebar/Search.stories.tsx | 6 +++++ .../manager/src/components/sidebar/Search.tsx | 24 ++++++++++++------- .../components/sidebar/Sidebar.stories.tsx | 7 ++++++ .../src/components/sidebar/Sidebar.tsx | 9 ++++++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/Search.stories.tsx b/code/ui/manager/src/components/sidebar/Search.stories.tsx index 8eb50c9832c9..8b796158db8d 100644 --- a/code/ui/manager/src/components/sidebar/Search.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Search.stories.tsx @@ -43,6 +43,12 @@ const baseProps = { export const Simple: StoryFn = () => {() => null}; +export const SimpleWithCreateButton: StoryFn = () => ( + + {() => null} + +); + export const FilledIn: StoryFn = () => ( {() => } diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 834f8fab8e94..60d41351f4b4 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -159,18 +159,22 @@ const ClearIcon = styled.div(({ theme }) => ({ const FocusContainer = styled.div({ outline: 0 }); +const isDevelopment = global.CONFIG_TYPE === 'DEVELOPMENT'; + export const Search = React.memo<{ children: SearchChildrenFn; dataset: CombinedDataset; enableShortcuts?: boolean; getLastViewed: () => Selection[]; initialQuery?: string; + showCreateStoryButton?: boolean; }>(function Search({ children, dataset, enableShortcuts = true, getLastViewed, initialQuery = '', + showCreateStoryButton = isDevelopment, }) { const api = useStorybookApi(); const inputRef = useRef(null); @@ -392,15 +396,17 @@ export const Search = React.memo<{ )} - } - > - - - - + {showCreateStoryButton ? ( + } + > + + + + + ) : null} {children({ diff --git a/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx b/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx index 253775bc07c7..46c3d7c14979 100644 --- a/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx @@ -40,6 +40,7 @@ const meta = { refId: DEFAULT_REF_ID, refs: {}, status: {}, + showCreateStoryButton: true, }, decorators: [ (storyFn) => ( @@ -107,6 +108,12 @@ const refsEmpty = { export const Simple: Story = {}; +export const SimpleInProduction: Story = { + args: { + showCreateStoryButton: false, + }, +}; + export const Loading: Story = { args: { previewInitialized: false, diff --git a/code/ui/manager/src/components/sidebar/Sidebar.tsx b/code/ui/manager/src/components/sidebar/Sidebar.tsx index 0da159ffb4f1..66c4e7aabf4c 100644 --- a/code/ui/manager/src/components/sidebar/Sidebar.tsx +++ b/code/ui/manager/src/components/sidebar/Sidebar.tsx @@ -114,6 +114,7 @@ export interface SidebarProps extends API_LoadedRefData { menuHighlighted?: boolean; enableShortcuts?: boolean; onMenuClick?: HeadingProps['onMenuClick']; + showCreateStoryButton?: boolean; } export const Sidebar = React.memo(function Sidebar({ @@ -130,6 +131,7 @@ export const Sidebar = React.memo(function Sidebar({ enableShortcuts = true, refs = {}, onMenuClick, + showCreateStoryButton, }: SidebarProps) { const selected: Selection = useMemo(() => storyId && { storyId, refId }, [storyId, refId]); const dataset = useCombination(index, indexError, previewInitialized, status, refs); @@ -149,7 +151,12 @@ export const Sidebar = React.memo(function Sidebar({ isLoading={isLoading} onMenuClick={onMenuClick} /> - + {({ query, results, From 92ba34731a1e6f33f251720ee47287e128aaf5a2 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 10 Apr 2024 12:50:00 +0200 Subject: [PATCH 071/180] Only show create new story button for react renderers --- code/builders/builder-manager/src/utils/framework.ts | 9 ++++++--- code/lib/manager-api/src/modules/versions.ts | 2 +- code/ui/manager/src/components/sidebar/Search.tsx | 3 ++- code/ui/manager/src/typings.d.ts | 1 + 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/builders/builder-manager/src/utils/framework.ts b/code/builders/builder-manager/src/utils/framework.ts index 165b018ddf8f..bf3588290511 100644 --- a/code/builders/builder-manager/src/utils/framework.ts +++ b/code/builders/builder-manager/src/utils/framework.ts @@ -1,5 +1,6 @@ import path from 'path'; import type { Options } from '@storybook/types'; +import { extractProperRendererNameFromFramework, getFrameworkName } from '@storybook/core-common'; interface PropertyObject { name: string; @@ -28,12 +29,14 @@ export const pluckThirdPartyPackageFromPath = (packagePath: string) => export const buildFrameworkGlobalsFromOptions = async (options: Options) => { const globals: Record = {}; - const { renderer, builder } = await options.presets.apply('core'); + const { builder } = await options.presets.apply('core'); + + const frameworkName = await getFrameworkName(options); + const rendererName = await extractProperRendererNameFromFramework(frameworkName); - const rendererName = pluckNameFromConfigProperty(renderer); if (rendererName) { globals.STORYBOOK_RENDERER = - pluckStorybookPackageFromPath(rendererName) ?? pluckThirdPartyPackageFromPath(rendererName); + (await extractProperRendererNameFromFramework(frameworkName)) ?? undefined; } const builderName = pluckNameFromConfigProperty(builder); diff --git a/code/lib/manager-api/src/modules/versions.ts b/code/lib/manager-api/src/modules/versions.ts index a414c07fe073..8305523f2f0d 100644 --- a/code/lib/manager-api/src/modules/versions.ts +++ b/code/lib/manager-api/src/modules/versions.ts @@ -109,7 +109,7 @@ export const init: ModuleFn = ({ store }) => { } if (renderer && typeof global.STORYBOOK_RENDERER !== 'undefined') { - const rendererName = (global.STORYBOOK_RENDERER as string).split('/').pop()?.toLowerCase(); + const rendererName = global.STORYBOOK_RENDERER as string; if (rendererName) { url += `?renderer=${normalizeRendererName(rendererName)}`; diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 60d41351f4b4..84ff9df58fca 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -160,6 +160,7 @@ const ClearIcon = styled.div(({ theme }) => ({ const FocusContainer = styled.div({ outline: 0 }); const isDevelopment = global.CONFIG_TYPE === 'DEVELOPMENT'; +const isRendererReact = global.STORYBOOK_RENDERER === 'react'; export const Search = React.memo<{ children: SearchChildrenFn; @@ -174,7 +175,7 @@ export const Search = React.memo<{ enableShortcuts = true, getLastViewed, initialQuery = '', - showCreateStoryButton = isDevelopment, + showCreateStoryButton = isDevelopment && isRendererReact, }) { const api = useStorybookApi(); const inputRef = useRef(null); diff --git a/code/ui/manager/src/typings.d.ts b/code/ui/manager/src/typings.d.ts index c51fcc2f2f86..5ac9aaa1a174 100644 --- a/code/ui/manager/src/typings.d.ts +++ b/code/ui/manager/src/typings.d.ts @@ -26,4 +26,5 @@ declare var __STORYBOOK_ICONS__: any; declare var __STORYBOOK_CLIENT_LOGGER__: any; declare var __STORYBOOK_ADDONS_CHANNEL__: any; declare var __STORYBOOK_TYPES__: any; +declare var STORYBOOK_RENDERER: string | undefined; declare var sendTelemetryError: (error: any) => void; From 2e6862a03dc38986ce40e925c6779195109dfa63 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 10 Apr 2024 13:20:42 +0200 Subject: [PATCH 072/180] Disable TurboSnap --- code/chromatic.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/chromatic.config.json b/code/chromatic.config.json index 77130b818b6d..a2ed8ccde24c 100644 --- a/code/chromatic.config.json +++ b/code/chromatic.config.json @@ -2,7 +2,7 @@ "projectId": "Project:635781f3500dd2c49e189caf", "projectToken": "80b312430ec4", "buildScriptName": "storybook:ui:build", - "onlyChanged": true, + "onlyChanged": false, "storybookConfigDir": "ui/.storybook", "storybookBaseDir": "./code", "zip": true From b86eeb02f5b242d64e99c3515fdfe3e650c6afc7 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 11 Apr 2024 09:24:28 +0200 Subject: [PATCH 073/180] Apply mediumdark color only to IconButton --- code/ui/components/src/components/Button/Button.tsx | 2 +- code/ui/manager/src/components/sidebar/Search.tsx | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/ui/components/src/components/Button/Button.tsx b/code/ui/components/src/components/Button/Button.tsx index 2b070dcb7b00..6e77f668b8df 100644 --- a/code/ui/components/src/components/Button/Button.tsx +++ b/code/ui/components/src/components/Button/Button.tsx @@ -202,7 +202,7 @@ const StyledButton = styled('button', { : {}), color: (() => { if (variant === 'solid') return theme.color.lightest; - if (variant === 'outline') return theme.color.mediumdark; + if (variant === 'outline') return theme.input.color; if (variant === 'ghost' && active) return theme.color.secondary; if (variant === 'ghost') return theme.color.mediumdark; return theme.input.color; diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 84ff9df58fca..441653e44234 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -63,6 +63,10 @@ const ScreenReaderLabel = styled.label({ overflow: 'hidden', }); +const CreateNewStoryButton = styled(IconButton)(({ theme }) => ({ + color: theme.color.mediumdark, +})); + const SearchIconWrapper = styled.div(({ theme }) => ({ position: 'absolute', top: 0, @@ -397,17 +401,17 @@ export const Search = React.memo<{ )} - {showCreateStoryButton ? ( + {showCreateStoryButton && ( } > - + - + - ) : null} + )} {children({ From f1c6ae9c21ac3d89c7722bec5eee84f3a114316f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 15 Apr 2024 09:04:49 +0200 Subject: [PATCH 074/180] Adjust top position of code in search field --- code/ui/manager/src/components/sidebar/Search.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 441653e44234..8708a05dad6a 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -130,7 +130,7 @@ const Input = styled.input(({ theme }) => ({ const FocusKey = styled.code(({ theme }) => ({ position: 'absolute', - top: 8, + top: 6, right: 9, height: 16, zIndex: 1, From 0757f18616780ae667686b25fca6841781ac467f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 15 Apr 2024 12:44:54 +0200 Subject: [PATCH 075/180] fix CI --- code/addons/controls/src/ControlsPanel.tsx | 2 +- code/addons/controls/src/SaveFromControls.stories.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index 7eebdc5c6bd2..adf4db26cfeb 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -12,7 +12,7 @@ import { import { PureArgsTable as ArgsTable, type PresetColor, type SortType } from '@storybook/blocks'; import { styled } from '@storybook/theming'; import type { ArgTypes } from '@storybook/types'; -import { SAVE_STORY_REQUEST, SAVE_STORY_RESULT } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST } from '@storybook/core-events'; import { PARAM_KEY } from './constants'; import { SaveFromControls } from './SaveFromControls'; diff --git a/code/addons/controls/src/SaveFromControls.stories.tsx b/code/addons/controls/src/SaveFromControls.stories.tsx index 39204f2d2488..6b9345da0bc0 100644 --- a/code/addons/controls/src/SaveFromControls.stories.tsx +++ b/code/addons/controls/src/SaveFromControls.stories.tsx @@ -22,12 +22,12 @@ type Story = StoryObj; export const Default: Story = {}; -export const Creating: Story = { +export const Creating = { play: async ({ canvasElement }) => { const createButton = await within(canvasElement).findByRole('button', { name: /Create/i }); await fireEvent.click(createButton); }, -}; +} satisfies Story; export const Created: Story = { play: async (context) => { From 5247e9a02eea4bae494a64dee8c80787441803da Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 11:52:21 +0200 Subject: [PATCH 076/180] Avoid nested button --- .../manager/src/components/notifications/NotificationItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/manager/src/components/notifications/NotificationItem.tsx b/code/ui/manager/src/components/notifications/NotificationItem.tsx index d47f539a3f1c..f8e44fcd3660 100644 --- a/code/ui/manager/src/components/notifications/NotificationItem.tsx +++ b/code/ui/manager/src/components/notifications/NotificationItem.tsx @@ -81,7 +81,7 @@ const NotificationWithInteractiveStates = styled(Notification)(() => ({ 'rgba(2,156,253,1) 0 0 0 1px inset, 0 1px 3px 0 rgba(30,167,253,0.5), 0 2px 5px 0 rgba(0,0,0,0.05), 0 5px 15px 0 rgba(0,0,0,0.1)', }, })); -const NotificationButton = NotificationWithInteractiveStates.withComponent('button'); +const NotificationButton = NotificationWithInteractiveStates.withComponent('div'); const NotificationLink = NotificationWithInteractiveStates.withComponent(Link); const NotificationIconWrapper = styled.div(() => ({ From 88556bffb289df0610adcf31517ddf4e5c9a00bc Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 13:25:53 +0200 Subject: [PATCH 077/180] Remove unused ref --- code/addons/controls/src/ControlsPanel.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index 3541d8aeb2da..fa6b8e046c6e 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -49,9 +49,6 @@ export const ControlsPanel = ({ saveStory, createStory }: ControlsPanelProps) => const { expanded, sort, presetColors } = useParameter(PARAM_KEY, {}); const { path, previewInitialized } = useStorybookState(); - const currentArgsRef = useRef(args); - currentArgsRef.current = args; - // If the story is prepared, then show the args table // and reset the loading states useEffect(() => { From 762a784c12876e0ff2c3679eeb821d42377f4f40 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 13:27:16 +0200 Subject: [PATCH 078/180] Wait for story to rerender after HMR before responding to save-story request --- .../core-server/src/utils/save-story/save-story.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 5ddb8f8e0fd6..6d2622f10e17 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ import type { Channel } from '@storybook/channels'; -import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, STORY_RENDERED } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; import { readCsf, writeCsf } from '@storybook/csf-tools'; @@ -75,7 +75,16 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf name ? duplicateStoryWithNewName(parsed, storyName, name) : csf.getStoryExport(storyName), args ); - await writeCsf(csf, sourceFilePath); + + // Writing the CSF file should trigger HMR, which causes the story to rerender. Delay the + // response until that happens, but don't wait too long. + await Promise.all([ + new Promise((resolve) => { + channel.on(STORY_RENDERED, resolve); + setTimeout(() => resolve(channel.off(STORY_RENDERED, resolve)), 3000); + }), + writeCsf(csf, sourceFilePath), + ]); channel.emit(SAVE_STORY_RESPONSE, { id, From 365a46d2061f844d7319fd6d043aac2940a3dae8 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 13:30:51 +0200 Subject: [PATCH 079/180] No need to retry selectStory call anymore --- code/addons/controls/src/manager.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 5d9b6eb19cd6..eeab03b1c456 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -24,16 +24,6 @@ function Title() { ); } -// It might take a little while for a new story to be available, so we retry a few times -const selectNewStory = (selectStory: (id: string) => void, storyId: string, attempt = 1) => { - if (attempt > 10) return; - try { - selectStory(storyId); - } catch (e) { - setTimeout(() => selectNewStory(selectStory, storyId, attempt + 1), 500); - } -}; - interface ResponseData { id: string; success: boolean; @@ -114,7 +104,7 @@ addons.register(ADDON_ID, (api) => { const data = api.getCurrentStoryData(); if (data.type === 'story') api.resetStoryArgs(data); - if (newStoryId) selectNewStory(api.selectStory, newStoryId); + if (newStoryId) api.selectStory(newStoryId); api.addNotification({ id: 'save-story-success', From 3e6637379cdd0cfa48c038f373258582c61c67ff Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 13:57:49 +0200 Subject: [PATCH 080/180] e2e tests for save-from-controls --- code/e2e-tests/save-from-controls.spec.ts | 69 +++++++++++++++++++++++ scripts/tasks/e2e-tests-build.ts | 4 +- scripts/tasks/e2e-tests-dev.ts | 1 + 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 code/e2e-tests/save-from-controls.spec.ts diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts new file mode 100644 index 000000000000..ce50fe8e6c4a --- /dev/null +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -0,0 +1,69 @@ +import { test } from '@playwright/test'; +import process from 'process'; +import { SbPage } from './util'; + +const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:8001'; +const type = process.env.STORYBOOK_TYPE || 'dev'; + +test.describe('save-from-controls', () => { + test.skip(type === 'build', `Skipping save-from-controls tests for production Storybooks`); + + test('Should be able to update a story', async ({ page }) => { + await page.goto(storybookUrl); + const sbPage = new SbPage(page); + await sbPage.waitUntilLoaded(); + + await sbPage.navigateToStory('example/button', 'primary'); + await sbPage.viewAddonPanel('Controls'); + + // Update an arg + const label = sbPage.panelContent().locator('textarea[name=label]'); + const value = await label.inputValue(); + await label.fill(value + ' Updated'); + + // Assert the footer is shown + await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); + + // update the story + await sbPage.panelContent().locator('button').getByText('Update story').click(); + + // Assert the file is saved + const notification = await sbPage.page.waitForSelector('[title="Story saved"]'); + await notification.isVisible(); + + // dismiss + await notification.click(); + await notification.isHidden(); + + // cleanup + await label.fill(value); + await sbPage.panelContent().locator('button').getByText('Update story').click(); + await sbPage.page.waitForSelector('[title="Story saved"]'); + }); + + test('Should be able to clone a story', async ({ page }) => { + await page.goto(storybookUrl); + const sbPage = new SbPage(page); + await sbPage.waitUntilLoaded(); + + await sbPage.navigateToStory('example/button', 'primary'); + await sbPage.viewAddonPanel('Controls'); + + // Update an arg + const label = sbPage.panelContent().locator('textarea[name=label]'); + await label.fill((await label.inputValue()) + ' Copied'); + + // Assert the footer is shown + await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); + + // clone the story + await sbPage.panelContent().locator('button').getByText('Create new story').click(); + + (await sbPage.page.waitForSelector('[placeholder="Story export name"]')).fill('ClonedStory'); + (await sbPage.page.waitForSelector('[type="submit"]')).click(); + + // Assert the file is saved + const notification = await sbPage.page.waitForSelector('[title="Story saved"]'); + await notification.isVisible(); + }); +}); diff --git a/scripts/tasks/e2e-tests-build.ts b/scripts/tasks/e2e-tests-build.ts index a90670fa7258..8e419ddf15cb 100644 --- a/scripts/tasks/e2e-tests-build.ts +++ b/scripts/tasks/e2e-tests-build.ts @@ -3,11 +3,12 @@ import type { Task } from '../task'; import { exec } from '../utils/exec'; import { PORT } from './serve'; -export const e2eTestsBuild: Task & { port: number } = { +export const e2eTestsBuild: Task & { port: number; type: 'build' | 'dev' } = { description: 'Run e2e tests against a sandbox in prod mode', dependsOn: ['serve'], junit: true, port: PORT, + type: 'build', async ready() { return false; }, @@ -29,6 +30,7 @@ export const e2eTestsBuild: Task & { port: number } = { { env: { STORYBOOK_URL: `http://localhost:${this.port}`, + STORYBOOK_TYPE: this.type, STORYBOOK_TEMPLATE_NAME: key, ...(junitFilename && { PLAYWRIGHT_JUNIT_OUTPUT_NAME: junitFilename, diff --git a/scripts/tasks/e2e-tests-dev.ts b/scripts/tasks/e2e-tests-dev.ts index 50dce2123a14..42c6f4c72b70 100644 --- a/scripts/tasks/e2e-tests-dev.ts +++ b/scripts/tasks/e2e-tests-dev.ts @@ -6,4 +6,5 @@ export const e2eTestsDev: typeof e2eTestsBuild = { description: 'Run e2e tests against a sandbox in dev mode', dependsOn: ['dev'], port: PORT, + type: 'dev', }; From 907fb3aa42e73d6b16a3c76b5722da07dc18a31b Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 13:59:29 +0200 Subject: [PATCH 081/180] Fix import in ControlsPanel.tsx --- code/addons/controls/src/ControlsPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/addons/controls/src/ControlsPanel.tsx b/code/addons/controls/src/ControlsPanel.tsx index fa6b8e046c6e..6e82b0c0e727 100644 --- a/code/addons/controls/src/ControlsPanel.tsx +++ b/code/addons/controls/src/ControlsPanel.tsx @@ -1,5 +1,5 @@ import { dequal as deepEqual } from 'dequal'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { global } from '@storybook/global'; import { useArgs, From 10b556c8b09b70656377a3317e526e890d972cec Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 14:37:43 +0200 Subject: [PATCH 082/180] Fix notification selector in save-from-controls.spec.ts --- code/e2e-tests/save-from-controls.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index ce50fe8e6c4a..67f4c06a982f 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -63,7 +63,8 @@ test.describe('save-from-controls', () => { (await sbPage.page.waitForSelector('[type="submit"]')).click(); // Assert the file is saved - const notification = await sbPage.page.waitForSelector('[title="Story saved"]'); + const notification = await sbPage.page.waitForSelector('[title="Story created"]'); await notification.isVisible(); + await notification.click(); }); }); From 80dd30395a78149772041902387c33691a858f0c Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 15:21:03 +0200 Subject: [PATCH 083/180] Fix notification selector in save-from-controls.spec.ts --- code/e2e-tests/save-from-controls.spec.ts | 28 +++++++---------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index 67f4c06a982f..ccdcd4148869 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -28,30 +28,18 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('button').getByText('Update story').click(); // Assert the file is saved - const notification = await sbPage.page.waitForSelector('[title="Story saved"]'); - await notification.isVisible(); + const notification1 = await sbPage.page.waitForSelector('[title="Story saved"]'); + await notification1.isVisible(); // dismiss - await notification.click(); - await notification.isHidden(); - - // cleanup - await label.fill(value); - await sbPage.panelContent().locator('button').getByText('Update story').click(); - await sbPage.page.waitForSelector('[title="Story saved"]'); - }); - - test('Should be able to clone a story', async ({ page }) => { - await page.goto(storybookUrl); - const sbPage = new SbPage(page); - await sbPage.waitUntilLoaded(); + await notification1.click(); + await notification1.isHidden(); await sbPage.navigateToStory('example/button', 'primary'); await sbPage.viewAddonPanel('Controls'); // Update an arg - const label = sbPage.panelContent().locator('textarea[name=label]'); - await label.fill((await label.inputValue()) + ' Copied'); + await label.fill(value + ' Copied'); // Assert the footer is shown await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); @@ -63,8 +51,8 @@ test.describe('save-from-controls', () => { (await sbPage.page.waitForSelector('[type="submit"]')).click(); // Assert the file is saved - const notification = await sbPage.page.waitForSelector('[title="Story created"]'); - await notification.isVisible(); - await notification.click(); + const notification2 = await sbPage.page.waitForSelector('[title="Story created"]'); + await notification2.isVisible(); + await notification2.click(); }); }); From 3816841a9d32a219ac8892b02315425e9ac54446 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 15:53:11 +0200 Subject: [PATCH 084/180] Fix submit button click in save-from-controls.spec.ts --- code/e2e-tests/save-from-controls.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index ccdcd4148869..7849c9e6bbf4 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -48,7 +48,8 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('button').getByText('Create new story').click(); (await sbPage.page.waitForSelector('[placeholder="Story export name"]')).fill('ClonedStory'); - (await sbPage.page.waitForSelector('[type="submit"]')).click(); + const submit = await sbPage.page.waitForSelector('[type="submit"]'); + await submit.click(); // Assert the file is saved const notification2 = await sbPage.page.waitForSelector('[title="Story created"]'); From 022251567868badbdc29d9daa9e5d10bad08adef Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 16:20:24 +0200 Subject: [PATCH 085/180] Fix input fill in save-from-controls.spec.ts --- code/e2e-tests/save-from-controls.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index 7849c9e6bbf4..4a8cbafe0f16 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -47,7 +47,8 @@ test.describe('save-from-controls', () => { // clone the story await sbPage.panelContent().locator('button').getByText('Create new story').click(); - (await sbPage.page.waitForSelector('[placeholder="Story export name"]')).fill('ClonedStory'); + const input = await sbPage.page.waitForSelector('[placeholder="Story export name"]'); + await input.fill('ClonedStory'); const submit = await sbPage.page.waitForSelector('[type="submit"]'); await submit.click(); From 3d10cd73543de51836c5ecae588f790014114e68 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 16:48:29 +0200 Subject: [PATCH 086/180] Refactor save-from-controls.spec.ts and ControlsPanel.tsx --- code/e2e-tests/save-from-controls.spec.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index 4a8cbafe0f16..95d61692a7e8 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -35,9 +35,6 @@ test.describe('save-from-controls', () => { await notification1.click(); await notification1.isHidden(); - await sbPage.navigateToStory('example/button', 'primary'); - await sbPage.viewAddonPanel('Controls'); - // Update an arg await label.fill(value + ' Copied'); From 60fb5baa6759280d9b3c7d743995c20c47f90ecc Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 17:44:47 +0200 Subject: [PATCH 087/180] Refactor save-from-controls.spec.ts and ControlsPanel.tsx --- code/e2e-tests/save-from-controls.spec.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index 95d61692a7e8..e086171b0647 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -8,7 +8,14 @@ const type = process.env.STORYBOOK_TYPE || 'dev'; test.describe('save-from-controls', () => { test.skip(type === 'build', `Skipping save-from-controls tests for production Storybooks`); - test('Should be able to update a story', async ({ page }) => { + test('Should be able to update a story', async ({ page, browserName }) => { + // this is needed because the e2e test will generate a new file in the system + // which we dont know of its location (it runs in different sandboxes) + // so we just create a random id to make it easier to run tests + const id = Math.random().toString(36).substring(7); + + test.skip(browserName !== 'chromium', `Skipping save-from-controls tests for ${browserName}`); + await page.goto(storybookUrl); const sbPage = new SbPage(page); await sbPage.waitUntilLoaded(); @@ -19,13 +26,13 @@ test.describe('save-from-controls', () => { // Update an arg const label = sbPage.panelContent().locator('textarea[name=label]'); const value = await label.inputValue(); - await label.fill(value + ' Updated'); + await label.fill(value + ' Updated ' + id); // Assert the footer is shown await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // update the story - await sbPage.panelContent().locator('button').getByText('Update story').click(); + await sbPage.panelContent().locator('[aria-label="Save changes to story"]').click(); // Assert the file is saved const notification1 = await sbPage.page.waitForSelector('[title="Story saved"]'); @@ -42,10 +49,13 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // clone the story - await sbPage.panelContent().locator('button').getByText('Create new story').click(); + await sbPage + .panelContent() + .locator('[aria-label="Create new story with these settings"]') + .click(); const input = await sbPage.page.waitForSelector('[placeholder="Story export name"]'); - await input.fill('ClonedStory'); + await input.fill('ClonedStory' + id); const submit = await sbPage.page.waitForSelector('[type="submit"]'); await submit.click(); From 139e8c96c84799351b93e820fcdf85005fa42fbe Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 16:22:33 +0200 Subject: [PATCH 088/180] Prevent color swatch from showing on top of SaveStory bar --- code/addons/controls/src/SaveStory.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/code/addons/controls/src/SaveStory.tsx b/code/addons/controls/src/SaveStory.tsx index 8a7368ba9d6c..35123ad296b4 100644 --- a/code/addons/controls/src/SaveStory.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -27,6 +27,7 @@ const Container = styled.div({ bottom: 0, height: 39, overflow: 'hidden', + zIndex: 1, }); const Bar = styled(BaseBar)(({ theme }) => ({ From 8390ec5287d2eda0f33ac9afc4dd19c7cc97c97d Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 16:35:34 +0200 Subject: [PATCH 089/180] Avoid transparent background to prevent controls from showing through --- code/addons/controls/src/SaveStory.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/addons/controls/src/SaveStory.tsx b/code/addons/controls/src/SaveStory.tsx index 35123ad296b4..474d74b89409 100644 --- a/code/addons/controls/src/SaveStory.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -17,7 +17,7 @@ const slideIn = keyframes({ }); const highlight = keyframes({ - from: { background: 'var(--highlight-bg-color)' }, + from: { background: '#E0F0FF' }, to: {}, }); @@ -31,7 +31,6 @@ const Container = styled.div({ }); const Bar = styled(BaseBar)(({ theme }) => ({ - '--highlight-bg-color': theme.background.hoverable, display: 'flex', flexDirection: 'row-reverse', // hide Info rather than Actions on overflow alignItems: 'center', From f34265b220f215947388f093812ef2cd93d16fd8 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 17:43:48 +0200 Subject: [PATCH 090/180] Only send updated args when saving story, to prevent meta args from being added --- code/addons/controls/src/manager.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index eeab03b1c456..b282c15b40e1 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -6,6 +6,7 @@ import { addons, types, useArgTypes } from '@storybook/manager-api'; import { color } from '@storybook/theming'; import { ControlsPanel } from './ControlsPanel'; import { ADDON_ID, PARAM_KEY } from './constants'; +import type { Args } from '@storybook/csf'; function Title() { const rows = useArgTypes(); @@ -64,7 +65,11 @@ addons.register(ADDON_ID, (api) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { - args: data.args, + // Only send updated args + args: Object.entries(data.args || {}).reduce((acc, [key, value]) => { + if (value !== data.initialArgs?.[key]) acc[key] = value; + return acc; + }, {}), csfId: data.id, importPath: data.importPath, }); From fa3d3bebd0bfb5707a72e364b7cf2a003962c991 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 17:48:07 +0200 Subject: [PATCH 091/180] Fix typo in save-from-controls.spec.ts --- code/e2e-tests/save-from-controls.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index e086171b0647..fe124846ce49 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -6,11 +6,12 @@ const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:8001'; const type = process.env.STORYBOOK_TYPE || 'dev'; test.describe('save-from-controls', () => { + test.describe.configure({ mode: 'serial' }); test.skip(type === 'build', `Skipping save-from-controls tests for production Storybooks`); test('Should be able to update a story', async ({ page, browserName }) => { // this is needed because the e2e test will generate a new file in the system - // which we dont know of its location (it runs in different sandboxes) + // which we don't know of its location (it runs in different sandboxes) // so we just create a random id to make it easier to run tests const id = Math.random().toString(36).substring(7); From 6c086140c8d5e62c17e21cbd2c22a7981bd6bb2a Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 17 Apr 2024 18:20:41 +0200 Subject: [PATCH 092/180] Refactor save-from-controls.spec.ts and ControlsPanel.tsx --- code/e2e-tests/save-from-controls.spec.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index fe124846ce49..de64cea7c990 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -33,7 +33,7 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // update the story - await sbPage.panelContent().locator('[aria-label="Save changes to story"]').click(); + await sbPage.panelContent().locator('button').getByText('Update story').click(); // Assert the file is saved const notification1 = await sbPage.page.waitForSelector('[title="Story saved"]'); @@ -50,10 +50,7 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // clone the story - await sbPage - .panelContent() - .locator('[aria-label="Create new story with these settings"]') - .click(); + await sbPage.panelContent().locator('button').getByText('Create new story').click(); const input = await sbPage.page.waitForSelector('[placeholder="Story export name"]'); await input.fill('ClonedStory' + id); From 43be9655c0de56ce9a177d289cf68d569465f401 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Wed, 17 Apr 2024 18:44:54 +0200 Subject: [PATCH 093/180] Use deepEqual rather than equality check --- code/addons/controls/src/manager.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index b282c15b40e1..228a8ae31e66 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { dequal as deepEqual } from 'dequal'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; import type { API } from '@storybook/manager-api'; @@ -67,7 +68,7 @@ addons.register(ADDON_ID, (api) => { return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { // Only send updated args args: Object.entries(data.args || {}).reduce((acc, [key, value]) => { - if (value !== data.initialArgs?.[key]) acc[key] = value; + if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; return acc; }, {}), csfId: data.id, From 944ff5fb996dc928de94b7c889df476acd9568d7 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 08:48:32 +0200 Subject: [PATCH 094/180] Introduce useDebounce hook --- .../core-events/src/data/create-new-story.ts | 18 +++++++++++++ .../src/data/file-component-search.ts | 25 +++++++++++++++++++ code/lib/core-events/src/data/save-story.ts | 22 ++++++++++++++++ code/ui/manager/src/hooks/useDebounce.ts | 17 +++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 code/lib/core-events/src/data/create-new-story.ts create mode 100644 code/lib/core-events/src/data/file-component-search.ts create mode 100644 code/lib/core-events/src/data/save-story.ts create mode 100644 code/ui/manager/src/hooks/useDebounce.ts diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts new file mode 100644 index 000000000000..7c85817e0cfe --- /dev/null +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -0,0 +1,18 @@ +export interface CreateNewStoryPayload { + // The filepath of the component for which the Story should be generated for (relative to the project root) + componentFilePath: string; + // The name of the exported component + componentExportName: string; + // is default export + componentIsDefaultExport: boolean; +} + +export interface CreateNewStoryResult { + success: true | false; + result: null | { + storyId: string; + storyFilePath: string; + exportedStoryName: string; + }; + error: null | string; +} diff --git a/code/lib/core-events/src/data/file-component-search.ts b/code/lib/core-events/src/data/file-component-search.ts new file mode 100644 index 000000000000..72877a07c55d --- /dev/null +++ b/code/lib/core-events/src/data/file-component-search.ts @@ -0,0 +1,25 @@ +export interface FileComponentSearchPayload { + // A regular string or a glob pattern + searchQuery?: string; +} + +export interface FileComponentSearchResult { + success: true | false; + result: null | { + searchQuery: string; + files: Array<{ + // The filepath relative to the project root + filepath: string; + // The search query - Helps to identify the event on the frontend + searchQuery: string; + // A list of exported components + exportedComponents: Array<{ + // the name of the exported component + name: string; + // True, if the exported component is a default export + default: boolean; + }>; + }> | null; + }; + error: null | string; +} diff --git a/code/lib/core-events/src/data/save-story.ts b/code/lib/core-events/src/data/save-story.ts new file mode 100644 index 000000000000..47f7e1ab5d05 --- /dev/null +++ b/code/lib/core-events/src/data/save-story.ts @@ -0,0 +1,22 @@ +export interface SaveStoryRequest { + id: string; + payload: { + csfId: string; + importPath: string; + args: Record; + name?: string; + }; +} + +export type SaveStoryResponse = ( + | { id: string; success: true } + | { id: string; success: false; error: string } +) & { + payload: { + csfId: string; + newStoryId?: string; + newStoryName?: string; + sourceFileName?: string; + sourceStoryName?: string; + }; +}; diff --git a/code/ui/manager/src/hooks/useDebounce.ts b/code/ui/manager/src/hooks/useDebounce.ts new file mode 100644 index 000000000000..48f64b82953c --- /dev/null +++ b/code/ui/manager/src/hooks/useDebounce.ts @@ -0,0 +1,17 @@ +import { useEffect, useState } from 'react'; + +export function useDebounce(value: T, delay: number): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(handler); + }; + }, [value, delay]); + + return debouncedValue; +} From 333329acfe5ad00b0aee99c24b9ff61e6912830f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 08:52:01 +0200 Subject: [PATCH 095/180] Export request and response interfaces for some channels WIP --- code/lib/core-events/src/index.ts | 20 +++++---- .../create-new-story-channel.ts | 18 ++++---- .../src/server-channel/file-search-channel.ts | 42 +++++-------------- .../src/utils/get-new-story-file.ts | 12 +----- .../src/utils/save-story/save-story.ts | 24 +---------- code/ui/manager/src/globals/exports.ts | 8 ++-- 6 files changed, 40 insertions(+), 84 deletions(-) diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 37452d0a8d76..0a23e056927a 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -74,12 +74,12 @@ enum events { TOGGLE_WHATS_NEW_NOTIFICATIONS = 'toggleWhatsNewNotifications', TELEMETRY_ERROR = 'telemetryError', - FILE_COMPONENT_SEARCH = 'fileComponentSearch', - FILE_COMPONENT_SEARCH_RESULT = 'fileComponentSearchResult', + FILE_COMPONENT_SEARCH_REQUEST = 'fileComponentSearchRequest', + FILE_COMPONENT_SEARCH_RESPONSE = 'fileComponentSearchResponse', SAVE_STORY_REQUEST = 'saveStoryRequest', SAVE_STORY_RESPONSE = 'saveStoryResponse', - CREATE_NEW_STORYFILE = 'createNewStoryfile', - CREATE_NEW_STORYFILE_RESULT = 'createNewStoryfileResult', + CREATE_NEW_STORYFILE_REQUEST = 'createNewStoryfileRequest', + CREATE_NEW_STORYFILE_RESPONSE = 'createNewStoryfileResponse', } // Enables: `import Events from ...` @@ -91,13 +91,13 @@ export const { CHANNEL_WS_DISCONNECT, CHANNEL_CREATED, CONFIG_ERROR, - CREATE_NEW_STORYFILE, - CREATE_NEW_STORYFILE_RESULT, + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, CURRENT_STORY_WAS_SET, DOCS_PREPARED, DOCS_RENDERED, - FILE_COMPONENT_SEARCH, - FILE_COMPONENT_SEARCH_RESULT, + FILE_COMPONENT_SEARCH_REQUEST, + FILE_COMPONENT_SEARCH_RESPONSE, FORCE_RE_RENDER, FORCE_REMOUNT, GLOBALS_UPDATED, @@ -142,6 +142,10 @@ export const { SAVE_STORY_RESPONSE, } = events; +export * from './data/create-new-story'; +export * from './data/file-component-search'; +export * from './data/save-story'; + export interface WhatsNewCache { lastDismissedPost?: string; lastReadPost?: string; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 7546c5910a70..e93694c7f097 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -1,6 +1,10 @@ import type { Options } from '@storybook/types'; import type { Channel } from '@storybook/channels'; -import { CREATE_NEW_STORYFILE, CREATE_NEW_STORYFILE_RESULT } from '@storybook/core-events'; +import type { CreateNewStoryPayload, CreateNewStoryResult } from '@storybook/core-events'; +import { + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, +} from '@storybook/core-events'; import fs from 'node:fs/promises'; import type { NewStoryData } from '../utils/get-new-story-file'; import { getNewStoryFile } from '../utils/get-new-story-file'; @@ -20,7 +24,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** * Listens for events to create a new storyfile */ - channel.on(CREATE_NEW_STORYFILE, async (data: CreateNewStoryPayload) => { + channel.on(CREATE_NEW_STORYFILE_REQUEST, async (data: CreateNewStoryPayload) => { try { const { storyFilePath, exportedStoryName, storyFileContent } = await getNewStoryFile( data, @@ -31,19 +35,19 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); - channel.emit(CREATE_NEW_STORYFILE_RESULT, { + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: true, result: { storyId, }, error: null, - } satisfies Result); + } satisfies CreateNewStoryResult); } catch (e: any) { - channel.emit(CREATE_NEW_STORYFILE_RESULT, { + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: false, result: null, - error: `An error occurred while creating a new story:\n${e?.message}`, - } satisfies Result); + error: e?.message, + } satisfies CreateNewStoryResult); } }); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index 3f2884867447..6d26aaede94a 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -10,39 +10,17 @@ import fs from 'fs/promises'; import { getParser } from '../utils/parser'; import { searchFiles } from '../utils/search-files'; -import { FILE_COMPONENT_SEARCH, FILE_COMPONENT_SEARCH_RESULT } from '@storybook/core-events'; - -interface Data { - // A regular string or a glob pattern - searchQuery?: string; -} - -interface SearchResult { - success: true | false; - result: null | { - searchQuery: string; - files: Array<{ - // The filepath relative to the project root - filepath: string; - // The search query - Helps to identify the event on the frontend - searchQuery: string; - // A list of exported components - exportedComponents: Array<{ - // the name of the exported component - name: string; - // True, if the exported component is a default export - default: boolean; - }>; - }> | null; - }; - error: null | string; -} +import type { FileComponentSearchPayload, FileComponentSearchResult } from '@storybook/core-events'; +import { + FILE_COMPONENT_SEARCH_REQUEST, + FILE_COMPONENT_SEARCH_RESPONSE, +} from '@storybook/core-events'; export function initFileSearchChannel(channel: Channel, options: Options) { /** * Listens for a search query event and searches for files in the project */ - channel.on(FILE_COMPONENT_SEARCH, async (data: Data) => { + channel.on(FILE_COMPONENT_SEARCH_REQUEST, async (data: FileComponentSearchPayload) => { try { const searchQuery = data?.searchQuery; @@ -82,23 +60,23 @@ export function initFileSearchChannel(channel: Channel, options: Options) { } }); - channel.emit(FILE_COMPONENT_SEARCH_RESULT, { + channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { success: true, result: { searchQuery, files: await Promise.all(entries), }, error: null, - } as SearchResult); + } as FileComponentSearchResult); } catch (e: any) { /** * Emits the search result event with an error message */ - channel.emit(FILE_COMPONENT_SEARCH_RESULT, { + channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { success: false, result: null, error: `An error occurred while searching for components in the project.\n${e?.message}`, - } as SearchResult); + } as FileComponentSearchResult); } }); diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index cfec1dd52152..96e337bc6e93 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -4,18 +4,10 @@ import path from 'node:path'; import fs from 'node:fs'; import { getTypeScriptTemplateForNewStoryFile } from './new-story-templates/typescript'; import { getJavaScriptTemplateForNewStoryFile } from './new-story-templates/javascript'; - -export interface NewStoryData { - // The filepath of the component for which the Story should be generated for (relative to the project root) - componentFilePath: string; - // The name of the exported component - componentExportName: string; - // is default export - componentIsDefaultExport: boolean; -} +import type { CreateNewStoryPayload } from '@storybook/core-events'; export async function getNewStoryFile( - { componentFilePath, componentExportName, componentIsDefaultExport }: NewStoryData, + { componentFilePath, componentExportName, componentIsDefaultExport }: CreateNewStoryPayload, options: Options ) { const isTypescript = /\.(ts|tsx|mts|cts)$/.test(componentFilePath); diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 6d2622f10e17..7b4c1a91d85f 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,5 +1,6 @@ /* eslint-disable no-underscore-dangle */ import type { Channel } from '@storybook/channels'; +import type { SaveStoryRequest, SaveStoryResponse } from '@storybook/core-events'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, STORY_RENDERED } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; import { readCsf, writeCsf } from '@storybook/csf-tools'; @@ -11,29 +12,6 @@ import type { CoreConfig, Options } from '@storybook/types'; import { telemetry } from '@storybook/telemetry'; import { logger } from '@storybook/node-logger'; -interface SaveStoryRequest { - id: string; - payload: { - csfId: string; - importPath: string; - args: Record; - name?: string; - }; -} - -type SaveStoryResponse = ( - | { id: string; success: true } - | { id: string; success: false; error: string } -) & { - payload: { - csfId: string; - newStoryId?: string; - newStoryName?: string; - sourceFileName?: string; - sourceStoryName?: string; - }; -}; - class SaveStoryError extends Error {} export function initializeSaveStory(channel: Channel, options: Options, coreConfig: CoreConfig) { diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index f76f146adca5..206ce13b3473 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -134,13 +134,13 @@ export default { 'CHANNEL_CREATED', 'CHANNEL_WS_DISCONNECT', 'CONFIG_ERROR', - 'CREATE_NEW_STORYFILE', - 'CREATE_NEW_STORYFILE_RESULT', + 'CREATE_NEW_STORYFILE_REQUEST', + 'CREATE_NEW_STORYFILE_RESPONSE', 'CURRENT_STORY_WAS_SET', 'DOCS_PREPARED', 'DOCS_RENDERED', - 'FILE_COMPONENT_SEARCH', - 'FILE_COMPONENT_SEARCH_RESULT', + 'FILE_COMPONENT_SEARCH_REQUEST', + 'FILE_COMPONENT_SEARCH_RESPONSE', 'FORCE_REMOUNT', 'FORCE_RE_RENDER', 'GLOBALS_UPDATED', From 0c19a46e61960808a29a37f864fd26f6b77c3292 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 08:53:33 +0200 Subject: [PATCH 096/180] Change generic parser to use @babel/parser es-module-parser was not supporting jsx syntax. Other fast alternatives like acorn were evaluated, but either the parsing wasn't sufficient or the parser wasn't maintained anymore. @babel/parser fits our requirements the best, although it might be one of the slower AST parsers. --- code/lib/core-server/package.json | 3 +- .../file-search-channel.test.ts | 25 ++-- .../src/es-module.stories.js | 0 .../src/utils/parser/generic-parser.test.ts | 28 ---- .../src/utils/parser/generic-parser.ts | 141 +++++++++++++----- 5 files changed, 115 insertions(+), 82 deletions(-) create mode 100644 code/lib/core-server/src/utils/__search-files-tests__/src/es-module.stories.js diff --git a/code/lib/core-server/package.json b/code/lib/core-server/package.json index b10fdf945447..9261d64f6e48 100644 --- a/code/lib/core-server/package.json +++ b/code/lib/core-server/package.json @@ -57,6 +57,7 @@ "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@babel/core": "^7.23.9", + "@babel/parser": "^7.24.4", "@discoveryjs/json-ext": "^0.5.3", "@storybook/builder-manager": "workspace:*", "@storybook/channels": "workspace:*", @@ -79,12 +80,10 @@ "@types/semver": "^7.3.4", "better-opn": "^3.0.2", "chalk": "^4.1.0", - "cjs-module-lexer": "^1.2.3", "cli-table3": "^0.6.1", "compression": "^1.7.4", "detect-port": "^1.3.0", "diff": "^5.2.0", - "es-module-lexer": "^1.5.0", "express": "^4.17.3", "fs-extra": "^11.1.0", "globby": "^14.0.1", diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index e967910dd6c7..3316fab5f8dd 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -43,7 +43,7 @@ describe('file-search-channel', () => { describe('initFileSearchChannel', async () => { it('should emit search result event with the search result', async () => { const mockOptions = {}; - const data = { searchQuery: 'commonjs' }; + const data = { searchQuery: 'es-module' }; initFileSearchChannel(mockChannel, mockOptions as any); @@ -70,38 +70,33 @@ describe('file-search-channel', () => { exportedComponents: [ { default: false, - name: './commonjs', + name: 'p', }, - ], - filepath: 'src/commonjs-module-default.js', - }, - { - exportedComponents: [ { default: false, - name: 'a', + name: 'q', }, { default: false, - name: 'b', + name: 'C', }, { default: false, - name: 'c', + name: 'externalName', }, { default: false, - name: 'd', + name: 'ns', }, { - default: false, - name: 'e', + default: true, + name: 'default', }, ], - filepath: 'src/commonjs-module.js', + filepath: 'src/es-module.js', }, ], - searchQuery: 'commonjs', + searchQuery: 'es-module', }, success: true, }); diff --git a/code/lib/core-server/src/utils/__search-files-tests__/src/es-module.stories.js b/code/lib/core-server/src/utils/__search-files-tests__/src/es-module.stories.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/code/lib/core-server/src/utils/parser/generic-parser.test.ts b/code/lib/core-server/src/utils/parser/generic-parser.test.ts index 6d3ff96e15b0..61bba2739f72 100644 --- a/code/lib/core-server/src/utils/parser/generic-parser.test.ts +++ b/code/lib/core-server/src/utils/parser/generic-parser.test.ts @@ -8,34 +8,6 @@ const genericParser = new GenericParser(); const TEST_DIR = path.join(__dirname, '..', '__search-files-tests__'); describe('generic-parser', () => { - it('should correctly return exports from CommonJS files', async () => { - const content = fs.readFileSync(path.join(TEST_DIR, 'src', 'commonjs-module.js'), 'utf-8'); - const { exports } = await genericParser.parse(content); - - expect(exports).toEqual([ - { - default: false, - name: 'a', - }, - { - default: false, - name: 'b', - }, - { - default: false, - name: 'c', - }, - { - default: false, - name: 'd', - }, - { - default: false, - name: 'e', - }, - ]); - }); - it('should correctly return exports from ES modules', async () => { const content = fs.readFileSync(path.join(TEST_DIR, 'src', 'es-module.js'), 'utf-8'); const { exports } = await genericParser.parse(content); diff --git a/code/lib/core-server/src/utils/parser/generic-parser.ts b/code/lib/core-server/src/utils/parser/generic-parser.ts index e297c1e92eed..e3c4754fab44 100644 --- a/code/lib/core-server/src/utils/parser/generic-parser.ts +++ b/code/lib/core-server/src/utils/parser/generic-parser.ts @@ -1,8 +1,7 @@ -import { parse as parseCjs, init as initCjsParser } from 'cjs-module-lexer'; -import { parse as parseEs } from 'es-module-lexer'; -import assert from 'node:assert'; +import * as babelParser from '@babel/parser'; +import { types } from '@babel/core'; -import type { Parser } from './types'; +import type { Parser, ParserResult } from './types'; /** * A generic parser that can parse both ES and CJS modules. @@ -13,41 +12,109 @@ export class GenericParser implements Parser { * @param content The content of the file * @returns The exports of the file */ - async parse(content: string) { - try { - // Do NOT remove await here. The types are wrong! It has to be awaited, - // otherwise it will return a Promise> when wasm isn't loaded. - const [, exports] = await parseEs(content); + async parse(content: string): Promise { + const ast = babelParser.parse(content, { + allowImportExportEverywhere: true, + allowAwaitOutsideFunction: true, + allowNewTargetOutsideFunction: true, + allowReturnOutsideFunction: true, + allowUndeclaredExports: true, + plugins: [ + // Language features + 'typescript', + 'jsx', + // Latest ECMAScript features + 'asyncGenerators', + 'bigInt', + 'classProperties', + 'classPrivateProperties', + 'classPrivateMethods', + 'classStaticBlock', + 'dynamicImport', + 'exportNamespaceFrom', + 'logicalAssignment', + 'moduleStringNames', + 'nullishCoalescingOperator', + 'numericSeparator', + 'objectRestSpread', + 'optionalCatchBinding', + 'optionalChaining', + 'privateIn', + 'regexpUnicodeSets', + 'topLevelAwait', + // ECMAScript proposals + 'asyncDoExpressions', + 'decimal', + 'decorators', + 'decoratorAutoAccessors', + 'deferredImportEvaluation', + 'destructuringPrivate', + 'doExpressions', + 'explicitResourceManagement', + 'exportDefaultFrom', + 'functionBind', + 'functionSent', + 'importAttributes', + 'importReflection', + 'moduleBlocks', + 'partialApplication', + 'recordAndTuple', + 'sourcePhaseImports', + 'throwExpressions', + ], + }); - assert( - exports.length > 0, - 'No named exports found. Very likely that this is not a ES module.' - ); + const exports: ParserResult['exports'] = []; - return { - exports: (exports ?? []).map((e) => { - const name = content.substring(e.s, e.e); - return { - name, - default: name === 'default', - }; - }), - }; - // Try to parse as CJS module - } catch { - await initCjsParser(); + ast.program.body.forEach(function traverse(node) { + if (types.isExportNamedDeclaration(node)) { + // Handles function declarations: `export function a() {}` + if ( + types.isFunctionDeclaration(node.declaration) && + types.isIdentifier(node.declaration.id) + ) { + exports.push({ + name: node.declaration.id.name, + default: false, + }); + } + // Handles class declarations: `export class A {}` + if (types.isClassDeclaration(node.declaration) && types.isIdentifier(node.declaration.id)) { + exports.push({ + name: node.declaration.id.name, + default: false, + }); + } + // Handles export specifiers: `export { a }` + if (node.declaration === null && node.specifiers.length > 0) { + node.specifiers.forEach((specifier) => { + if (types.isExportSpecifier(specifier) && types.isIdentifier(specifier.exported)) { + exports.push({ + name: specifier.exported.name, + default: false, + }); + } + }); + } + if (types.isVariableDeclaration(node.declaration)) { + node.declaration.declarations.forEach((declaration) => { + // Handle variable declarators: `export const a = 1;` + if (types.isVariableDeclarator(declaration) && types.isIdentifier(declaration.id)) { + exports.push({ + name: declaration.id.name, + default: false, + }); + } + }); + } + } else if (types.isExportDefaultDeclaration(node)) { + exports.push({ + name: 'default', + default: true, + }); + } + }); - const { exports, reexports } = parseCjs(content); - const filteredExports = [...exports, ...reexports].filter((e: string) => e !== '__esModule'); - - assert(filteredExports.length > 0, 'No named exports found'); - - return { - exports: (filteredExports ?? []).map((name) => ({ - name, - default: name === 'default', - })), - }; - } + return { exports }; } } From 6b81b0cbbc56dbd0cbdbf36c91696143eab66303 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 08:56:21 +0200 Subject: [PATCH 097/180] Use renderer package for typescript template --- .../src/utils/get-new-story-file.test.ts | 2 +- .../src/utils/get-new-story-file.ts | 44 ++++++++++++------- .../new-story-templates/typescript.test.ts | 8 ++-- .../utils/new-story-templates/typescript.ts | 6 +-- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/code/lib/core-server/src/utils/get-new-story-file.test.ts b/code/lib/core-server/src/utils/get-new-story-file.test.ts index 429801ad0186..e9f204f1fe0c 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.test.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.test.ts @@ -31,7 +31,7 @@ describe('get-new-story-file', () => { expect(exportedStoryName).toBe('Default'); expect(storyFileContent).toMatchInlineSnapshot(` - "import type { Meta, StoryObj } from '@storybook/nextjs'; + "import type { Meta, StoryObj } from '@storybook/react'; import { Page } from './Page'; diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index 96e337bc6e93..330b33903c7c 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -1,5 +1,10 @@ import type { Options } from '@storybook/types'; -import { getFrameworkName, getProjectRoot } from '@storybook/core-common'; +import { + extractProperRendererNameFromFramework, + getFrameworkName, + getProjectRoot, + rendererPackages, +} from '@storybook/core-common'; import path from 'node:path'; import fs from 'node:fs'; import { getTypeScriptTemplateForNewStoryFile } from './new-story-templates/typescript'; @@ -14,6 +19,10 @@ export async function getNewStoryFile( const cwd = getProjectRoot(); const frameworkPackageName = await getFrameworkName(options); + const rendererName = await extractProperRendererNameFromFramework(frameworkPackageName); + const rendererPackage = Object.entries(rendererPackages).find( + ([, value]) => value === rendererName + )?.[0]; const basename = path.basename(componentFilePath); const extension = path.extname(componentFilePath); @@ -26,22 +35,23 @@ export async function getNewStoryFile( const exportedStoryName = 'Default'; - const storyFileContent = isTypescript - ? await getTypeScriptTemplateForNewStoryFile({ - basenameWithoutExtension, - componentExportName, - componentIsDefaultExport, - frameworkPackageName, - exportedStoryName, - }) - : await getJavaScriptTemplateForNewStoryFile({ - basenameWithoutExtension, - componentExportName, - componentIsDefaultExport, - exportedStoryName, - }); - - const doesStoryFileExist = fs.existsSync(path.join(cwd, componentFilePath)); + const storyFileContent = + isTypescript && rendererPackage + ? await getTypeScriptTemplateForNewStoryFile({ + basenameWithoutExtension, + componentExportName, + componentIsDefaultExport, + rendererPackage, + exportedStoryName, + }) + : await getJavaScriptTemplateForNewStoryFile({ + basenameWithoutExtension, + componentExportName, + componentIsDefaultExport, + exportedStoryName, + }); + + const doesStoryFileExist = fs.existsSync(path.join(cwd, storyFileName)); const storyFilePath = doesStoryFileExist ? path.join(cwd, dirname, alternativeStoryFileName) diff --git a/code/lib/core-server/src/utils/new-story-templates/typescript.test.ts b/code/lib/core-server/src/utils/new-story-templates/typescript.test.ts index f576a3d4ad2d..338b3209ce95 100644 --- a/code/lib/core-server/src/utils/new-story-templates/typescript.test.ts +++ b/code/lib/core-server/src/utils/new-story-templates/typescript.test.ts @@ -7,12 +7,12 @@ describe('typescript', () => { basenameWithoutExtension: 'foo', componentExportName: 'default', componentIsDefaultExport: true, - frameworkPackageName: '@storybook/nextjs', + rendererPackage: '@storybook/react', exportedStoryName: 'Default', }); expect(result).toMatchInlineSnapshot(` - "import type { Meta, StoryObj } from '@storybook/nextjs'; + "import type { Meta, StoryObj } from '@storybook/react'; import Foo from './foo'; @@ -33,12 +33,12 @@ describe('typescript', () => { basenameWithoutExtension: 'foo', componentExportName: 'Example', componentIsDefaultExport: false, - frameworkPackageName: '@storybook/nextjs', + rendererPackage: '@storybook/react', exportedStoryName: 'Default', }); expect(result).toMatchInlineSnapshot(` - "import type { Meta, StoryObj } from '@storybook/nextjs'; + "import type { Meta, StoryObj } from '@storybook/react'; import { Example } from './foo'; diff --git a/code/lib/core-server/src/utils/new-story-templates/typescript.ts b/code/lib/core-server/src/utils/new-story-templates/typescript.ts index cb44dfdfc9c4..d2513673ebb5 100644 --- a/code/lib/core-server/src/utils/new-story-templates/typescript.ts +++ b/code/lib/core-server/src/utils/new-story-templates/typescript.ts @@ -6,8 +6,8 @@ interface TypeScriptTemplateData { basenameWithoutExtension: string; componentExportName: string; componentIsDefaultExport: boolean; - /** The framework package name, e.g. @storybook/nextjs */ - frameworkPackageName: string; + /** The renderer package name, e.g. @storybook/nextjs */ + rendererPackage: string; /** The exported name of the default story */ exportedStoryName: string; } @@ -21,7 +21,7 @@ export async function getTypeScriptTemplateForNewStoryFile(data: TypeScriptTempl : `import { ${importName} } from './${data.basenameWithoutExtension}'`; return dedent` - import type { Meta, StoryObj } from '${data.frameworkPackageName}'; + import type { Meta, StoryObj } from '${data.rendererPackage}'; ${importStatement}; From a449d8cb6b616a869f0878fea98e436a059955a7 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 08:57:26 +0200 Subject: [PATCH 098/180] Return storyFilePath and exported name when creating a story in the response --- .../create-new-story-channel.test.ts | 4 +++- .../src/server-channel/create-new-story-channel.ts | 14 +++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index 289756ea540b..92244207ca8a 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -73,6 +73,8 @@ describe('createNewStoryChannel', () => { error: null, result: { storyId: 'components-page--default', + storyFilePath: './src/components/Page.stories.jsx', + exportedStoryName: 'Default', }, success: true, }); @@ -111,7 +113,7 @@ describe('createNewStoryChannel', () => { }); expect(createNewStoryFileEventListener).toHaveBeenCalledWith({ - error: 'An error occurred while creating a new story:\nFailed to write file', + error: 'Failed to write file', result: null, success: false, }); diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index e93694c7f097..304c7411fba9 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -6,19 +6,9 @@ import { CREATE_NEW_STORYFILE_RESPONSE, } from '@storybook/core-events'; import fs from 'node:fs/promises'; -import type { NewStoryData } from '../utils/get-new-story-file'; import { getNewStoryFile } from '../utils/get-new-story-file'; import { getStoryId } from '../utils/get-story-id'; - -interface CreateNewStoryPayload extends NewStoryData {} - -interface Result { - success: true | false; - result: null | { - storyId: string; - }; - error: null | string; -} +import path from 'node:path'; export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** @@ -39,6 +29,8 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { success: true, result: { storyId, + storyFilePath: `./${path.relative(process.cwd(), storyFilePath)}`, + exportedStoryName, }, error: null, } satisfies CreateNewStoryResult); From 0f37b9874f9f5aea8991dbabedb50c1b45bd910f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:00:27 +0200 Subject: [PATCH 099/180] Enhance file search to exclude stories and to filter out unsupported file extensions --- .../src/utils/search-files.test.ts | 31 +++++++++++++++++++ .../lib/core-server/src/utils/search-files.ts | 15 +++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/code/lib/core-server/src/utils/search-files.test.ts b/code/lib/core-server/src/utils/search-files.test.ts index 6aaec136df74..c7f7ab51d388 100644 --- a/code/lib/core-server/src/utils/search-files.test.ts +++ b/code/lib/core-server/src/utils/search-files.test.ts @@ -66,6 +66,28 @@ describe('search-files', () => { expect(files).toEqual(['src/commonjs-module.js']); }); + it('should respect glob but also the allowed file extensions', async (t) => { + const files = await searchFiles({ + searchQuery: '**/*', + cwd: path.join(__dirname, '__search-files-tests__'), + }); + + expect(files).toEqual([ + 'src/commonjs-module-default.js', + 'src/commonjs-module.js', + 'src/es-module.js', + 'src/no-export.js', + 'src/file-extensions/extension.cjs', + 'src/file-extensions/extension.cts', + 'src/file-extensions/extension.js', + 'src/file-extensions/extension.jsx', + 'src/file-extensions/extension.mjs', + 'src/file-extensions/extension.mts', + 'src/file-extensions/extension.ts', + 'src/file-extensions/extension.tsx', + ]); + }); + it('should ignore node_modules', async (t) => { const files = await searchFiles({ searchQuery: 'file-in-common.js', @@ -75,6 +97,15 @@ describe('search-files', () => { expect(files).toEqual([]); }); + it('should ignore story files', async (t) => { + const files = await searchFiles({ + searchQuery: 'es-module.stories.js', + cwd: path.join(__dirname, '__search-files-tests__'), + }); + + expect(files).toEqual([]); + }); + it('should not return files outside of project root', async (t) => { await expect(() => searchFiles({ diff --git a/code/lib/core-server/src/utils/search-files.ts b/code/lib/core-server/src/utils/search-files.ts index b6f1bd89ab25..3f6a8e669046 100644 --- a/code/lib/core-server/src/utils/search-files.ts +++ b/code/lib/core-server/src/utils/search-files.ts @@ -3,7 +3,9 @@ export type SearchResult = Array; /** * File extensions that should be searched for */ -const fileExtensions = ['js', 'mjs', 'cjs', 'jsx', 'mts', 'ts', 'tsx', 'cts']; +const FILE_EXTENSIONS = ['js', 'mjs', 'cjs', 'jsx', 'mts', 'ts', 'tsx', 'cts']; + +const IGNORED_FILES = ['**/node_modules/**', '**/*.spec.*', '**/*.test.*', '**/*.stories.*']; /** * Search for files in a directory that match the search query @@ -15,9 +17,13 @@ const fileExtensions = ['js', 'mjs', 'cjs', 'jsx', 'mts', 'ts', 'tsx', 'cts']; export async function searchFiles({ searchQuery, cwd, + ignoredFiles = IGNORED_FILES, + fileExtensions = FILE_EXTENSIONS, }: { searchQuery: string; cwd: string; + ignoredFiles?: string[]; + fileExtensions?: string[]; }): Promise { // Dynamically import globby because it is a pure ESM module const { globby, isDynamicPattern } = await import('globby'); @@ -38,11 +44,14 @@ export async function searchFiles({ ]; const entries = await globby(globbedSearchQuery, { - ignore: ['**/node_modules/**', '**/*.spec.*', '**/*.test.*'], + ignore: ignoredFiles, gitignore: true, + caseSensitiveMatch: false, cwd, objectMode: true, }); - return entries.map((entry) => entry.path); + return entries + .map((entry) => entry.path) + .filter((entry) => fileExtensions.some((ext) => entry.endsWith(`.${ext}`))); } From b2ba678932239bdef7e45185c4940009e0677e13 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:07:51 +0200 Subject: [PATCH 100/180] Update error message --- code/lib/core-server/src/utils/get-story-id.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/lib/core-server/src/utils/get-story-id.ts b/code/lib/core-server/src/utils/get-story-id.ts index acfbce990853..b874a071479a 100644 --- a/code/lib/core-server/src/utils/get-story-id.ts +++ b/code/lib/core-server/src/utils/get-story-id.ts @@ -31,9 +31,7 @@ export async function getStoryId(data: StoryIdData, options: Options) { if (autoTitle === undefined) { // eslint-disable-next-line local-rules/no-uncategorized-errors throw new Error(dedent` - The generation of your new Story file was successful but it seems that we are unable to index it. - Please make sure that the new Story file is matched by the 'stories' glob pattern in your Storybook configuration. - The location of the new Story file is: ${relativePath} + The new story file was successfully generated, but we are unable to index it. Please ensure that the new Story file is matched by the 'stories' glob pattern in your Storybook configuration. `); } From 343081be5e47149b569a71b822fcc2ff3cc6850c Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:11:00 +0200 Subject: [PATCH 101/180] Implement argtypes channel in Preview --- code/lib/core-events/package.json | 1 + .../lib/core-events/src/data/argtypes-info.ts | 13 ++++++++++ code/lib/core-events/src/index.ts | 5 ++++ .../src/modules/preview-web/Preview.tsx | 24 +++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 code/lib/core-events/src/data/argtypes-info.ts diff --git a/code/lib/core-events/package.json b/code/lib/core-events/package.json index 699640debd0d..2cc265012563 100644 --- a/code/lib/core-events/package.json +++ b/code/lib/core-events/package.json @@ -78,6 +78,7 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { + "@storybook/csf": "^0.1.4", "ts-dedent": "^2.0.0" }, "devDependencies": { diff --git a/code/lib/core-events/src/data/argtypes-info.ts b/code/lib/core-events/src/data/argtypes-info.ts new file mode 100644 index 000000000000..4636a006a56f --- /dev/null +++ b/code/lib/core-events/src/data/argtypes-info.ts @@ -0,0 +1,13 @@ +import type { ArgTypes } from '@storybook/csf'; + +export interface ArgTypesInfoPayload { + storyId: string; +} + +export interface ArgTypesInfoResult { + success: true | false; + result: null | { + argTypes: ArgTypes; + }; + error: null | string; +} diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 0a23e056927a..53491bb3f68f 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -78,6 +78,8 @@ enum events { FILE_COMPONENT_SEARCH_RESPONSE = 'fileComponentSearchResponse', SAVE_STORY_REQUEST = 'saveStoryRequest', SAVE_STORY_RESPONSE = 'saveStoryResponse', + ARGTYPES_INFO_REQUEST = 'argtypesInfoRequest', + ARGTYPES_INFO_RESPONSE = 'argtypesInfoResponse', CREATE_NEW_STORYFILE_REQUEST = 'createNewStoryfileRequest', CREATE_NEW_STORYFILE_RESPONSE = 'createNewStoryfileResponse', } @@ -140,10 +142,13 @@ export const { TELEMETRY_ERROR, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, } = events; export * from './data/create-new-story'; export * from './data/file-component-search'; +export * from './data/argtypes-info'; export * from './data/save-story'; export interface WhatsNewCache { diff --git a/code/lib/preview-api/src/modules/preview-web/Preview.tsx b/code/lib/preview-api/src/modules/preview-web/Preview.tsx index 29ea71045949..4b875f5e26e8 100644 --- a/code/lib/preview-api/src/modules/preview-web/Preview.tsx +++ b/code/lib/preview-api/src/modules/preview-web/Preview.tsx @@ -1,6 +1,9 @@ import { global } from '@storybook/global'; import { deprecate, logger } from '@storybook/client-logger'; +import type { ArgTypesInfoResult } from '@storybook/core-events'; import { + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, CONFIG_ERROR, FORCE_REMOUNT, FORCE_RE_RENDER, @@ -129,6 +132,7 @@ export class Preview { this.channel.on(STORY_INDEX_INVALIDATED, this.onStoryIndexChanged.bind(this)); this.channel.on(UPDATE_GLOBALS, this.onUpdateGlobals.bind(this)); this.channel.on(UPDATE_STORY_ARGS, this.onUpdateArgs.bind(this)); + this.channel.on(ARGTYPES_INFO_REQUEST, this.onRequestArgTypesInfo.bind(this)); this.channel.on(RESET_STORY_ARGS, this.onResetArgs.bind(this)); this.channel.on(FORCE_RE_RENDER, this.onForceReRender.bind(this)); this.channel.on(FORCE_REMOUNT, this.onForceRemount.bind(this)); @@ -295,6 +299,26 @@ export class Preview { }); } + async onRequestArgTypesInfo({ storyId }: { storyId: string }) { + try { + await this.storeInitializationPromise; + const story = await this.storyStoreValue?.loadStory({ storyId }); + this.channel.emit(ARGTYPES_INFO_RESPONSE, { + result: { + argTypes: story?.argTypes || {}, + }, + success: true, + error: null, + } as ArgTypesInfoResult); + } catch (e: any) { + this.channel.emit(ARGTYPES_INFO_RESPONSE, { + result: null, + success: false, + error: e?.message, + } as ArgTypesInfoResult); + } + } + async onResetArgs({ storyId, argNames }: { storyId: string; argNames?: string[] }) { if (!this.storyStoreValue) throw new CalledPreviewMethodBeforeInitializationError({ methodName: 'onResetArgs' }); From 30eb66ad205e4e382fc696946298c44c7b8e0437 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:12:02 +0200 Subject: [PATCH 102/180] Implement FileSearchModal --- code/ui/manager/package.json | 1 + .../src/components/sidebar/FileList.tsx | 41 ++ .../src/components/sidebar/FileSearchList.tsx | 398 ++++++++++++++++++ .../sidebar/FileSearchListSkeleton.tsx | 54 +++ .../components/sidebar/FileSearchModal.tsx | 348 +++++++++++++++ .../sidebar/FileSearchModal.utils.tsx | 60 +++ .../manager/src/components/sidebar/Search.tsx | 31 +- code/ui/manager/src/globals/exports.ts | 2 + code/yarn.lock | 33 +- 9 files changed, 957 insertions(+), 11 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/FileList.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchList.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchModal.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx diff --git a/code/ui/manager/package.json b/code/ui/manager/package.json index 9dd2b2528cd8..4389243ad4b9 100644 --- a/code/ui/manager/package.json +++ b/code/ui/manager/package.json @@ -85,6 +85,7 @@ "@storybook/test": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", + "@tanstack/react-virtual": "^3.3.0", "@testing-library/react": "^11.2.2", "@types/react-transition-group": "^4", "@types/semver": "^7.3.4", diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx new file mode 100644 index 000000000000..b966c112b4e6 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -0,0 +1,41 @@ +import { styled } from '@storybook/theming'; +import { rgba } from 'polished'; + +export const FileList = styled('div')(({ theme }) => ({ + height: '280px', + overflow: 'auto', + msOverflowStyle: 'none', + scrollbarWidth: 'none', + '::-webkit-scrollbar': { + display: 'none', + }, + // after element which fades out the list + '&::after': { + content: '""', + position: 'absolute', + pointerEvents: 'none', + bottom: 0, + left: 0, + right: 0, + height: '80px', + background: `linear-gradient(${rgba(theme.barBg, 0)} 10%, ${theme.barBg} 80%)`, + }, +})); + +export const FileListItem = styled('li')(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + + ':focus-visible': { + outline: 'none', + + '> div': { + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, + }, +})); diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx new file mode 100644 index 000000000000..447ecf8599b0 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -0,0 +1,398 @@ +import React, { memo, useCallback, useLayoutEffect, useState } from 'react'; +import { styled } from '@storybook/theming'; +import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; +import { FileSearchListLoadingSkeleton } from './FileSearchListSkeleton'; +import { FileList, FileListItem } from './FileList'; +import type { VirtualItem } from '@tanstack/react-virtual'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import type { CreateNewStoryPayload, FileComponentSearchResult } from '@storybook/core-events'; +import { WithTooltip, TooltipNote } from '@storybook/components'; + +const FileListItemContentWrapper = styled.div<{ selected: boolean; disabled: boolean }>( + ({ theme, selected, disabled }) => ({ + display: 'flex', + alignItems: 'flex-start', + gap: '8px', + alignSelf: 'stretch', + padding: '8px 16px', + cursor: 'pointer', + + ...(selected && { + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }), + + ...(disabled && { + cursor: 'not-allowed', + }), + + '&:hover': { + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, + }) +); + +const FileListUl = styled('ul')({ + margin: 0, + padding: 0, + width: '100%', + position: 'relative', +}); + +const FileListItemContent = styled('div')({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + width: 'calc(100% - 50px)', +}); + +const FileListIconWrapper = styled('div')(({ theme }) => ({ + color: theme.color.secondary, +})); + +const FileListItemLabel = styled('div')(({ theme }) => ({ + color: theme.base === 'dark' ? theme.color.lighter : theme.color.darkest, + fontSize: '14px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: '100%', +})); + +const FileListItemPath = styled('div')(({ theme }) => ({ + color: theme.color.mediumdark, + fontSize: '14px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: '100%', +})); + +const FileListExport = styled('ul')(({ theme }) => ({ + margin: 0, + padding: 0, +})); + +const FileListItemExport = styled('li')(({ theme }) => ({ + padding: '8px 16px 8px 16px', + marginLeft: '30px', + display: 'flex', + gap: '8px', + alignItems: 'center', + justifyContent: 'space-between', + cursor: 'pointer', + + ':focus-visible': { + outline: 'none', + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, + + '&:hover': { + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255, 255, 255, 0.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, + + '> div > svg': { + color: theme.color.secondary, + }, +})); + +const FileListItemExportName = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: '8px', + width: 'calc(100% - 20px)', +})); + +const FileListItemExportNameContent = styled('span')(({ theme }) => ({ + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: 'calc(100% - 160px)', + display: 'inline-block', +})); + +const ChevronRightIconStyled = styled(ChevronRightIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + +const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + +const DefaultExport = styled('span')(({ theme }) => ({ + display: 'inline-block', + padding: `1px ${theme.appBorderRadius}px`, + color: '#727272', + backgroundColor: '#F2F4F5', +})); + +const NoResults = styled('div')(({ theme }) => ({ + padding: '0 10%', + textAlign: 'center', + color: theme.base === 'dark' ? theme.color.lightest : theme.defaultText, +})); + +const NoResultsDescription = styled('p')(({ theme }) => ({ + color: theme.base === 'dark' ? theme.color.defaultText : theme.color.mediumdark, +})); + +export type SearchResult = FileComponentSearchResult['result']['files'][0]; + +interface FileSearchListProps { + isLoading: boolean; + searchResults: Array | null; + onNewStory: (props: CreateNewStoryPayload) => void; +} + +interface FileItemContentProps { + virtualItem: VirtualItem; + selected: number | null; + searchResult: SearchResult; + as?: 'div'; +} + +export const FileSearchList = memo(function FileSearchList({ + isLoading, + searchResults, + onNewStory, +}: FileSearchListProps) { + const [selectedItem, setSelectedItem] = useState(null); + const parentRef = React.useRef(); + + const rowVirtualizer = useVirtualizer({ + count: searchResults?.length || 0, + getScrollElement: () => parentRef.current, + paddingEnd: 40, + estimateSize: () => 54, + overscan: 2, + }); + + useLayoutEffect(() => { + if (selectedItem !== null) { + rowVirtualizer.scrollToIndex(selectedItem, { + align: 'start', + }); + } + }, [rowVirtualizer, selectedItem]); + + const handleFileItemSelection = useCallback( + ({ virtualItem, searchResult }: { virtualItem: VirtualItem; searchResult: SearchResult }) => { + if (searchResult?.exportedComponents?.length > 1) { + setSelectedItem((sItem) => { + if (sItem === virtualItem.index) { + return null; + } + + return virtualItem.index; + }); + } else if (searchResult?.exportedComponents?.length === 1) { + onNewStory({ + componentExportName: searchResult.exportedComponents[0].name, + componentFilePath: searchResult.filepath, + componentIsDefaultExport: searchResult.exportedComponents[0].default, + }); + } + }, + [onNewStory] + ); + + const handleFileItemComponentSelection = useCallback( + ({ + searchResult, + component, + }: { + searchResult: SearchResult; + component: SearchResult['exportedComponents'][0]; + }) => { + onNewStory({ + componentExportName: component.name, + componentFilePath: searchResult.filepath, + componentIsDefaultExport: component.default, + }); + }, + [onNewStory] + ); + + const ListItem = useCallback( + ({ virtualItem, selected, searchResult, as }: FileItemContentProps) => ( + { + handleFileItemSelection({ virtualItem, searchResult }); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + handleFileItemSelection({ virtualItem, searchResult }); + } + }} + > + + + + + + {searchResult.filepath.split('/').at(-1)} + {searchResult.filepath} + + {selected === virtualItem.index ? : } + + {searchResult?.exportedComponents?.length > 1 && selected === virtualItem.index && ( + { + e.stopPropagation(); + }} + onKeyUp={(e) => { + if (e.key === 'Enter') { + e.stopPropagation(); + } + }} + > + {searchResult.exportedComponents?.map((component) => ( + { + handleFileItemComponentSelection({ searchResult, component }); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + handleFileItemComponentSelection({ searchResult, component }); + } + }} + > + + + {component.default ? ( + <> + + {searchResult.filepath.split('/').at(-1)?.split('.')?.at(0)} + + Default export + + ) : ( + component.name + )} + + + + ))} + + )} + + ), + [handleFileItemComponentSelection, handleFileItemSelection, rowVirtualizer] + ); + + if (isLoading && (searchResults === null || searchResults?.length === 0)) { + return ; + } + + if (searchResults?.length === 0) { + return ( + +

We could not find any file with that name

+ + You may want to try using different keywords, checking for typos or adjusting your + filters. + +
+ ); + } + + if (searchResults?.length > 0) { + return ( + + + {rowVirtualizer.getVirtualItems().map((virtualItem) => { + const searchResult = searchResults[virtualItem.index]; + return searchResult.exportedComponents === null || + searchResult.exportedComponents?.length === 0 ? ( + + } + > + + + ) : ( + + ); + })} + + + ); + } + + return null; +}); + +// border-radius: 2px; +// font-size: 10px; + +// apply font-size: 14px to sub items +// input sizing and icon positioning diff --git a/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx b/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx new file mode 100644 index 000000000000..d54cd473f7d0 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { styled } from '@storybook/theming'; +import { FileList, FileListItem } from './FileList'; + +const FileListItemContentWrapperSkeleton = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'flex-start', + gap: '8px', + alignSelf: 'stretch', + padding: '8px 16px', +})); + +const FileListItemContentSkeleton = styled('div')({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + width: '100%', +}); + +const FileListIconWrapperSkeleton = styled.div(({ theme }) => ({ + width: '14px', + height: '14px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : 'rgba(0,0,0,.1)', + animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, +})); + +const FileListItemSkeleton = styled.div(({ theme }) => ({ + height: '14px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : 'rgba(0,0,0,.1)', + animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, + width: '100%', + + '+ div': { + marginTop: '8px', + }, +})); + +export const FileSearchListLoadingSkeleton = () => { + return ( + + {[1, 2, 3, 4, 5].map((result) => ( + + + + + + + + + + ))} + + ); +}; diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx new file mode 100644 index 000000000000..47c7b1685d7c --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -0,0 +1,348 @@ +import React, { + useCallback, + useDeferredValue, + useEffect, + useRef, + useState, + useTransition, +} from 'react'; +import { Modal, Form } from '@storybook/components'; +import { styled } from '@storybook/theming'; +import { AlertIcon, CheckIcon, CloseAltIcon, RefreshIcon, SearchIcon } from '@storybook/icons'; +import type { + ArgTypesInfoPayload, + ArgTypesInfoResult, + CreateNewStoryPayload, + CreateNewStoryResult, + FileComponentSearchPayload, + FileComponentSearchResult, + SaveStoryRequest, + SaveStoryResponse, +} from '@storybook/core-events'; +import { + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, + FILE_COMPONENT_SEARCH_REQUEST, + FILE_COMPONENT_SEARCH_RESPONSE, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, +} from '@storybook/core-events'; +import { addons, useStorybookApi } from '@storybook/manager-api'; + +import { useDebounce } from '../../hooks/useDebounce'; +import type { SearchResult } from './FileSearchList'; +import { FileSearchList } from './FileSearchList'; +import type { Channel } from '@storybook/channels'; +import { extractSeededRequiredArgs, selectNewStory } from './FileSearchModal.utils'; + +interface FileSearchModalProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +const ModalInput = styled(Form.Input)(({ theme }) => ({ + color: theme.color.darkest, + paddingLeft: 40, + paddingRight: 28, + fontSize: 14, + height: 40, + + '::placeholder': { + color: theme.color.mediumdark, + }, + '&:invalid:not(:placeholder-shown)': { + boxShadow: `${theme.color.negative} 0 0 0 1px inset`, + }, + '&::-webkit-search-decoration, &::-webkit-search-cancel-button, &::-webkit-search-results-button, &::-webkit-search-results-decoration': + { + display: 'none', + }, +})); + +const SearchField = styled.div({ + display: 'flex', + flexDirection: 'column', + flexGrow: 1, + position: 'relative', +}); + +const SearchIconWrapper = styled.div(({ theme }) => ({ + position: 'absolute', + top: 0, + left: 16, + zIndex: 1, + pointerEvents: 'none', + color: theme.darkest, + display: 'flex', + alignItems: 'center', + height: '100%', +})); + +const LoadingIcon = styled.div(({ theme }) => ({ + position: 'absolute', + top: 0, + right: 16, + zIndex: 1, + color: theme.textMutedColor, + display: 'flex', + alignItems: 'center', + height: '100%', + '@keyframes spin': { + from: { transform: 'rotate(0deg)' }, + to: { transform: 'rotate(360deg)' }, + }, + animation: 'spin 1s linear infinite', +})); + +const ModalError = styled(Modal.Error)({ + position: 'absolute', + padding: '8px 40px 8px 16px', + bottom: 0, +}); + +const ModalErrorCloseIcon = styled(CloseAltIcon)({ + position: 'absolute', + top: 8, + right: 16, + cursor: 'pointer', +}); + +export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => { + const [, startTransition] = useTransition(); + const [isLoading, setLoading] = useState(false); + const [fileSearchQuery, setFileSearchQuery] = useState(''); + const fileSearchQueryDebounced = useDebounce(fileSearchQuery, 200); + const fileSearchQueryDeferred = useDeferredValue(fileSearchQueryDebounced); + const emittedValue = useRef(null); + const [error, setError] = useState(null); + const api = useStorybookApi(); + + const [searchResults, setSearchResults] = useState(null); + + const handleErrorWhenCreatingStory = useCallback(() => { + api.addNotification({ + id: 'create-new-story-file-error', + content: { + headline: 'Error while creating story file', + subHeadline: `Take a look at your developer console for more information`, + }, + duration: 8_000, + icon: , + }); + + onOpenChange(false); + }, [api, onOpenChange]); + + const handleSuccessfullyCreatedStory = useCallback( + (componentExportName: string) => { + api.addNotification({ + id: 'create-new-story-file-success', + content: { + headline: 'Story file created', + subHeadline: `${componentExportName} was created`, + }, + duration: 8_000, + icon: , + }); + + onOpenChange(false); + }, + [api, onOpenChange] + ); + + const handleCreateNewStory = useCallback( + async ({ + componentExportName, + componentFilePath, + componentIsDefaultExport, + }: CreateNewStoryPayload) => { + try { + const channel = addons.getChannel(); + + const createNewStoryResult = await oncePromise( + { + channel, + request: { + name: CREATE_NEW_STORYFILE_REQUEST, + payload: { + componentExportName, + componentFilePath, + componentIsDefaultExport, + }, + }, + resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, + } + ); + + if (createNewStoryResult.success) { + setError(null); + + const storyId = createNewStoryResult.result.storyId; + + await selectNewStory(api.selectStory, storyId); + + const argTypesInfoResult = await oncePromise({ + channel, + request: { + name: ARGTYPES_INFO_REQUEST, + payload: { storyId }, + }, + resolveEvent: ARGTYPES_INFO_RESPONSE, + }); + + if (argTypesInfoResult.success) { + const argTypes = argTypesInfoResult.result.argTypes; + + const requiredArgs = extractSeededRequiredArgs(argTypes); + + await oncePromise({ + channel, + request: { + name: SAVE_STORY_REQUEST, + payload: { + id: storyId, + payload: { + args: requiredArgs, + importPath: createNewStoryResult.result.storyFilePath, + csfId: storyId, + }, + }, + }, + resolveEvent: SAVE_STORY_RESPONSE, + }); + } + + handleSuccessfullyCreatedStory(componentExportName); + } else { + setError(createNewStoryResult.error); + } + } catch (e) { + handleErrorWhenCreatingStory(); + } + }, + [api, handleSuccessfullyCreatedStory, handleErrorWhenCreatingStory] + ); + + useEffect(() => { + setLoading(true); + const channel = addons.getChannel(); + + const set = (data: FileComponentSearchResult) => { + if (data.success) { + if (data.result?.searchQuery === fileSearchQueryDeferred && data.result.files) { + setSearchResults(data.result.files); + } + } else { + setError(data.error); + } + setLoading(false); + }; + + channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); + + if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { + emittedValue.current = fileSearchQueryDeferred; + channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + searchQuery: fileSearchQueryDeferred, + } satisfies FileComponentSearchPayload); + } else { + setSearchResults(null); + setLoading(false); + } + + return () => { + channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); + }; + }, [fileSearchQueryDeferred, setSearchResults, setLoading]); + + return ( + { + onOpenChange(false); + }} + onInteractOutside={() => { + onOpenChange(false); + }} + > + + + Add a new story + We will create a new story for your component + + + + + + { + startTransition(() => { + setFileSearchQuery((e.target as HTMLInputElement).value); + }); + }} + /> + {isLoading && ( + + + + )} + + { + + } + + {error && ( + + {error} + { + setError(null); + }} + /> + + )} + + ); +}; + +interface OncePromiseOptions { + channel: Channel; + request: { + name: string; + payload: Payload; + }; + resolveEvent: string; +} + +function oncePromise({ + channel, + request, + resolveEvent, +}: OncePromiseOptions): Promise { + return new Promise((resolve, reject) => { + channel.once(resolveEvent, (data: Result) => { + resolve(data); + }); + + channel.emit(request.name, request.payload as Payload); + + // If the channel supports error events, you can reject the promise on error + channel.once(resolveEvent, (error: any) => { + reject(error); + }); + }); +} diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx new file mode 100644 index 000000000000..340544410fc7 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -0,0 +1,60 @@ +import type { ArgTypes } from '@storybook/csf'; + +export function extractSeededRequiredArgs(argTypes: ArgTypes) { + const extractedArgTypes = Object.keys(argTypes).reduce( + (acc, key: keyof typeof argTypes) => { + const argType = argTypes[key]; + if (typeof argType.type !== 'string' && argType.type.required) { + switch (argType.type.name) { + case 'boolean': + acc[key] = true; + break; + case 'number': + acc[key] = 0; + break; + case 'string': + acc[key] = key; + break; + case 'union': + case 'enum': + case 'intersection': + if ('value' in argType.type) { + acc[key] = argType.type.value[0]; + } + break; + case 'array': + acc[key] = []; + break; + case 'object': + acc[key] = {}; + break; + case 'function': + acc[key] = () => {}; + break; + default: + break; + } + } + return acc; + }, + {} as Record + ); + return extractedArgTypes; +} + +export async function selectNewStory( + selectStory: (id: string) => Promise | void, + storyId: string, + attempt = 1 +): Promise { + if (attempt > 10) { + throw new Error('We could not select the new story. Please try again.'); + } + + try { + await selectStory(storyId); + } catch (e) { + await new Promise((resolve) => setTimeout(resolve, 500)); + return selectNewStory(selectStory, storyId, attempt + 1); + } +} diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 76d9cfa202c7..c4116ba87997 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -22,6 +22,7 @@ import { isSearchResult, isExpandType } from './types'; import { scrollIntoView, searchItem } from '../../utils/tree'; import { getGroupStatus, getHighestStatus } from '../../utils/status'; import { useLayout } from '../layout/LayoutProvider'; +import { FileSearchModal } from './FileSearchModal'; const { document } = global; @@ -186,6 +187,7 @@ export const Search = React.memo<{ const [inputPlaceholder, setPlaceholder] = useState('Find components'); const [allComponents, showAllComponents] = useState(false); const searchShortcut = api ? shortcutToHumanString(api.getShortcutKeys().search) : '/'; + const [isFileSearchModalOpen, setIsFileSearchModalOpen] = useState(false); const makeFuse = useCallback(() => { const list = dataset.entries.reduce((acc, [refId, { index, status }]) => { @@ -410,15 +412,26 @@ export const Search = React.memo<{ )} {showCreateStoryButton && ( - } - > - - - - + <> + } + > + { + setIsFileSearchModalOpen(true); + }} + variant="outline" + > + + + + + )} diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 206ce13b3473..4a877050efd1 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -131,6 +131,8 @@ export default { 'createBrowserChannel', ], '@storybook/core-events': [ + 'ARGTYPES_INFO_REQUEST', + 'ARGTYPES_INFO_RESPONSE', 'CHANNEL_CREATED', 'CHANNEL_WS_DISCONNECT', 'CONFIG_ERROR', diff --git a/code/yarn.lock b/code/yarn.lock index 2ee01f76a383..ddc556e1770d 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -719,6 +719,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/8381e1efead5069cb7ed2abc3a583f4a86289b2f376c75cecc69f59a8eb36df18274b1886cecf2f97a6a0dff5334b27330f58535be9b3e4e26102cc50e12eac8 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" @@ -5762,6 +5771,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/core-events@workspace:lib/core-events" dependencies: + "@storybook/csf": "npm:^0.1.4" chalk: "npm:^4.1.0" ts-dedent: "npm:^2.0.0" typescript: "npm:^5.3.2" @@ -5774,6 +5784,7 @@ __metadata: dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/addon-docs": "workspace:*" "@storybook/builder-manager": "workspace:*" @@ -5803,12 +5814,10 @@ __metadata: boxen: "npm:^7.1.1" camelcase: "npm:^8.0.0" chalk: "npm:^4.1.0" - cjs-module-lexer: "npm:^1.2.3" cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" diff: "npm:^5.2.0" - es-module-lexer: "npm:^1.5.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -6103,6 +6112,7 @@ __metadata: "@storybook/test": "workspace:*" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" + "@tanstack/react-virtual": "npm:^3.3.0" "@testing-library/react": "npm:^11.2.2" "@types/react-transition-group": "npm:^4" "@types/semver": "npm:^7.3.4" @@ -7124,6 +7134,25 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-virtual@npm:^3.3.0": + version: 3.3.0 + resolution: "@tanstack/react-virtual@npm:3.3.0" + dependencies: + "@tanstack/virtual-core": "npm:3.3.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/52b30c87cbf2518cfe19812b290c60dd576587545bc910adf5a17ff16b241c4cf28690163db2063afd9e3adc0259086263071e63c8c8380ac56c0f6a54bde820 + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.3.0": + version: 3.3.0 + resolution: "@tanstack/virtual-core@npm:3.3.0" + checksum: 10c0/d31125fde6a3ef3aefd3754b37f4724772c8a567f4e8212cf02a64fba6fde9ab8f80a8c9f99d28b046f84a938aea390adbd591eb4858d849a05326b0cebdfc25 + languageName: node + linkType: hard + "@testing-library/dom@npm:^7.28.1, @testing-library/dom@npm:^7.29.4": version: 7.31.2 resolution: "@testing-library/dom@npm:7.31.2" From fa49c94145ecbee3dfa649bc71b5b148d0c5fcc3 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:31:46 +0200 Subject: [PATCH 103/180] Add unit tests to FileSearchModal.utils --- .../sidebar/FileSearchModal.utils.test.tsx | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx new file mode 100644 index 000000000000..892c5517b7e8 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -0,0 +1,65 @@ +import { describe, expect, it } from 'vitest'; +import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; +import type { ArgTypes, SBType } from '@storybook/csf'; + +describe('FileSearchModal.utils', () => { + describe('extractSeededRequiredArgs', () => { + it('should extract seeded required args', () => { + const argTypes = { + stringRequired: { + type: { name: 'string', required: true }, + }, + string: { + type: { name: 'string', required: false }, + }, + numberRequired: { + type: { name: 'number', required: true }, + }, + number: { + type: { name: 'number', required: false }, + }, + booleanRequired: { + type: { name: 'boolean', required: true }, + }, + boolean: { + type: { name: 'boolean', required: false }, + }, + functionRequired: { + type: { name: 'function', required: true }, + }, + function: { + type: { name: 'function', required: false }, + }, + unionRequired: { + type: { + name: 'union', + required: true, + value: ['a', 'b', 'c'] as any, + }, + }, + union: { + type: { name: 'union', required: false, value: [] }, + }, + enumRequired: { + type: { + name: 'enum', + required: true, + value: ['a', 'b', 'c'] as any, + }, + }, + enum: { + type: { name: 'union', required: false, value: [] }, + }, + } as ArgTypes; + + expect(extractSeededRequiredArgs(argTypes)).toEqual({ + stringRequired: 'stringRequired', + numberRequired: 0, + booleanRequired: true, + functionRequired: expect.any(Function), + unionRequired: 'a', + enumRequired: 'a', + }); + }); + }); +}); From 19b6094b543442ffadf02d0c62de296718d0e7bb Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:33:09 +0200 Subject: [PATCH 104/180] Rename helper function --- .../manager/src/components/sidebar/FileSearchModal.tsx | 9 ++++++--- .../src/components/sidebar/FileSearchModal.utils.tsx | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index 47c7b1685d7c..b47732ba7a06 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -35,7 +35,7 @@ import { useDebounce } from '../../hooks/useDebounce'; import type { SearchResult } from './FileSearchList'; import { FileSearchList } from './FileSearchList'; import type { Channel } from '@storybook/channels'; -import { extractSeededRequiredArgs, selectNewStory } from './FileSearchModal.utils'; +import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; interface FileSearchModalProps { open: boolean; @@ -43,12 +43,15 @@ interface FileSearchModalProps { } const ModalInput = styled(Form.Input)(({ theme }) => ({ - color: theme.color.darkest, paddingLeft: 40, paddingRight: 28, fontSize: 14, height: 40, + ...(theme.base === 'light' && { + color: theme.color.darkest, + }), + '::placeholder': { color: theme.color.mediumdark, }, @@ -181,7 +184,7 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => const storyId = createNewStoryResult.result.storyId; - await selectNewStory(api.selectStory, storyId); + await trySelectNewStory(api.selectStory, storyId); const argTypesInfoResult = await oncePromise({ channel, diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index 340544410fc7..d53adde3059c 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -42,7 +42,7 @@ export function extractSeededRequiredArgs(argTypes: ArgTypes) { return extractedArgTypes; } -export async function selectNewStory( +export async function trySelectNewStory( selectStory: (id: string) => Promise | void, storyId: string, attempt = 1 @@ -55,6 +55,6 @@ export async function selectNewStory( await selectStory(storyId); } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)); - return selectNewStory(selectStory, storyId, attempt + 1); + return trySelectNewStory(selectStory, storyId, attempt + 1); } } From aac320dea162893c08ef9325fe5ccfde1e481d1f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 09:33:59 +0200 Subject: [PATCH 105/180] Remove unnecessary imports --- .../src/components/sidebar/FileSearchModal.utils.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx index 892c5517b7e8..cbb3e8c2e2e5 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; -import type { ArgTypes, SBType } from '@storybook/csf'; +import { extractSeededRequiredArgs } from './FileSearchModal.utils'; +import type { ArgTypes } from '@storybook/csf'; describe('FileSearchModal.utils', () => { describe('extractSeededRequiredArgs', () => { From f9d81b53c4b30d1d9da2bdc55dd5f318517c8f65 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 10:51:51 +0200 Subject: [PATCH 106/180] Animate modal opening --- .../components/src/components/Modal/Modal.tsx | 4 ++- .../components/sidebar/FileSearchModal.tsx | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.tsx b/code/ui/components/src/components/Modal/Modal.tsx index ab9b59a27693..33bac379d2b1 100644 --- a/code/ui/components/src/components/Modal/Modal.tsx +++ b/code/ui/components/src/components/Modal/Modal.tsx @@ -10,6 +10,7 @@ interface ModalProps extends Omit, 'chi children: React.ReactNode; onEscapeKeyDown?: ContentProps['onEscapeKeyDown']; onInteractOutside?: ContentProps['onInteractOutside']; + className?: string; } export const initial = { opacity: 0 }; @@ -22,6 +23,7 @@ function BaseModal({ height, onEscapeKeyDown, onInteractOutside = (ev) => ev.preventDefault(), + className, ...rootProps }: ModalProps) { return ( @@ -35,7 +37,7 @@ function BaseModal({ onInteractOutside={onInteractOutside} onEscapeKeyDown={onEscapeKeyDown} > - + {children} diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index b47732ba7a06..de739cf42cbd 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -37,11 +37,29 @@ import { FileSearchList } from './FileSearchList'; import type { Channel } from '@storybook/channels'; import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; +const MODAL_HEIGHT = 418; +const MODAL_HEIGHT_MINIMIZED = 133; + interface FileSearchModalProps { open: boolean; onOpenChange: (open: boolean) => void; } +interface ModalStyledProps { + minimized: boolean; +} + +const ModalStyled = styled(Modal)(({ minimized }) => ({ + top: minimized + ? `calc((100vh - ${MODAL_HEIGHT - MODAL_HEIGHT_MINIMIZED}px) / 2)` + : `calc((100vh - ${MODAL_HEIGHT}px) / 2)`, + ...(!minimized && { + transform: 'translate(-50%, 0)', + transition: 'height 0.2s ease', + }), + animation: 'none', +})); + const ModalInput = styled(Form.Input)(({ theme }) => ({ paddingLeft: 40, paddingRight: 28, @@ -122,6 +140,8 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => const [error, setError] = useState(null); const api = useStorybookApi(); + const minimized = !isLoading && fileSearchQueryDeferred === ''; + const [searchResults, setSearchResults] = useState(null); const handleErrorWhenCreatingStory = useCallback(() => { @@ -261,8 +281,9 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => }, [fileSearchQueryDeferred, setSearchResults, setLoading]); return ( - /> )} - + ); }; From 05ac43c1fe2d9ed276c92bbe425e1ff3644535ca Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 11:17:03 +0200 Subject: [PATCH 107/180] Try to absolute position modal --- code/ui/manager/src/components/sidebar/FileSearchModal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index de739cf42cbd..32e37252ccd9 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -39,6 +39,7 @@ import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal. const MODAL_HEIGHT = 418; const MODAL_HEIGHT_MINIMIZED = 133; +const MODAL_DIFF_EVEN = Math.round((MODAL_HEIGHT - MODAL_HEIGHT_MINIMIZED) / 2) * 2; interface FileSearchModalProps { open: boolean; @@ -51,7 +52,7 @@ interface ModalStyledProps { const ModalStyled = styled(Modal)(({ minimized }) => ({ top: minimized - ? `calc((100vh - ${MODAL_HEIGHT - MODAL_HEIGHT_MINIMIZED}px) / 2)` + ? `calc((100vh - ${MODAL_DIFF_EVEN}px) / 2)` : `calc((100vh - ${MODAL_HEIGHT}px) / 2)`, ...(!minimized && { transform: 'translate(-50%, 0)', From 67c67854d4674992c2ec14b9e79ad64aed1b7a3d Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 11:17:54 +0200 Subject: [PATCH 108/180] Fix highlight color on dark theme --- code/addons/controls/src/SaveStory.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/addons/controls/src/SaveStory.tsx b/code/addons/controls/src/SaveStory.tsx index 474d74b89409..acf9143eb46c 100644 --- a/code/addons/controls/src/SaveStory.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -17,7 +17,7 @@ const slideIn = keyframes({ }); const highlight = keyframes({ - from: { background: '#E0F0FF' }, + from: { background: 'var(--highlight-bg-color)' }, to: {}, }); @@ -31,6 +31,7 @@ const Container = styled.div({ }); const Bar = styled(BaseBar)(({ theme }) => ({ + '--highlight-bg-color': theme.base === 'dark' ? '#153B5B' : '#E0F0FF', display: 'flex', flexDirection: 'row-reverse', // hide Info rather than Actions on overflow alignItems: 'center', From 07c4fc370ae622121894b41e548d7e826ffbb00f Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 11:19:09 +0200 Subject: [PATCH 109/180] Add types to stories --- .../src/components/Badge/Badge.stories.tsx | 20 +++++++++++-------- .../components/src/components/Badge/Badge.tsx | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/code/ui/components/src/components/Badge/Badge.stories.tsx b/code/ui/components/src/components/Badge/Badge.stories.tsx index 530b4f368ac2..974dc64f8be1 100644 --- a/code/ui/components/src/components/Badge/Badge.stories.tsx +++ b/code/ui/components/src/components/Badge/Badge.stories.tsx @@ -1,12 +1,16 @@ +import type { Meta, StoryObj } from '@storybook/react'; import { Badge } from './Badge'; -export default { +const meta = { component: Badge, -}; +} satisfies Meta; -export const Default = { args: { children: 'Default' } }; -export const Positive = { args: { status: 'positive', children: 'Positive' } }; -export const Negative = { args: { status: 'negative', children: 'Negative' } }; -export const Neutral = { args: { status: 'neutral', children: 'Neutral' } }; -export const Warning = { args: { status: 'warning', children: 'Warning' } }; -export const Critical = { args: { status: 'critical', children: 'Critical' } }; +export default meta; +type Story = StoryObj; + +export const Default = { args: { children: 'Default' } } satisfies Story; +export const Positive = { args: { status: 'positive', children: 'Positive' } } satisfies Story; +export const Negative = { args: { status: 'negative', children: 'Negative' } } satisfies Story; +export const Neutral = { args: { status: 'neutral', children: 'Neutral' } } satisfies Story; +export const Warning = { args: { status: 'warning', children: 'Warning' } } satisfies Story; +export const Critical = { args: { status: 'critical', children: 'Critical' } } satisfies Story; diff --git a/code/ui/components/src/components/Badge/Badge.tsx b/code/ui/components/src/components/Badge/Badge.tsx index f9d1c9b91ebb..51bcee12e2ef 100644 --- a/code/ui/components/src/components/Badge/Badge.tsx +++ b/code/ui/components/src/components/Badge/Badge.tsx @@ -80,7 +80,7 @@ const BadgeWrapper = styled.div( ); export interface BadgeProps { - status: 'positive' | 'negative' | 'neutral' | 'warning' | 'critical'; + status?: 'positive' | 'negative' | 'neutral' | 'warning' | 'critical'; children?: React.ReactNode; } From 9077a3f07a8176a762d96bbd4bfbe5c0e0e1d23d Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 11:19:58 +0200 Subject: [PATCH 110/180] Remove stray story --- .../src/components/form/form.stories.tsx | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/code/ui/components/src/components/form/form.stories.tsx b/code/ui/components/src/components/form/form.stories.tsx index fc472dfdaa84..fb6070100d41 100644 --- a/code/ui/components/src/components/form/form.stories.tsx +++ b/code/ui/components/src/components/form/form.stories.tsx @@ -121,29 +121,3 @@ export const Input = { }, }, }; - -export const Field2 = { - args: { - label: 'field', - }, - - render: (args: any) => ( - - - - - - - - ), - - argTypes: { - label: { - defaultValue: 'label', - - control: { - type: 'text', - }, - }, - }, -}; From b997f1eb0385a4e773ffc084d0be0e40a0018378 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 11:34:58 +0200 Subject: [PATCH 111/180] Use getByLabel rather than getByText --- code/e2e-tests/save-from-controls.spec.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index de64cea7c990..c0d083b6dda9 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -50,7 +50,11 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // clone the story - await sbPage.panelContent().locator('button').getByText('Create new story').click(); + await sbPage + .panelContent() + .locator('button') + .getByLabel(/Create new story/) + .click(); const input = await sbPage.page.waitForSelector('[placeholder="Story export name"]'); await input.fill('ClonedStory' + id); From f1808c8be19e4e4ce9bb7a40310ee771dcbc8b84 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 13:14:29 +0200 Subject: [PATCH 112/180] Modal polishing --- .../src/components/sidebar/FileList.tsx | 1 + .../src/components/sidebar/FileSearchList.tsx | 13 +- .../components/sidebar/FileSearchModal.tsx | 146 ++++++++++-------- .../src/components/sidebar/useMeasure.tsx | 33 ++++ 4 files changed, 121 insertions(+), 72 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/useMeasure.tsx diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index b966c112b4e6..9ee0a7d0f35f 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -6,6 +6,7 @@ export const FileList = styled('div')(({ theme }) => ({ overflow: 'auto', msOverflowStyle: 'none', scrollbarWidth: 'none', + position: 'relative', '::-webkit-scrollbar': { display: 'none', }, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 447ecf8599b0..2cc27eaec015 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -89,6 +89,7 @@ const FileListItemExport = styled('li')(({ theme }) => ({ gap: '8px', alignItems: 'center', justifyContent: 'space-between', + fontSize: '14px', cursor: 'pointer', ':focus-visible': { @@ -145,8 +146,10 @@ const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ const DefaultExport = styled('span')(({ theme }) => ({ display: 'inline-block', padding: `1px ${theme.appBorderRadius}px`, - color: '#727272', - backgroundColor: '#F2F4F5', + borderRadius: '2px', + fontSize: '10px', + color: theme.base === 'dark' ? theme.color.lightest : '#727272', + backgroundColor: theme.base === 'dark' ? 'rgba(255, 255, 255, 0.1)' : '#F2F4F5', })); const NoResults = styled('div')(({ theme }) => ({ @@ -390,9 +393,3 @@ export const FileSearchList = memo(function FileSearchList({ return null; }); - -// border-radius: 2px; -// font-size: 10px; - -// apply font-size: 14px to sub items -// input sizing and icon positioning diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index 32e37252ccd9..e3be813631d3 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -36,31 +36,34 @@ import type { SearchResult } from './FileSearchList'; import { FileSearchList } from './FileSearchList'; import type { Channel } from '@storybook/channels'; import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; +import { useMeasure } from './useMeasure'; const MODAL_HEIGHT = 418; -const MODAL_HEIGHT_MINIMIZED = 133; -const MODAL_DIFF_EVEN = Math.round((MODAL_HEIGHT - MODAL_HEIGHT_MINIMIZED) / 2) * 2; interface FileSearchModalProps { open: boolean; onOpenChange: (open: boolean) => void; } -interface ModalStyledProps { - minimized: boolean; -} +const ModalStyled = styled(Modal)(() => ({ + boxShadow: 'none', + background: 'transparent', +})); -const ModalStyled = styled(Modal)(({ minimized }) => ({ - top: minimized - ? `calc((100vh - ${MODAL_DIFF_EVEN}px) / 2)` - : `calc((100vh - ${MODAL_HEIGHT}px) / 2)`, - ...(!minimized && { - transform: 'translate(-50%, 0)', - transition: 'height 0.2s ease', - }), - animation: 'none', +const ModalChild = styled.div<{ height?: number }>(({ theme, height }) => ({ + backgroundColor: theme.background.bar, + borderRadius: 6, + boxShadow: `rgba(255, 255, 255, 0.05) 0 0 0 1px inset, rgba(14, 18, 22, 0.35) 0px 10px 18px -10px`, + padding: '16px', + transition: 'height 0.3s', + height: height ? `${height + 32}px` : 'auto', + overflow: 'hidden', })); +const ModalContent = styled(Modal.Content)({ + margin: 0, +}); + const ModalInput = styled(Form.Input)(({ theme }) => ({ paddingLeft: 40, paddingRight: 28, @@ -140,8 +143,14 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => const emittedValue = useRef(null); const [error, setError] = useState(null); const api = useStorybookApi(); + const [modalContentRef, modalContentDimensions] = useMeasure(); + const [modalMaxHeight, setModalMaxHeight] = useState(modalContentDimensions.height); - const minimized = !isLoading && fileSearchQueryDeferred === ''; + useEffect(() => { + if (modalMaxHeight < modalContentDimensions.height) { + setModalMaxHeight(modalContentDimensions.height); + } + }, [modalContentDimensions.height, modalMaxHeight]); const [searchResults, setSearchResults] = useState(null); @@ -254,14 +263,20 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => const channel = addons.getChannel(); const set = (data: FileComponentSearchResult) => { + const isLatestRequest = + data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; + if (data.success) { - if (data.result?.searchQuery === fileSearchQueryDeferred && data.result.files) { + if (isLatestRequest) { setSearchResults(data.result.files); } } else { setError(data.error); } - setLoading(false); + + if (isLatestRequest) { + setLoading(false); + } }; channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); @@ -283,8 +298,7 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => return ( onOpenChange(false); }} > - - - Add a new story - We will create a new story for your component - - - - - - { - startTransition(() => { - setFileSearchQuery((e.target as HTMLInputElement).value); - }); - }} - /> - {isLoading && ( - - - - )} - - { - - } - - {error && ( - - {error} - { - setError(null); - }} - /> - - )} + + + + Add a new story + We will create a new story for your component + + + + + + { + startTransition(() => { + setFileSearchQuery((e.target as HTMLInputElement).value); + }); + }} + /> + {isLoading && ( + + + + )} + + { + + } + + {error && ( + + {error} + { + setError(null); + }} + /> + + )} + ); }; diff --git a/code/ui/manager/src/components/sidebar/useMeasure.tsx b/code/ui/manager/src/components/sidebar/useMeasure.tsx new file mode 100644 index 000000000000..26d349bd216f --- /dev/null +++ b/code/ui/manager/src/components/sidebar/useMeasure.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +// Copied and modified from https://usehooks.com/usemeasure +export function useMeasure() { + const [dimensions, setDimensions] = React.useState({ + width: null, + height: null, + }); + + const prevObserver = React.useRef(null); + + const customRef = React.useCallback((node: T) => { + if (prevObserver.current) { + prevObserver.current.disconnect(); + prevObserver.current = null; + } + + if (node?.nodeType === Node.ELEMENT_NODE) { + const observer = new ResizeObserver(([entry]) => { + if (entry && entry.borderBoxSize) { + const { inlineSize: width, blockSize: height } = entry.borderBoxSize[0]; + + setDimensions({ width, height }); + } + }); + + observer.observe(node); + prevObserver.current = observer; + } + }, []); + + return [customRef, dimensions] as const; +} From 03039b675a2a02a3ce20579b27f2e0f0d46f031f Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 18 Apr 2024 15:04:16 +0200 Subject: [PATCH 113/180] allow args to contain function etc. --- code/addons/controls/package.json | 1 + code/addons/controls/src/manager.tsx | 21 ++++++++++++++----- .../src/utils/save-story/save-story.ts | 13 ++++++++++-- code/yarn.lock | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/code/addons/controls/package.json b/code/addons/controls/package.json index 482e56e196ee..5c9bcd56f1ee 100644 --- a/code/addons/controls/package.json +++ b/code/addons/controls/package.json @@ -54,6 +54,7 @@ "@storybook/blocks": "workspace:*", "dequal": "^2.0.2", "lodash": "^4.17.21", + "telejson": "^7.2.0", "ts-dedent": "^2.0.0" }, "devDependencies": { diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 228a8ae31e66..802a52cf871e 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -1,3 +1,4 @@ +import { stringify } from 'telejson'; import React from 'react'; import { dequal as deepEqual } from 'dequal'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; @@ -26,6 +27,14 @@ function Title() { ); } +const stringifyArgs = (args: Record) => + stringify(args, { + allowDate: true, + allowFunction: true, + allowUndefined: true, + allowSymbol: true, + }); + interface ResponseData { id: string; success: boolean; @@ -67,10 +76,12 @@ addons.register(ADDON_ID, (api) => { if (data.type !== 'story') throw new Error('Not a story'); return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { // Only send updated args - args: Object.entries(data.args || {}).reduce((acc, [key, value]) => { - if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; - return acc; - }, {}), + args: stringifyArgs( + Object.entries(data.args || {}).reduce((acc, [key, value]) => { + if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; + return acc; + }, {}) + ), csfId: data.id, importPath: data.importPath, }); @@ -80,7 +91,7 @@ addons.register(ADDON_ID, (api) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { - args: data.args, + args: data.args ? stringifyArgs(data.args) : data.args, csfId: data.id, importPath: data.importPath, name, diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 6d2622f10e17..ea109b04d0fd 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,4 +1,5 @@ /* eslint-disable no-underscore-dangle */ +import { parse } from 'telejson'; import type { Channel } from '@storybook/channels'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, STORY_RENDERED } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; @@ -11,12 +12,20 @@ import type { CoreConfig, Options } from '@storybook/types'; import { telemetry } from '@storybook/telemetry'; import { logger } from '@storybook/node-logger'; +const parseArgs = (args: string): Record => + parse(args, { + allowDate: true, + allowFunction: true, + allowUndefined: true, + allowSymbol: true, + }); + interface SaveStoryRequest { id: string; payload: { csfId: string; importPath: string; - args: Record; + args: string; name?: string; }; } @@ -73,7 +82,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf await updateArgsInCsfFile( name ? duplicateStoryWithNewName(parsed, storyName, name) : csf.getStoryExport(storyName), - args + parseArgs(args) ); // Writing the CSF file should trigger HMR, which causes the story to rerender. Delay the diff --git a/code/yarn.lock b/code/yarn.lock index 2ee01f76a383..d73b24c6441b 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -4994,6 +4994,7 @@ __metadata: lodash: "npm:^4.17.21" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" languageName: unknown linkType: soft From cfec679380a8466c34afd1fff81bc9aedd12407c Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 18 Apr 2024 15:21:38 +0200 Subject: [PATCH 114/180] Add stories and polishing --- .../src/data/file-component-search.ts | 5 +- .../create-new-story-channel.test.ts | 13 +- .../create-new-story-channel.ts | 9 +- .../src/server-channel/file-search-channel.ts | 4 +- .../src/components/sidebar/FileList.tsx | 2 +- .../sidebar/FileSearchList.stories.tsx | 112 ++++++++++++++++++ .../src/components/sidebar/FileSearchList.tsx | 17 ++- .../FileSearchListSkeleton.stories.tsx | 15 +++ .../components/sidebar/FileSearchModal.tsx | 31 +++-- 9 files changed, 182 insertions(+), 26 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchListSkeleton.stories.tsx diff --git a/code/lib/core-events/src/data/file-component-search.ts b/code/lib/core-events/src/data/file-component-search.ts index 72877a07c55d..1f35b6e7f0db 100644 --- a/code/lib/core-events/src/data/file-component-search.ts +++ b/code/lib/core-events/src/data/file-component-search.ts @@ -6,19 +6,18 @@ export interface FileComponentSearchPayload { export interface FileComponentSearchResult { success: true | false; result: null | { + // The search query - Helps to identify the event on the frontend searchQuery: string; files: Array<{ // The filepath relative to the project root filepath: string; - // The search query - Helps to identify the event on the frontend - searchQuery: string; // A list of exported components exportedComponents: Array<{ // the name of the exported component name: string; // True, if the exported component is a default export default: boolean; - }>; + }> | null; }> | null; }; error: null | string; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index 92244207ca8a..e9eecaef8796 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -3,7 +3,10 @@ import { initCreateNewStoryChannel } from './create-new-story-channel'; import path from 'path'; import type { ChannelTransport } from '@storybook/channels'; import { Channel } from '@storybook/channels'; -import { CREATE_NEW_STORYFILE, CREATE_NEW_STORYFILE_RESULT } from '@storybook/core-events'; +import { + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, +} from '@storybook/core-events'; vi.mock('@storybook/core-common', async (importOriginal) => { const actual = await importOriginal(); @@ -42,7 +45,7 @@ describe('createNewStoryChannel', () => { describe('initCreateNewStoryChannel', () => { it('should emit an event with a story id', async () => { - mockChannel.addListener(CREATE_NEW_STORYFILE_RESULT, createNewStoryFileEventListener); + mockChannel.addListener(CREATE_NEW_STORYFILE_RESPONSE, createNewStoryFileEventListener); const cwd = process.cwd(); initCreateNewStoryChannel(mockChannel, { @@ -59,7 +62,7 @@ describe('createNewStoryChannel', () => { }, } as any); - mockChannel.emit(CREATE_NEW_STORYFILE, { + mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, @@ -81,7 +84,7 @@ describe('createNewStoryChannel', () => { }); it('should emit an error event if an error occurs', async () => { - mockChannel.addListener(CREATE_NEW_STORYFILE_RESULT, createNewStoryFileEventListener); + mockChannel.addListener(CREATE_NEW_STORYFILE_RESPONSE, createNewStoryFileEventListener); const cwd = process.cwd(); mockFs.writeFile.mockImplementation(() => { @@ -102,7 +105,7 @@ describe('createNewStoryChannel', () => { }, } as any); - mockChannel.emit(CREATE_NEW_STORYFILE, { + mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 304c7411fba9..2e5282fd311f 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -6,6 +6,7 @@ import { CREATE_NEW_STORYFILE_RESPONSE, } from '@storybook/core-events'; import fs from 'node:fs/promises'; +import { existsSync } from 'node:fs'; import { getNewStoryFile } from '../utils/get-new-story-file'; import { getStoryId } from '../utils/get-story-id'; import path from 'node:path'; @@ -21,6 +22,12 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { options ); + const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); + + if (existsSync(storyFilePath)) { + throw new Error(`Story file already exists at .${path.sep}${relativeStoryFilePath}`); + } + await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); @@ -29,7 +36,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { success: true, result: { storyId, - storyFilePath: `./${path.relative(process.cwd(), storyFilePath)}`, + storyFilePath: `./${relativeStoryFilePath}`, exportedStoryName, }, error: null, diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index 6d26aaede94a..f35db74624ae 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -67,7 +67,7 @@ export function initFileSearchChannel(channel: Channel, options: Options) { files: await Promise.all(entries), }, error: null, - } as FileComponentSearchResult); + } satisfies FileComponentSearchResult); } catch (e: any) { /** * Emits the search result event with an error message @@ -76,7 +76,7 @@ export function initFileSearchChannel(channel: Channel, options: Options) { success: false, result: null, error: `An error occurred while searching for components in the project.\n${e?.message}`, - } as FileComponentSearchResult); + } satisfies FileComponentSearchResult); } }); diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index 9ee0a7d0f35f..db1dadcb57bf 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -13,7 +13,7 @@ export const FileList = styled('div')(({ theme }) => ({ // after element which fades out the list '&::after': { content: '""', - position: 'absolute', + position: 'fixed', pointerEvents: 'none', bottom: 0, left: 0, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx new file mode 100644 index 000000000000..a0b458da679c --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx @@ -0,0 +1,112 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { fn, fireEvent, findByText, expect } from '@storybook/test'; + +import { FileSearchList } from './FileSearchList'; + +const meta = { + component: FileSearchList, + args: { + onNewStory: fn(), + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + isLoading: true, + searchResults: null, + }, +}; + +export const Empty: Story = { + args: { + isLoading: false, + searchResults: [], + }, +}; + +export const WithResults: Story = { + play: async ({ canvasElement, args }) => { + // use react testing library + // select first item in the list and click on it + const firstItem = await findByText(canvasElement, 'module-multiple-exports.js'); + fireEvent.click(firstItem); + + const exportedElement1 = await findByText(canvasElement, 'module-multiple-exports'); + fireEvent.click(exportedElement1); + + expect(args.onNewStory).toHaveBeenCalledWith({ + componentExportName: 'default', + componentFilePath: 'src/module-multiple-exports.js', + componentIsDefaultExport: true, + }); + + const exportedElement2 = await findByText(canvasElement, 'namedExport'); + fireEvent.click(exportedElement2); + + expect(args.onNewStory).toHaveBeenCalledWith({ + componentExportName: 'namedExport', + componentFilePath: 'src/module-multiple-exports.js', + componentIsDefaultExport: false, + }); + + const singleExport = await findByText(canvasElement, 'module-single-export.js'); + fireEvent.click(singleExport); + + expect(args.onNewStory).toHaveBeenCalledWith({ + componentExportName: 'default', + componentFilePath: 'src/module-single-export.js', + componentIsDefaultExport: true, + }); + + expect(args.onNewStory).toHaveBeenCalledTimes(3); + + const noExportsModule1 = await findByText(canvasElement, 'no-exports-module.js'); + fireEvent.click(noExportsModule1); + + expect(args.onNewStory).toHaveBeenCalledTimes(3); + + const noExportsModule2 = await findByText(canvasElement, 'no-exports-module-1.js'); + fireEvent.click(noExportsModule2); + + expect(args.onNewStory).toHaveBeenCalledTimes(3); + }, + args: { + isLoading: false, + searchResults: [ + { + exportedComponents: [], + filepath: 'src/no-exports-module.js', + }, + { + exportedComponents: [ + { + default: true, + name: 'default', + }, + { + default: false, + name: 'namedExport', + }, + ], + filepath: 'src/module-multiple-exports.js', + }, + { + exportedComponents: null, + filepath: 'src/no-exports-module-1.js', + }, + { + exportedComponents: [ + { + default: true, + name: 'default', + }, + ], + filepath: 'src/module-single-export.js', + }, + ], + }, +}; diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 2cc27eaec015..c12e1ec96756 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -1,4 +1,4 @@ -import React, { memo, useCallback, useLayoutEffect, useState } from 'react'; +import React, { memo, useCallback, useLayoutEffect, useMemo, useState } from 'react'; import { styled } from '@storybook/theming'; import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; import { FileSearchListLoadingSkeleton } from './FileSearchListSkeleton'; @@ -185,6 +185,17 @@ export const FileSearchList = memo(function FileSearchList({ const [selectedItem, setSelectedItem] = useState(null); const parentRef = React.useRef(); + const sortedSearchResults = useMemo(() => { + // search results with no exports should be at the end of the list + return [...(searchResults ?? [])]?.sort((a, b) => { + if (a.exportedComponents?.length && b.exportedComponents?.length < 1) { + return -1; + } + + return 0; + }); + }, [searchResults]); + const rowVirtualizer = useVirtualizer({ count: searchResults?.length || 0, getScrollElement: () => parentRef.current, @@ -348,7 +359,7 @@ export const FileSearchList = memo(function FileSearchList({ ); } - if (searchResults?.length > 0) { + if (sortedSearchResults?.length > 0) { return ( {rowVirtualizer.getVirtualItems().map((virtualItem) => { - const searchResult = searchResults[virtualItem.index]; + const searchResult = sortedSearchResults[virtualItem.index]; return searchResult.exportedComponents === null || searchResult.exportedComponents?.length === 0 ? ( ; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index e3be813631d3..a0bf5a6be995 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -125,12 +125,17 @@ const ModalError = styled(Modal.Error)({ position: 'absolute', padding: '8px 40px 8px 16px', bottom: 0, + maxHeight: 'initial', + + '> div': { + padding: 0, + }, }); const ModalErrorCloseIcon = styled(CloseAltIcon)({ position: 'absolute', top: 8, - right: 16, + right: -24, cursor: 'pointer', }); @@ -258,6 +263,10 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => [api, handleSuccessfullyCreatedStory, handleErrorWhenCreatingStory] ); + useEffect(() => { + setError(null); + }, [searchResults]); + useEffect(() => { setLoading(true); const channel = addons.getChannel(); @@ -347,17 +356,17 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => /> } - {error && ( - - {error} - { - setError(null); - }} - /> - - )} + {error && fileSearchQueryDeferred !== '' && ( + + {error} + { + setError(null); + }} + /> + + )} ); }; From 2a4c28963533f47adb74fd3c53546bfb3a99b94e Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 18 Apr 2024 15:27:01 +0200 Subject: [PATCH 115/180] hopefully fix the e2e --- code/e2e-tests/save-from-controls.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index c0d083b6dda9..7428fd46fc60 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -33,7 +33,7 @@ test.describe('save-from-controls', () => { await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); // update the story - await sbPage.panelContent().locator('button').getByText('Update story').click(); + await sbPage.panelContent().locator('button').getByText('Update story').click({ force: true }); // Assert the file is saved const notification1 = await sbPage.page.waitForSelector('[title="Story saved"]'); @@ -49,12 +49,12 @@ test.describe('save-from-controls', () => { // Assert the footer is shown await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); - // clone the story - await sbPage + const buttons = await sbPage .panelContent() - .locator('button') - .getByLabel(/Create new story/) - .click(); + .locator('[aria-label="Create new story with these settings"]'); + + // clone the story + await buttons.click({ force: true }); const input = await sbPage.page.waitForSelector('[placeholder="Story export name"]'); await input.fill('ClonedStory' + id); From d90488453cb5aee0a3ecc2c49c042c247cfa0e42 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 15:16:27 +0200 Subject: [PATCH 116/180] Cherry-pick 343081be5e47149b569a71b822fcc2ff3cc6850c --- code/lib/core-events/package.json | 1 + .../lib/core-events/src/data/argtypes-info.ts | 9 ++++ code/lib/core-events/src/index.ts | 16 +++++-- code/lib/core-events/src/request-response.ts | 46 +++++++++++++++++++ .../create-new-story-channel.test.ts | 13 ++++-- .../create-new-story-channel.ts | 11 +++-- .../src/modules/preview-web/Preview.tsx | 27 +++++++++++ code/ui/manager/src/globals/exports.ts | 7 ++- 8 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 code/lib/core-events/src/data/argtypes-info.ts create mode 100644 code/lib/core-events/src/request-response.ts diff --git a/code/lib/core-events/package.json b/code/lib/core-events/package.json index 699640debd0d..2cc265012563 100644 --- a/code/lib/core-events/package.json +++ b/code/lib/core-events/package.json @@ -78,6 +78,7 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { + "@storybook/csf": "^0.1.4", "ts-dedent": "^2.0.0" }, "devDependencies": { diff --git a/code/lib/core-events/src/data/argtypes-info.ts b/code/lib/core-events/src/data/argtypes-info.ts new file mode 100644 index 000000000000..c993c684768c --- /dev/null +++ b/code/lib/core-events/src/data/argtypes-info.ts @@ -0,0 +1,9 @@ +import type { ArgTypes } from '@storybook/csf'; + +export interface ArgTypesRequestPayload { + storyId: string; +} + +export interface ArgTypesResponsePayload { + argTypes: ArgTypes; +} diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 37452d0a8d76..3a64992e3c12 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -78,8 +78,10 @@ enum events { FILE_COMPONENT_SEARCH_RESULT = 'fileComponentSearchResult', SAVE_STORY_REQUEST = 'saveStoryRequest', SAVE_STORY_RESPONSE = 'saveStoryResponse', - CREATE_NEW_STORYFILE = 'createNewStoryfile', - CREATE_NEW_STORYFILE_RESULT = 'createNewStoryfileResult', + ARGTYPES_INFO_REQUEST = 'argtypesInfoRequest', + ARGTYPES_INFO_RESPONSE = 'argtypesInfoResponse', + CREATE_NEW_STORYFILE_REQUEST = 'createNewStoryfileRequest', + CREATE_NEW_STORYFILE_RESPONSE = 'createNewStoryfileResponse', } // Enables: `import Events from ...` @@ -91,8 +93,8 @@ export const { CHANNEL_WS_DISCONNECT, CHANNEL_CREATED, CONFIG_ERROR, - CREATE_NEW_STORYFILE, - CREATE_NEW_STORYFILE_RESULT, + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, CURRENT_STORY_WAS_SET, DOCS_PREPARED, DOCS_RENDERED, @@ -140,8 +142,14 @@ export const { TELEMETRY_ERROR, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, } = events; +export * from './request-response'; + +export * from './data/argtypes-info'; + export interface WhatsNewCache { lastDismissedPost?: string; lastReadPost?: string; diff --git a/code/lib/core-events/src/request-response.ts b/code/lib/core-events/src/request-response.ts new file mode 100644 index 000000000000..88c8d1dddf77 --- /dev/null +++ b/code/lib/core-events/src/request-response.ts @@ -0,0 +1,46 @@ +import type { Channel } from '@storybook/channels'; + +class RequestResponseError extends Error {} + +export type RequestData = { + id: string; + payload: Payload; +}; + +export type ResponseData = + | { id: string; success: true; payload: Payload } + | { id: string; success: false; error?: string; payload?: Payload }; + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const experimental_requestResponse = ( + channel: Channel, + requestEvent: string, + responseEvent: string, + payload: any, + timeout = 5000 +): Promise => { + let timeoutId: NodeJS.Timeout; + + return new Promise((resolve, reject) => { + const request: RequestData = { + id: Math.random().toString(16).slice(2), + payload, + }; + + const responseHandler = (response: ResponseData) => { + if (response.id !== request.id) return; + clearTimeout(timeoutId); + channel.off(responseEvent, responseHandler); + if (response.success) resolve(response.payload); + else reject(new RequestResponseError(response.error)); + }; + + channel.emit(requestEvent, request); + channel.on(responseEvent, responseHandler); + + timeoutId = setTimeout(() => { + channel.off(responseEvent, responseHandler); + reject(new RequestResponseError('Timed out waiting for response')); + }, timeout); + }); +}; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index 289756ea540b..d9021723922d 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -3,7 +3,10 @@ import { initCreateNewStoryChannel } from './create-new-story-channel'; import path from 'path'; import type { ChannelTransport } from '@storybook/channels'; import { Channel } from '@storybook/channels'; -import { CREATE_NEW_STORYFILE, CREATE_NEW_STORYFILE_RESULT } from '@storybook/core-events'; +import { + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, +} from '@storybook/core-events'; vi.mock('@storybook/core-common', async (importOriginal) => { const actual = await importOriginal(); @@ -42,7 +45,7 @@ describe('createNewStoryChannel', () => { describe('initCreateNewStoryChannel', () => { it('should emit an event with a story id', async () => { - mockChannel.addListener(CREATE_NEW_STORYFILE_RESULT, createNewStoryFileEventListener); + mockChannel.addListener(CREATE_NEW_STORYFILE_RESPONSE, createNewStoryFileEventListener); const cwd = process.cwd(); initCreateNewStoryChannel(mockChannel, { @@ -59,7 +62,7 @@ describe('createNewStoryChannel', () => { }, } as any); - mockChannel.emit(CREATE_NEW_STORYFILE, { + mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, @@ -79,7 +82,7 @@ describe('createNewStoryChannel', () => { }); it('should emit an error event if an error occurs', async () => { - mockChannel.addListener(CREATE_NEW_STORYFILE_RESULT, createNewStoryFileEventListener); + mockChannel.addListener(CREATE_NEW_STORYFILE_RESPONSE, createNewStoryFileEventListener); const cwd = process.cwd(); mockFs.writeFile.mockImplementation(() => { @@ -100,7 +103,7 @@ describe('createNewStoryChannel', () => { }, } as any); - mockChannel.emit(CREATE_NEW_STORYFILE, { + mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 7546c5910a70..872b7fd08988 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -1,6 +1,9 @@ import type { Options } from '@storybook/types'; import type { Channel } from '@storybook/channels'; -import { CREATE_NEW_STORYFILE, CREATE_NEW_STORYFILE_RESULT } from '@storybook/core-events'; +import { + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, +} from '@storybook/core-events'; import fs from 'node:fs/promises'; import type { NewStoryData } from '../utils/get-new-story-file'; import { getNewStoryFile } from '../utils/get-new-story-file'; @@ -20,7 +23,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** * Listens for events to create a new storyfile */ - channel.on(CREATE_NEW_STORYFILE, async (data: CreateNewStoryPayload) => { + channel.on(CREATE_NEW_STORYFILE_REQUEST, async (data: CreateNewStoryPayload) => { try { const { storyFilePath, exportedStoryName, storyFileContent } = await getNewStoryFile( data, @@ -31,7 +34,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); - channel.emit(CREATE_NEW_STORYFILE_RESULT, { + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: true, result: { storyId, @@ -39,7 +42,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { error: null, } satisfies Result); } catch (e: any) { - channel.emit(CREATE_NEW_STORYFILE_RESULT, { + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: false, result: null, error: `An error occurred while creating a new story:\n${e?.message}`, diff --git a/code/lib/preview-api/src/modules/preview-web/Preview.tsx b/code/lib/preview-api/src/modules/preview-web/Preview.tsx index 29ea71045949..40596f6e1f21 100644 --- a/code/lib/preview-api/src/modules/preview-web/Preview.tsx +++ b/code/lib/preview-api/src/modules/preview-web/Preview.tsx @@ -1,6 +1,14 @@ import { global } from '@storybook/global'; import { deprecate, logger } from '@storybook/client-logger'; +import type { + ArgTypesRequestPayload, + ArgTypesResponsePayload, + RequestData, + ResponseData, +} from '@storybook/core-events'; import { + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, CONFIG_ERROR, FORCE_REMOUNT, FORCE_RE_RENDER, @@ -129,6 +137,7 @@ export class Preview { this.channel.on(STORY_INDEX_INVALIDATED, this.onStoryIndexChanged.bind(this)); this.channel.on(UPDATE_GLOBALS, this.onUpdateGlobals.bind(this)); this.channel.on(UPDATE_STORY_ARGS, this.onUpdateArgs.bind(this)); + this.channel.on(ARGTYPES_INFO_REQUEST, this.onRequestArgTypesInfo.bind(this)); this.channel.on(RESET_STORY_ARGS, this.onResetArgs.bind(this)); this.channel.on(FORCE_RE_RENDER, this.onForceReRender.bind(this)); this.channel.on(FORCE_REMOUNT, this.onForceRemount.bind(this)); @@ -295,6 +304,24 @@ export class Preview { }); } + async onRequestArgTypesInfo({ id, payload }: RequestData) { + try { + await this.storeInitializationPromise; + const story = await this.storyStoreValue?.loadStory(payload); + this.channel.emit(ARGTYPES_INFO_RESPONSE, { + id, + success: true, + payload: { argTypes: story?.argTypes || {} }, + } satisfies ResponseData); + } catch (e: any) { + this.channel.emit(ARGTYPES_INFO_RESPONSE, { + id, + success: false, + error: e?.message, + } satisfies ResponseData); + } + } + async onResetArgs({ storyId, argNames }: { storyId: string; argNames?: string[] }) { if (!this.storyStoreValue) throw new CalledPreviewMethodBeforeInitializationError({ methodName: 'onResetArgs' }); diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index f76f146adca5..55c33e03e3a1 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -131,11 +131,13 @@ export default { 'createBrowserChannel', ], '@storybook/core-events': [ + 'ARGTYPES_INFO_REQUEST', + 'ARGTYPES_INFO_RESPONSE', 'CHANNEL_CREATED', 'CHANNEL_WS_DISCONNECT', 'CONFIG_ERROR', - 'CREATE_NEW_STORYFILE', - 'CREATE_NEW_STORYFILE_RESULT', + 'CREATE_NEW_STORYFILE_REQUEST', + 'CREATE_NEW_STORYFILE_RESPONSE', 'CURRENT_STORY_WAS_SET', 'DOCS_PREPARED', 'DOCS_RENDERED', @@ -183,6 +185,7 @@ export default { 'UPDATE_GLOBALS', 'UPDATE_QUERY_PARAMS', 'UPDATE_STORY_ARGS', + 'experimental_requestResponse', ], '@storybook/core-events/manager-errors': [ 'Category', From 567f464060ee85c8989ac351af132412a6159d5a Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 15:17:49 +0200 Subject: [PATCH 117/180] Move requestResponse util and types to core-events --- code/addons/controls/src/manager.tsx | 160 ++++++++---------- code/lib/core-events/src/data/save-story.ts | 14 ++ code/lib/core-events/src/index.ts | 1 + .../src/utils/save-story/save-story.ts | 43 ++--- code/yarn.lock | 1 + 5 files changed, 104 insertions(+), 115 deletions(-) create mode 100644 code/lib/core-events/src/data/save-story.ts diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 802a52cf871e..d52291081bc2 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -2,8 +2,16 @@ import { stringify } from 'telejson'; import React from 'react'; import { dequal as deepEqual } from 'dequal'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; -import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; -import type { API } from '@storybook/manager-api'; +import type { + ResponseData, + SaveStoryRequestPayload, + SaveStoryResponsePayload, +} from '@storybook/core-events'; +import { + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, + experimental_requestResponse, +} from '@storybook/core-events'; import { addons, types, useArgTypes } from '@storybook/manager-api'; import { color } from '@storybook/theming'; import { ControlsPanel } from './ControlsPanel'; @@ -35,67 +43,46 @@ const stringifyArgs = (args: Record) => allowSymbol: true, }); -interface ResponseData { - id: string; - success: boolean; - error?: string; - payload?: any; -} - -const requestResponse = ( - api: API, - requestEvent: string, - responseEvent: string, - payload: any, - timeout = 5000 -) => { - let timeoutId: NodeJS.Timeout; - return new Promise((resolve, reject) => { - const requestId = Math.random().toString(16).slice(2); - const responseHandler = (response: ResponseData) => { - if (response.id !== requestId) return; - clearTimeout(timeoutId); - api.off(responseEvent, responseHandler); - if (response.success) resolve(response.payload); - else reject(new Error(response.error)); - }; - - api.emit(requestEvent, { id: requestId, payload }); - api.on(responseEvent, responseHandler); - - timeoutId = setTimeout(() => { - api.off(responseEvent, responseHandler); - reject(new Error('Timed out waiting for response')); - }, timeout); - }); -}; - addons.register(ADDON_ID, (api) => { + const channel = addons.getChannel(); + const saveStory = async () => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); - return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { - // Only send updated args - args: stringifyArgs( - Object.entries(data.args || {}).reduce((acc, [key, value]) => { - if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; - return acc; - }, {}) - ), - csfId: data.id, - importPath: data.importPath, - }); + + return experimental_requestResponse( + channel, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, + { + // Only send updated args + args: stringifyArgs( + Object.entries(data.args || {}).reduce((acc, [key, value]) => { + if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; + return acc; + }, {}) + ), + csfId: data.id, + importPath: data.importPath, + } satisfies SaveStoryRequestPayload + ); }; const createStory = async (name: string) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); - return requestResponse(api, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { - args: data.args ? stringifyArgs(data.args) : data.args, - csfId: data.id, - importPath: data.importPath, - name, - }); + + return experimental_requestResponse( + channel, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, + { + args: data.args && stringifyArgs(data.args), + csfId: data.id, + importPath: data.importPath, + name, + } satisfies SaveStoryRequestPayload + ); }; addons.add(ADDON_ID, { @@ -114,38 +101,41 @@ addons.register(ADDON_ID, (api) => { }, }); - api.on(SAVE_STORY_RESPONSE, ({ success, payload }) => { - if (!success) return; + channel.on( + SAVE_STORY_RESPONSE, + ({ success, payload }: ResponseData) => { + if (!success) return; - const { newStoryId, newStoryName, sourceStoryName } = payload; + const { newStoryId, newStoryName, sourceStoryName } = payload; - const data = api.getCurrentStoryData(); - if (data.type === 'story') api.resetStoryArgs(data); - if (newStoryId) api.selectStory(newStoryId); + const data = api.getCurrentStoryData(); + if (data.type === 'story') api.resetStoryArgs(data); + if (newStoryId) api.selectStory(newStoryId); - api.addNotification({ - id: 'save-story-success', - content: { - headline: newStoryName ? 'Story created' : 'Story saved', - subHeadline: newStoryName ? ( - <> - Added story {newStoryName} based on {sourceStoryName}. - - ) : ( - <> - Updated story {sourceStoryName}. - - ), - }, - duration: 8_000, - onClick: ({ onDismiss }) => { - onDismiss(); - if (newStoryId) api.selectStory(newStoryId); - }, - icon: { - name: 'passed', - color: color.positive, - }, - }); - }); + api.addNotification({ + id: 'save-story-success', + content: { + headline: newStoryName ? 'Story created' : 'Story saved', + subHeadline: newStoryName ? ( + <> + Added story {newStoryName} based on {sourceStoryName}. + + ) : ( + <> + Updated story {sourceStoryName}. + + ), + }, + duration: 8_000, + onClick: ({ onDismiss }) => { + onDismiss(); + if (newStoryId) api.selectStory(newStoryId); + }, + icon: { + name: 'passed', + color: color.positive, + }, + }); + } + ); }); diff --git a/code/lib/core-events/src/data/save-story.ts b/code/lib/core-events/src/data/save-story.ts new file mode 100644 index 000000000000..8dd4c009f044 --- /dev/null +++ b/code/lib/core-events/src/data/save-story.ts @@ -0,0 +1,14 @@ +export interface SaveStoryRequestPayload { + args: string | undefined; + csfId: string; + importPath: string; + name?: string; +} + +export interface SaveStoryResponsePayload { + csfId: string; + newStoryId?: string; + newStoryName?: string; + sourceFileName?: string; + sourceStoryName?: string; +} diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 3a64992e3c12..5d2b881b44ac 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -149,6 +149,7 @@ export const { export * from './request-response'; export * from './data/argtypes-info'; +export * from './data/save-story'; export interface WhatsNewCache { lastDismissedPost?: string; diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index ea109b04d0fd..067b26f515cf 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,16 +1,22 @@ /* eslint-disable no-underscore-dangle */ import { parse } from 'telejson'; import type { Channel } from '@storybook/channels'; +import type { + RequestData, + ResponseData, + SaveStoryRequestPayload, + SaveStoryResponsePayload, +} from '@storybook/core-events'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, STORY_RENDERED } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; import { readCsf, writeCsf } from '@storybook/csf-tools'; +import { logger } from '@storybook/node-logger'; +import type { CoreConfig, Options } from '@storybook/types'; +import { telemetry } from '@storybook/telemetry'; import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; -import type { CoreConfig, Options } from '@storybook/types'; -import { telemetry } from '@storybook/telemetry'; -import { logger } from '@storybook/node-logger'; const parseArgs = (args: string): Record => parse(args, { @@ -20,33 +26,10 @@ const parseArgs = (args: string): Record => allowSymbol: true, }); -interface SaveStoryRequest { - id: string; - payload: { - csfId: string; - importPath: string; - args: string; - name?: string; - }; -} - -type SaveStoryResponse = ( - | { id: string; success: true } - | { id: string; success: false; error: string } -) & { - payload: { - csfId: string; - newStoryId?: string; - newStoryName?: string; - sourceFileName?: string; - sourceStoryName?: string; - }; -}; - class SaveStoryError extends Error {} export function initializeSaveStory(channel: Channel, options: Options, coreConfig: CoreConfig) { - channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: SaveStoryRequest) => { + channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: RequestData) => { const { csfId, importPath, args, name } = payload; let newStoryId; @@ -82,7 +65,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf await updateArgsInCsfFile( name ? duplicateStoryWithNewName(parsed, storyName, name) : csf.getStoryExport(storyName), - parseArgs(args) + args ? parseArgs(args) : {} ); // Writing the CSF file should trigger HMR, which causes the story to rerender. Delay the @@ -105,7 +88,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf sourceFileName, sourceStoryName, }, - } satisfies SaveStoryResponse); + } satisfies ResponseData); if (!coreConfig.disableTelemetry) { await telemetry('save-story', { @@ -125,7 +108,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf sourceFileName, sourceStoryName, }, - } satisfies SaveStoryResponse); + } satisfies ResponseData); logger.error( `Error writing to ${sourceFilePath}:\n${error.stack || error.message || error.toString()}` diff --git a/code/yarn.lock b/code/yarn.lock index d73b24c6441b..bb20a3544238 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -5763,6 +5763,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/core-events@workspace:lib/core-events" dependencies: + "@storybook/csf": "npm:^0.1.4" chalk: "npm:^4.1.0" ts-dedent: "npm:^2.0.0" typescript: "npm:^5.3.2" From 8bfbaa877aa90ddf20b8dd70a2a1580b854a7ba2 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 18 Apr 2024 15:40:54 +0200 Subject: [PATCH 118/180] Move requestResponse util to manager-api --- code/addons/controls/src/manager.tsx | 8 ++------ code/lib/core-events/src/data/request-response.ts | 8 ++++++++ code/lib/core-events/src/index.ts | 3 +-- code/lib/manager-api/src/index.tsx | 1 + .../src => manager-api/src/lib}/request-response.ts | 10 +--------- code/ui/manager/src/globals/exports.ts | 2 +- 6 files changed, 14 insertions(+), 18 deletions(-) create mode 100644 code/lib/core-events/src/data/request-response.ts rename code/lib/{core-events/src => manager-api/src/lib}/request-response.ts (82%) diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index d52291081bc2..135997f7a4c4 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -7,12 +7,8 @@ import type { SaveStoryRequestPayload, SaveStoryResponsePayload, } from '@storybook/core-events'; -import { - SAVE_STORY_REQUEST, - SAVE_STORY_RESPONSE, - experimental_requestResponse, -} from '@storybook/core-events'; -import { addons, types, useArgTypes } from '@storybook/manager-api'; +import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE } from '@storybook/core-events'; +import { addons, experimental_requestResponse, types, useArgTypes } from '@storybook/manager-api'; import { color } from '@storybook/theming'; import { ControlsPanel } from './ControlsPanel'; import { ADDON_ID, PARAM_KEY } from './constants'; diff --git a/code/lib/core-events/src/data/request-response.ts b/code/lib/core-events/src/data/request-response.ts new file mode 100644 index 000000000000..7c4c0295b388 --- /dev/null +++ b/code/lib/core-events/src/data/request-response.ts @@ -0,0 +1,8 @@ +export type RequestData = { + id: string; + payload: Payload; +}; + +export type ResponseData = + | { id: string; success: true; payload: Payload } + | { id: string; success: false; error?: string; payload?: Payload }; diff --git a/code/lib/core-events/src/index.ts b/code/lib/core-events/src/index.ts index 5d2b881b44ac..b8b21ff41f41 100644 --- a/code/lib/core-events/src/index.ts +++ b/code/lib/core-events/src/index.ts @@ -146,9 +146,8 @@ export const { ARGTYPES_INFO_RESPONSE, } = events; -export * from './request-response'; - export * from './data/argtypes-info'; +export * from './data/request-response'; export * from './data/save-story'; export interface WhatsNewCache { diff --git a/code/lib/manager-api/src/index.tsx b/code/lib/manager-api/src/index.tsx index 0cb188bdb5d1..4e946fa5d618 100644 --- a/code/lib/manager-api/src/index.tsx +++ b/code/lib/manager-api/src/index.tsx @@ -69,6 +69,7 @@ import type { ModuleFn } from './lib/types'; import { types } from './lib/addons'; +export * from './lib/request-response'; export * from './lib/shortcut'; const { ActiveTabs } = layout; diff --git a/code/lib/core-events/src/request-response.ts b/code/lib/manager-api/src/lib/request-response.ts similarity index 82% rename from code/lib/core-events/src/request-response.ts rename to code/lib/manager-api/src/lib/request-response.ts index 88c8d1dddf77..dfbbda5b3b31 100644 --- a/code/lib/core-events/src/request-response.ts +++ b/code/lib/manager-api/src/lib/request-response.ts @@ -1,16 +1,8 @@ import type { Channel } from '@storybook/channels'; +import type { RequestData, ResponseData } from '@storybook/core-events'; class RequestResponseError extends Error {} -export type RequestData = { - id: string; - payload: Payload; -}; - -export type ResponseData = - | { id: string; success: true; payload: Payload } - | { id: string; success: false; error?: string; payload?: Payload }; - // eslint-disable-next-line @typescript-eslint/naming-convention export const experimental_requestResponse = ( channel: Channel, diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 55c33e03e3a1..1cd291ce406f 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -185,7 +185,6 @@ export default { 'UPDATE_GLOBALS', 'UPDATE_QUERY_PARAMS', 'UPDATE_STORY_ARGS', - 'experimental_requestResponse', ], '@storybook/core-events/manager-errors': [ 'Category', @@ -476,6 +475,7 @@ export default { 'controlOrMetaSymbol', 'eventMatchesShortcut', 'eventToShortcut', + 'experimental_requestResponse', 'isMacLike', 'isShortcutTaken', 'keyToSymbol', From 0df8706b715ae87f2ea8176deb00c79af8864657 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Thu, 18 Apr 2024 19:47:00 +0200 Subject: [PATCH 119/180] Fix save-from-controls e2e test --- code/e2e-tests/save-from-controls.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/e2e-tests/save-from-controls.spec.ts b/code/e2e-tests/save-from-controls.spec.ts index 7428fd46fc60..b70a1607595c 100644 --- a/code/e2e-tests/save-from-controls.spec.ts +++ b/code/e2e-tests/save-from-controls.spec.ts @@ -28,6 +28,7 @@ test.describe('save-from-controls', () => { const label = sbPage.panelContent().locator('textarea[name=label]'); const value = await label.inputValue(); await label.fill(value + ' Updated ' + id); + await label.blur(); // Assert the footer is shown await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); @@ -45,6 +46,7 @@ test.describe('save-from-controls', () => { // Update an arg await label.fill(value + ' Copied'); + await label.blur(); // Assert the footer is shown await sbPage.panelContent().locator('[data-short-label="Unsaved changes"]').isVisible(); From 2cf3ea2af6fc61334c3e57c17638ee38c2b86eb5 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 10:29:05 +0200 Subject: [PATCH 120/180] Polishing --- code/addons/measure/vitest.config.stories.tsx | 13 + .../src/data/file-component-search.ts | 2 + .../file-search-channel.test.ts | 17 +- .../src/server-channel/file-search-channel.ts | 8 + .../src/utils/get-new-story-file.ts | 15 +- .../lib/core-server/src/utils/search-files.ts | 8 +- code/ui/.storybook/main.ts | 5 +- .../src/components/sidebar/FileList.tsx | 207 ++++++- .../sidebar/FileSearchList.stories.tsx | 31 ++ .../src/components/sidebar/FileSearchList.tsx | 523 ++++++++---------- .../sidebar/FileSearchModal.stories.tsx | 17 + .../components/sidebar/FileSearchModal.tsx | 99 ++-- 12 files changed, 586 insertions(+), 359 deletions(-) create mode 100644 code/addons/measure/vitest.config.stories.tsx create mode 100644 code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx diff --git a/code/addons/measure/vitest.config.stories.tsx b/code/addons/measure/vitest.config.stories.tsx new file mode 100644 index 000000000000..bdf3c2979774 --- /dev/null +++ b/code/addons/measure/vitest.config.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import VitestConfig from './vitest.config'; + +const meta = { + component: VitestConfig, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; \ No newline at end of file diff --git a/code/lib/core-events/src/data/file-component-search.ts b/code/lib/core-events/src/data/file-component-search.ts index 1f35b6e7f0db..7737155a155f 100644 --- a/code/lib/core-events/src/data/file-component-search.ts +++ b/code/lib/core-events/src/data/file-component-search.ts @@ -11,6 +11,8 @@ export interface FileComponentSearchResult { files: Array<{ // The filepath relative to the project root filepath: string; + // Whether a corresponding story file exists + storyFileExists: boolean; // A list of exported components exportedComponents: Array<{ // the name of the exported component diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index 3316fab5f8dd..d1138d7bb3c9 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -1,6 +1,9 @@ import type { ChannelTransport } from '@storybook/channels'; import { Channel } from '@storybook/channels'; -import { FILE_COMPONENT_SEARCH, FILE_COMPONENT_SEARCH_RESULT } from '@storybook/core-events'; +import { + FILE_COMPONENT_SEARCH_RESPONSE, + FILE_COMPONENT_SEARCH_REQUEST, +} from '@storybook/core-events'; import { beforeEach, describe, expect, vi, it } from 'vitest'; import { initFileSearchChannel } from './file-search-channel'; @@ -47,8 +50,8 @@ describe('file-search-channel', () => { initFileSearchChannel(mockChannel, mockOptions as any); - mockChannel.addListener(FILE_COMPONENT_SEARCH_RESULT, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH, data); + mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); mocks.searchFiles.mockImplementation(async (...args) => { // @ts-expect-error Ignore type issue @@ -108,8 +111,8 @@ describe('file-search-channel', () => { initFileSearchChannel(mockChannel, mockOptions as any); - mockChannel.addListener(FILE_COMPONENT_SEARCH_RESULT, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH, data); + mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); mocks.searchFiles.mockImplementation(async (...args) => { // @ts-expect-error Ignore type issue @@ -139,9 +142,9 @@ describe('file-search-channel', () => { initFileSearchChannel(mockChannel, mockOptions as any); - mockChannel.addListener(FILE_COMPONENT_SEARCH_RESULT, searchResultChannelListener); + mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH, data); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); mocks.searchFiles.mockRejectedValue(new Error('ENOENT: no such file or directory')); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index f35db74624ae..0522dd59a55b 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -7,6 +7,7 @@ import { } from '@storybook/core-common'; import path from 'path'; import fs from 'fs/promises'; +import { existsSync } from 'fs'; import { getParser } from '../utils/parser'; import { searchFiles } from '../utils/search-files'; @@ -15,6 +16,7 @@ import { FILE_COMPONENT_SEARCH_REQUEST, FILE_COMPONENT_SEARCH_RESPONSE, } from '@storybook/core-events'; +import { getStoryMetadata } from '../utils/get-new-story-file'; export function initFileSearchChannel(channel: Channel, options: Options) { /** @@ -46,15 +48,21 @@ export function initFileSearchChannel(channel: Channel, options: Options) { try { const content = await fs.readFile(path.join(projectRoot, file), 'utf-8'); + const { storyFileName } = getStoryMetadata(path.join(projectRoot, file)); + const dirname = path.dirname(file); + + const storyFileExists = existsSync(path.join(projectRoot, dirname, storyFileName)); const info = await parser.parse(content); return { filepath: file, exportedComponents: info.exports, + storyFileExists, }; } catch (e) { return { filepath: file, + storyFileExists: false, exportedComponents: null, }; } diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index 330b33903c7c..d402f8de5924 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -15,7 +15,6 @@ export async function getNewStoryFile( { componentFilePath, componentExportName, componentIsDefaultExport }: CreateNewStoryPayload, options: Options ) { - const isTypescript = /\.(ts|tsx|mts|cts)$/.test(componentFilePath); const cwd = getProjectRoot(); const frameworkPackageName = await getFrameworkName(options); @@ -29,8 +28,8 @@ export async function getNewStoryFile( const basenameWithoutExtension = basename.replace(extension, ''); const dirname = path.dirname(componentFilePath); + const { storyFileName, isTypescript } = getStoryMetadata(componentFilePath); const storyFileExtension = isTypescript ? 'tsx' : 'jsx'; - const storyFileName = `${basenameWithoutExtension}.stories.${storyFileExtension}`; const alternativeStoryFileName = `${basenameWithoutExtension}.${componentExportName}.stories.${storyFileExtension}`; const exportedStoryName = 'Default'; @@ -59,3 +58,15 @@ export async function getNewStoryFile( return { storyFilePath, exportedStoryName, storyFileContent }; } + +export const getStoryMetadata = (componentFilePath: string) => { + const isTypescript = /\.(ts|tsx|mts|cts)$/.test(componentFilePath); + const basename = path.basename(componentFilePath); + const extension = path.extname(componentFilePath); + const basenameWithoutExtension = basename.replace(extension, ''); + const storyFileExtension = isTypescript ? 'tsx' : 'jsx'; + return { + storyFileName: `${basenameWithoutExtension}.stories.${storyFileExtension}`, + isTypescript, + }; +}; diff --git a/code/lib/core-server/src/utils/search-files.ts b/code/lib/core-server/src/utils/search-files.ts index 3f6a8e669046..98557584c4fa 100644 --- a/code/lib/core-server/src/utils/search-files.ts +++ b/code/lib/core-server/src/utils/search-files.ts @@ -5,7 +5,13 @@ export type SearchResult = Array; */ const FILE_EXTENSIONS = ['js', 'mjs', 'cjs', 'jsx', 'mts', 'ts', 'tsx', 'cts']; -const IGNORED_FILES = ['**/node_modules/**', '**/*.spec.*', '**/*.test.*', '**/*.stories.*']; +const IGNORED_FILES = [ + '**/node_modules/**', + '**/*.spec.*', + '**/*.test.*', + '**/*.stories.*', + '**/storybook-static/**', +]; /** * Search for files in a directory that match the search query diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index 7c67fa3d58d8..094a3a1a4a83 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -57,7 +57,7 @@ const config: StorybookConfig = { '@storybook/addon-storysource', '@storybook/addon-designs', '@storybook/addon-a11y', - '@chromatic-com/storybook', + // '@chromatic-com/storybook', ], build: { test: { @@ -67,6 +67,9 @@ const config: StorybookConfig = { disableDocgen: false, }, }, + typescript: { + reactDocgen: 'react-docgen-typescript', + }, framework: { name: '@storybook/react-vite', options: {}, diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index db1dadcb57bf..a98614793e64 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -1,15 +1,9 @@ import { styled } from '@storybook/theming'; import { rgba } from 'polished'; +import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; -export const FileList = styled('div')(({ theme }) => ({ - height: '280px', - overflow: 'auto', - msOverflowStyle: 'none', - scrollbarWidth: 'none', - position: 'relative', - '::-webkit-scrollbar': { - display: 'none', - }, +export const FileListWrapper = styled('div')(({ theme }) => ({ + marginTop: '-16px', // after element which fades out the list '&::after': { content: '""', @@ -23,10 +17,18 @@ export const FileList = styled('div')(({ theme }) => ({ }, })); -export const FileListItem = styled('li')(({ theme }) => ({ - display: 'flex', - flexDirection: 'column', +export const FileList = styled('div')(({ theme }) => ({ + height: '280px', + overflow: 'auto', + msOverflowStyle: 'none', + scrollbarWidth: 'none', + position: 'relative', + '::-webkit-scrollbar': { + display: 'none', + }, +})); +export const FileListLi = styled('li')(({ theme }) => ({ ':focus-visible': { outline: 'none', @@ -40,3 +42,184 @@ export const FileListItem = styled('li')(({ theme }) => ({ }, }, })); + +export const FileListItem = styled('div')(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + position: 'relative', +})); + +export const FileListItemContentWrapper = styled.div<{ + selected: boolean; + disabled: boolean; + error: boolean; +}>(({ theme, selected, disabled, error }) => ({ + display: 'flex', + alignItems: 'flex-start', + gap: '8px', + alignSelf: 'stretch', + padding: '8px 16px', + cursor: 'pointer', + borderRadius: '4px', + + ...(selected && { + borderRadius: '4px', + background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }), + + ...(disabled && { + cursor: 'not-allowed', + + div: { + color: `${theme.color.mediumdark} !important`, + }, + }), + + ...(error && { + background: '#F9ECEC', + }), + + '&:hover': { + background: error + ? '#F9ECEC' + : theme.base === 'dark' + ? 'rgba(255,255,255,.1)' + : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, +})); + +export const FileListUl = styled('ul')({ + margin: 0, + padding: '0 0 0 0', + width: '100%', + position: 'relative', +}); + +export const FileListItemContent = styled('div')({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + width: 'calc(100% - 50px)', +}); + +export const FileListIconWrapper = styled('div')<{ error: boolean }>(({ theme, error }) => ({ + color: error ? theme.color.negativeText : theme.color.secondary, +})); + +export const FileListItemLabel = styled('div')<{ error: boolean }>(({ theme, error }) => ({ + color: error + ? theme.color.negativeText + : theme.base === 'dark' + ? theme.color.lighter + : theme.color.darkest, + fontSize: '14px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: '100%', +})); + +export const FileListItemPath = styled('div')(({ theme }) => ({ + color: theme.color.mediumdark, + fontSize: '14px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: '100%', +})); + +export const FileListExport = styled('ul')(({ theme }) => ({ + margin: 0, + padding: 0, +})); + +export const FileListItemExport = styled('li')<{ error: boolean }>(({ theme, error }) => ({ + padding: '8px 16px 8px 16px', + marginLeft: '30px', + display: 'flex', + gap: '8px', + alignItems: 'center', + justifyContent: 'space-between', + fontSize: '14px', + cursor: 'pointer', + borderRadius: '4px', + + ':focus-visible': { + outline: 'none', + }, + + ...(error && { + background: '#F9ECEC', + color: theme.color.negativeText, + }), + + '&:hover,:focus-visible': { + background: error + ? '#F9ECEC' + : theme.base === 'dark' + ? 'rgba(255, 255, 255, 0.1)' + : theme.color.mediumlight, + + '> svg': { + display: 'flex', + }, + }, + + '> div > svg': { + color: error ? theme.color.negativeText : theme.color.secondary, + }, +})); + +export const FileListItemExportName = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: '8px', + width: 'calc(100% - 20px)', +})); + +export const FileListItemExportNameContent = styled('span')(({ theme }) => ({ + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + maxWidth: 'calc(100% - 160px)', + display: 'inline-block', +})); + +export const ChevronRightIconStyled = styled(ChevronRightIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + +export const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + +export const DefaultExport = styled('span')(({ theme }) => ({ + display: 'inline-block', + padding: `1px ${theme.appBorderRadius}px`, + borderRadius: '2px', + fontSize: '10px', + color: theme.base === 'dark' ? theme.color.lightest : '#727272', + backgroundColor: theme.base === 'dark' ? 'rgba(255, 255, 255, 0.1)' : '#F2F4F5', +})); + +export const NoResults = styled('div')(({ theme }) => ({ + padding: '0 10%', + textAlign: 'center', + color: theme.base === 'dark' ? theme.color.lightest : theme.defaultText, +})); + +export const NoResultsDescription = styled('p')(({ theme }) => ({ + color: theme.base === 'dark' ? theme.color.defaultText : theme.color.mediumdark, +})); diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx index a0b458da679c..d7f6f32ba965 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx @@ -18,6 +18,7 @@ export const Default: Story = { args: { isLoading: true, searchResults: null, + errorItemId: null, }, }; @@ -25,6 +26,7 @@ export const Empty: Story = { args: { isLoading: false, searchResults: [], + errorItemId: null, }, }; @@ -76,12 +78,15 @@ export const WithResults: Story = { }, args: { isLoading: false, + errorItemId: null, searchResults: [ { exportedComponents: [], + storyFileExists: false, filepath: 'src/no-exports-module.js', }, { + storyFileExists: false, exportedComponents: [ { default: true, @@ -95,10 +100,12 @@ export const WithResults: Story = { filepath: 'src/module-multiple-exports.js', }, { + storyFileExists: false, exportedComponents: null, filepath: 'src/no-exports-module-1.js', }, { + storyFileExists: false, exportedComponents: [ { default: true, @@ -107,6 +114,30 @@ export const WithResults: Story = { ], filepath: 'src/module-single-export.js', }, + { + storyFileExists: true, + exportedComponents: [ + { + default: true, + name: 'default', + }, + { + default: false, + name: 'namedExportWithStory', + }, + ], + filepath: 'src/has-story-file-with-multiple-exports.js', + }, + { + storyFileExists: true, + exportedComponents: [ + { + default: true, + name: 'default', + }, + ], + filepath: 'src/has-story-file.js', + }, ], }, }; diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index c12e1ec96756..b02d30503950 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -1,173 +1,43 @@ import React, { memo, useCallback, useLayoutEffect, useMemo, useState } from 'react'; -import { styled } from '@storybook/theming'; -import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; +import { ComponentIcon } from '@storybook/icons'; import { FileSearchListLoadingSkeleton } from './FileSearchListSkeleton'; -import { FileList, FileListItem } from './FileList'; +import { + ChevronDownIconStyled, + ChevronRightIconStyled, + DefaultExport, + FileList, + FileListExport, + FileListIconWrapper, + FileListItem, + FileListItemContent, + FileListItemContentWrapper, + FileListItemExport, + FileListItemExportName, + FileListItemExportNameContent, + FileListItemLabel, + FileListItemPath, + FileListLi, + FileListUl, + FileListWrapper, + NoResults, + NoResultsDescription, +} from './FileList'; import type { VirtualItem } from '@tanstack/react-virtual'; import { useVirtualizer } from '@tanstack/react-virtual'; import type { CreateNewStoryPayload, FileComponentSearchResult } from '@storybook/core-events'; import { WithTooltip, TooltipNote } from '@storybook/components'; -const FileListItemContentWrapper = styled.div<{ selected: boolean; disabled: boolean }>( - ({ theme, selected, disabled }) => ({ - display: 'flex', - alignItems: 'flex-start', - gap: '8px', - alignSelf: 'stretch', - padding: '8px 16px', - cursor: 'pointer', - - ...(selected && { - borderRadius: '4px', - background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, - - '> svg': { - display: 'flex', - }, - }), - - ...(disabled && { - cursor: 'not-allowed', - }), - - '&:hover': { - borderRadius: '4px', - background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, - - '> svg': { - display: 'flex', - }, - }, - }) -); - -const FileListUl = styled('ul')({ - margin: 0, - padding: 0, - width: '100%', - position: 'relative', -}); - -const FileListItemContent = styled('div')({ - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - width: 'calc(100% - 50px)', -}); - -const FileListIconWrapper = styled('div')(({ theme }) => ({ - color: theme.color.secondary, -})); - -const FileListItemLabel = styled('div')(({ theme }) => ({ - color: theme.base === 'dark' ? theme.color.lighter : theme.color.darkest, - fontSize: '14px', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - overflow: 'hidden', - maxWidth: '100%', -})); - -const FileListItemPath = styled('div')(({ theme }) => ({ - color: theme.color.mediumdark, - fontSize: '14px', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - overflow: 'hidden', - maxWidth: '100%', -})); - -const FileListExport = styled('ul')(({ theme }) => ({ - margin: 0, - padding: 0, -})); - -const FileListItemExport = styled('li')(({ theme }) => ({ - padding: '8px 16px 8px 16px', - marginLeft: '30px', - display: 'flex', - gap: '8px', - alignItems: 'center', - justifyContent: 'space-between', - fontSize: '14px', - cursor: 'pointer', - - ':focus-visible': { - outline: 'none', - borderRadius: '4px', - background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, - - '> svg': { - display: 'flex', - }, - }, - - '&:hover': { - borderRadius: '4px', - background: theme.base === 'dark' ? 'rgba(255, 255, 255, 0.1)' : theme.color.mediumlight, - - '> svg': { - display: 'flex', - }, - }, - - '> div > svg': { - color: theme.color.secondary, - }, -})); - -const FileListItemExportName = styled('div')(({ theme }) => ({ - display: 'flex', - alignItems: 'center', - gap: '8px', - width: 'calc(100% - 20px)', -})); - -const FileListItemExportNameContent = styled('span')(({ theme }) => ({ - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - overflow: 'hidden', - maxWidth: 'calc(100% - 160px)', - display: 'inline-block', -})); - -const ChevronRightIconStyled = styled(ChevronRightIcon)(({ theme }) => ({ - display: 'none', - alignSelf: 'center', - color: theme.color.mediumdark, -})); - -const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ - display: 'none', - alignSelf: 'center', - color: theme.color.mediumdark, -})); - -const DefaultExport = styled('span')(({ theme }) => ({ - display: 'inline-block', - padding: `1px ${theme.appBorderRadius}px`, - borderRadius: '2px', - fontSize: '10px', - color: theme.base === 'dark' ? theme.color.lightest : '#727272', - backgroundColor: theme.base === 'dark' ? 'rgba(255, 255, 255, 0.1)' : '#F2F4F5', -})); - -const NoResults = styled('div')(({ theme }) => ({ - padding: '0 10%', - textAlign: 'center', - color: theme.base === 'dark' ? theme.color.lightest : theme.defaultText, -})); - -const NoResultsDescription = styled('p')(({ theme }) => ({ - color: theme.base === 'dark' ? theme.color.defaultText : theme.color.mediumdark, -})); - export type SearchResult = FileComponentSearchResult['result']['files'][0]; +export interface NewStoryPayload extends CreateNewStoryPayload { + selectedItemId: string | number; +} + interface FileSearchListProps { isLoading: boolean; searchResults: Array | null; - onNewStory: (props: CreateNewStoryPayload) => void; + onNewStory: (props: NewStoryPayload) => void; + errorItemId?: number | string; } interface FileItemContentProps { @@ -177,10 +47,23 @@ interface FileItemContentProps { as?: 'div'; } +interface FileItemSelectionPayload { + virtualItem: VirtualItem; + searchResult: SearchResult; + itemId: string; +} + +interface FileItemComponentSelectionPayload { + searchResult: SearchResult; + component: SearchResult['exportedComponents'][0]; + id: string; +} + export const FileSearchList = memo(function FileSearchList({ isLoading, searchResults, onNewStory, + errorItemId, }: FileSearchListProps) { const [selectedItem, setSelectedItem] = useState(null); const parentRef = React.useRef(); @@ -188,7 +71,21 @@ export const FileSearchList = memo(function FileSearchList({ const sortedSearchResults = useMemo(() => { // search results with no exports should be at the end of the list return [...(searchResults ?? [])]?.sort((a, b) => { - if (a.exportedComponents?.length && b.exportedComponents?.length < 1) { + const isADisabled = + a.exportedComponents === null || + a.exportedComponents?.length === 0 || + (a.storyFileExists && a.exportedComponents?.length < 2); + + const isBDisabled = + b.exportedComponents === null || + b.exportedComponents?.length === 0 || + (b.storyFileExists && b.exportedComponents?.length < 2); + + if (isADisabled && !isBDisabled) { + return 1; + } + + if (!isADisabled && isBDisabled) { return -1; } @@ -199,6 +96,7 @@ export const FileSearchList = memo(function FileSearchList({ const rowVirtualizer = useVirtualizer({ count: searchResults?.length || 0, getScrollElement: () => parentRef.current, + paddingStart: 16, paddingEnd: 40, estimateSize: () => 54, overscan: 2, @@ -213,7 +111,7 @@ export const FileSearchList = memo(function FileSearchList({ }, [rowVirtualizer, selectedItem]); const handleFileItemSelection = useCallback( - ({ virtualItem, searchResult }: { virtualItem: VirtualItem; searchResult: SearchResult }) => { + ({ virtualItem, searchResult, itemId }: FileItemSelectionPayload) => { if (searchResult?.exportedComponents?.length > 1) { setSelectedItem((sItem) => { if (sItem === virtualItem.index) { @@ -222,11 +120,12 @@ export const FileSearchList = memo(function FileSearchList({ return virtualItem.index; }); - } else if (searchResult?.exportedComponents?.length === 1) { + } else if (searchResult?.exportedComponents?.length === 1 && !searchResult?.storyFileExists) { onNewStory({ componentExportName: searchResult.exportedComponents[0].name, componentFilePath: searchResult.filepath, componentIsDefaultExport: searchResult.exportedComponents[0].default, + selectedItemId: itemId, }); } }, @@ -234,113 +133,117 @@ export const FileSearchList = memo(function FileSearchList({ ); const handleFileItemComponentSelection = useCallback( - ({ - searchResult, - component, - }: { - searchResult: SearchResult; - component: SearchResult['exportedComponents'][0]; - }) => { + ({ searchResult, component, id }: FileItemComponentSelectionPayload) => { onNewStory({ componentExportName: component.name, componentFilePath: searchResult.filepath, componentIsDefaultExport: component.default, + selectedItemId: id, }); }, [onNewStory] ); const ListItem = useCallback( - ({ virtualItem, selected, searchResult, as }: FileItemContentProps) => ( - { - handleFileItemSelection({ virtualItem, searchResult }); - }} - onKeyUp={(event) => { - if (event.key === 'Enter') { - handleFileItemSelection({ virtualItem, searchResult }); - } - }} - > - { + const itemError = errorItemId === searchResult.filepath; + const itemSelected = selected === virtualItem.index; + + return ( + { + handleFileItemSelection({ virtualItem, itemId: searchResult.filepath, searchResult }); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + handleFileItemSelection({ virtualItem, itemId: searchResult.filepath, searchResult }); + } + }} > - - - - - {searchResult.filepath.split('/').at(-1)} - {searchResult.filepath} - - {selected === virtualItem.index ? : } - - {searchResult?.exportedComponents?.length > 1 && selected === virtualItem.index && ( - { - e.stopPropagation(); - }} - onKeyUp={(e) => { - if (e.key === 'Enter') { - e.stopPropagation(); - } - }} + - {searchResult.exportedComponents?.map((component) => ( - { - handleFileItemComponentSelection({ searchResult, component }); - }} - onKeyUp={(event) => { - if (event.key === 'Enter') { - handleFileItemComponentSelection({ searchResult, component }); - } - }} - > - - - {component.default ? ( - <> - - {searchResult.filepath.split('/').at(-1)?.split('.')?.at(0)} - - Default export - - ) : ( - component.name - )} - - - - ))} - - )} - - ), - [handleFileItemComponentSelection, handleFileItemSelection, rowVirtualizer] + + + + + + {searchResult.filepath.split('/').at(-1)} + + {searchResult.filepath} + + {itemSelected ? : } + + {searchResult?.exportedComponents?.length > 1 && itemSelected && ( + { + e.stopPropagation(); + }} + onKeyUp={(e) => { + if (e.key === 'Enter') { + e.stopPropagation(); + } + }} + > + {searchResult.exportedComponents?.map((component, itemExportId) => { + const itemExportError = errorItemId === `${searchResult.filepath}_${itemExportId}`; + return ( + { + handleFileItemComponentSelection({ + searchResult, + component, + id: `${searchResult.filepath}_${itemExportId}`, + }); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + handleFileItemComponentSelection({ + searchResult, + component, + id: `${searchResult.filepath}_${itemExportId}`, + }); + } + }} + > + + + {component.default ? ( + <> + + {searchResult.filepath.split('/').at(-1)?.split('.')?.at(0)} + + Default export + + ) : ( + component.name + )} + + + + ); + })} + + )} + + ); + }, + [handleFileItemComponentSelection, handleFileItemSelection, errorItemId] ); if (isLoading && (searchResults === null || searchResults?.length === 0)) { @@ -361,44 +264,76 @@ export const FileSearchList = memo(function FileSearchList({ if (sortedSearchResults?.length > 0) { return ( - - - {rowVirtualizer.getVirtualItems().map((virtualItem) => { - const searchResult = sortedSearchResults[virtualItem.index]; - return searchResult.exportedComponents === null || - searchResult.exportedComponents?.length === 0 ? ( - - } - > - - - ) : ( - - ); - })} - - + + + + {rowVirtualizer.getVirtualItems().map((virtualItem) => { + const searchResult = sortedSearchResults[virtualItem.index]; + const noExports = + searchResult.exportedComponents === null || + searchResult.exportedComponents?.length === 0; + const hasStoryFile = + searchResult.exportedComponents?.length === 1 && searchResult.storyFileExists; + + const itemProps = {}; + + return ( + + {noExports || hasStoryFile ? ( + + } + > + + + ) : ( + + )} + + ); + })} + + + ); } diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx new file mode 100644 index 000000000000..7e31196e6908 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx @@ -0,0 +1,17 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { FileSearchModal } from './FileSearchModal'; + +const meta = { + component: FileSearchModal, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + open: true + } +}; \ No newline at end of file diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index a0bf5a6be995..3f4f7c946c07 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -32,7 +32,7 @@ import { import { addons, useStorybookApi } from '@storybook/manager-api'; import { useDebounce } from '../../hooks/useDebounce'; -import type { SearchResult } from './FileSearchList'; +import type { NewStoryPayload, SearchResult } from './FileSearchList'; import { FileSearchList } from './FileSearchList'; import type { Channel } from '@storybook/channels'; import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; @@ -126,6 +126,11 @@ const ModalError = styled(Modal.Error)({ padding: '8px 40px 8px 16px', bottom: 0, maxHeight: 'initial', + width: '100%', + + div: { + wordBreak: 'break-word', + }, '> div': { padding: 0, @@ -146,7 +151,9 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => const fileSearchQueryDebounced = useDebounce(fileSearchQuery, 200); const fileSearchQueryDeferred = useDeferredValue(fileSearchQueryDebounced); const emittedValue = useRef(null); - const [error, setError] = useState(null); + const [error, setError] = useState<{ selectedItemId?: number | string; error: string } | null>( + null + ); const api = useStorybookApi(); const [modalContentRef, modalContentDimensions] = useMeasure(); const [modalMaxHeight, setModalMaxHeight] = useState(modalContentDimensions.height); @@ -190,12 +197,53 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => [api, onOpenChange] ); + const handleFileSearch = useCallback(() => { + setLoading(true); + const channel = addons.getChannel(); + + const set = (data: FileComponentSearchResult) => { + const isLatestRequest = + data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; + + if (data.success) { + if (isLatestRequest) { + setSearchResults(data.result.files); + } + } else { + setError({ error: data.error }); + } + + if (isLatestRequest) { + channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); + setLoading(false); + emittedValue.current = null; + } + }; + + channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); + + if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { + emittedValue.current = fileSearchQueryDeferred; + channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + searchQuery: fileSearchQueryDeferred, + } satisfies FileComponentSearchPayload); + } else { + setSearchResults(null); + setLoading(false); + } + + return () => { + channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); + }; + }, [fileSearchQueryDeferred]); + const handleCreateNewStory = useCallback( async ({ componentExportName, componentFilePath, componentIsDefaultExport, - }: CreateNewStoryPayload) => { + selectedItemId, + }: NewStoryPayload) => { try { const channel = addons.getChannel(); @@ -254,7 +302,7 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => handleSuccessfullyCreatedStory(componentExportName); } else { - setError(createNewStoryResult.error); + setError({ selectedItemId: selectedItemId, error: createNewStoryResult.error }); } } catch (e) { handleErrorWhenCreatingStory(); @@ -265,45 +313,11 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => useEffect(() => { setError(null); - }, [searchResults]); + }, [fileSearchQueryDeferred]); useEffect(() => { - setLoading(true); - const channel = addons.getChannel(); - - const set = (data: FileComponentSearchResult) => { - const isLatestRequest = - data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; - - if (data.success) { - if (isLatestRequest) { - setSearchResults(data.result.files); - } - } else { - setError(data.error); - } - - if (isLatestRequest) { - setLoading(false); - } - }; - - channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); - - if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { - emittedValue.current = fileSearchQueryDeferred; - channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { - searchQuery: fileSearchQueryDeferred, - } satisfies FileComponentSearchPayload); - } else { - setSearchResults(null); - setLoading(false); - } - - return () => { - channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); - }; - }, [fileSearchQueryDeferred, setSearchResults, setLoading]); + return handleFileSearch(); + }, [handleFileSearch]); return ( { {error && fileSearchQueryDeferred !== '' && ( - {error} +
{error.error}
{ setError(null); From e0af40b48a0cd0b91384506a2667bddb73085a5e Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 10:48:44 +0200 Subject: [PATCH 121/180] Polish skeleton --- .../components/sidebar/FileSearchListSkeleton.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx b/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx index d54cd473f7d0..f8050f4942f6 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchListSkeleton.tsx @@ -15,36 +15,41 @@ const FileListItemContentSkeleton = styled('div')({ flexDirection: 'column', alignItems: 'flex-start', width: '100%', + borderRadius: '3px', }); const FileListIconWrapperSkeleton = styled.div(({ theme }) => ({ width: '14px', height: '14px', + borderRadius: '3px', + marginTop: '1px', background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : 'rgba(0,0,0,.1)', animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, })); const FileListItemSkeleton = styled.div(({ theme }) => ({ - height: '14px', + height: '16px', + borderRadius: '3px', background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : 'rgba(0,0,0,.1)', animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, width: '100%', + maxWidth: '100%', '+ div': { - marginTop: '8px', + marginTop: '6px', }, })); export const FileSearchListLoadingSkeleton = () => { return ( - {[1, 2, 3, 4, 5].map((result) => ( + {[1, 2, 3].map((result) => ( - - + + From c3f0177374e2d27a04bb6cf8b8521b86033e97a7 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 10:49:04 +0200 Subject: [PATCH 122/180] Polish no results --- code/ui/manager/src/components/sidebar/FileList.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index a98614793e64..0ad499740aa5 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -215,11 +215,14 @@ export const DefaultExport = styled('span')(({ theme }) => ({ })); export const NoResults = styled('div')(({ theme }) => ({ - padding: '0 10%', textAlign: 'center', - color: theme.base === 'dark' ? theme.color.lightest : theme.defaultText, + maxWidth: '334px', + margin: '16px auto 0 auto', + fontSize: '14px', + color: theme.base === 'dark' ? theme.color.lightest : '#000', })); export const NoResultsDescription = styled('p')(({ theme }) => ({ + margin: 0, color: theme.base === 'dark' ? theme.color.defaultText : theme.color.mediumdark, })); From d7039ef542ca54aa864c17826978fcf328328c2c Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 19 Apr 2024 12:22:32 +0200 Subject: [PATCH 123/180] Implement file formatting --- .../src/utils/save-story/save-story.ts | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 067b26f515cf..b7cd292ce218 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,4 +1,5 @@ /* eslint-disable no-underscore-dangle */ +import fs from 'node:fs/promises'; import { parse } from 'telejson'; import type { Channel } from '@storybook/channels'; import type { @@ -9,7 +10,7 @@ import type { } from '@storybook/core-events'; import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, STORY_RENDERED } from '@storybook/core-events'; import { storyNameFromExport, toId } from '@storybook/csf'; -import { readCsf, writeCsf } from '@storybook/csf-tools'; +import { printCsf, readCsf } from '@storybook/csf-tools'; import { logger } from '@storybook/node-logger'; import type { CoreConfig, Options } from '@storybook/types'; import { telemetry } from '@storybook/telemetry'; @@ -17,6 +18,7 @@ import { telemetry } from '@storybook/telemetry'; import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; +import { formatFileContent } from '@storybook/core-common'; const parseArgs = (args: string): Record => parse(args, { @@ -26,17 +28,34 @@ const parseArgs = (args: string): Record => allowSymbol: true, }); +// Removes extra newlines between story properties. See https://github.com/benjamn/recast/issues/242 +// Only updates the part of the code for the story with the given name. +const removeExtraNewlines = (code: string, name: string) => { + const anything = '(.|\r\n|\r|\n)'; // Multiline match for any character. + const newline = '(\r\n|\r|\n)'; // Either newlines or carriage returns may be used in the file. + const closing = newline + '};' + newline; // Marks the end of the story definition. + const regex = new RegExp( + // Looks for an export by the given name, considers the first closing brace on its own line + // to be the end of the story definition. + `^(?${anything}*)(?export const ${name} =${anything}+?${closing})(?${anything}*)$` + ); + const { before, story, after } = code.match(regex)?.groups || {}; + return story + ? before + story.replaceAll(/(\r\n|\r|\n)(\r\n|\r|\n)([ \t]*[a-z0-9_]+): /gi, '$2$3:') + after + : code; +}; + class SaveStoryError extends Error {} export function initializeSaveStory(channel: Channel, options: Options, coreConfig: CoreConfig) { channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: RequestData) => { const { csfId, importPath, args, name } = payload; - let newStoryId; - let newStoryName; - let sourceFileName; - let sourceFilePath; - let sourceStoryName; + let newStoryId: string | undefined; + let newStoryName: string | undefined; + let sourceFileName: string; + let sourceFilePath: string; + let sourceStoryName: string; try { sourceFileName = basename(importPath); @@ -68,6 +87,11 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf args ? parseArgs(args) : {} ); + const code = await formatFileContent( + sourceFilePath, + removeExtraNewlines(printCsf(csf).code, name || storyName) + ); + // Writing the CSF file should trigger HMR, which causes the story to rerender. Delay the // response until that happens, but don't wait too long. await Promise.all([ @@ -75,7 +99,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf channel.on(STORY_RENDERED, resolve); setTimeout(() => resolve(channel.off(STORY_RENDERED, resolve)), 3000); }), - writeCsf(csf, sourceFilePath), + fs.writeFile(sourceFilePath, code), ]); channel.emit(SAVE_STORY_RESPONSE, { From fa134a9e8fbdd6f54c102d29db30d7ed3a05f17b Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 12:34:38 +0200 Subject: [PATCH 124/180] Add FileSearchModal --- .../components/src/components/Modal/Modal.tsx | 4 +- .../src/components/sidebar/FileList.tsx | 2 +- .../sidebar/FileSearchList.stories.tsx | 3 + .../src/components/sidebar/FileSearchList.tsx | 26 +- .../sidebar/FileSearchModal.stories.tsx | 124 ++++++++- .../components/sidebar/FileSearchModal.tsx | 245 +++--------------- .../manager/src/components/sidebar/Search.tsx | 4 +- 7 files changed, 183 insertions(+), 225 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.tsx b/code/ui/components/src/components/Modal/Modal.tsx index 33bac379d2b1..ad5ddaa85b4e 100644 --- a/code/ui/components/src/components/Modal/Modal.tsx +++ b/code/ui/components/src/components/Modal/Modal.tsx @@ -11,6 +11,7 @@ interface ModalProps extends Omit, 'chi onEscapeKeyDown?: ContentProps['onEscapeKeyDown']; onInteractOutside?: ContentProps['onInteractOutside']; className?: string; + container?: HTMLElement; } export const initial = { opacity: 0 }; @@ -24,11 +25,12 @@ function BaseModal({ onEscapeKeyDown, onInteractOutside = (ev) => ev.preventDefault(), className, + container, ...rootProps }: ModalProps) { return ( - + diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index 0ad499740aa5..0e242d528076 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -217,7 +217,7 @@ export const DefaultExport = styled('span')(({ theme }) => ({ export const NoResults = styled('div')(({ theme }) => ({ textAlign: 'center', maxWidth: '334px', - margin: '16px auto 0 auto', + margin: '16px auto 50px auto', fontSize: '14px', color: theme.base === 'dark' ? theme.color.lightest : '#000', })); diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx index d7f6f32ba965..6aa590c6d34a 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx @@ -41,6 +41,7 @@ export const WithResults: Story = { fireEvent.click(exportedElement1); expect(args.onNewStory).toHaveBeenCalledWith({ + selectedItemId: 'src/module-multiple-exports.js_0', componentExportName: 'default', componentFilePath: 'src/module-multiple-exports.js', componentIsDefaultExport: true, @@ -50,6 +51,7 @@ export const WithResults: Story = { fireEvent.click(exportedElement2); expect(args.onNewStory).toHaveBeenCalledWith({ + selectedItemId: 'src/module-multiple-exports.js_1', componentExportName: 'namedExport', componentFilePath: 'src/module-multiple-exports.js', componentIsDefaultExport: false, @@ -59,6 +61,7 @@ export const WithResults: Story = { fireEvent.click(singleExport); expect(args.onNewStory).toHaveBeenCalledWith({ + selectedItemId: 'src/module-single-export.js', componentExportName: 'default', componentFilePath: 'src/module-single-export.js', componentIsDefaultExport: true, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index b02d30503950..0319e73b9ba1 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -154,14 +154,6 @@ export const FileSearchList = memo(function FileSearchList({ aria-expanded={itemSelected} aria-controls={`file-list-export-${virtualItem.index}`} id={`file-list-item-wrapper-${virtualItem.index}`} - onClick={(event) => { - handleFileItemSelection({ virtualItem, itemId: searchResult.filepath, searchResult }); - }} - onKeyUp={(event) => { - if (event.key === 'Enter') { - handleFileItemSelection({ virtualItem, itemId: searchResult.filepath, searchResult }); - } - }} > ); }, - [handleFileItemComponentSelection, handleFileItemSelection, errorItemId] + [handleFileItemComponentSelection, errorItemId] ); if (isLoading && (searchResults === null || searchResults?.length === 0)) { @@ -286,6 +278,22 @@ export const FileSearchList = memo(function FileSearchList({ key={virtualItem.key} data-index={virtualItem.index} ref={rowVirtualizer.measureElement} + onClick={() => { + handleFileItemSelection({ + virtualItem, + itemId: searchResult.filepath, + searchResult, + }); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + handleFileItemSelection({ + virtualItem, + itemId: searchResult.filepath, + searchResult, + }); + } + }} style={{ position: 'absolute', top: 0, diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx index 7e31196e6908..d27d61b0457e 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx @@ -1,17 +1,133 @@ import type { Meta, StoryObj } from '@storybook/react'; +import { findByText, fireEvent, fn, expect } from '@storybook/test'; +import { WithResults } from './FileSearchList.stories'; +import React, { useState } from 'react'; import { FileSearchModal } from './FileSearchModal'; const meta = { component: FileSearchModal, + args: { + open: true, + setError: fn(), + onCreateNewStory: fn(), + onOpenChange: fn(), + setFileSearchQuery: fn(), + }, + // This decorator is used to show the modal in the side by side view + decorators: [ + (Story, context) => { + const [container, setContainer] = useState(null); + + if (context.globals.theme === 'side-by-side') { + return ( +
{ + setContainer(element); + }} + style={{ + width: '100%', + height: '100%', + minHeight: '600px', + transform: 'translateZ(0)', + }} + > + {Story({ args: { ...context.args, container } })} +
+ ); + } + + return Story(); + }, + ], } satisfies Meta; export default meta; type Story = StoryObj; -export const Default: Story = { +export const InitialState: Story = { + args: { + fileSearchQuery: '', + fileSearchQueryDeferred: '', + isLoading: false, + error: null, + searchResults: null, + }, +}; + +export const Loading: Story = { + args: { + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: true, + error: null, + searchResults: null, + }, +}; + +export const LoadingWithPreviousResults: Story = { + args: { + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: true, + error: null, + searchResults: WithResults.args.searchResults, + }, +}; + +export const Empty: Story = { + args: { + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: false, + error: null, + searchResults: [], + }, +}; + +export const WithSearchResults: Story = { + args: { + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: false, + error: null, + searchResults: WithResults.args.searchResults, + }, + play: async ({ canvasElement, args }) => { + const parent = canvasElement.parentNode as HTMLElement; + + const moduleSingleExport = await findByText(parent, 'module-single-export.js'); + await fireEvent.click(moduleSingleExport); + + expect(args.onCreateNewStory).toHaveBeenCalledWith({ + componentExportName: 'default', + componentFilePath: 'src/module-single-export.js', + componentIsDefaultExport: true, + selectedItemId: 'src/module-single-export.js', + }); + }, +}; + +export const WithSearchResultsAndError: Story = { + args: { + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: false, + error: { error: 'Some error occured', selectedItemId: 'src/module-multiple-exports.js' }, + searchResults: WithResults.args.searchResults, + }, +}; + +export const WithSearchResultsAndMultiLineError: Story = { args: { - open: true - } -}; \ No newline at end of file + fileSearchQuery: 'src', + fileSearchQueryDeferred: 'src', + isLoading: false, + error: { + error: 'A very long error occured. A very long error occured. A very long error occured.', + selectedItemId: 'src/module-multiple-exports.js', + }, + searchResults: WithResults.args.searchResults, + }, +}; diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index 3f4f7c946c07..0c948128d7fb 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -8,7 +8,7 @@ import React, { } from 'react'; import { Modal, Form } from '@storybook/components'; import { styled } from '@storybook/theming'; -import { AlertIcon, CheckIcon, CloseAltIcon, RefreshIcon, SearchIcon } from '@storybook/icons'; +import { AlertIcon, CheckIcon, CloseAltIcon, SearchIcon, SyncIcon } from '@storybook/icons'; import type { ArgTypesInfoPayload, ArgTypesInfoResult, @@ -40,11 +40,6 @@ import { useMeasure } from './useMeasure'; const MODAL_HEIGHT = 418; -interface FileSearchModalProps { - open: boolean; - onOpenChange: (open: boolean) => void; -} - const ModalStyled = styled(Modal)(() => ({ boxShadow: 'none', background: 'transparent', @@ -110,7 +105,7 @@ const LoadingIcon = styled.div(({ theme }) => ({ top: 0, right: 16, zIndex: 1, - color: theme.textMutedColor, + color: theme.darkest, display: 'flex', alignItems: 'center', height: '100%', @@ -139,24 +134,42 @@ const ModalError = styled(Modal.Error)({ const ModalErrorCloseIcon = styled(CloseAltIcon)({ position: 'absolute', - top: 8, + top: 4, right: -24, cursor: 'pointer', }); -export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => { - const [, startTransition] = useTransition(); - const [isLoading, setLoading] = useState(false); - const [fileSearchQuery, setFileSearchQuery] = useState(''); - const fileSearchQueryDebounced = useDebounce(fileSearchQuery, 200); - const fileSearchQueryDeferred = useDeferredValue(fileSearchQueryDebounced); - const emittedValue = useRef(null); - const [error, setError] = useState<{ selectedItemId?: number | string; error: string } | null>( - null - ); - const api = useStorybookApi(); +type Error = { selectedItemId?: number | string; error: string } | null; + +interface FileSearchModalProps { + open: boolean; + onOpenChange: (open: boolean) => void; + fileSearchQuery: string; + fileSearchQueryDeferred: string; + setFileSearchQuery: (query: string) => void; + isLoading: boolean; + error: Error; + searchResults: SearchResult[] | null; + onCreateNewStory: (payload: NewStoryPayload) => void; + setError: (error: Error) => void; + container?: HTMLElement; +} + +export const FileSearchModal = ({ + open, + onOpenChange, + fileSearchQuery, + setFileSearchQuery, + isLoading, + error, + searchResults, + onCreateNewStory, + setError, + container, +}: FileSearchModalProps) => { const [modalContentRef, modalContentDimensions] = useMeasure(); const [modalMaxHeight, setModalMaxHeight] = useState(modalContentDimensions.height); + const [, startTransition] = useTransition(); useEffect(() => { if (modalMaxHeight < modalContentDimensions.height) { @@ -164,161 +177,6 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => } }, [modalContentDimensions.height, modalMaxHeight]); - const [searchResults, setSearchResults] = useState(null); - - const handleErrorWhenCreatingStory = useCallback(() => { - api.addNotification({ - id: 'create-new-story-file-error', - content: { - headline: 'Error while creating story file', - subHeadline: `Take a look at your developer console for more information`, - }, - duration: 8_000, - icon: , - }); - - onOpenChange(false); - }, [api, onOpenChange]); - - const handleSuccessfullyCreatedStory = useCallback( - (componentExportName: string) => { - api.addNotification({ - id: 'create-new-story-file-success', - content: { - headline: 'Story file created', - subHeadline: `${componentExportName} was created`, - }, - duration: 8_000, - icon: , - }); - - onOpenChange(false); - }, - [api, onOpenChange] - ); - - const handleFileSearch = useCallback(() => { - setLoading(true); - const channel = addons.getChannel(); - - const set = (data: FileComponentSearchResult) => { - const isLatestRequest = - data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; - - if (data.success) { - if (isLatestRequest) { - setSearchResults(data.result.files); - } - } else { - setError({ error: data.error }); - } - - if (isLatestRequest) { - channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); - setLoading(false); - emittedValue.current = null; - } - }; - - channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); - - if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { - emittedValue.current = fileSearchQueryDeferred; - channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { - searchQuery: fileSearchQueryDeferred, - } satisfies FileComponentSearchPayload); - } else { - setSearchResults(null); - setLoading(false); - } - - return () => { - channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); - }; - }, [fileSearchQueryDeferred]); - - const handleCreateNewStory = useCallback( - async ({ - componentExportName, - componentFilePath, - componentIsDefaultExport, - selectedItemId, - }: NewStoryPayload) => { - try { - const channel = addons.getChannel(); - - const createNewStoryResult = await oncePromise( - { - channel, - request: { - name: CREATE_NEW_STORYFILE_REQUEST, - payload: { - componentExportName, - componentFilePath, - componentIsDefaultExport, - }, - }, - resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, - } - ); - - if (createNewStoryResult.success) { - setError(null); - - const storyId = createNewStoryResult.result.storyId; - - await trySelectNewStory(api.selectStory, storyId); - - const argTypesInfoResult = await oncePromise({ - channel, - request: { - name: ARGTYPES_INFO_REQUEST, - payload: { storyId }, - }, - resolveEvent: ARGTYPES_INFO_RESPONSE, - }); - - if (argTypesInfoResult.success) { - const argTypes = argTypesInfoResult.result.argTypes; - - const requiredArgs = extractSeededRequiredArgs(argTypes); - - await oncePromise({ - channel, - request: { - name: SAVE_STORY_REQUEST, - payload: { - id: storyId, - payload: { - args: requiredArgs, - importPath: createNewStoryResult.result.storyFilePath, - csfId: storyId, - }, - }, - }, - resolveEvent: SAVE_STORY_RESPONSE, - }); - } - - handleSuccessfullyCreatedStory(componentExportName); - } else { - setError({ selectedItemId: selectedItemId, error: createNewStoryResult.error }); - } - } catch (e) { - handleErrorWhenCreatingStory(); - } - }, - [api, handleSuccessfullyCreatedStory, handleErrorWhenCreatingStory] - ); - - useEffect(() => { - setError(null); - }, [fileSearchQueryDeferred]); - - useEffect(() => { - return handleFileSearch(); - }, [handleFileSearch]); - return ( onInteractOutside={() => { onOpenChange(false); }} + container={container} > - + Add a new story @@ -358,7 +215,7 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => /> {isLoading && ( - + )} @@ -367,12 +224,12 @@ export const FileSearchModal = ({ open, onOpenChange }: FileSearchModalProps) => errorItemId={error?.selectedItemId} isLoading={isLoading} searchResults={searchResults} - onNewStory={handleCreateNewStory} + onNewStory={onCreateNewStory} /> } - {error && fileSearchQueryDeferred !== '' && ( + {error && fileSearchQuery !== '' && (
{error.error}
); }; - -interface OncePromiseOptions { - channel: Channel; - request: { - name: string; - payload: Payload; - }; - resolveEvent: string; -} - -function oncePromise({ - channel, - request, - resolveEvent, -}: OncePromiseOptions): Promise { - return new Promise((resolve, reject) => { - channel.once(resolveEvent, (data: Result) => { - resolve(data); - }); - - channel.emit(request.name, request.payload as Payload); - - // If the channel supports error events, you can reject the promise on error - channel.once(resolveEvent, (error: any) => { - reject(error); - }); - }); -} diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index c4116ba87997..28010a0785da 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -22,7 +22,7 @@ import { isSearchResult, isExpandType } from './types'; import { scrollIntoView, searchItem } from '../../utils/tree'; import { getGroupStatus, getHighestStatus } from '../../utils/status'; import { useLayout } from '../layout/LayoutProvider'; -import { FileSearchModal } from './FileSearchModal'; +import { FileSearchModalContainer } from './FileSearchModal'; const { document } = global; @@ -427,7 +427,7 @@ export const Search = React.memo<{
- From ccf154fc6e0715f2e966f1c6ca93c9ab0171ea0e Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Fri, 19 Apr 2024 12:35:42 +0200 Subject: [PATCH 125/180] pick https://github.com/storybookjs/storybook/pull/26882/files#diff-d40226fcb115b93feafb896e096305e58bd7bfdde052bdb05da560b4177182b2 --- .../src/modules/preview-web/PreviewWithSelection.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/lib/preview-api/src/modules/preview-web/PreviewWithSelection.tsx b/code/lib/preview-api/src/modules/preview-web/PreviewWithSelection.tsx index b183a7488ba9..f4c15e000d14 100644 --- a/code/lib/preview-api/src/modules/preview-web/PreviewWithSelection.tsx +++ b/code/lib/preview-api/src/modules/preview-web/PreviewWithSelection.tsx @@ -352,12 +352,8 @@ export class PreviewWithSelection extends Preview Date: Fri, 19 Apr 2024 12:41:24 +0200 Subject: [PATCH 126/180] Separate CreateNewStoryFileModal from FileSearchModal --- .../sidebar/CreateNewStoryFileModal.tsx | 244 ++++++++++++++++++ .../manager/src/components/sidebar/Search.tsx | 4 +- 2 files changed, 246 insertions(+), 2 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx new file mode 100644 index 000000000000..b4dfb3e79ecd --- /dev/null +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -0,0 +1,244 @@ +import React, { useCallback, useDeferredValue, useEffect, useRef, useState } from 'react'; +import { AlertIcon, CheckIcon } from '@storybook/icons'; +import type { + ArgTypesInfoPayload, + ArgTypesInfoResult, + CreateNewStoryPayload, + CreateNewStoryResult, + FileComponentSearchPayload, + FileComponentSearchResult, + SaveStoryRequest, + SaveStoryResponse, +} from '@storybook/core-events'; +import { + ARGTYPES_INFO_REQUEST, + ARGTYPES_INFO_RESPONSE, + CREATE_NEW_STORYFILE_REQUEST, + CREATE_NEW_STORYFILE_RESPONSE, + FILE_COMPONENT_SEARCH_REQUEST, + FILE_COMPONENT_SEARCH_RESPONSE, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, +} from '@storybook/core-events'; +import { addons, useStorybookApi } from '@storybook/manager-api'; + +import { useDebounce } from '../../hooks/useDebounce'; +import type { NewStoryPayload, SearchResult } from './FileSearchList'; +import type { Channel } from '@storybook/channels'; +import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; +import { FileSearchModal } from './FileSearchModal'; + +interface CreateNewStoryFileModalProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFileModalProps) => { + const [isLoading, setLoading] = useState(false); + const [fileSearchQuery, setFileSearchQuery] = useState(''); + const fileSearchQueryDebounced = useDebounce(fileSearchQuery, 600); + const fileSearchQueryDeferred = useDeferredValue(fileSearchQueryDebounced); + const emittedValue = useRef(null); + const [error, setError] = useState<{ selectedItemId?: number | string; error: string } | null>( + null + ); + const api = useStorybookApi(); + + const [searchResults, setSearchResults] = useState(null); + + const handleErrorWhenCreatingStory = useCallback(() => { + api.addNotification({ + id: 'create-new-story-file-error', + content: { + headline: 'Error while creating story file', + subHeadline: `Take a look at your developer console for more information`, + }, + duration: 8_000, + icon: , + }); + + onOpenChange(false); + }, [api, onOpenChange]); + + const handleSuccessfullyCreatedStory = useCallback( + (componentExportName: string) => { + api.addNotification({ + id: 'create-new-story-file-success', + content: { + headline: 'Story file created', + subHeadline: `${componentExportName} was created`, + }, + duration: 8_000, + icon: , + }); + + onOpenChange(false); + }, + [api, onOpenChange] + ); + + const handleFileSearch = useCallback(() => { + setLoading(true); + const channel = addons.getChannel(); + + const set = (data: FileComponentSearchResult) => { + const isLatestRequest = + data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; + + if (data.success) { + if (isLatestRequest) { + setSearchResults(data.result.files); + } + } else { + setError({ error: data.error }); + } + + if (isLatestRequest) { + channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); + setLoading(false); + emittedValue.current = null; + } + }; + + channel.on(FILE_COMPONENT_SEARCH_RESPONSE, set); + + if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { + emittedValue.current = fileSearchQueryDeferred; + channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + searchQuery: fileSearchQueryDeferred, + } satisfies FileComponentSearchPayload); + } else { + setSearchResults(null); + setLoading(false); + } + + return () => { + channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); + }; + }, [fileSearchQueryDeferred]); + + const handleCreateNewStory = useCallback( + async ({ + componentExportName, + componentFilePath, + componentIsDefaultExport, + selectedItemId, + }: NewStoryPayload) => { + try { + const channel = addons.getChannel(); + + const createNewStoryResult = await oncePromise( + { + channel, + request: { + name: CREATE_NEW_STORYFILE_REQUEST, + payload: { + componentExportName, + componentFilePath, + componentIsDefaultExport, + }, + }, + resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, + } + ); + + if (createNewStoryResult.success) { + setError(null); + + const storyId = createNewStoryResult.result.storyId; + + await trySelectNewStory(api.selectStory, storyId); + + const argTypesInfoResult = await oncePromise({ + channel, + request: { + name: ARGTYPES_INFO_REQUEST, + payload: { storyId }, + }, + resolveEvent: ARGTYPES_INFO_RESPONSE, + }); + + if (argTypesInfoResult.success) { + const argTypes = argTypesInfoResult.result.argTypes; + + const requiredArgs = extractSeededRequiredArgs(argTypes); + + await oncePromise({ + channel, + request: { + name: SAVE_STORY_REQUEST, + payload: { + id: storyId, + payload: { + args: requiredArgs, + importPath: createNewStoryResult.result.storyFilePath, + csfId: storyId, + }, + }, + }, + resolveEvent: SAVE_STORY_RESPONSE, + }); + } + + handleSuccessfullyCreatedStory(componentExportName); + } else { + setError({ selectedItemId: selectedItemId, error: createNewStoryResult.error }); + } + } catch (e) { + handleErrorWhenCreatingStory(); + } + }, + [api, handleSuccessfullyCreatedStory, handleErrorWhenCreatingStory] + ); + + useEffect(() => { + setError(null); + }, [fileSearchQueryDeferred]); + + useEffect(() => { + return handleFileSearch(); + }, [handleFileSearch]); + + return ( + + ); +}; + +interface OncePromiseOptions { + channel: Channel; + request: { + name: string; + payload: Payload; + }; + resolveEvent: string; +} + +function oncePromise({ + channel, + request, + resolveEvent, +}: OncePromiseOptions): Promise { + return new Promise((resolve, reject) => { + channel.once(resolveEvent, (data: Result) => { + resolve(data); + }); + + channel.emit(request.name, request.payload as Payload); + + // If the channel supports error events, you can reject the promise on error + channel.once(resolveEvent, (error: any) => { + reject(error); + }); + }); +} diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 28010a0785da..4e87d462d3ca 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -22,7 +22,7 @@ import { isSearchResult, isExpandType } from './types'; import { scrollIntoView, searchItem } from '../../utils/tree'; import { getGroupStatus, getHighestStatus } from '../../utils/status'; import { useLayout } from '../layout/LayoutProvider'; -import { FileSearchModalContainer } from './FileSearchModal'; +import { CreateNewStoryFileModal } from './CreateNewStoryFileModal'; const { document } = global; @@ -427,7 +427,7 @@ export const Search = React.memo<{ - From 53ec3dd0e51bc3f89011927d71ffcd01202cc7c8 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Fri, 19 Apr 2024 13:13:34 +0200 Subject: [PATCH 127/180] dedupe --- code/yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/yarn.lock b/code/yarn.lock index bb20a3544238..55d06346003c 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -1996,7 +1996,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.24.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:7.24.0": version: 7.24.0 resolution: "@babel/runtime@npm:7.24.0" dependencies: @@ -2014,7 +2014,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.22.15": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.24.4 resolution: "@babel/runtime@npm:7.24.4" dependencies: From 551704b181b19bf953dcdcdd487c487d1f7eab7c Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 19 Apr 2024 14:03:26 +0200 Subject: [PATCH 128/180] Fix error handling for saveStory --- code/addons/controls/src/SaveStory.tsx | 12 +- code/addons/controls/src/manager.tsx | 123 ++++++++++-------- .../src/utils/save-story/save-story.ts | 8 +- 3 files changed, 78 insertions(+), 65 deletions(-) diff --git a/code/addons/controls/src/SaveStory.tsx b/code/addons/controls/src/SaveStory.tsx index acf9143eb46c..614e8364ff74 100644 --- a/code/addons/controls/src/SaveStory.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -99,15 +99,9 @@ export const SaveStory = ({ saveStory, createStory, resetArgs }: SaveStoryProps) const onSaveStory = async () => { if (saving) return; - try { - setErrorMessage(null); - setSaving(true); - await saveStory(); - setSaving(false); - } catch (e: any) { - setErrorMessage(e.message); - setSaving(false); - } + setSaving(true); + await saveStory().catch(() => {}); + setSaving(false); }; const onShowForm = () => { diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 135997f7a4c4..7c7ba68f1133 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -46,29 +46,57 @@ addons.register(ADDON_ID, (api) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); - return experimental_requestResponse( - channel, - SAVE_STORY_REQUEST, - SAVE_STORY_RESPONSE, - { - // Only send updated args - args: stringifyArgs( - Object.entries(data.args || {}).reduce((acc, [key, value]) => { - if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; - return acc; - }, {}) - ), - csfId: data.id, - importPath: data.importPath, - } satisfies SaveStoryRequestPayload - ); + try { + const response = await experimental_requestResponse( + channel, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, + { + // Only send updated args + args: stringifyArgs( + Object.entries(data.args || {}).reduce((acc, [key, value]) => { + if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; + return acc; + }, {}) + ), + csfId: data.id, + importPath: data.importPath, + } satisfies SaveStoryRequestPayload + ); + + api.addNotification({ + id: 'save-story-success', + icon: { name: 'passed', color: color.positive }, + content: { + headline: 'Story saved', + subHeadline: ( + <> + Updated story {response.sourceStoryName}. + + ), + }, + duration: 8_000, + }); + } catch (error: any) { + api.addNotification({ + id: 'save-story-error', + icon: { name: 'failed', color: color.negative }, + content: { + headline: 'Failed to save story', + subHeadline: + error?.message || 'Check the Storybook process on the command line for more details.', + }, + duration: 8_000, + }); + throw error; + } }; const createStory = async (name: string) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); - return experimental_requestResponse( + const response = await experimental_requestResponse( channel, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, @@ -79,6 +107,24 @@ addons.register(ADDON_ID, (api) => { name, } satisfies SaveStoryRequestPayload ); + + api.addNotification({ + id: 'save-story-success', + icon: { name: 'passed', color: color.positive }, + content: { + headline: 'Story created', + subHeadline: ( + <> + Added story {response.newStoryName} based on {response.sourceStoryName}. + + ), + }, + duration: 8_000, + onClick: ({ onDismiss }) => { + onDismiss(); + api.selectStory(response.newStoryId); + }, + }); }; addons.add(ADDON_ID, { @@ -97,41 +143,14 @@ addons.register(ADDON_ID, (api) => { }, }); - channel.on( - SAVE_STORY_RESPONSE, - ({ success, payload }: ResponseData) => { - if (!success) return; + channel.on(SAVE_STORY_RESPONSE, (data: ResponseData) => { + if (!data.success) return; + const story = api.getCurrentStoryData(); + if (story.type !== 'story') return; - const { newStoryId, newStoryName, sourceStoryName } = payload; - - const data = api.getCurrentStoryData(); - if (data.type === 'story') api.resetStoryArgs(data); - if (newStoryId) api.selectStory(newStoryId); - - api.addNotification({ - id: 'save-story-success', - content: { - headline: newStoryName ? 'Story created' : 'Story saved', - subHeadline: newStoryName ? ( - <> - Added story {newStoryName} based on {sourceStoryName}. - - ) : ( - <> - Updated story {sourceStoryName}. - - ), - }, - duration: 8_000, - onClick: ({ onDismiss }) => { - onDismiss(); - if (newStoryId) api.selectStory(newStoryId); - }, - icon: { - name: 'passed', - color: color.positive, - }, - }); + api.resetStoryArgs(story); + if (data.payload.newStoryId) { + api.selectStory(data.payload.newStoryId); } - ); + }); }); diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index b7cd292ce218..c87dc5ce131b 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -53,9 +53,9 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf let newStoryId: string | undefined; let newStoryName: string | undefined; - let sourceFileName: string; - let sourceFilePath: string; - let sourceStoryName: string; + let sourceFileName: string | undefined; + let sourceFilePath: string | undefined; + let sourceStoryName: string | undefined; try { sourceFileName = basename(importPath); @@ -124,7 +124,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf channel.emit(SAVE_STORY_RESPONSE, { id, success: false, - error: error.message, + error: error instanceof SaveStoryError ? error.message : undefined, payload: { csfId, newStoryId, From 20d0e7ec9818f1828516fde8048243614f9789dc Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 19 Apr 2024 14:04:17 +0200 Subject: [PATCH 129/180] Fix babel traverse issue --- .../core-server/src/utils/save-story/update-args-in-csf-file.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts index b3737893625b..d51ba1ad73d9 100644 --- a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts @@ -83,6 +83,8 @@ export const updateArgsInCsfFile = async (node: t.Node, input: Record Date: Fri, 19 Apr 2024 14:13:06 +0200 Subject: [PATCH 130/180] Wait a while --- code/addons/controls/src/SaveStory.stories.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/addons/controls/src/SaveStory.stories.tsx b/code/addons/controls/src/SaveStory.stories.tsx index 948ebf87fb0e..fd62c211cad1 100644 --- a/code/addons/controls/src/SaveStory.stories.tsx +++ b/code/addons/controls/src/SaveStory.stories.tsx @@ -39,8 +39,9 @@ export const Created: Story = { const submitButton = await within(dialog).findByRole('button', { name: /Create/i }); await userEvent.click(submitButton); }); - - await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); + await waitFor(async () => { + await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); + }); }, }; From 1c194d89eccd1935104f18a39dee36c39a922144 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 14:56:12 +0200 Subject: [PATCH 131/180] Cleanup --- code/addons/measure/vitest.config.stories.tsx | 13 ------- code/ui/.storybook/main.ts | 5 +-- .../components/sidebar/FileSearchModal.tsx | 39 ++----------------- .../sidebar => hooks}/useMeasure.tsx | 0 4 files changed, 5 insertions(+), 52 deletions(-) delete mode 100644 code/addons/measure/vitest.config.stories.tsx rename code/ui/manager/src/{components/sidebar => hooks}/useMeasure.tsx (100%) diff --git a/code/addons/measure/vitest.config.stories.tsx b/code/addons/measure/vitest.config.stories.tsx deleted file mode 100644 index bdf3c2979774..000000000000 --- a/code/addons/measure/vitest.config.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import VitestConfig from './vitest.config'; - -const meta = { - component: VitestConfig, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; \ No newline at end of file diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index 094a3a1a4a83..7c67fa3d58d8 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -57,7 +57,7 @@ const config: StorybookConfig = { '@storybook/addon-storysource', '@storybook/addon-designs', '@storybook/addon-a11y', - // '@chromatic-com/storybook', + '@chromatic-com/storybook', ], build: { test: { @@ -67,9 +67,6 @@ const config: StorybookConfig = { disableDocgen: false, }, }, - typescript: { - reactDocgen: 'react-docgen-typescript', - }, framework: { name: '@storybook/react-vite', options: {}, diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index 0c948128d7fb..4fb0717c4c6b 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -1,42 +1,11 @@ -import React, { - useCallback, - useDeferredValue, - useEffect, - useRef, - useState, - useTransition, -} from 'react'; +import React, { useEffect, useState, useTransition } from 'react'; import { Modal, Form } from '@storybook/components'; import { styled } from '@storybook/theming'; -import { AlertIcon, CheckIcon, CloseAltIcon, SearchIcon, SyncIcon } from '@storybook/icons'; -import type { - ArgTypesInfoPayload, - ArgTypesInfoResult, - CreateNewStoryPayload, - CreateNewStoryResult, - FileComponentSearchPayload, - FileComponentSearchResult, - SaveStoryRequest, - SaveStoryResponse, -} from '@storybook/core-events'; -import { - ARGTYPES_INFO_REQUEST, - ARGTYPES_INFO_RESPONSE, - CREATE_NEW_STORYFILE_REQUEST, - CREATE_NEW_STORYFILE_RESPONSE, - FILE_COMPONENT_SEARCH_REQUEST, - FILE_COMPONENT_SEARCH_RESPONSE, - SAVE_STORY_REQUEST, - SAVE_STORY_RESPONSE, -} from '@storybook/core-events'; -import { addons, useStorybookApi } from '@storybook/manager-api'; - -import { useDebounce } from '../../hooks/useDebounce'; +import { CloseAltIcon, SearchIcon, SyncIcon } from '@storybook/icons'; + import type { NewStoryPayload, SearchResult } from './FileSearchList'; import { FileSearchList } from './FileSearchList'; -import type { Channel } from '@storybook/channels'; -import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; -import { useMeasure } from './useMeasure'; +import { useMeasure } from '../../hooks/useMeasure'; const MODAL_HEIGHT = 418; diff --git a/code/ui/manager/src/components/sidebar/useMeasure.tsx b/code/ui/manager/src/hooks/useMeasure.tsx similarity index 100% rename from code/ui/manager/src/components/sidebar/useMeasure.tsx rename to code/ui/manager/src/hooks/useMeasure.tsx From d16983eaa7fae79de7cdc7a1604ac5a40a7f5ba6 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 19 Apr 2024 15:02:01 +0200 Subject: [PATCH 132/180] Fix stories --- .../addons/controls/src/SaveStory.stories.tsx | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/code/addons/controls/src/SaveStory.stories.tsx b/code/addons/controls/src/SaveStory.stories.tsx index fd62c211cad1..9dbe620da7fb 100644 --- a/code/addons/controls/src/SaveStory.stories.tsx +++ b/code/addons/controls/src/SaveStory.stories.tsx @@ -1,8 +1,9 @@ +import React from 'react'; import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; import { SaveStory } from './SaveStory'; -import { expect, fireEvent, fn, userEvent, waitFor, within } from '@storybook/test'; +import { expect, fireEvent, fn, userEvent, within } from '@storybook/test'; const meta = { component: SaveStory, @@ -14,6 +15,13 @@ const meta = { parameters: { layout: 'fullscreen', }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], } satisfies Meta; export default meta; @@ -25,6 +33,7 @@ export const Creating = { play: async ({ canvasElement }) => { const createButton = await within(canvasElement).findByRole('button', { name: /Create/i }); await fireEvent.click(createButton); + await new Promise((resolve) => setTimeout(resolve, 300)); }, } satisfies Story; @@ -32,16 +41,12 @@ export const Created: Story = { play: async (context) => { await Creating.play(context); - await waitFor(async () => { - const dialog = await within(document.body).findByRole('dialog'); - const input = await within(dialog).findByRole('textbox'); - await userEvent.type(input, 'MyNewStory'); - const submitButton = await within(dialog).findByRole('button', { name: /Create/i }); - await userEvent.click(submitButton); - }); - await waitFor(async () => { - await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); - }); + const dialog = await within(document.body).findByRole('dialog'); + const input = await within(dialog).findByRole('textbox'); + await userEvent.type(input, 'MyNewStory'); + + fireEvent.submit(dialog.getElementsByTagName('form')[0]); + await expect(context.args.createStory).toHaveBeenCalledWith('MyNewStory'); }, }; From 9077f9e972f16e3cd86513bac684019ee4771f57 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 15:34:39 +0200 Subject: [PATCH 133/180] Move icons to FileSearchList --- .../manager/src/components/sidebar/FileList.tsx | 13 +------------ .../src/components/sidebar/FileSearchList.tsx | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index 0e242d528076..a0b516aaf487 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -1,3 +1,4 @@ +import type { StyledComponent } from '@storybook/theming'; import { styled } from '@storybook/theming'; import { rgba } from 'polished'; import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; @@ -193,18 +194,6 @@ export const FileListItemExportNameContent = styled('span')(({ theme }) => ({ display: 'inline-block', })); -export const ChevronRightIconStyled = styled(ChevronRightIcon)(({ theme }) => ({ - display: 'none', - alignSelf: 'center', - color: theme.color.mediumdark, -})); - -export const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ - display: 'none', - alignSelf: 'center', - color: theme.color.mediumdark, -})); - export const DefaultExport = styled('span')(({ theme }) => ({ display: 'inline-block', padding: `1px ${theme.appBorderRadius}px`, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 0319e73b9ba1..261dbb04850d 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -1,9 +1,8 @@ import React, { memo, useCallback, useLayoutEffect, useMemo, useState } from 'react'; -import { ComponentIcon } from '@storybook/icons'; +import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; +import { styled } from '@storybook/theming'; import { FileSearchListLoadingSkeleton } from './FileSearchListSkeleton'; import { - ChevronDownIconStyled, - ChevronRightIconStyled, DefaultExport, FileList, FileListExport, @@ -33,6 +32,18 @@ export interface NewStoryPayload extends CreateNewStoryPayload { selectedItemId: string | number; } +const ChevronRightIconStyled = styled(ChevronRightIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + +const ChevronDownIconStyled = styled(ChevronDownIcon)(({ theme }) => ({ + display: 'none', + alignSelf: 'center', + color: theme.color.mediumdark, +})); + interface FileSearchListProps { isLoading: boolean; searchResults: Array | null; From f29966ece1f4313040b9e3a11e76ab1ef78c1c7d Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 16:12:44 +0200 Subject: [PATCH 134/180] Fix test --- .../core-server/src/server-channel/file-search-channel.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index d1138d7bb3c9..4b2954ac0514 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -97,6 +97,7 @@ describe('file-search-channel', () => { }, ], filepath: 'src/es-module.js', + storyFileExists: false, }, ], searchQuery: 'es-module', From 1378113c19a188603e0ed2adfdc189a69ac8ae2d Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 16:44:11 +0200 Subject: [PATCH 135/180] Retrigger search after succefull story creation --- .../src/components/sidebar/CreateNewStoryFileModal.tsx | 8 +++++++- .../src/components/sidebar/FileSearchModal.utils.tsx | 7 +++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index b4dfb3e79ecd..d0902cd43556 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -181,6 +181,7 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi } handleSuccessfullyCreatedStory(componentExportName); + handleFileSearch(); } else { setError({ selectedItemId: selectedItemId, error: createNewStoryResult.error }); } @@ -188,7 +189,12 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi handleErrorWhenCreatingStory(); } }, - [api, handleSuccessfullyCreatedStory, handleErrorWhenCreatingStory] + [ + api.selectStory, + handleSuccessfullyCreatedStory, + handleFileSearch, + handleErrorWhenCreatingStory, + ] ); useEffect(() => { diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index d53adde3059c..dd1a4c9aec1e 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -17,8 +17,11 @@ export function extractSeededRequiredArgs(argTypes: ArgTypes) { break; case 'union': case 'enum': - case 'intersection': - if ('value' in argType.type) { + const valueName = (argType.type.value?.[0] as any).name; + if ( + 'value' in argType.type && + (valueName === 'string' || valueName === 'number' || valueName === 'boolean') + ) { acc[key] = argType.type.value[0]; } break; From 2e5a457b2fbae98e8d6f263ac43850ac01e169e3 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Fri, 19 Apr 2024 17:07:11 +0200 Subject: [PATCH 136/180] Fix modal snapshot --- .../src/components/Modal/Modal.stories.tsx | 69 ++++++++++++------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.stories.tsx b/code/ui/components/src/components/Modal/Modal.stories.tsx index 20af542e2c31..658683e6368b 100644 --- a/code/ui/components/src/components/Modal/Modal.stories.tsx +++ b/code/ui/components/src/components/Modal/Modal.stories.tsx @@ -128,30 +128,47 @@ export const FixedWidthAndHeight: Story = { }, }; -export const StyledComponents = { - render: () => ( - - - - Hello - Lorem ipsum dolor sit amet. - - - - One - Two - - Right - - Another section - - - - - - - - Oops. Something went wrong. - - ), +export const StyledComponents: Story = { + args: { + ...Default.args, + width: 500, + }, + render: (props) => { + const [isOpen, setOpen] = useState(false); + + return ( + <> + + + + Hello + Lorem ipsum dolor sit amet. + + + + One + Two + + Right + + Another section + + + + + + + + Oops. Something went wrong. + + + + ); + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement.parentElement!); + const button = canvas.getAllByText('Open modal')[0]; + await userEvent.click(button); + await expect(canvas.findByText('Hello')).resolves.toBeInTheDocument(); + }, }; From a007256a7ec4be351d99fdf6392d91acbb87d87b Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 19 Apr 2024 22:09:27 +0200 Subject: [PATCH 137/180] WIP --- .../lib/core-events/src/data/argtypes-info.ts | 4 +- .../core-events/src/data/create-new-story.ts | 14 +- .../src/data/file-component-search.ts | 37 ++---- .../core-events/src/data/request-response.ts | 4 +- code/lib/core-events/src/data/save-story.ts | 32 ++--- .../create-new-story-channel.test.ts | 27 ++-- .../create-new-story-channel.ts | 68 +++++----- .../file-search-channel.test.ts | 27 ++-- .../src/server-channel/file-search-channel.ts | 120 ++++++++++-------- .../src/utils/get-new-story-file.ts | 8 +- .../src/utils/save-story/save-story.ts | 11 +- .../src/modules/preview-web/Preview.tsx | 1 + code/ui/manager/package.json | 1 + .../sidebar/CreateNewStoryFileModal.tsx | 72 ++++++----- .../src/components/sidebar/FileSearchList.tsx | 13 +- code/yarn.lock | 1 + 16 files changed, 235 insertions(+), 205 deletions(-) diff --git a/code/lib/core-events/src/data/argtypes-info.ts b/code/lib/core-events/src/data/argtypes-info.ts index c993c684768c..7013b986885d 100644 --- a/code/lib/core-events/src/data/argtypes-info.ts +++ b/code/lib/core-events/src/data/argtypes-info.ts @@ -1,8 +1,6 @@ import type { ArgTypes } from '@storybook/csf'; -export interface ArgTypesRequestPayload { - storyId: string; -} +export interface ArgTypesRequestPayload {} export interface ArgTypesResponsePayload { argTypes: ArgTypes; diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts index 7c85817e0cfe..bc973019b7af 100644 --- a/code/lib/core-events/src/data/create-new-story.ts +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -1,4 +1,4 @@ -export interface CreateNewStoryPayload { +export interface CreateNewStoryRequestPayload { // The filepath of the component for which the Story should be generated for (relative to the project root) componentFilePath: string; // The name of the exported component @@ -7,12 +7,8 @@ export interface CreateNewStoryPayload { componentIsDefaultExport: boolean; } -export interface CreateNewStoryResult { - success: true | false; - result: null | { - storyId: string; - storyFilePath: string; - exportedStoryName: string; - }; - error: null | string; +export interface CreateNewStoryResponsePayload { + storyId: string; + storyFilePath: string; + exportedStoryName: string; } diff --git a/code/lib/core-events/src/data/file-component-search.ts b/code/lib/core-events/src/data/file-component-search.ts index 7737155a155f..000ae3e3d4c9 100644 --- a/code/lib/core-events/src/data/file-component-search.ts +++ b/code/lib/core-events/src/data/file-component-search.ts @@ -1,26 +1,17 @@ -export interface FileComponentSearchPayload { - // A regular string or a glob pattern - searchQuery?: string; -} +export interface FileComponentSearchRequestPayload {} -export interface FileComponentSearchResult { - success: true | false; - result: null | { - // The search query - Helps to identify the event on the frontend - searchQuery: string; - files: Array<{ - // The filepath relative to the project root - filepath: string; - // Whether a corresponding story file exists - storyFileExists: boolean; - // A list of exported components - exportedComponents: Array<{ - // the name of the exported component - name: string; - // True, if the exported component is a default export - default: boolean; - }> | null; +export interface FileComponentSearchResponsePayload { + files: Array<{ + // The filepath relative to the project root + filepath: string; + // Whether a corresponding story file exists + storyFileExists: boolean; + // A list of exported components + exportedComponents: Array<{ + // the name of the exported component + name: string; + // True, if the exported component is a default export + default: boolean; }> | null; - }; - error: null | string; + }> | null; } diff --git a/code/lib/core-events/src/data/request-response.ts b/code/lib/core-events/src/data/request-response.ts index 7c4c0295b388..998ebcdc0f3d 100644 --- a/code/lib/core-events/src/data/request-response.ts +++ b/code/lib/core-events/src/data/request-response.ts @@ -4,5 +4,5 @@ export type RequestData = { }; export type ResponseData = - | { id: string; success: true; payload: Payload } - | { id: string; success: false; error?: string; payload?: Payload }; + | { id: string; success: true; error: null; payload: Payload } + | { id: string; success: false; error: string; payload: null }; diff --git a/code/lib/core-events/src/data/save-story.ts b/code/lib/core-events/src/data/save-story.ts index 47f7e1ab5d05..8dd4c009f044 100644 --- a/code/lib/core-events/src/data/save-story.ts +++ b/code/lib/core-events/src/data/save-story.ts @@ -1,22 +1,14 @@ -export interface SaveStoryRequest { - id: string; - payload: { - csfId: string; - importPath: string; - args: Record; - name?: string; - }; +export interface SaveStoryRequestPayload { + args: string | undefined; + csfId: string; + importPath: string; + name?: string; } -export type SaveStoryResponse = ( - | { id: string; success: true } - | { id: string; success: false; error: string } -) & { - payload: { - csfId: string; - newStoryId?: string; - newStoryName?: string; - sourceFileName?: string; - sourceStoryName?: string; - }; -}; +export interface SaveStoryResponsePayload { + csfId: string; + newStoryId?: string; + newStoryName?: string; + sourceFileName?: string; + sourceStoryName?: string; +} diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index e9eecaef8796..2414743be406 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -3,6 +3,7 @@ import { initCreateNewStoryChannel } from './create-new-story-channel'; import path from 'path'; import type { ChannelTransport } from '@storybook/channels'; import { Channel } from '@storybook/channels'; +import type { CreateNewStoryRequestPayload, RequestData } from '@storybook/core-events'; import { CREATE_NEW_STORYFILE_REQUEST, CREATE_NEW_STORYFILE_RESPONSE, @@ -63,9 +64,12 @@ describe('createNewStoryChannel', () => { } as any); mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { - componentFilePath: 'src/components/Page.jsx', - componentExportName: 'Page', - componentIsDefaultExport: true, + id: 'components-page--default', + payload: { + componentFilePath: 'src/components/Page.jsx', + componentExportName: 'Page', + componentIsDefaultExport: true, + }, }); await vi.waitFor(() => { @@ -74,7 +78,8 @@ describe('createNewStoryChannel', () => { expect(createNewStoryFileEventListener).toHaveBeenCalledWith({ error: null, - result: { + id: 'components-page--default', + payload: { storyId: 'components-page--default', storyFilePath: './src/components/Page.stories.jsx', exportedStoryName: 'Default', @@ -106,10 +111,13 @@ describe('createNewStoryChannel', () => { } as any); mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { - componentFilePath: 'src/components/Page.jsx', - componentExportName: 'Page', - componentIsDefaultExport: true, - }); + id: 'components-page--default', + payload: { + componentFilePath: 'src/components/Page.jsx', + componentExportName: 'Page', + componentIsDefaultExport: true, + }, + } satisfies RequestData); await vi.waitFor(() => { expect(createNewStoryFileEventListener).toHaveBeenCalled(); @@ -117,7 +125,8 @@ describe('createNewStoryChannel', () => { expect(createNewStoryFileEventListener).toHaveBeenCalledWith({ error: 'Failed to write file', - result: null, + payload: null, + id: 'components-page--default', success: false, }); }); diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 2e5282fd311f..669598ad14a1 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -1,6 +1,11 @@ import type { Options } from '@storybook/types'; import type { Channel } from '@storybook/channels'; -import type { CreateNewStoryPayload, CreateNewStoryResult } from '@storybook/core-events'; +import type { + CreateNewStoryRequestPayload, + CreateNewStoryResponsePayload, + RequestData, + ResponseData, +} from '@storybook/core-events'; import { CREATE_NEW_STORYFILE_REQUEST, CREATE_NEW_STORYFILE_RESPONSE, @@ -15,40 +20,45 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** * Listens for events to create a new storyfile */ - channel.on(CREATE_NEW_STORYFILE_REQUEST, async (data: CreateNewStoryPayload) => { - try { - const { storyFilePath, exportedStoryName, storyFileContent } = await getNewStoryFile( - data, - options - ); + channel.on( + CREATE_NEW_STORYFILE_REQUEST, + async (data: RequestData) => { + try { + const { storyFilePath, exportedStoryName, storyFileContent } = await getNewStoryFile( + data.payload, + options + ); - const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); + const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); - if (existsSync(storyFilePath)) { - throw new Error(`Story file already exists at .${path.sep}${relativeStoryFilePath}`); - } + if (existsSync(storyFilePath)) { + throw new Error(`Story file already exists at .${path.sep}${relativeStoryFilePath}`); + } - await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); + await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); - const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); + const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); - channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { - success: true, - result: { - storyId, - storyFilePath: `./${relativeStoryFilePath}`, - exportedStoryName, - }, - error: null, - } satisfies CreateNewStoryResult); - } catch (e: any) { - channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { - success: false, - result: null, - error: e?.message, - } satisfies CreateNewStoryResult); + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { + success: true, + id: storyId, + payload: { + storyId, + storyFilePath: `./${relativeStoryFilePath}`, + exportedStoryName, + }, + error: null, + } satisfies ResponseData); + } catch (e: any) { + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { + success: false, + id: data.id, + payload: null, + error: e?.message, + } satisfies ResponseData); + } } - }); + ); return channel; } diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index 4b2954ac0514..0b4295ee145f 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -1,5 +1,6 @@ import type { ChannelTransport } from '@storybook/channels'; import { Channel } from '@storybook/channels'; +import type { RequestData, FileComponentSearchRequestPayload } from '@storybook/core-events'; import { FILE_COMPONENT_SEARCH_RESPONSE, FILE_COMPONENT_SEARCH_REQUEST, @@ -51,7 +52,10 @@ describe('file-search-channel', () => { initFileSearchChannel(mockChannel, mockOptions as any); mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + id: data.searchQuery, + payload: {}, + } satisfies RequestData); mocks.searchFiles.mockImplementation(async (...args) => { // @ts-expect-error Ignore type issue @@ -66,8 +70,9 @@ describe('file-search-channel', () => { ); expect(searchResultChannelListener).toHaveBeenCalledWith({ + id: data.searchQuery, error: null, - result: { + payload: { files: [ { exportedComponents: [ @@ -100,7 +105,6 @@ describe('file-search-channel', () => { storyFileExists: false, }, ], - searchQuery: 'es-module', }, success: true, }); @@ -113,7 +117,10 @@ describe('file-search-channel', () => { initFileSearchChannel(mockChannel, mockOptions as any); mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + id: data.searchQuery, + payload: {}, + } satisfies RequestData); mocks.searchFiles.mockImplementation(async (...args) => { // @ts-expect-error Ignore type issue @@ -128,10 +135,10 @@ describe('file-search-channel', () => { ); expect(searchResultChannelListener).toHaveBeenCalledWith({ + id: data.searchQuery, error: null, - result: { + payload: { files: [], - searchQuery: 'no-file-for-search-query', }, success: true, }); @@ -145,7 +152,10 @@ describe('file-search-channel', () => { mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); - mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, data); + mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, { + id: data.searchQuery, + payload: {}, + } satisfies RequestData); mocks.searchFiles.mockRejectedValue(new Error('ENOENT: no such file or directory')); @@ -154,9 +164,10 @@ describe('file-search-channel', () => { }); expect(searchResultChannelListener).toHaveBeenCalledWith({ + id: data.searchQuery, + payload: null, error: 'An error occurred while searching for components in the project.\nENOENT: no such file or directory', - result: null, success: false, }); }); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index 0522dd59a55b..007091d222d0 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -11,7 +11,12 @@ import { existsSync } from 'fs'; import { getParser } from '../utils/parser'; import { searchFiles } from '../utils/search-files'; -import type { FileComponentSearchPayload, FileComponentSearchResult } from '@storybook/core-events'; +import type { + FileComponentSearchRequestPayload, + FileComponentSearchResponsePayload, + RequestData, + ResponseData, +} from '@storybook/core-events'; import { FILE_COMPONENT_SEARCH_REQUEST, FILE_COMPONENT_SEARCH_RESPONSE, @@ -22,71 +27,74 @@ export function initFileSearchChannel(channel: Channel, options: Options) { /** * Listens for a search query event and searches for files in the project */ - channel.on(FILE_COMPONENT_SEARCH_REQUEST, async (data: FileComponentSearchPayload) => { - try { - const searchQuery = data?.searchQuery; - - if (!searchQuery) { - return; - } + channel.on( + FILE_COMPONENT_SEARCH_REQUEST, + async (data: RequestData) => { + const searchQuery = data.id; + try { + if (!searchQuery) { + return; + } - const frameworkName = await getFrameworkName(options); + const frameworkName = await getFrameworkName(options); - const rendererName = (await extractProperRendererNameFromFramework( - frameworkName - )) as SupportedRenderers; + const rendererName = (await extractProperRendererNameFromFramework( + frameworkName + )) as SupportedRenderers; - const projectRoot = getProjectRoot(); + const projectRoot = getProjectRoot(); - const files = await searchFiles({ - searchQuery, - cwd: projectRoot, - }); + const files = await searchFiles({ + searchQuery, + cwd: projectRoot, + }); - const entries = files.map(async (file) => { - const parser = getParser(rendererName); + const entries = files.map(async (file) => { + const parser = getParser(rendererName); - try { - const content = await fs.readFile(path.join(projectRoot, file), 'utf-8'); - const { storyFileName } = getStoryMetadata(path.join(projectRoot, file)); - const dirname = path.dirname(file); + try { + const content = await fs.readFile(path.join(projectRoot, file), 'utf-8'); + const { storyFileName } = getStoryMetadata(path.join(projectRoot, file)); + const dirname = path.dirname(file); - const storyFileExists = existsSync(path.join(projectRoot, dirname, storyFileName)); - const info = await parser.parse(content); + const storyFileExists = existsSync(path.join(projectRoot, dirname, storyFileName)); + const info = await parser.parse(content); - return { - filepath: file, - exportedComponents: info.exports, - storyFileExists, - }; - } catch (e) { - return { - filepath: file, - storyFileExists: false, - exportedComponents: null, - }; - } - }); + return { + filepath: file, + exportedComponents: info.exports, + storyFileExists, + }; + } catch (e) { + return { + filepath: file, + storyFileExists: false, + exportedComponents: null, + }; + } + }); - channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { - success: true, - result: { - searchQuery, - files: await Promise.all(entries), - }, - error: null, - } satisfies FileComponentSearchResult); - } catch (e: any) { - /** - * Emits the search result event with an error message - */ - channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { - success: false, - result: null, - error: `An error occurred while searching for components in the project.\n${e?.message}`, - } satisfies FileComponentSearchResult); + channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { + success: true, + id: searchQuery, + payload: { + files: await Promise.all(entries), + }, + error: null, + } satisfies ResponseData); + } catch (e: any) { + /** + * Emits the search result event with an error message + */ + channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { + success: false, + id: searchQuery ?? '', + payload: null, + error: `An error occurred while searching for components in the project.\n${e?.message}`, + } satisfies ResponseData); + } } - }); + ); return channel; } diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index d402f8de5924..2839368975f5 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -9,10 +9,14 @@ import path from 'node:path'; import fs from 'node:fs'; import { getTypeScriptTemplateForNewStoryFile } from './new-story-templates/typescript'; import { getJavaScriptTemplateForNewStoryFile } from './new-story-templates/javascript'; -import type { CreateNewStoryPayload } from '@storybook/core-events'; +import type { CreateNewStoryRequestPayload } from '@storybook/core-events'; export async function getNewStoryFile( - { componentFilePath, componentExportName, componentIsDefaultExport }: CreateNewStoryPayload, + { + componentFilePath, + componentExportName, + componentIsDefaultExport, + }: CreateNewStoryRequestPayload, options: Options ) { const cwd = getProjectRoot(); diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index c87dc5ce131b..506be3147439 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -112,6 +112,7 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf sourceFileName, sourceStoryName, }, + error: null, } satisfies ResponseData); if (!coreConfig.disableTelemetry) { @@ -124,14 +125,8 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf channel.emit(SAVE_STORY_RESPONSE, { id, success: false, - error: error instanceof SaveStoryError ? error.message : undefined, - payload: { - csfId, - newStoryId, - newStoryName, - sourceFileName, - sourceStoryName, - }, + error: error instanceof SaveStoryError ? error.message : 'Unknown error', + payload: null, } satisfies ResponseData); logger.error( diff --git a/code/lib/preview-api/src/modules/preview-web/Preview.tsx b/code/lib/preview-api/src/modules/preview-web/Preview.tsx index 40596f6e1f21..ee4524c32ecf 100644 --- a/code/lib/preview-api/src/modules/preview-web/Preview.tsx +++ b/code/lib/preview-api/src/modules/preview-web/Preview.tsx @@ -312,6 +312,7 @@ export class Preview { id, success: true, payload: { argTypes: story?.argTypes || {} }, + error: null, } satisfies ResponseData); } catch (e: any) { this.channel.emit(ARGTYPES_INFO_RESPONSE, { diff --git a/code/ui/manager/package.json b/code/ui/manager/package.json index 4389243ad4b9..0c8e86d7bdaa 100644 --- a/code/ui/manager/package.json +++ b/code/ui/manager/package.json @@ -108,6 +108,7 @@ "resolve-from": "^5.0.0", "semver": "^7.3.7", "store2": "^2.14.2", + "telejson": "^7.2.0", "ts-dedent": "^2.0.0", "typescript": "^5.3.2" }, diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index d0902cd43556..6c0c6c3c0f68 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -1,14 +1,17 @@ import React, { useCallback, useDeferredValue, useEffect, useRef, useState } from 'react'; import { AlertIcon, CheckIcon } from '@storybook/icons'; +import { stringify } from 'telejson'; import type { - ArgTypesInfoPayload, - ArgTypesInfoResult, - CreateNewStoryPayload, - CreateNewStoryResult, - FileComponentSearchPayload, - FileComponentSearchResult, - SaveStoryRequest, - SaveStoryResponse, + ArgTypesRequestPayload, + ArgTypesResponsePayload, + CreateNewStoryRequestPayload, + CreateNewStoryResponsePayload, + FileComponentSearchRequestPayload, + FileComponentSearchResponsePayload, + RequestData, + ResponseData, + SaveStoryRequestPayload, + SaveStoryResponsePayload, } from '@storybook/core-events'; import { ARGTYPES_INFO_REQUEST, @@ -81,13 +84,12 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi setLoading(true); const channel = addons.getChannel(); - const set = (data: FileComponentSearchResult) => { - const isLatestRequest = - data.result?.searchQuery === fileSearchQueryDeferred && data.result.files; + const set = (data: ResponseData) => { + const isLatestRequest = data.id === fileSearchQueryDeferred && data.payload.files; if (data.success) { if (isLatestRequest) { - setSearchResults(data.result.files); + setSearchResults(data.payload.files); } } else { setError({ error: data.error }); @@ -105,8 +107,9 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi if (fileSearchQueryDeferred !== '' && emittedValue.current !== fileSearchQueryDeferred) { emittedValue.current = fileSearchQueryDeferred; channel.emit(FILE_COMPONENT_SEARCH_REQUEST, { - searchQuery: fileSearchQueryDeferred, - } satisfies FileComponentSearchPayload); + id: fileSearchQueryDeferred, + payload: {}, + } satisfies RequestData); } else { setSearchResults(null); setLoading(false); @@ -127,51 +130,58 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi try { const channel = addons.getChannel(); - const createNewStoryResult = await oncePromise( - { - channel, - request: { - name: CREATE_NEW_STORYFILE_REQUEST, + const createNewStoryResult = await oncePromise< + CreateNewStoryRequestPayload, + CreateNewStoryResponsePayload + >({ + channel, + request: { + name: CREATE_NEW_STORYFILE_REQUEST, + payload: { + id: `${selectedItemId}`, payload: { componentExportName, componentFilePath, componentIsDefaultExport, }, }, - resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, - } - ); + }, + resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, + }); if (createNewStoryResult.success) { setError(null); - const storyId = createNewStoryResult.result.storyId; + const storyId = createNewStoryResult.payload.storyId; await trySelectNewStory(api.selectStory, storyId); - const argTypesInfoResult = await oncePromise({ + const argTypesInfoResult = await oncePromise< + ArgTypesRequestPayload, + ArgTypesResponsePayload + >({ channel, request: { name: ARGTYPES_INFO_REQUEST, - payload: { storyId }, + payload: { id: storyId, payload: {} }, }, resolveEvent: ARGTYPES_INFO_RESPONSE, }); if (argTypesInfoResult.success) { - const argTypes = argTypesInfoResult.result.argTypes; + const argTypes = argTypesInfoResult.payload.argTypes; const requiredArgs = extractSeededRequiredArgs(argTypes); - await oncePromise({ + await oncePromise({ channel, request: { name: SAVE_STORY_REQUEST, payload: { id: storyId, payload: { - args: requiredArgs, - importPath: createNewStoryResult.result.storyFilePath, + args: stringify(requiredArgs), + importPath: createNewStoryResult.payload.storyFilePath, csfId: storyId, }, }, @@ -234,9 +244,9 @@ function oncePromise({ channel, request, resolveEvent, -}: OncePromiseOptions): Promise { +}: OncePromiseOptions>): Promise> { return new Promise((resolve, reject) => { - channel.once(resolveEvent, (data: Result) => { + channel.once(resolveEvent, (data: ResponseData) => { resolve(data); }); diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 261dbb04850d..4025b6bf169c 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -23,12 +23,16 @@ import { } from './FileList'; import type { VirtualItem } from '@tanstack/react-virtual'; import { useVirtualizer } from '@tanstack/react-virtual'; -import type { CreateNewStoryPayload, FileComponentSearchResult } from '@storybook/core-events'; +import type { + CreateNewStoryRequestPayload, + FileComponentSearchResponsePayload, + ResponseData, +} from '@storybook/core-events'; import { WithTooltip, TooltipNote } from '@storybook/components'; -export type SearchResult = FileComponentSearchResult['result']['files'][0]; +export type SearchResult = ResponseData['payload']['files'][0]; -export interface NewStoryPayload extends CreateNewStoryPayload { +export interface NewStoryPayload extends CreateNewStoryRequestPayload { selectedItemId: string | number; } @@ -55,7 +59,6 @@ interface FileItemContentProps { virtualItem: VirtualItem; selected: number | null; searchResult: SearchResult; - as?: 'div'; } interface FileItemSelectionPayload { @@ -156,7 +159,7 @@ export const FileSearchList = memo(function FileSearchList({ ); const ListItem = useCallback( - ({ virtualItem, selected, searchResult, as }: FileItemContentProps) => { + ({ virtualItem, selected, searchResult }: FileItemContentProps) => { const itemError = errorItemId === searchResult.filepath; const itemSelected = selected === virtualItem.index; diff --git a/code/yarn.lock b/code/yarn.lock index f1ab6c38976d..f033288f0024 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -6136,6 +6136,7 @@ __metadata: resolve-from: "npm:^5.0.0" semver: "npm:^7.3.7" store2: "npm:^2.14.2" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" typescript: "npm:^5.3.2" languageName: unknown From 3cf984672053bd51d73c2e10043b7f64e05df018 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Sat, 20 Apr 2024 22:11:21 +0200 Subject: [PATCH 138/180] Finalize Create New Story File feature --- code/addons/controls/src/manager.tsx | 50 ++++--- .../lib/core-events/src/data/argtypes-info.ts | 4 +- .../core-events/src/data/create-new-story.ts | 2 + .../create-new-story-channel.ts | 5 +- .../src/utils/get-new-story-file.ts | 12 +- .../manager-api/src/lib/request-response.ts | 4 +- .../src/modules/preview-web/Preview.tsx | 1 + .../sidebar/CreateNewStoryFileModal.tsx | 125 ++++++------------ .../src/components/sidebar/FileSearchList.tsx | 2 + .../sidebar/FileSearchModal.utils.tsx | 8 +- .../sidebar/IconSymbols.stories.tsx | 13 ++ 11 files changed, 98 insertions(+), 128 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/IconSymbols.stories.tsx diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index 7c7ba68f1133..d7195cd544e1 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -47,22 +47,20 @@ addons.register(ADDON_ID, (api) => { if (data.type !== 'story') throw new Error('Not a story'); try { - const response = await experimental_requestResponse( - channel, - SAVE_STORY_REQUEST, - SAVE_STORY_RESPONSE, - { - // Only send updated args - args: stringifyArgs( - Object.entries(data.args || {}).reduce((acc, [key, value]) => { - if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; - return acc; - }, {}) - ), - csfId: data.id, - importPath: data.importPath, - } satisfies SaveStoryRequestPayload - ); + const response = await experimental_requestResponse< + SaveStoryRequestPayload, + SaveStoryResponsePayload + >(channel, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { + // Only send updated args + args: stringifyArgs( + Object.entries(data.args || {}).reduce((acc, [key, value]) => { + if (!deepEqual(value, data.initialArgs?.[key])) acc[key] = value; + return acc; + }, {}) + ), + csfId: data.id, + importPath: data.importPath, + }); api.addNotification({ id: 'save-story-success', @@ -96,17 +94,15 @@ addons.register(ADDON_ID, (api) => { const data = api.getCurrentStoryData(); if (data.type !== 'story') throw new Error('Not a story'); - const response = await experimental_requestResponse( - channel, - SAVE_STORY_REQUEST, - SAVE_STORY_RESPONSE, - { - args: data.args && stringifyArgs(data.args), - csfId: data.id, - importPath: data.importPath, - name, - } satisfies SaveStoryRequestPayload - ); + const response = await experimental_requestResponse< + SaveStoryRequestPayload, + SaveStoryResponsePayload + >(channel, SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, { + args: data.args && stringifyArgs(data.args), + csfId: data.id, + importPath: data.importPath, + name, + }); api.addNotification({ id: 'save-story-success', diff --git a/code/lib/core-events/src/data/argtypes-info.ts b/code/lib/core-events/src/data/argtypes-info.ts index 7013b986885d..c993c684768c 100644 --- a/code/lib/core-events/src/data/argtypes-info.ts +++ b/code/lib/core-events/src/data/argtypes-info.ts @@ -1,6 +1,8 @@ import type { ArgTypes } from '@storybook/csf'; -export interface ArgTypesRequestPayload {} +export interface ArgTypesRequestPayload { + storyId: string; +} export interface ArgTypesResponsePayload { argTypes: ArgTypes; diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts index bc973019b7af..1443e8234f56 100644 --- a/code/lib/core-events/src/data/create-new-story.ts +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -5,6 +5,8 @@ export interface CreateNewStoryRequestPayload { componentExportName: string; // is default export componentIsDefaultExport: boolean; + // The amount of exports in the file + componentExportCount: number; } export interface CreateNewStoryResponsePayload { diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 669598ad14a1..f003cb54a0cb 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -15,6 +15,7 @@ import { existsSync } from 'node:fs'; import { getNewStoryFile } from '../utils/get-new-story-file'; import { getStoryId } from '../utils/get-story-id'; import path from 'node:path'; +import { getProjectRoot } from '@storybook/core-common'; export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** @@ -29,7 +30,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { options ); - const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); + const relativeStoryFilePath = path.relative(getProjectRoot(), storyFilePath); if (existsSync(storyFilePath)) { throw new Error(`Story file already exists at .${path.sep}${relativeStoryFilePath}`); @@ -41,7 +42,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: true, - id: storyId, + id: data.id, payload: { storyId, storyFilePath: `./${relativeStoryFilePath}`, diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index 2839368975f5..be03c48d8e35 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -16,6 +16,7 @@ export async function getNewStoryFile( componentFilePath, componentExportName, componentIsDefaultExport, + componentExportCount, }: CreateNewStoryRequestPayload, options: Options ) { @@ -54,13 +55,14 @@ export async function getNewStoryFile( exportedStoryName, }); - const doesStoryFileExist = fs.existsSync(path.join(cwd, storyFileName)); + const doesStoryFileExist = fs.existsSync(path.join(cwd, dirname, storyFileName)); - const storyFilePath = doesStoryFileExist - ? path.join(cwd, dirname, alternativeStoryFileName) - : path.join(cwd, dirname, storyFileName); + const storyFilePath = + doesStoryFileExist && componentExportCount > 1 + ? path.join(cwd, dirname, alternativeStoryFileName) + : path.join(cwd, dirname, storyFileName); - return { storyFilePath, exportedStoryName, storyFileContent }; + return { storyFilePath, exportedStoryName, storyFileContent, dirname }; } export const getStoryMetadata = (componentFilePath: string) => { diff --git a/code/lib/manager-api/src/lib/request-response.ts b/code/lib/manager-api/src/lib/request-response.ts index dfbbda5b3b31..c52e8ad8da2d 100644 --- a/code/lib/manager-api/src/lib/request-response.ts +++ b/code/lib/manager-api/src/lib/request-response.ts @@ -4,11 +4,11 @@ import type { RequestData, ResponseData } from '@storybook/core-events'; class RequestResponseError extends Error {} // eslint-disable-next-line @typescript-eslint/naming-convention -export const experimental_requestResponse = ( +export const experimental_requestResponse = ( channel: Channel, requestEvent: string, responseEvent: string, - payload: any, + payload: RequestPayload, timeout = 5000 ): Promise => { let timeoutId: NodeJS.Timeout; diff --git a/code/lib/preview-api/src/modules/preview-web/Preview.tsx b/code/lib/preview-api/src/modules/preview-web/Preview.tsx index ee4524c32ecf..69dace1ba1a3 100644 --- a/code/lib/preview-api/src/modules/preview-web/Preview.tsx +++ b/code/lib/preview-api/src/modules/preview-web/Preview.tsx @@ -318,6 +318,7 @@ export class Preview { this.channel.emit(ARGTYPES_INFO_RESPONSE, { id, success: false, + payload: null, error: e?.message, } satisfies ResponseData); } diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index 6c0c6c3c0f68..b68ef9336c57 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -23,11 +23,10 @@ import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, } from '@storybook/core-events'; -import { addons, useStorybookApi } from '@storybook/manager-api'; +import { addons, experimental_requestResponse, useStorybookApi } from '@storybook/manager-api'; import { useDebounce } from '../../hooks/useDebounce'; import type { NewStoryPayload, SearchResult } from './FileSearchList'; -import type { Channel } from '@storybook/channels'; import { extractSeededRequiredArgs, trySelectNewStory } from './FileSearchModal.utils'; import { FileSearchModal } from './FileSearchModal'; @@ -36,6 +35,14 @@ interface CreateNewStoryFileModalProps { onOpenChange: (open: boolean) => void; } +const stringifyArgs = (args: Record) => + stringify(args, { + allowDate: true, + allowFunction: true, + allowUndefined: true, + allowSymbol: true, + }); + export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFileModalProps) => { const [isLoading, setLoading] = useState(false); const [fileSearchQuery, setFileSearchQuery] = useState(''); @@ -125,82 +132,60 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi componentExportName, componentFilePath, componentIsDefaultExport, + componentExportCount, selectedItemId, }: NewStoryPayload) => { try { const channel = addons.getChannel(); - const createNewStoryResult = await oncePromise< + const createNewStoryResult = await experimental_requestResponse< CreateNewStoryRequestPayload, CreateNewStoryResponsePayload - >({ - channel, - request: { - name: CREATE_NEW_STORYFILE_REQUEST, - payload: { - id: `${selectedItemId}`, - payload: { - componentExportName, - componentFilePath, - componentIsDefaultExport, - }, - }, - }, - resolveEvent: CREATE_NEW_STORYFILE_RESPONSE, + >(channel, CREATE_NEW_STORYFILE_REQUEST, CREATE_NEW_STORYFILE_RESPONSE, { + componentExportName, + componentFilePath, + componentIsDefaultExport, + componentExportCount, }); - if (createNewStoryResult.success) { - setError(null); + setError(null); - const storyId = createNewStoryResult.payload.storyId; + const storyId = createNewStoryResult.storyId; - await trySelectNewStory(api.selectStory, storyId); + await trySelectNewStory(api.selectStory, storyId); - const argTypesInfoResult = await oncePromise< + try { + const argTypesInfoResult = await experimental_requestResponse< ArgTypesRequestPayload, ArgTypesResponsePayload - >({ - channel, - request: { - name: ARGTYPES_INFO_REQUEST, - payload: { id: storyId, payload: {} }, - }, - resolveEvent: ARGTYPES_INFO_RESPONSE, + >(channel, ARGTYPES_INFO_REQUEST, ARGTYPES_INFO_RESPONSE, { + storyId, }); - if (argTypesInfoResult.success) { - const argTypes = argTypesInfoResult.payload.argTypes; - - const requiredArgs = extractSeededRequiredArgs(argTypes); + const argTypes = argTypesInfoResult.argTypes; - await oncePromise({ - channel, - request: { - name: SAVE_STORY_REQUEST, - payload: { - id: storyId, - payload: { - args: stringify(requiredArgs), - importPath: createNewStoryResult.payload.storyFilePath, - csfId: storyId, - }, - }, - }, - resolveEvent: SAVE_STORY_RESPONSE, - }); - } + const requiredArgs = extractSeededRequiredArgs(argTypes); - handleSuccessfullyCreatedStory(componentExportName); - handleFileSearch(); - } else { - setError({ selectedItemId: selectedItemId, error: createNewStoryResult.error }); - } + await experimental_requestResponse( + channel, + SAVE_STORY_REQUEST, + SAVE_STORY_RESPONSE, + { + args: stringifyArgs(requiredArgs), + importPath: createNewStoryResult.storyFilePath, + csfId: storyId, + } + ); + } catch (e) {} + + handleSuccessfullyCreatedStory(componentExportName); + handleFileSearch(); } catch (e) { - handleErrorWhenCreatingStory(); + setError({ selectedItemId: selectedItemId, error: e?.message }); } }, [ - api.selectStory, + api?.selectStory, handleSuccessfullyCreatedStory, handleFileSearch, handleErrorWhenCreatingStory, @@ -230,31 +215,3 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi /> ); }; - -interface OncePromiseOptions { - channel: Channel; - request: { - name: string; - payload: Payload; - }; - resolveEvent: string; -} - -function oncePromise({ - channel, - request, - resolveEvent, -}: OncePromiseOptions>): Promise> { - return new Promise((resolve, reject) => { - channel.once(resolveEvent, (data: ResponseData) => { - resolve(data); - }); - - channel.emit(request.name, request.payload as Payload); - - // If the channel supports error events, you can reject the promise on error - channel.once(resolveEvent, (error: any) => { - reject(error); - }); - }); -} diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 4025b6bf169c..8765d3b3da87 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -140,6 +140,7 @@ export const FileSearchList = memo(function FileSearchList({ componentFilePath: searchResult.filepath, componentIsDefaultExport: searchResult.exportedComponents[0].default, selectedItemId: itemId, + componentExportCount: 1, }); } }, @@ -153,6 +154,7 @@ export const FileSearchList = memo(function FileSearchList({ componentFilePath: searchResult.filepath, componentIsDefaultExport: component.default, selectedItemId: id, + componentExportCount: searchResult.exportedComponents.length, }); }, [onNewStory] diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index dd1a4c9aec1e..5dd02ba67806 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -17,13 +17,7 @@ export function extractSeededRequiredArgs(argTypes: ArgTypes) { break; case 'union': case 'enum': - const valueName = (argType.type.value?.[0] as any).name; - if ( - 'value' in argType.type && - (valueName === 'string' || valueName === 'number' || valueName === 'boolean') - ) { - acc[key] = argType.type.value[0]; - } + acc[key] = argType.options?.[0]; break; case 'array': acc[key] = []; diff --git a/code/ui/manager/src/components/sidebar/IconSymbols.stories.tsx b/code/ui/manager/src/components/sidebar/IconSymbols.stories.tsx new file mode 100644 index 000000000000..76136230d3d8 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/IconSymbols.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { IconSymbols } from './IconSymbols'; + +const meta = { + component: IconSymbols, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; From 6a961aade2a1a13d6e3673cedc528ea8057f2b7e Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Sat, 20 Apr 2024 22:40:03 +0200 Subject: [PATCH 139/180] Fix tests --- .../src/components/sidebar/FileSearchModal.utils.test.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx index cbb3e8c2e2e5..aa7481952ba7 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -34,8 +34,9 @@ describe('FileSearchModal.utils', () => { type: { name: 'union', required: true, - value: ['a', 'b', 'c'] as any, + value: [], }, + options: ['a', 'b', 'c'], }, union: { type: { name: 'union', required: false, value: [] }, @@ -44,8 +45,9 @@ describe('FileSearchModal.utils', () => { type: { name: 'enum', required: true, - value: ['a', 'b', 'c'] as any, + value: [], }, + options: ['a', 'b', 'c'], }, enum: { type: { name: 'union', required: false, value: [] }, From bda5336c598f04adc3204c2057ed5fee2a4b5114 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Sat, 20 Apr 2024 22:42:21 +0200 Subject: [PATCH 140/180] Fix TypeScript errors --- code/lib/core-server/src/utils/get-new-story-file.test.ts | 2 ++ code/ui/manager/src/components/sidebar/FileList.tsx | 2 -- code/ui/manager/src/components/sidebar/Search.tsx | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/lib/core-server/src/utils/get-new-story-file.test.ts b/code/lib/core-server/src/utils/get-new-story-file.test.ts index e9f204f1fe0c..91b06d9027b0 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.test.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.test.ts @@ -17,6 +17,7 @@ describe('get-new-story-file', () => { componentFilePath: 'src/components/Page.tsx', componentExportName: 'Page', componentIsDefaultExport: false, + componentExportCount: 1, }, { presets: { @@ -54,6 +55,7 @@ describe('get-new-story-file', () => { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, + componentExportCount: 1, }, { presets: { diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index a0b516aaf487..e5087a132639 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -1,7 +1,5 @@ -import type { StyledComponent } from '@storybook/theming'; import { styled } from '@storybook/theming'; import { rgba } from 'polished'; -import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; export const FileListWrapper = styled('div')(({ theme }) => ({ marginTop: '-16px', diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index 4e87d462d3ca..6cfa55ec415e 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -392,7 +392,6 @@ export const Search = React.memo<{ - {/* @ts-expect-error (TODO) */} {!isMobile && enableShortcuts && !isOpen && ( From d310cb97aae51792f67c4108cbe47df128a842b6 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 22 Apr 2024 15:36:00 +0200 Subject: [PATCH 141/180] Fix tests --- code/lib/core-events/src/data/create-new-story.ts | 3 +++ .../src/server-channel/create-new-story-channel.test.ts | 3 ++- .../src/server-channel/create-new-story-channel.ts | 7 +++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts index 1443e8234f56..362ca55511d4 100644 --- a/code/lib/core-events/src/data/create-new-story.ts +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -10,7 +10,10 @@ export interface CreateNewStoryRequestPayload { } export interface CreateNewStoryResponsePayload { + // The story id storyId: string; + // The story file path relative to the cwd storyFilePath: string; + // The name of the story export in the file exportedStoryName: string; } diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index 2414743be406..12aa76d02f5d 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -81,7 +81,7 @@ describe('createNewStoryChannel', () => { id: 'components-page--default', payload: { storyId: 'components-page--default', - storyFilePath: './src/components/Page.stories.jsx', + storyFilePath: path.join('src', 'components', 'Page.stories.jsx'), exportedStoryName: 'Default', }, success: true, @@ -116,6 +116,7 @@ describe('createNewStoryChannel', () => { componentFilePath: 'src/components/Page.jsx', componentExportName: 'Page', componentIsDefaultExport: true, + componentExportCount: 1, }, } satisfies RequestData); diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index f003cb54a0cb..d11ab389ecc3 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -15,7 +15,6 @@ import { existsSync } from 'node:fs'; import { getNewStoryFile } from '../utils/get-new-story-file'; import { getStoryId } from '../utils/get-story-id'; import path from 'node:path'; -import { getProjectRoot } from '@storybook/core-common'; export function initCreateNewStoryChannel(channel: Channel, options: Options) { /** @@ -30,10 +29,10 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { options ); - const relativeStoryFilePath = path.relative(getProjectRoot(), storyFilePath); + const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); if (existsSync(storyFilePath)) { - throw new Error(`Story file already exists at .${path.sep}${relativeStoryFilePath}`); + throw new Error(`Story file already exists at ${relativeStoryFilePath}`); } await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); @@ -45,7 +44,7 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { id: data.id, payload: { storyId, - storyFilePath: `./${relativeStoryFilePath}`, + storyFilePath: path.relative(process.cwd(), storyFilePath), exportedStoryName, }, error: null, From 7702cb647a605d51533cc368a44ce40cef2fbbfa Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 23 Apr 2024 04:46:45 -0600 Subject: [PATCH 142/180] Fix Modals in onboarding and add stories to manager's Storybook --- code/addons/onboarding/package.json | 4 ++- .../src/components/Confetti/Confetti.tsx | 2 +- .../WelcomeModal/WelcomeModal.stories.tsx | 31 +++++++++++++++++-- .../WelcomeModal/WelcomeModal.styled.tsx | 5 +++ .../features/WelcomeModal/WelcomeModal.tsx | 9 +++--- .../WriteStoriesModal.stories.tsx | 28 ++++++++++++++++- .../WriteStoriesModal.styled.tsx | 5 +++ .../WriteStoriesModal/WriteStoriesModal.tsx | 7 +++-- code/ui/.storybook/main.ts | 4 +++ 9 files changed, 84 insertions(+), 11 deletions(-) diff --git a/code/addons/onboarding/package.json b/code/addons/onboarding/package.json index 8919cabdb5b6..b4d1940b6b3a 100644 --- a/code/addons/onboarding/package.json +++ b/code/addons/onboarding/package.json @@ -45,6 +45,9 @@ "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/addon-bundle.ts" }, + "dependencies": { + "react-confetti": "^6.1.0" + }, "devDependencies": { "@radix-ui/react-dialog": "^1.0.5", "@storybook/channels": "workspace:*", @@ -59,7 +62,6 @@ "@storybook/types": "workspace:*", "framer-motion": "^11.0.3", "react": "^18.2.0", - "react-confetti": "^6.1.0", "react-dom": "^18.2.0", "react-joyride": "^2.7.2", "react-use-measure": "^2.1.1", diff --git a/code/addons/onboarding/src/components/Confetti/Confetti.tsx b/code/addons/onboarding/src/components/Confetti/Confetti.tsx index 5f0658dc462b..763a835e88a8 100644 --- a/code/addons/onboarding/src/components/Confetti/Confetti.tsx +++ b/code/addons/onboarding/src/components/Confetti/Confetti.tsx @@ -1,4 +1,4 @@ -import { ReactConfetti } from 'react-confetti/src/ReactConfetti'; +import ReactConfetti from 'react-confetti'; import React, { useEffect } from 'react'; import { styled } from '@storybook/theming'; import { createPortal } from 'react-dom'; diff --git a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.stories.tsx b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.stories.tsx index ecf153295ee6..791698211dfe 100644 --- a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.stories.tsx +++ b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.stories.tsx @@ -1,11 +1,38 @@ -import React from 'react'; +import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { WelcomeModal } from './WelcomeModal'; const meta: Meta = { component: WelcomeModal, - decorators: [(storyFn) =>
{storyFn()}
], + // This decorator is used to show the modal in the side by side view + decorators: [ + (Story, context) => { + const [container, setContainer] = useState(undefined); + + if (context.globals.theme === 'side-by-side') { + return ( +
{ + if (element) { + setContainer(element); + } + }} + style={{ + width: '100%', + height: '100%', + minHeight: '600px', + transform: 'translateZ(0)', + }} + > + {Story({ args: { ...context.args, container } })} +
+ ); + } + + return Story(); + }, + ], }; export default meta; diff --git a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.styled.tsx b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.styled.tsx index 503c97e102ef..8728edfa6045 100644 --- a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.styled.tsx +++ b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.styled.tsx @@ -1,5 +1,10 @@ import { ArrowRightIcon } from '@storybook/icons'; import { keyframes, styled } from '@storybook/theming'; +import { Modal } from '@storybook/components'; + +export const ModalWrapper = styled(Modal)` + background: white; +`; export const ModalContentWrapper = styled.div` border-radius: 5px; diff --git a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx index c971eecfa22f..a8000fd6ea63 100644 --- a/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx +++ b/code/addons/onboarding/src/features/WelcomeModal/WelcomeModal.tsx @@ -1,4 +1,3 @@ -import { Modal } from '@storybook/components'; import type { FC } from 'react'; import React from 'react'; @@ -15,17 +14,19 @@ import { Circle2, Circle3, TopContent, + ModalWrapper, } from './WelcomeModal.styled'; interface WelcomeModalProps { onProceed: () => void; skipOnboarding: () => void; + container?: HTMLElement; } -export const WelcomeModal: FC = ({ onProceed, skipOnboarding }) => { +export const WelcomeModal: FC = ({ onProceed, skipOnboarding, container }) => { return (
- + @@ -48,7 +49,7 @@ export const WelcomeModal: FC = ({ onProceed, skipOnboarding - +
); }; diff --git a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.stories.tsx b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.stories.tsx index d2fe6ba470b4..6902466a8e15 100644 --- a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.stories.tsx +++ b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.stories.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { waitFor, within, expect, fn } from '@storybook/test'; @@ -33,6 +33,7 @@ const meta: Meta = { }), }, }, + decorators: [ (storyFn, context) => { (context.args.api.getData as typeof getData) @@ -42,6 +43,31 @@ const meta: Meta = { .mockReturnValueOnce({ some: 'data' }); return
{storyFn()}
; }, + (Story, context) => { + const [container, setContainer] = useState(undefined); + + if (context.globals.theme === 'side-by-side') { + return ( +
{ + if (element) { + setContainer(element); + } + }} + style={{ + width: '100%', + height: '100%', + minHeight: '600px', + transform: 'translateZ(0)', + }} + > + {Story({ args: { ...context.args, container } })} +
+ ); + } + + return Story(); + }, ], }; diff --git a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.styled.tsx b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.styled.tsx index b47dba7c7c39..9b63cf6daf3d 100644 --- a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.styled.tsx +++ b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.styled.tsx @@ -1,4 +1,9 @@ import { keyframes, styled } from '@storybook/theming'; +import { Modal } from '@storybook/components'; + +export const ModalWrapper = styled(Modal)` + background: white; +`; export const ModalContent = styled.div` display: flex; diff --git a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx index 7bfb4ea3a2e9..333e1826bb2e 100644 --- a/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx +++ b/code/addons/onboarding/src/features/WriteStoriesModal/WriteStoriesModal.tsx @@ -12,6 +12,7 @@ import { Main, ModalContent, ModalTitle, + ModalWrapper, SpanHighlight, Step2Text, } from './WriteStoriesModal.styled'; @@ -41,6 +42,7 @@ interface WriteStoriesModalProps { addonsStore: AddonStore; codeSnippets: CodeSnippets; skipOnboarding: () => void; + container?: HTMLElement; } export const WriteStoriesModal: FC = ({ @@ -49,6 +51,7 @@ export const WriteStoriesModal: FC = ({ addonsStore, skipOnboarding, codeSnippets, + container, }) => { const [step, setStep] = useState<'imports' | 'meta' | 'story' | 'args' | 'customStory'>( 'imports' @@ -91,7 +94,7 @@ export const WriteStoriesModal: FC = ({ }, [api, step]); return ( - + {codeSnippets ? ( = ({ - + ); }; diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index 7c67fa3d58d8..55a7a09b611d 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -23,6 +23,10 @@ const allStories = [ directory: '../../addons/controls/src', // TODO other addons? titlePrefix: '@addons/controls', }, + { + directory: '../../addons/onboarding/src', + titlePrefix: '@addons/onboarding', + }, ]; /** From 466a774abbad0acbb59133b06275286586a0f192 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 23 Apr 2024 05:06:37 -0600 Subject: [PATCH 143/180] Upgrade babel dependencies --- code/addons/docs/package.json | 2 +- code/frameworks/nextjs/package.json | 24 +- code/lib/cli/package.json | 4 +- code/lib/codemod/package.json | 6 +- code/lib/core-server/package.json | 2 +- code/lib/csf-tools/package.json | 8 +- code/lib/docs-tools/package.json | 2 +- code/yarn.lock | 1105 ++++++++++++++++----------- 8 files changed, 685 insertions(+), 468 deletions(-) diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 77ccd00d086e..20c26d3fa9d5 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -98,7 +98,7 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@babel/core": "^7.12.3", + "@babel/core": "^7.24.4", "@mdx-js/react": "^3.0.0", "@storybook/blocks": "workspace:*", "@storybook/client-logger": "workspace:*", diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index 65aebaa66c60..e2a136996b8c 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -75,19 +75,19 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@babel/core": "^7.23.2", + "@babel/core": "^7.24.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.2", - "@babel/runtime": "^7.23.2", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-runtime": "^7.24.3", + "@babel/preset-env": "^7.24.4", + "@babel/preset-react": "^7.24.1", + "@babel/preset-typescript": "^7.24.1", + "@babel/runtime": "^7.24.4", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@storybook/addon-actions": "workspace:*", "@storybook/builder-webpack5": "workspace:*", @@ -121,7 +121,7 @@ "tsconfig-paths-webpack-plugin": "^4.0.1" }, "devDependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.24.0", "@types/babel__core": "^7", "@types/babel__plugin-transform-runtime": "^7", "@types/babel__preset-env": "^7", diff --git a/code/lib/cli/package.json b/code/lib/cli/package.json index 200eae0d10e8..1ea9d9ca1181 100644 --- a/code/lib/cli/package.json +++ b/code/lib/cli/package.json @@ -56,8 +56,8 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@babel/core": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", "@ndelangen/get-tarball": "^3.0.7", "@storybook/codemod": "workspace:*", "@storybook/core-common": "workspace:*", diff --git a/code/lib/codemod/package.json b/code/lib/codemod/package.json index 46f9ad028a5e..46037afa5e46 100644 --- a/code/lib/codemod/package.json +++ b/code/lib/codemod/package.json @@ -54,9 +54,9 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@babel/types": "^7.24.0", "@storybook/csf": "^0.1.4", "@storybook/csf-tools": "workspace:*", "@storybook/node-logger": "workspace:*", diff --git a/code/lib/core-server/package.json b/code/lib/core-server/package.json index 9261d64f6e48..f044cd25733e 100644 --- a/code/lib/core-server/package.json +++ b/code/lib/core-server/package.json @@ -56,7 +56,7 @@ }, "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", - "@babel/core": "^7.23.9", + "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "@discoveryjs/json-ext": "^0.5.3", "@storybook/builder-manager": "workspace:*", diff --git a/code/lib/csf-tools/package.json b/code/lib/csf-tools/package.json index 430b347c2451..0c76c17e7758 100644 --- a/code/lib/csf-tools/package.json +++ b/code/lib/csf-tools/package.json @@ -42,10 +42,10 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/generator": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", "@storybook/csf": "^0.1.4", "@storybook/types": "workspace:*", "fs-extra": "^11.1.0", diff --git a/code/lib/docs-tools/package.json b/code/lib/docs-tools/package.json index 087113cd0229..5af72a730ae4 100644 --- a/code/lib/docs-tools/package.json +++ b/code/lib/docs-tools/package.json @@ -54,7 +54,7 @@ "lodash": "^4.17.21" }, "devDependencies": { - "@babel/preset-react": "^7.23.3", + "@babel/preset-react": "^7.24.1", "babel-plugin-react-docgen": "4.2.1", "require-from-string": "^2.0.2", "typescript": "^5.3.2" diff --git a/code/yarn.lock b/code/yarn.lock index f033288f0024..e1b518ce055d 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -360,20 +360,20 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" dependencies: - "@babel/highlight": "npm:^7.23.4" - chalk: "npm:^2.4.2" - checksum: 10c0/a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 10c0/081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 10c0/9cd8a9cd28a5ca6db5d0e27417d609f95a8762b655e8c9c97fd2de08997043ae99f0139007083c5e607601c6122e8432c85fe391731b19bf26ad458fa0c60dd3 languageName: node linkType: hard @@ -400,7 +400,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.24.0, @babel/core@npm:^7.12.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.3.4, @babel/core@npm:^7.7.5": +"@babel/core@npm:7.24.0": version: 7.24.0 resolution: "@babel/core@npm:7.24.0" dependencies: @@ -423,7 +423,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:7.23.6, @babel/generator@npm:^7.12.11, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6": +"@babel/core@npm:^7.12.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.24.4, @babel/core@npm:^7.3.4, @babel/core@npm:^7.7.5": + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/fc136966583e64d6f84f4a676368de6ab4583aa87f867186068655b30ef67f21f8e65a88c6d446a7efd219ad7ffb9185c82e8a90183ee033f6f47b5026641e16 + languageName: node + linkType: hard + +"@babel/generator@npm:7.23.6": version: 7.23.6 resolution: "@babel/generator@npm:7.23.6" dependencies: @@ -435,6 +458,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/67a1b2f7cc985aaaa11b01e8ddd4fffa4f285837bc7a209738eb8203aa34bdafeb8507ed75fd883ddbabd641a036ca0a8d984e760f28ad4a9d60bff29d0a60bb + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:7.22.5, @babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -453,7 +488,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -466,22 +501,22 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5, @babel/helper-create-class-features-plugin@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.0" +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-member-expression-to-functions": "npm:^7.23.0" "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/341548496df202805489422a160bba75b111d994c64d788a397c35f01784632af48bf06023af8aa2fe72c2c254f8c885b4e0f7f3df5ef17a37370f2feaf80328 + checksum: 10c0/6ebb38375dcd44c79f40008c2de4d023376cf436c135439f15c9c54603c2d6a8ada39b2e07be545da684d9e40b602a0cb0d1670f3877d056deb5f0d786c4bf86 languageName: node linkType: hard @@ -513,9 +548,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.0": - version: 0.6.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.0, @babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -524,7 +559,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/bf6af52fadbbebc5bf71166b91eac4fc21431ec9b0d2a94063f3a3d900ed44aa1384ad23e920a85e7a657fcf3e80edb2eaaac9d902bd1e632f3b50c836b45c53 + checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 languageName: node linkType: hard @@ -554,7 +589,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.15, @babel/helper-member-expression-to-functions@npm:^7.23.0": +"@babel/helper-member-expression-to-functions@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" dependencies: @@ -563,12 +598,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.8.3": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3, @babel/helper-module-imports@npm:^7.8.3": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10c0/4e0d7fc36d02c1b8c8b3006dfbfeedf7a367d3334a04934255de5128115ea0bafdeb3e5736a2559917f0653e4e437400d54542da0468e08d3cbc86d3bbfa8f30 + "@babel/types": "npm:^7.24.0" + checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d languageName: node linkType: hard @@ -616,16 +651,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-replace-supers@npm:7.22.20" +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" "@babel/helper-optimise-call-expression": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6b0858811ad46873817c90c805015d63300e003c5a85c147a17d9845fa2558a02047c3cc1f07767af59014b2dd0fa75b503e5bc36e917f360e9b67bb6f1e79f4 + checksum: 10c0/d39a3df7892b7c3c0e307fb229646168a9bd35e26a72080c2530729322600e8cff5f738f44a14860a2358faffa741b6a6a0d6749f113387b03ddbfa0ec10e1a0 languageName: node linkType: hard @@ -657,9 +692,9 @@ __metadata: linkType: hard "@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: 10c0/f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac + version: 7.24.1 + resolution: "@babel/helper-string-parser@npm:7.24.1" + checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2 languageName: node linkType: hard @@ -670,7 +705,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": +"@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 @@ -688,79 +723,83 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.9, @babel/helpers@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helpers@npm:7.24.0" +"@babel/helpers@npm:^7.23.9, @babel/helpers@npm:^7.24.0, @babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" dependencies: "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" "@babel/types": "npm:^7.24.0" - checksum: 10c0/dd27c9f11c1c5244ef312fae37636f2fcc69c541c46508017b846c4cf680af059f1922ce84e3f778f123a70d027ded75c96070ee8e906f3bc52dc26dc43df608 + checksum: 10c0/747ef62b7fe87de31a2f3c19ff337a86cbb79be2f6c18af63133b614ab5a8f6da5b06ae4b06fb0e71271cb6a27efec6f8b6c9f44c60b8a18777832dc7929e6c5 languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" dependencies: "@babel/helper-validator-identifier": "npm:^7.22.20" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" - checksum: 10c0/fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 + picocolors: "npm:^1.0.0" + checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.11.5, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.5, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": - version: 7.24.0 - resolution: "@babel/parser@npm:7.24.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.11.5, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.5, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" bin: parser: ./bin/babel-parser.js - checksum: 10c0/77593d0b9de9906823c4d653bb6cda1c7593837598516330f655f70cba6224a37def7dbe5b4dad0038482d407d8d209eb8be5f48ca9a13357d769f829c5adb8e + checksum: 10c0/8381e1efead5069cb7ed2abc3a583f4a86289b2f376c75cecc69f59a8eb36df18274b1886cecf2f97a6a0dff5334b27330f58535be9b3e4e26102cc50e12eac8 languageName: node linkType: hard -"@babel/parser@npm:^7.24.4": +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": version: 7.24.4 - resolution: "@babel/parser@npm:7.24.4" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/8381e1efead5069cb7ed2abc3a583f4a86289b2f376c75cecc69f59a8eb36df18274b1886cecf2f97a6a0dff5334b27330f58535be9b3e4e26102cc50e12eac8 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9aed453a1a21e4fd29add0b4a2d82a2c6f43a47c80d28411f8327f2a714064bc93a6f622c701d263970e0d72d7901d28f7f51e91ba91a31306efe8f17c411182 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/356a4e9fc52d7ca761ce6857fc58e2295c2785d22565760e6a5680be86c6e5883ab86e0ba25ef572882c01713d3a31ae6cfa3e3222cdb95e6026671dab1fa415 + checksum: 10c0/d4e592e6fc4878654243d2e7b51ea86471b868a8cb09de29e73b65d2b64159990c6c198fd7c9c2af2e38b1cddf70206243792853c47384a84f829dada152f605 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/a8785f099d55ca71ed89815e0f3a636a80c16031f80934cfec17c928d096ee0798964733320c8b145ef36ba429c5e19d5107b06231e0ab6777cfb0f01adfdc23 + checksum: 10c0/351c36e45795a7890d610ab9041a52f4078a59429f6e74c281984aa44149a10d43e82b3a8172c703c0d5679471e165d1c02b6d2e45a677958ee301b89403f202 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/355746e21ad7f43e4f4daef54cfe2ef461ecd19446b2afedd53c39df1bf9aa2eeeeaabee2279b1321de89a97c9360e4f76e9ba950fee50ff1676c25f6929d625 + checksum: 10c0/d7dd5a59a54635a3152895dcaa68f3370bb09d1f9906c1e72232ff759159e6be48de4a598a993c986997280a2dc29922a48aaa98020f16439f3f57ad72788354 languageName: node linkType: hard @@ -777,15 +816,15 @@ __metadata: linkType: hard "@babel/plugin-proposal-decorators@npm:^7.13.5, @babel/plugin-proposal-decorators@npm:^7.22.7": - version: 7.24.0 - resolution: "@babel/plugin-proposal-decorators@npm:7.24.0" + version: 7.24.1 + resolution: "@babel/plugin-proposal-decorators@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.0" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-decorators": "npm:^7.24.0" + "@babel/plugin-syntax-decorators": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6bf16cb2b5b2f1b63b5ea964853cd3b3419c8285296b5bf64a64127c9d5c1b2e6829e84bd92734e4b71df67686d8f36fb01bb8a45fc52bcece7503b73bc42ec7 + checksum: 10c0/ffe49522ada6581f1c760b777dbd913afcd204e11e6907c4f2c293ce6d30961449ac19d9960250d8743a1f60e21cb667e51a3af15992dfe7627105e039c46a9b languageName: node linkType: hard @@ -893,14 +932,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/plugin-syntax-decorators@npm:7.24.0" +"@babel/plugin-syntax-decorators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-decorators@npm:7.24.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6c11801e062772d4e1b0b418a4732574128b1dfc13193a2909fa93937346746aaa7046f88f6026ff3c80777c967d0fe2e4bb19a1d3fb399e8349c81741e4f471 + checksum: 10c0/14028a746f86efbdd47e4961456bb53d656e9e3461890f66b1b01032151d15fda5ba99fcaa60232a229a33aa9e73b11c2597b706d5074c520155757e372cd17b languageName: node linkType: hard @@ -926,36 +965,36 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-flow@npm:7.22.5" +"@babel/plugin-syntax-flow@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-flow@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/07afc7df02141597968532bfbfa3f6c0ad21a2bdd885d0e5e035dcf60fdf35f0995631c9750b464e1a6f2feea14160a82787f914e88e8f7115dc99f09853e43e + checksum: 10c0/618de04360a96111408abdaafaba2efbaef0d90faad029d50e0281eaad5d7c7bd2ce4420bbac0ee27ad84c2b7bbc3e48f782064f81ed5bc40c398637991004c7 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.22.5, @babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.23.3, @babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7db8b59f75667bada2293353bb66b9d5651a673b22c72f47da9f5c46e719142481601b745f9822212fd7522f92e26e8576af37116f85dae1b5e5967f80d0faab + checksum: 10c0/72f0340d73e037f0702c61670054e0af66ece7282c5c2f4ba8de059390fee502de282defdf15959cd9f71aa18dc5c5e4e7a0fde317799a0600c6c4e0a656d82b languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.23.3, @babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/99b40d33d79205a8e04bb5dea56fd72906ffc317513b20ca7319e7683e18fce8ea2eea5e9171056f92b979dc0ab1e31b2cb5171177a5ba61e05b54fe7850a606 + checksum: 10c0/309634e3335777aee902552b2cf244c4a8050213cc878b3fb9d70ad8cbbff325dc46ac5e5791836ff477ea373b27832238205f6ceaff81f7ea7c4c7e8fbb13bb languageName: node linkType: hard @@ -981,14 +1020,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" +"@babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/563bb7599b868773f1c7c1d441ecc9bc53aeb7832775da36752c926fc402a1fa5421505b39e724f71eb217c13e4b93117e081cac39723b0e11dac4c897f33c3e + checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a languageName: node linkType: hard @@ -1080,14 +1119,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.3.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" +"@babel/plugin-syntax-typescript@npm:^7.24.1, @babel/plugin-syntax-typescript@npm:^7.3.3": + version: 7.24.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d6e9cdb9d0bfb9bd9b220fc951d937fce2ca69135ec121153572cebe81d86abc9a489208d6b69ee5f10cadcaeffa10d0425340a5029e40e14a6025021b90948 + checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93 languageName: node linkType: hard @@ -1103,18 +1142,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.23.3, @babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b128315c058f5728d29b0b78723659b11de88247ea4d0388f0b935cddf60a80c40b9067acf45cbbe055bd796928faef152a09d9e4a0695465aca4394d9f109ca + checksum: 10c0/f44bfacf087dc21b422bab99f4e9344ee7b695b05c947dacae66de05c723ab9d91800be7edc1fa016185e8c819f3aca2b4a5f66d8a4d1e47d9bad80b8fa55b8e languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:7.23.9, @babel/plugin-transform-async-generator-functions@npm:^7.23.9": +"@babel/plugin-transform-async-generator-functions@npm:7.23.9": version: 7.23.9 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" dependencies: @@ -1128,7 +1167,21 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:7.23.3, @babel/plugin-transform-async-to-generator@npm:^7.23.3": +"@babel/plugin-transform-async-generator-functions@npm:^7.23.9, @babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-remap-async-to-generator": "npm:^7.22.20" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/55ceed059f819dcccbfe69600bfa1c055ada466bd54eda117cfdd2cf773dd85799e2f6556e4a559b076e93b9704abcca2aef9d72aad7dc8a5d3d17886052f1d3 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" dependencies: @@ -1141,284 +1194,297 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.23.3, @babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/82c12a11277528184a979163de7189ceb00129f60dd930b0d5313454310bf71205f302fb2bf0430247161c8a22aaa9fb9eec1459f9f7468206422c191978fd59 + checksum: 10c0/3731ba8e83cbea1ab22905031f25b3aeb0b97c6467360a2cc685352f16e7c786417d8883bc747f5a0beff32266bdb12a05b6292e7b8b75967087200a7bc012c4 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4, @babel/plugin-transform-block-scoping@npm:^7.8.3": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3, @babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83006804dddf980ab1bcd6d67bc381e24b58c776507c34f990468f820d0da71dba3697355ca4856532fa2eeb2a1e3e73c780f03760b5507a511cbedb0308e276 + checksum: 10c0/6fbaa85f5204f34845dfc0bebf62fdd3ac5a286241c85651e59d426001e7a1785ac501f154e093e0b8ee49e1f51e3f8b06575a5ae8d4a9406d43e4816bf18c37 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" +"@babel/plugin-transform-block-scoping@npm:^7.23.4, @babel/plugin-transform-block-scoping@npm:^7.24.4, @babel/plugin-transform-block-scoping@npm:^7.8.3": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bca30d576f539eef216494b56d610f1a64aa9375de4134bc021d9660f1fa735b1d7cc413029f22abc0b7cb737e3a57935c8ae9d8bd1730921ccb1deebce51bfd + checksum: 10c0/62f55fd1b60a115506e9553c3bf925179b1ab8a42dc31471c4e3ada20573a488b5c5e3317145da352493ef07f1d9750ce1f8a49cb3f39489ac1ab42e5ddc883d languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3, @babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00dff042ac9df4ae67b5ef98b1137cc72e0a24e6d911dc200540a8cb1f00b4cff367a922aeb22da17da662079f0abcd46ee1c5f4cdf37ceebf6ff1639bb9af27 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.23.4, @babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/fdca96640ef29d8641a7f8de106f65f18871b38cc01c0f7b696d2b49c76b77816b30a812c08e759d06dd10b4d9b3af6b5e4ac22a2017a88c4077972224b77ab0 + checksum: 10c0/19dfeaf4a2ac03695034f7211a8b5ad89103b224608ac3e91791055107c5fe4d7ebe5d9fbb31b4a91265694af78762260642eb270f4b239c175984ee4b253f80 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.23.8, @babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/227ac5166501e04d9e7fbd5eda6869b084ffa4af6830ac12544ac6ea14953ca00eb1762b0df9349c0f6c8d2a799385910f558066cd0fb85b9ca437b1131a6043 + checksum: 10c0/586a95826be4d68056fa23d8e6c34353ce2ea59bf3ca8cf62bc784e60964d492d76e1b48760c43fd486ffb65a79d3fed9a4f91289e4f526f88c3b6acc0dfb00e languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.23.3, @babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3ca8a006f8e652b58c21ecb84df1d01a73f0a96b1d216fd09a890b235dd90cb966b152b603b88f7e850ae238644b1636ce5c30b7c029c0934b43383932372e4a + checksum: 10c0/8292c508b656b7722e2c2ca0f6f31339852e3ed2b9b80f6e068a4010e961b431ca109ecd467fc906283f4b1574c1e7b1cb68d35a4dea12079d386c15ff7e0eac languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.23.3, @babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/717e9a62c1b0c93c507f87b4eaf839ec08d3c3147f14d74ae240d8749488d9762a8b3950132be620a069bde70f4b3e4ee9867b226c973fcc40f3cdec975cde71 + checksum: 10c0/a08e706a9274a699abc3093f38c72d4a5354eac11c44572cc9ea049915b6e03255744297069fd94fcce82380725c5d6b1b11b9a84c0081aa3aa6fc2fdab98ef6 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.23.3, @babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6c89286d1277c2a63802a453c797c87c1203f89e4c25115f7b6620f5fce15d8c8d37af613222f6aa497aa98773577a6ec8752e79e13d59bc5429270677ea010b + checksum: 10c0/758def705ec5a87ef910280dc2df5d2fda59dc5d4771c1725c7aed0988ae5b79e29aeb48109120301a3e1c6c03dfac84700469de06f38ca92c96834e09eadf5d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.23.3, @babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7e2640e4e6adccd5e7b0615b6e9239d7c98363e21c52086ea13759dfa11cf7159b255fc5331c2de435639ea8eb6acefae115ae0d797a3d19d12587652f8052a5 + checksum: 10c0/41072f57f83a6c2b15f3ee0b6779cdca105ff3d98061efe92ac02d6c7b90fdb6e7e293b8a4d5b9c690d9ae5d3ae73e6bde4596dc4d8c66526a0e5e1abc73c88c languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.23.4, @babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/19ae4a4a2ca86d35224734c41c48b2aa6a13139f3cfa1cbd18c0e65e461de8b65687dec7e52b7a72bb49db04465394c776aa1b13a2af5dc975b2a0cde3dcab67 + checksum: 10c0/7e2834780e9b5251ef341854043a89c91473b83c335358620ca721554877e64e416aeb3288a35f03e825c4958e07d5d00ead08c4490fadc276a21fe151d812f1 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3, @babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c33ee6a1bdc52fcdf0807f445b27e3fbdce33008531885e65a699762327565fffbcfde8395be7f21bcb22d582e425eddae45650c986462bb84ba68f43687516 + checksum: 10c0/f0fc4c5a9add25fd6bf23dabe6752e9b7c0a2b2554933dddfd16601245a2ba332b647951079c782bf3b94c6330e3638b9b4e0227f469a7c1c707446ba0eba6c7 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.23.4, @babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/38bf04f851e36240bbe83ace4169da626524f4107bfb91f05b4ad93a5fb6a36d5b3d30b8883c1ba575ccfc1bac7938e90ca2e3cb227f7b3f4a9424beec6fd4a7 + checksum: 10c0/510bb23b2423d5fbffef69b356e4050929c21a7627e8194b1506dd935c7d9cbbd696c9ae9d7c3bcd7e6e7b69561b0b290c2d72d446327b40fc20ce40bbca6712 languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.22.5" +"@babel/plugin-transform-flow-strip-types@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-flow": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-flow": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5949a8e5214e3fc65d31dab0551423cea9d9eef35faa5d0004707ba7347baf96166aa400907ce7498f754db4e1e9d039ca434a508546b0dc9fdae9a42e814c1a + checksum: 10c0/e6aa9cbad0441867598d390d4df65bc8c6b797574673e4eedbdae0cc528e81e00f4b2cd38f7d138b0f04bcdd2540384a9812d5d76af5abfa06aee1c7fc20ca58 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.23.6, @babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/46681b6ab10f3ca2d961f50d4096b62ab5d551e1adad84e64be1ee23e72eb2f26a1e30e617e853c74f1349fffe4af68d33921a128543b6f24b6d46c09a3e2aec + checksum: 10c0/e4bc92b1f334246e62d4bde079938df940794db564742034f6597f2e38bd426e11ae8c5670448e15dd6e45c462f2a9ab3fa87259bddf7c08553ffd9457fc2b2c languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.23.3, @babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/89cb9747802118048115cf92a8f310752f02030549b26f008904990cbdc86c3d4a68e07ca3b5c46de8a46ed4df2cb576ac222c74c56de67253d2a3ddc2956083 + checksum: 10c0/65c1735ec3b5e43db9b5aebf3c16171c04b3050c92396b9e22dda0d2aaf51f43fdcf147f70a40678fd9a4ee2272a5acec4826e9c21bcf968762f4c184897ad75 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.23.4, @babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/39e82223992a9ad857722ae051291935403852ad24b0dd64c645ca1c10517b6bf9822377d88643fed8b3e61a4e3f7e5ae41cf90eb07c40a786505d47d5970e54 + checksum: 10c0/13d9b6a3c31ab4be853b3d49d8d1171f9bd8198562fd75da8f31e7de31398e1cfa6eb1d073bed93c9746e4f9c47a53b20f8f4c255ece3f88c90852ad3181dc2d languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.23.3, @babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8292106b106201464c2bfdd5c014fe6a9ca1c0256eb0a8031deb20081e21906fe68b156186f77d993c23eeab6d8d6f5f66e8895eec7ed97ce6de5dbcafbcd7f4 + checksum: 10c0/a27cc7d565ee57b5a2bf136fa889c5c2f5988545ae7b3b2c83a7afe5dd37dfac80dca88b1c633c65851ce6af7d2095c04c01228657ce0198f918e64b5ccd01fa languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4, @babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/87b034dd13143904e405887e6125d76c27902563486efc66b7d9a9d8f9406b76c6ac42d7b37224014af5783d7edb465db0cdecd659fa3227baad0b3a6a35deff + checksum: 10c0/98a2e0843ddfe51443c1bfcf08ba40ad8856fd4f8e397b392a5390a54f257c8c1b9a99d8ffc0fc7e8c55cce45e2cd9c2795a4450303f48f501bcbd662de44554 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.23.3, @babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/687f24f3ec60b627fef6e87b9e2770df77f76727b9d5f54fa4c84a495bb24eb4a20f1a6240fa22d339d45aac5eaeb1b39882e941bfd00cf498f9c53478d1ec88 + checksum: 10c0/2af731d02aa4c757ef80c46df42264128cbe45bfd15e1812d1a595265b690a44ad036041c406a73411733540e1c4256d8174705ae6b8cfaf757fc175613993fd languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.23.3, @babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9f7ec036f7cfc588833a4dd117a44813b64aa4c1fd5bfb6c78f60198c1d290938213090c93a46f97a68a2490fad909e21a82b2472e95da74d108c125df21c8d5 + checksum: 10c0/71fd04e5e7026e6e52701214b1e9f7508ba371b757e5075fbb938a79235ed66a54ce65f89bb92b59159e9f03f01b392e6c4de6d255b948bec975a90cfd6809ef languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" +"@babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.23.3, @babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-simple-access": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c8840c5c9ecba39367ae17c973ed13dbc43234147b77ae780eec65010e2a9993c5d717721b23e8179f7cf49decdd325c509b241d69cfbf92aa647a1d8d5a37d + checksum: 10c0/efb3ea2047604a7eb44a9289311ebb29842fe6510ff8b66a77a60440448c65e1312a60dc48191ed98246bdbd163b5b6f3348a0669bcc0e3809e69c7c776b20fa languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-systemjs@npm:^7.23.9, @babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1926631fe9d87c0c53427a3420ad49da62d53320d0016b6afab64e5417a672aa5bdff3ea1d24746ffa1e43319c28a80f5d8cef0ad214760d399c293b5850500f + checksum: 10c0/38145f8abe8a4ce2b41adabe5d65eb7bd54a139dc58e2885fec975eb5cf247bd938c1dd9f09145c46dbe57d25dd0ef7f00a020e5eb0cbe8195b2065d51e2d93d languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.23.3, @babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f0d2f890a15b4367d0d8f160bed7062bdb145c728c24e9bfbc1211c7925aae5df72a88df3832c92dd2011927edfed4da1b1249e4c78402e893509316c0c2caa6 + checksum: 10c0/14c90c58562b54e17fe4a8ded3f627f9a993648f8378ef00cb2f6c34532032b83290d2ad54c7fff4f0c2cd49091bda780f8cc28926ec4b77a6c2141105a2e699 languageName: node linkType: hard @@ -1434,160 +1500,159 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.23.3, @babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f489b9e1f17b42b2ba6312d58351e757cb23a8409f64f2bb6af4c09d015359588a5d68943b20756f141d0931a94431c782f3ed1225228a930a04b07be0c31b04 + checksum: 10c0/c4cabe628163855f175a8799eb73d692b6f1dc347aae5022af0c253f80c92edb962e48ddccc98b691eff3d5d8e53c9a8f10894c33ba4cebc2e2f8f8fe554fb7a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bce490d22da5c87ff27fffaff6ad5a4d4979b8d7b72e30857f191e9c1e1824ba73bb8d7081166289369e388f94f0ce5383a593b1fc84d09464a062c75f824b0b + checksum: 10c0/c8532951506fb031287280cebeef10aa714f8a7cea2b62a13c805f0e0af945ba77a7c87e4bbbe4c37fe973e0e5d5e649cfac7f0374f57efc54cdf9656362a392 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.22.11, @babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-numeric-separator@npm:^7.23.4, @babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e34902da4f5588dc4812c92cb1f6a5e3e3647baf7b4623e30942f551bf1297621abec4e322ebfa50b320c987c0f34d9eb4355b3d289961d9035e2126e3119c12 + checksum: 10c0/15e2b83292e586fb4f5b4b4021d4821a806ca6de2b77d5ad6c4e07aa7afa23704e31b4d683dac041afc69ac51b2461b96e8c98e46311cc1faba54c73f235044f languageName: node linkType: hard "@babel/plugin-transform-object-assign@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-assign@npm:7.22.5" + version: 7.24.1 + resolution: "@babel/plugin-transform-object-assign@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c80ca956ccc45c68a6f35e8aea80e08c0a653e4baf243727d4258f242d312d71be20e3fad35a1f2cd9d58b30dcbb5cdf5f8d6c6614a3f8c6079d90f9b1dadee6 + checksum: 10c0/eb30beac71a5930ecdfc8740b184f22dd2043b1ac6f9f6818fb2e10ddfbdd6536b4ddb0d00af2c9f4a375823f52a566915eb598bea0633484aa5ff5db4e547fd languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.22.15, @babel/plugin-transform-object-rest-spread@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.0" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.0, @babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/02fe8b99ee6329e68b97b1b1b5410e50c6c20470e73dcd1d287c6ddb5623c654dce82327b2a3f6710ee3b512fe4950e43ab81d0bbc33d771f0cad3bc3cef87c6 + checksum: 10c0/e301f1a66b63bafc2bce885305cc88ab30ec875b5e2c7933fb7f9cbf0d954685aa10334ffcecf147ba19d6a1d7ffab37baf4ce871849d395941c56fdb3060f73 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.23.3, @babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a6856fd8c0afbe5b3318c344d4d201d009f4051e2f6ff6237ff2660593e93c5997a58772b13d639077c3e29ced3440247b29c496cd77b13af1e7559a70009775 + checksum: 10c0/d30e6b9e59a707efd7ed524fc0a8deeea046011a6990250f2e9280516683138e2d13d9c52daf41d78407bdab0378aef7478326f2a15305b773d851cb6e106157 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4, @babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4ef61812af0e4928485e28301226ce61139a8b8cea9e9a919215ebec4891b9fea2eb7a83dc3090e2679b7d7b2c8653da601fbc297d2addc54a908b315173991e + checksum: 10c0/68408b9ef772d9aa5dccf166c86dc4d2505990ce93e03dcfc65c73fb95c2511248e009ba9ccf5b96405fb85de1c16ad8291016b1cc5689ee4becb1e3050e0ae7 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" +"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.4, @babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/305b773c29ad61255b0e83ec1e92b2f7af6aa58be4cba1e3852bddaa14f7d2afd7b4438f41c28b179d6faac7eb8d4fb5530a17920294f25d459b8f84406bfbfb + checksum: 10c0/b4688795229c9e9ce978eccf979fe515eb4e8d864d2dcd696baa937c8db13e3d46cff664a3cd6119dfe60e261f5d359b10c6783effab7cc91d75d03ad7f43d05 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-parameters@npm:^7.23.3, @babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a8d4cbe0f6ba68d158f5b4215c63004fc37a1fdc539036eb388a9792017c8496ea970a1932ccb929308f61e53dc56676ed01d8df6f42bc0a85c7fd5ba82482b7 + checksum: 10c0/eee8d2f72d3ee0876dc8d85f949f4adf34685cfe36c814ebc20c96315f3891a53d43c764d636b939e34d55e6a6a4af9aa57ed0d7f9439eb5771a07277c669e55 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" +"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3, @babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/745a655edcd111b7f91882b921671ca0613079760d8c9befe336b8a9bc4ce6bb49c0c08941831c950afb1b225b4b2d3eaac8842e732db095b04db38efd8c34f4 + checksum: 10c0/d8e18587d2a8b71a795da5e8841b0e64f1525a99ad73ea8b9caa331bc271d69646e2e1e749fd634321f3df9d126070208ddac22a27ccf070566b2efb74fecd99 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-property-in-object@npm:^7.23.4, @babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8d31b28f24204b4d13514cd3a8f3033abf575b1a6039759ddd6e1d82dd33ba7281f9bc85c9f38072a665d69bfa26dc40737eefaf9d397b024654a483d2357bf5 + checksum: 10c0/33d2b9737de7667d7a1b704eef99bfecc6736157d9ea28c2e09010d5f25e33ff841c41d89a4430c5d47f4eb3384e24770fa0ec79600e1e38d6d16e2f9333b4b5 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.23.3, @babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b2549f23f90cf276c2e3058c2225c3711c2ad1c417e336d3391199445a9776dd791b83be47b2b9a7ae374b40652d74b822387e31fa5267a37bf49c122e1a9747 + checksum: 10c0/3bf3e01f7bb8215a8b6d0081b6f86fea23e3a4543b619e059a264ede028bc58cdfb0acb2c43271271915a74917effa547bc280ac636a9901fa9f2fb45623f87e languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" +"@babel/plugin-transform-react-display-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3aed142af7bd1aed1df2bdad91ed33ba1cdd5c3c67ce6eafba821ff72f129162a197ffb55f1eb1775af276abd5545934489a8257fef6c6665ddf253a4f39a939 + checksum: 10c0/adf1a3cb0df8134533a558a9072a67e34127fd489dfe431c3348a86dd41f3e74861d5d5134bbb68f61a9cdb3f7e79b2acea1346be94ce4d3328a64e5a9e09be1 languageName: node linkType: hard @@ -1603,28 +1668,28 @@ __metadata: linkType: hard "@babel/plugin-transform-react-jsx-self@npm:^7.18.6": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.22.5" + version: 7.24.1 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/263091bdede1f448cb2c59b84eb69972c15d3f022c929a75337bd20d8b65551ac38cd26dad1946eaa93289643506b10ddaea3445a28cb8fca5a773a22a0df90b + checksum: 10c0/ea362ff94b535c753f560eb1f5e063dc72bbbca17ed58837a949a7b289d5eacc7b0a28296d1932c94429b168d6040cdee5484a59b9e3c021f169e0ee137e6a27 languageName: node linkType: hard "@babel/plugin-transform-react-jsx-source@npm:^7.19.6": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.22.5" + version: 7.24.1 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/defc9debb76b4295e3617ef7795a0533dbbecef6f51bf5ba4bfc162df892a84fd39e14d5f1b9a5aad7b09b97074fef4c6756f9d2036eef5a9874acabe198f75a + checksum: 10c0/ea8e3263c0dc51fbc97c156cc647150a757cc56de10781287353d0ce9b2dcd6b6d93d573c0142d7daf5d6fb554c74fa1971ae60764924ea711161d8458739b63 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": +"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" dependencies: @@ -1639,42 +1704,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/76287adeab656fb7f39243e5ab6a8c60069cf69fffeebd1566457d56cb2f966366a23bd755d3e369f4d0437459e3b76243df370caa7d7d2287a8560b66c53ca2 + checksum: 10c0/9eb3056fcaadd63d404fd5652b2a3f693bc4758ba753fee5b5c580c7a64346eeeb94e5a4f77a99c76f3cf06d1f1ad6c227647cd0b1219efe3d00cafa5a6e7b2a languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.23.3, @babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b0e989ae5db78894ee300b24e07fbcec490c39ab48629c519377581cf94e90308f4ddc10a8914edc9f403e2d3ac7a7ae0ae09003629d852da03e2ba846299c6 + checksum: 10c0/0a333585d7c0b38d31cc549d0f3cf7c396d1d50b6588a307dc58325505ddd4f5446188bc536c4779431b396251801b3f32d6d8e87db8274bc84e8c41950737f7 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.23.3, @babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd + checksum: 10c0/936d6e73cafb2cbb495f6817c6f8463288dbc9ab3c44684b931ebc1ece24f0d55dfabc1a75ba1de5b48843d0fef448dcfdbecb8485e4014f8f41d0d1440c536f languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.24.0, @babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2": +"@babel/plugin-transform-runtime@npm:7.24.0": version: 7.24.0 resolution: "@babel/plugin-transform-runtime@npm:7.24.0" dependencies: @@ -1690,120 +1755,136 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-runtime@npm:7.24.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c423c66fec0b6503f50561741754c84366ef9e9818442c8881fbaa90cc363fd137084b9431cdc00ed2f1fd8c8a1a5982c4a7e1f2af3769db4caf2ac7ea55d4f0 + checksum: 10c0/ee01967bf405d84bd95ca4089166a18fb23fe9851a6da53dcf712a7f8ba003319996f21f320d568ec76126e18adfaee978206ccda86eef7652d47cc9a052e75e languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.23.3, @babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8273347621183aada3cf1f3019d8d5f29467ba13a75b72cb405bc7f23b7e05fd85f4edb1e4d9f0103153dddb61826a42dc24d466480d707f8932c1923a4c25fa + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.23.3, @babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a348e4ae47e4ceeceb760506ec7bf835ccc18a2cf70ec74ebfbe41bc172fa2412b05b7d1b86836f8aee375e41a04ff20486074778d0e2d19d668b33dc52e9dbb + checksum: 10c0/50a0302e344546d57e5c9f4dea575f88e084352eeac4e9a3e238c41739eef2df1daf4a7ebbb3ccb7acd3447f6a5ce9938405f98bf5f5583deceb8257f5a673c9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.23.3, @babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cd15c407906b41e4b924ea151e455c11274dba050771ee7154ad88a1a274140ac5e84efc8d08c4379f2f0cec8a09e4a0a3b2a3a954ba6a67d9fb35df1c714c56 + checksum: 10c0/786fe2ae11ef9046b9fa95677935abe495031eebf1274ad03f2054a20adea7b9dbd00336ac0b143f7924bc562e5e09793f6e8613607674b97e067d4838ccc4a0 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.23.3, @babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9b5f43788b9ffcb8f2b445a16b1aa40fcf23cb0446a4649445f098ec6b4cb751f243a535da623d59fefe48f4c40552f5621187a61811779076bab26863e3373d + checksum: 10c0/f73bcda5488eb81c6e7a876498d9e6b72be32fca5a4d9db9053491a2d1300cd27b889b463fd2558f3cd5826a85ed00f61d81b234aa55cb5a0abf1b6fa1bd5026 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.23.3, @babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/50e81d84c6059878be2a0e41e0d790cab10882cfb8fa85e8c2665ccb0b3cd7233f49197f17427bc7c1b36c80e07076640ecf1b641888d78b9cb91bc16478d84a + checksum: 10c0/d392f549bfd13414f59feecdf3fb286f266a3eb9107a9de818e57907bda56eed08d1f6f8e314d09bf99252df026a7fd4d5df839acd45078a777abcebaa9a8593 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.13.0, @babel/plugin-transform-typescript@npm:^7.23.3": - version: 7.23.5 - resolution: "@babel/plugin-transform-typescript@npm:7.23.5" +"@babel/plugin-transform-typescript@npm:^7.13.0, @babel/plugin-transform-typescript@npm:^7.24.1": + version: 7.24.4 + resolution: "@babel/plugin-transform-typescript@npm:7.24.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.23.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-typescript": "npm:^7.23.3" + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/75d6689bfdf4c9462b5fb21107c295717c9bedffe5eae8b22b0a65c9603660683d55e020df83825de13792358043bd939f48efc2b3a293b5210a608076c94934 + checksum: 10c0/fa6625046f219cdc75061025c8031ada75ef631b137f1442e3d0054ba4e63548eb12cf55e2e1f442c889aa5fdd76d0d0b7904fdf812ce4c38748446227acc798 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.23.3, @babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f1ed54742dc982666f471df5d087cfda9c6dbf7842bec2d0f7893ed359b142a38c0210358f297ab5c7a3e11ec0dfb0e523de2e2edf48b62f257aaadd5f068866 + checksum: 10c0/67a72a1ed99639de6a93aead35b1993cb3f0eb178a8991fcef48732c38c9f0279c85bbe1e2e2477b85afea873e738ff0955a35057635ce67bc149038e2d8a28e languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3, @babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dca5702d43fac70351623a12e4dfa454fd028a67498888522b644fd1a02534fabd440106897e886ebcc6ce6a39c58094ca29953b6f51bc67372aa8845a5ae49f + checksum: 10c0/d9d9752df7d51bf9357c0bf3762fe16b8c841fca9ecf4409a16f15ccc34be06e8e71abfaee1251b7d451227e70e6b873b36f86b090efdb20f6f7de5fdb6c7a05 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.23.3, @babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/df824dcca2f6e731f61d69103e87d5dd974d8a04e46e28684a4ba935ae633d876bded09b8db890fd72d0caf7b9638e2672b753671783613cc78d472951e2df8c + checksum: 10c0/6046ab38e5d14ed97dbb921bd79ac1d7ad9d3286da44a48930e980b16896db2df21e093563ec3c916a630dc346639bf47c5924a33902a06fe3bbb5cdc7ef5f2f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3, @babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/30fe1d29af8395a867d40a63a250ca89072033d9bc7d4587eeebeaf4ad7f776aab83064321bfdb1d09d7e29a1d392852361f4f60a353f0f4d1a3b435dcbf256b + checksum: 10c0/b6c1f6b90afeeddf97e5713f72575787fcb7179be7b4c961869bfbc66915f66540dc49da93e4369da15596bd44b896d1eb8a50f5e1fd907abd7a1a625901006b languageName: node linkType: hard @@ -1817,7 +1898,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.24.0, @babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2": +"@babel/preset-env@npm:7.24.0": version: 7.24.0 resolution: "@babel/preset-env@npm:7.24.0" dependencies: @@ -1907,16 +1988,107 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" + dependencies: + "@babel/compat-data": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.4" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.4" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.31.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/72a79d0cd38cb26f143509dd0c58db34b5b1ae90116863f55a404f0eb06a64a3cdcb1abd0b6435fafe463bbf55b82ffcf56aedee91e8d37797bf53e4ae74c413 + languageName: node + linkType: hard + "@babel/preset-flow@npm:^7.13.13, @babel/preset-flow@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/preset-flow@npm:7.22.15" + version: 7.24.1 + resolution: "@babel/preset-flow@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-flow-strip-types": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-transform-flow-strip-types": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7eef0c84ec1889d6c4f7a67d7d1a81703420eed123a8c23f25af148eead77907f0bd701f3e729fdb37d3ddb2a373bf43938b36a9ba17f546111ddb9521466b92 + checksum: 10c0/e2209158d68a456b8f9d6cd6c810e692f3ab8ca28edba99afcecaacd657ace7cc905e566f84d6da06e537836a2f830bc6ddf4cb34006d57303ff9a40a94fa433 languageName: node linkType: hard @@ -1933,49 +2105,49 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.22.15, @babel/preset-react@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/preset-react@npm:7.23.3" +"@babel/preset-react@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/preset-react@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-transform-react-display-name": "npm:^7.24.1" + "@babel/plugin-transform-react-jsx": "npm:^7.23.4" "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cecb2493e09fd4ffa5effcef1d06e968386b1bfe077a99834f7e8ef249208274fca62fe5a6b3986ef1c1c3900b2eb409adb528ae1b73dba31397b16f9262e83c + checksum: 10c0/a842abc5a024ed68a0ce4c1244607d40165cb6f8cf1817ebda282e470f20302d81c6a61cb41c1a31aa6c4e99ce93df4dd9e998a8ded1417c25d7480f0e14103a languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.22.5, @babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.23.2": - version: 7.23.3 - resolution: "@babel/preset-typescript@npm:7.23.3" +"@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.22.5, @babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/preset-typescript@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-typescript": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-syntax-jsx": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e72b654c7f0f08b35d7e1c0e3a59c0c13037f295c425760b8b148aa7dde01e6ddd982efc525710f997a1494fafdd55cb525738c016609e7e4d703d02014152b7 + checksum: 10c0/0033dc6fbc898ed0d8017c83a2dd5e095c82909e2f83e48cf9f305e3e9287148758c179ad90f27912cf98ca68bfec3643c57c70c0ca34d3a6c50dc8243aef406 languageName: node linkType: hard "@babel/register@npm:^7.13.16, @babel/register@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/register@npm:7.22.15" + version: 7.23.7 + resolution: "@babel/register@npm:7.23.7" dependencies: clone-deep: "npm:^4.0.1" find-cache-dir: "npm:^2.0.0" make-dir: "npm:^2.1.0" - pirates: "npm:^4.0.5" + pirates: "npm:^4.0.6" source-map-support: "npm:^0.5.16" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/895cc773c3b3eae909478ea2a9735ef6edd634b04b4aaaad2ce576fd591c2b3c70ff8c90423e769a291bee072186e7e4801480c1907e31ba3053c6cdba5571cb + checksum: 10c0/b2466e41a4394e725b57e139ba45c3f61b88546d3cb443e84ce46cb34071b60c6cdb706a14c58a1443db530691a54f51da1f0c97f6c1aecbb838a2fb7eb5dbb9 languageName: node linkType: hard @@ -1987,12 +2159,12 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.10.2": - version: 7.23.1 - resolution: "@babel/runtime-corejs3@npm:7.23.1" + version: 7.24.4 + resolution: "@babel/runtime-corejs3@npm:7.24.4" dependencies: core-js-pure: "npm:^3.30.2" regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/6e2c2b11779ff56c88b1f3a8742498640f7271ad4fcf9cfd24052bbb236a5e7c4c7c8d81cda751da3b4effa678736303deb78441c5752e63bfb90d6453fd870f + checksum: 10c0/121bec9a0b505e2995c4b71cf480167e006e8ee423f77bccc38975bfbfbfdb191192ff03557c18fad6de8f2b85c12c49aaa4b92d1d5fe0c0e136da664129be1e languageName: node linkType: hard @@ -2023,7 +2195,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.24.4 resolution: "@babel/runtime@npm:7.24.4" dependencies: @@ -2052,21 +2224,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.9, @babel/traverse@npm:^7.24.0, @babel/traverse@npm:^7.4.5": - version: 7.24.0 - resolution: "@babel/traverse@npm:7.24.0" +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.9, @babel/traverse@npm:^7.24.0, @babel/traverse@npm:^7.24.1, @babel/traverse@npm:^7.4.5": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.6" + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.0" + "@babel/parser": "npm:^7.24.1" "@babel/types": "npm:^7.24.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/55ffd2b0ce0fbd0a09051edc4def4fb1e96f35e0b100c0dc2a7429df569971ae312c290e980e423471f350961705698a257c7eea8c8304918024cc26f02468ba + checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab languageName: node linkType: hard @@ -3471,7 +3643,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -5035,7 +5207,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/addon-docs@workspace:addons/docs" dependencies: - "@babel/core": "npm:^7.12.3" + "@babel/core": "npm:^7.24.4" "@mdx-js/mdx": "npm:^3.0.0" "@mdx-js/react": "npm:^3.0.0" "@rollup/pluginutils": "npm:^5.0.2" @@ -5586,8 +5758,8 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/cli@workspace:lib/cli" dependencies: - "@babel/core": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@ndelangen/get-tarball": "npm:^3.0.7" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" @@ -5648,9 +5820,9 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/codemod@workspace:lib/codemod" dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/preset-env": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/node-logger": "workspace:*" @@ -5784,7 +5956,7 @@ __metadata: resolution: "@storybook/core-server@workspace:lib/core-server" dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" - "@babel/core": "npm:^7.23.9" + "@babel/core": "npm:^7.24.4" "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/addon-docs": "workspace:*" @@ -5871,10 +6043,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/csf-tools@workspace:lib/csf-tools" dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/generator": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" "@storybook/csf": "npm:^0.1.4" "@storybook/types": "workspace:*" "@types/fs-extra": "npm:^11.0.1" @@ -5916,7 +6088,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/docs-tools@workspace:lib/docs-tools" dependencies: - "@babel/preset-react": "npm:^7.23.3" + "@babel/preset-react": "npm:^7.24.1" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/preview-api": "workspace:*" @@ -6146,20 +6318,20 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/nextjs@workspace:frameworks/nextjs" dependencies: - "@babel/core": "npm:^7.23.2" + "@babel/core": "npm:^7.24.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.22.5" - "@babel/plugin-transform-class-properties": "npm:^7.22.5" - "@babel/plugin-transform-export-namespace-from": "npm:^7.22.11" - "@babel/plugin-transform-numeric-separator": "npm:^7.22.11" - "@babel/plugin-transform-object-rest-spread": "npm:^7.22.15" - "@babel/plugin-transform-runtime": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/preset-react": "npm:^7.22.15" - "@babel/preset-typescript": "npm:^7.23.2" - "@babel/runtime": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-runtime": "npm:^7.24.3" + "@babel/preset-env": "npm:^7.24.4" + "@babel/preset-react": "npm:^7.24.1" + "@babel/preset-typescript": "npm:^7.24.1" + "@babel/runtime": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11" "@storybook/addon-actions": "workspace:*" "@storybook/builder-webpack5": "workspace:*" @@ -10380,6 +10552,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/b2217bc8d5976cf8142453ed44daabf0b2e0e75518f24eac83b54a8892e87a88f1bd9089daa92fd25df979ecd0acfd29b6bc28c4182c1c46344cee15ef9bce84 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.8": version: 0.4.9 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.9" @@ -10393,6 +10578,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/31b92cd3dfb5b417da8dfcf0deaa4b8b032b476d7bb31ca51c66127cf25d41e89260e89d17bc004b2520faa38aa9515fafabf81d89f9d4976e9dc1163e4a7c41 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.9.0": version: 0.9.0 resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" @@ -10416,6 +10613,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/bc541037cf7620bc84ddb75a1c0ce3288f90e7d2799c070a53f8a495c8c8ae0316447becb06f958dd25dcce2a2fce855d318ecfa48036a1ddb218d55aa38a744 + languageName: node + linkType: hard + "babel-plugin-react-docgen@npm:4.2.1, babel-plugin-react-docgen@npm:^4.2.1": version: 4.2.1 resolution: "babel-plugin-react-docgen@npm:4.2.1" @@ -12227,6 +12435,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.36.1": + version: 3.37.0 + resolution: "core-js-compat@npm:3.37.0" + dependencies: + browserslist: "npm:^4.23.0" + checksum: 10c0/ca6ba7d200f7a4a850fd5cba58b40ab78139d3f301bad7b53816eafe0cfb000523e72882069ddaba440794b950ed101225668bf7b97b73e54a5e3384a8215e03 + languageName: node + linkType: hard + "core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.30.2": version: 3.33.0 resolution: "core-js-pure@npm:3.33.0" @@ -22707,7 +22924,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.5": +"pirates@npm:^4.0.6": version: 4.0.6 resolution: "pirates@npm:4.0.6" checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 From 9fc3a0fd5d792aacb1833328c1b5c861438341b8 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 23 Apr 2024 05:08:37 -0600 Subject: [PATCH 144/180] Update kitchen-sink lock files --- .../nextjs/yarn.lock | 1842 ++++++++++++----- .../react/yarn.lock | 1572 ++++++++++---- .../svelte/yarn.lock | 1502 ++++++++++---- .../vue3/yarn.lock | 1502 ++++++++++---- 4 files changed, 4529 insertions(+), 1889 deletions(-) diff --git a/test-storybooks/portable-stories-kitchen-sink/nextjs/yarn.lock b/test-storybooks/portable-stories-kitchen-sink/nextjs/yarn.lock index 99d48a7714ec..c6b4f419a9d9 100644 --- a/test-storybooks/portable-stories-kitchen-sink/nextjs/yarn.lock +++ b/test-storybooks/portable-stories-kitchen-sink/nextjs/yarn.lock @@ -50,14 +50,31 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": +"@babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" checksum: 10/088f14f646ecbddd5ef89f120a60a1b3389a50a9705d44603dca77662707d0175a5e0e0da3943c3298f1907a4ab871468656fbbf74bb7842cd8b0686b2c19736 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9": +"@babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 10/e51faec0ac8259f03cc5029d2b4a944b4fee44cb5188c11530769d5beb81f384d031dba951febc3e33dbb48ceb8045b1184f5c1ac4c5f86ab1f5e951e9aaf7af + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.9": version: 7.23.9 resolution: "@babel/core@npm:7.23.9" dependencies: @@ -80,7 +97,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": +"@babel/core@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/1e049f8df26be0fe5be36173fd7c33dfb004eeeec28152fea83c90e71784f9a6f2237296f43a2ee7d9041e2a33a05f43da48ce2d4e0cd473a682328ca07ce7e0 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": version: 7.23.6 resolution: "@babel/generator@npm:7.23.6" dependencies: @@ -92,6 +132,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10/69e1772dcf8f95baec951f422cca091d59a3f29b5eedc989ad87f7262289b94625983f6fe654302ca17aae0a32f9232332b83fcc85533311d6267b09c58b1061 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -110,7 +162,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -142,6 +194,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/86153719d98e4402f92f24d6b1be94e6b59c0236a6cc36b173a570a64b5156dbc2f16ccfe3c8485dc795524ca88acca65b14863be63049586668c45567f2acd4 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" @@ -155,9 +226,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.5.0": - version: 0.5.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -166,7 +237,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/f849e816ec4b182a3e8fa8e09ff016f88bb95259cd6b2190b815c48f83c3d3b68e973a8ec72acc5086bfe93705cbd46ec089c06476421d858597780e42235a03 + checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff languageName: node linkType: hard @@ -214,6 +285,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" + dependencies: + "@babel/types": "npm:^7.24.0" + checksum: 10/42fe124130b78eeb4bb6af8c094aa749712be0f4606f46716ce74bc18a5ea91c918c547c8bb2307a2e4b33f163e4ad2cb6a7b45f80448e624eae45b597ea3499 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -245,6 +325,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helper-plugin-utils@npm:7.24.0" + checksum: 10/dc8c7af321baf7653d93315beffee1790eb2c464b4f529273a24c8743a3f3095bf3f2d11828cb2c52d56282ef43a4bdc67a79c9ab8dd845e35d01871f3f28a0e + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -271,6 +358,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/1103b28ce0cc7fba903c21bc78035c696ff191bdbbe83c20c37030a2e10ae6254924556d942cdf8c44c48ba606a8266fdb105e6bb10945de9285f79cb1905df1 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -341,6 +441,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" + dependencies: + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + checksum: 10/54a9d0f86f2803fcc216cfa23b66b871ea0fa0a892af1c9a79075872c2437de71afbb150ed8216f30e00b19a0b9c5c9d5845173d170e1ebfbbf8887839b89dde + languageName: node + linkType: hard + "@babel/highlight@npm:^7.23.4": version: 7.23.4 resolution: "@babel/highlight@npm:7.23.4" @@ -352,6 +463,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4555124235f34403bb28f55b1de58edf598491cc181c75f8afc8fe529903cb598cd52fe3bf2faab9bc1f45c299681ef0e44eea7a848bb85c500c5a4fe13f54f6 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9": version: 7.23.9 resolution: "@babel/parser@npm:7.23.9" @@ -361,39 +484,60 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3742cc5068036287e6395269dce5a2735e6349cdc8d4b53297c75f98c580d7e1c8cb43235623999d151f2ef975d677dbc2c2357573a1855caa71c271bf3046c9 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + checksum: 10/1439e2ceec512b72f05f036503bf2c31e807d1b75ae22cf2676145e9f20740960a1c9575ea3065c6fb9f44f6b46163aab76eac513694ffa10de674e3cdd6219e languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/ec5fddc8db6de0e0082a883f21141d6f4f9f9f0bc190d662a732b5e9a506aae5d7d2337049a1bf055d7cb7add6f128036db6d4f47de5e9ac1be29e043c8b7ca8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + checksum: 10/e18235463e716ac2443938aaec3c18b40c417a1746fba0fa4c26cf4d71326b76ef26c002081ab1b445abfae98e063d561519aa55672dddc1ef80b3940211ffbb languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/3b0c9554cd0048e6e7341d7b92f29d400dbc6a5a4fc2f86dbed881d32e02ece9b55bc520387bae2eac22a5ab38a0b205c29b52b181294d99b4dd75e27309b548 + checksum: 10/3483f329bb099b438d05e5e206229ddbc1703972a69ba0240a796b5477369930b0ab2e7f6c9539ecad2cea8b0c08fa65498778b92cf87ad3d156f613de1fd2fa languageName: node linkType: hard @@ -483,25 +627,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.22.5, @babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + checksum: 10/2a463928a63b62052e9fb8f8b0018aa11a926e94f32c168260ae012afe864875c6176c6eb361e13f300542c31316dad791b08a5b8ed92436a3095c7a0e4fce65 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 10/87c8aa4a5ef931313f956871b27f2c051556f627b97ed21e9a5890ca4906b222d89062a956cde459816f5e0dec185ff128d7243d3fdc389504522acb88f0464e languageName: node linkType: hard @@ -538,6 +682,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/712f7e7918cb679f106769f57cfab0bc99b311032665c428b98f4c3e2e6d567601d45386a4f246df6a80d741e1f94192b3f008800d66c4f1daae3ad825c243f0 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -637,6 +792,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bf4bd70788d5456b5f75572e47a2e31435c7c4e43609bd4dffd2cc0c7a6cf90aabcf6cd389e351854de9a64412a07d30effef5373251fe8f6a4c9db0c0163bda + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -649,67 +815,67 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + checksum: 10/58f9aa9b0de8382f8cfa3f1f1d40b69d98cd2f52340e2391733d0af745fdddda650ba392e509bc056157c880a2f52834a38ab2c5aa5569af8c61bb6ecbf45f34 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d402494087a6b803803eb5ab46b837aab100a04c4c5148e38bfa943ea1bbfc1ecfb340f1ced68972564312d3580f550c125f452372e77607a558fbbaf98c31c0 + checksum: 10/4ccc3755a3d51544cd43575db2c5c2ef42cdcd35bd5940d13cdf23f04c75496290e79ea585a62427ec6bd508a1bffb329e01556cd1114be9b38ae4254935cd19 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + checksum: 10/429004a6596aa5c9e707b604156f49a146f8d029e31a3152b1649c0b56425264fda5fd38e5db1ddaeb33c3fe45c97dc8078d7abfafe3542a979b49f229801135 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + checksum: 10/d8e18bd57b156da1cd4d3c1780ab9ea03afed56c6824ca8e6e74f67959d7989a0e953ec370fe9b417759314f2eef30c8c437395ce63ada2e26c2f469e4704f82 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bbb965a3acdfb03559806d149efbd194ac9c983b260581a60efcb15eb9fbe20e3054667970800146d867446db1c1398f8e4ee87f4454233e49b8f8ce947bd99b + checksum: 10/4093fa109cd256e8ad0b26e3ffa67ec6dac4078a1a24b7755bed63e650cf938b2a315e01696c35b221db1a37606f93cb82696c8d1bf563c2a9845620e551736e languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": +"@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: @@ -721,116 +887,128 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/95779e9eef0c0638b9631c297d48aee53ffdbb2b1b5221bf40d7eccd566a8e34f859ff3571f8f20b9159b67f1bff7d7dc81da191c15d69fbae5a645197eae7e0 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + checksum: 10/3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb4b19e7a39871c4414fb44fc5f2cc47c78f993b74c43238dfb99c9dac2d15cb99b43f8a3d42747580e1807d2b8f5e13ce7e95e593fd839bd176aa090bf9a23 + checksum: 10/eb7f4a3d852cfa20f4efd299929c564bd2b45106ac1cf4ac8b0c87baf078d4a15c39b8a21bbb01879c1922acb9baaf3c9b150486e18d84b30129e9671639793d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e75593e02c5ea473c17839e3c9d597ce3697bf039b66afe9a4d06d086a87fb3d95850b4174476897afc351dc1b46a9ec3165ee6e8fbad3732c0d65f676f855ad + checksum: 10/62bbfe1bd508517d96ba6909e68b1adb9dfd24ea61af1f4b0aa909bfc5e476044afe9c55b10ef74508fd147aa665e818df67ece834d164a9fd69b80c9ede3875 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5abd93718af5a61f8f6a97d2ccac9139499752dd5b2c533d7556fb02947ae01b2f51d4c4f5e64df569e8783d3743270018eb1fa979c43edec7dd1377acf107ed + checksum: 10/03d9a81cd9eeb24d48e207be536d460d6ad228238ac70da9b7ad4bae799847bb3be0aecfa4ea6223752f3a8d4ada3a58cd9a0f8fc70c01fdfc87ad0618f897d3 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + checksum: 10/7f623d25b6f213b94ebc1754e9e31c1077c8e288626d8b7bfa76a97b067ce80ddcd0ede402a546706c65002c0ccf45cd5ec621511c2668eed31ebcabe8391d35 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + checksum: 10/de600a958ad146fc8aca71fd2dfa5ebcfdb97df4eaa530fc9a4b0d28d85442ddb9b7039f260b396785211e88c6817125a94c183459763c363847e8c84f318ff0 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + checksum: 10/59fc561ee40b1a69f969c12c6c5fac206226d6642213985a569dd0f99f8e41c0f4eaedebd36936c255444a8335079842274c42a975a433beadb436d4c5abb79b languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + checksum: 10/f90841fe1a1e9f680b4209121d3e2992f923e85efcd322b26e5901c180ef44ff727fb89790803a23fac49af34c1ce2e480018027c22b4573b615512ac5b6fc50 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + checksum: 10/bc710ac231919df9555331885748385c11c5e695d7271824fe56fba51dd637d48d3e5cd52e1c69f2b1a384fbbb41552572bc1ca3a2285ee29571f002e9bb2421 languageName: node linkType: hard @@ -846,86 +1024,86 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b84ef1f26a2db316237ae6d10fa7c22c70ac808ed0b8e095a8ecf9101551636cbb026bee9fb95a0a7944f3b8278ff9636a9088cb4a4ac5b84830a13829242735 + checksum: 10/befd0908c3f6b31f9fa9363a3c112d25eaa0bc4a79cfad1f0a8bb5010937188b043a44fb23443bc8ffbcc40c015bb25f80e4cc585ce5cc580708e2d56e76fe37 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + checksum: 10/31eb3c75297dda7265f78eba627c446f2324e30ec0124a645ccc3e9f341254aaa40d6787bd62b2280d77c0a5c9fbfce1da2c200ef7c7f8e0a1b16a8eb3644c6f languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + checksum: 10/f42302d42fc81ac00d14e9e5d80405eb80477d7f9039d7208e712d6bcd486a4e3b32fdfa07b5f027d6c773723d8168193ee880f93b0e430c828e45f104fb82a4 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + checksum: 10/2df94e9478571852483aca7588419e574d76bde97583e78551c286f498e01321e7dbb1d0ef67bee16e8f950688f79688809cfde370c5c4b84c14d841a3ef217a languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + checksum: 10/895f2290adf457cbf327428bdb4fb90882a38a22f729bcf0629e8ad66b9b616d2721fbef488ac00411b647489d1dda1d20171bb3772d0796bb7ef5ecf057808a languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + checksum: 10/4ea641cc14a615f9084e45ad2319f95e2fee01c77ec9789685e7e11a6c286238a426a98f9c1ed91568a047d8ac834393e06e8c82d1ff01764b7aa61bee8e9023 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/48c87dee2c7dae8ed40d16901f32c9e58be4ef87bf2c3985b51dd2e78e82081f3bad0a39ee5cf6e8909e13e954e2b4bedef0a8141922f281ed833ddb59ed9be2 + checksum: 10/5a324f7c630cf0be1f09098a3a36248c2521622f2c7ea1a44a5980f54b718f5e0dd4af92a337f4b445a8824c8d533853ebea7c16de829b8a7bc8bcca127d4d73 languageName: node linkType: hard @@ -942,29 +1120,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-simple-access": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7326a62ed5f766f93ee75684868635b59884e2801533207ea11561c296de53037949fecad4055d828fa7ebeb6cc9e55908aa3e7c13f930ded3e62ad9f24680d7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb800e5a9d0d668d7421ae3672fccff7d5f2a36621fd87414d7ece6d6f4d93627f9644cfecacae934bc65ffc131c8374242aaa400cca874dcab9b281a21aff0 + checksum: 10/565ec4518037b3d957431e29bda97b3d2fbb2e245fb5ba19889310ccb8fb71353e8ce2c325cc8d3fbc5a376d3af7d7e21782d5f502c46f8da077bee7807a590f languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e3f3af83562d687899555c7826b3faf0ab93ee7976898995b1d20cbe7f4451c55e05b0e17bfb3e549937cbe7573daf5400b752912a241b0a8a64d2457c7626e5 + checksum: 10/323bb9367e1967117a829f67788ec2ff55504b4faf8f6d83ec85d398e50b41cf7d1c375c67d63883dd7ad5e75b35c8ae776d89e422330ec0c0a1fda24e362083 languageName: node linkType: hard @@ -980,18 +1171,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + checksum: 10/e0d3af66cd0fad29c9d0e3fc65e711255e18b77e2e35bbd8f10059e3db7de6c16799ef74e704daf784950feb71e7a93c5bf2c771d98f1ca3fba1ff2e0240b24a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": version: 7.23.4 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: @@ -1003,58 +1194,69 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.22.11, @babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74025e191ceb7cefc619c15d33753aab81300a03d81b96ae249d9b599bc65878f962d608f452462d3aad5d6e334b7ab2b09a6bdcfe8d101fe77ac7aacca4261e + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + checksum: 10/3247bd7d409574fc06c59e0eb573ae7470d6d61ecf780df40b550102bb4406747d8f39dcbec57eb59406df6c565a86edd3b429e396ad02e4ce201ad92050832e languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.22.15, @babel/plugin-transform-object-rest-spread@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.3" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/656f09c4ec629856e807d5b386559166ae417ff75943abce19656b2c6de5101dfd0aaf23f9074e854339370b4e09f57518d3202457046ee5b567ded531005479 + checksum: 10/ff6eeefbc5497cf33d62dc86b797c6db0e9455d6a4945d6952f3b703d04baab048974c6573b503e0ec097b8112d3b98b5f4ee516e1b8a74ed47aebba4d9d2643 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + checksum: 10/d34d437456a54e2a5dcb26e9cf09ed4c55528f2a327c5edca92c93e9483c37176e228d00d6e0cf767f3d6fdbef45ae3a5d034a7c59337a009e20ae541c8220fa languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + checksum: 10/ff7c02449d32a6de41e003abb38537b4a1ad90b1eaa4c0b578cb1b55548201a677588a8c47f3e161c72738400ae811a6673ea7b8a734344755016ca0ac445dac languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": +"@babel/plugin-transform-optional-chaining@npm:^7.23.0": version: 7.23.4 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: @@ -1067,18 +1269,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8c36c3fc25f9daa46c4f6db47ea809c395dc4abc7f01c4b1391f6e5b0cd62b83b6016728b02a6a8ac21aca56207c9ec66daefc0336e9340976978de7e6e28df + checksum: 10/d41031b8e472b9b30aacd905a1561904bcec597dd888ad639b234971714dc9cd0dcb60df91a89219fc72e4feeb148e20f97bcddc39d7676e743ff0c23f62a7eb languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": +"@babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c289c188710cd1c60991db169d8173b6e8e05624ae61a7da0b64354100bfba9e44bc1332dd9223c4e3fe1b9cbc0c061e76e7c7b3a75c9588bf35d0ffec428070 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: @@ -1090,39 +1305,51 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7208c30bb3f3fbc73fb3a88bdcb78cd5cddaf6d523eb9d67c0c04e78f6fc6319ece89f4a5abc41777ceab16df55b3a13a4120e0efc9275ca6d2d89beaba80aa0 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/02eef2ee98fa86ee5052ed9bf0742d6d22b510b5df2fcce0b0f5615d6001f7786c6b31505e7f1c2f446406d8fb33603a5316d957cfa5b8365cbf78ddcc24fa42 + checksum: 10/466d1943960c2475c0361eba2ea72d504d4d8329a8e293af0eedd26887bf30a074515b330ea84be77331ace77efbf5533d5f04f8cff63428d2615f4a509ae7a4 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + checksum: 10/a73646d7ecd95b3931a3ead82c7d5efeb46e68ba362de63eb437d33531f294ec18bd31b6d24238cd3b6a3b919a6310c4a0ba4a2629927721d4d10b0518eb7715 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" +"@babel/plugin-transform-react-display-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7f86964e8434d3ddbd3c81d2690c9b66dbf1cd8bd9512e2e24500e9fa8cf378bc52c0853270b3b82143aba5965aec04721df7abdb768f952b44f5c6e0b198779 + checksum: 10/4cc7268652bd73a9e249db006d7278e3e90c033684e59801012311536f1ff93eb63fea845325035533aa281e428e6ec2ae0ad04659893ec1318250ddcf4a2f77 languageName: node linkType: hard @@ -1137,7 +1364,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": +"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" dependencies: @@ -1152,110 +1379,110 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9ea3698b1d422561d93c0187ac1ed8f2367e4250b10e259785ead5aa643c265830fd0f4cf5087a5bedbc4007444c06da2f2006686613220acf0949895f453666 + checksum: 10/06a6bfe80f1f36408d07dd80c48cf9f61177c8e5d814e80ddbe88cfad81a8b86b3110e1fe9d1ac943db77e74497daa7f874b5490c788707106ad26ecfbe44813 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + checksum: 10/a04319388a0a7931c3f8e15715d01444c32519692178b70deccc86d53304e74c0f589a4268f6c68578d86f75e934dd1fe6e6ed9071f54ee8379f356f88ef6e42 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + checksum: 10/132c6040c65aabae2d98a39289efb5c51a8632546dc50d2ad032c8660aec307fbed74ef499856ea4f881fc8505905f49b48e0270585da2ea3d50b75e962afd89 languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.23.2": - version: 7.23.9 - resolution: "@babel/plugin-transform-runtime@npm:7.23.9" +"@babel/plugin-transform-runtime@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-runtime@npm:7.24.3" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + "@babel/helper-module-imports": "npm:^7.24.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d942e5852f100d0de5021c4d1fda9e30c28b94aa846e09588476dd82c058fb6869a30be0cf915362bf23b5f3504aa150ca3c3b0299dbd0a86b3b1f5f744c2333 + checksum: 10/7f545c628993b527ae1cb028106168ec29873160a5d98aed947509b61e826fa52b6e2bd2c56504b4a5084555becc9841fa7842e61f822a050dd6ff5baff726ce languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + checksum: 10/006a2032d1c57dca76579ce6598c679c2f20525afef0a36e9d42affe3c8cf33c1427581ad696b519cc75dfee46c5e8ecdf0c6a29ffb14250caa3e16dd68cb424 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c6372d2f788fd71d85aba12fbe08ee509e053ed27457e6674a4f9cae41ff885e2eb88aafea8fadd0ccf990601fc69ec596fa00959e05af68a15461a8d97a548d + checksum: 10/0b60cfe2f700ec2c9c1af979bb805860258539648dadcd482a5ddfc2330b733fb61bb60266404f3e068246ad0d6376040b4f9c5ab9037a3d777624d64acd89e9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + checksum: 10/e326e96a9eeb6bb01dbc4d3362f989411490671b97f62edf378b8fb102c463a018b777f28da65344d41b22aa6efcdfa01ed43d2b11fdcf202046d3174be137c5 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + checksum: 10/4c9009c72321caf20e3b6328bbe9d7057006c5ae57b794cf247a37ca34d87dfec5e27284169a16df5a6235a083bf0f3ab9e1bfcb005d1c8b75b04aed75652621 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + checksum: 10/3dda5074abf8b5df9cdef697d6ebe14a72c199bd6c2019991d033d9ad91b0be937b126b8f34c3c5a9725afee9016a3776aeef3e3b06ab9b3f54f2dd5b5aefa37 languageName: node linkType: hard @@ -1273,72 +1500,87 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-typescript@npm:^7.24.1": + version: 7.24.4 + resolution: "@babel/plugin-transform-typescript@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + checksum: 10/e8d66fbafd6cbfeca2ebe77c4fc67537be9e01813f835ce097fa91329b0cd7ba587a9cf4c4a1df661cdde438741cb3c63d2ab95c97354eb89d7682a4d99bea5d languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d39041ff6b0cef78271ebe88be6dfd2882a3c6250a54ddae783f1b9adc815e8486a7d0ca054fabfa3fde1301c531d5be89224999fc7be83ff1eda9b77d173051 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + checksum: 10/276099b4483e707f80b054e2d29bc519158bfe52461ef5ff76f70727d592df17e30b1597ef4d8a0f04d810f6cb5a8dd887bdc1d0540af3744751710ef280090f languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + checksum: 10/400a0927bdb1425b4c0dc68a61b5b2d7d17c7d9f0e07317a1a6a373c080ef94be1dd65fdc4ac9a78fcdb58f89fd128450c7bc0d5b8ca0ae7eca3fbd98e50acba languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + checksum: 10/364342fb8e382dfaa23628b88e6484dc1097e53fb7199f4d338f1e2cd71d839bb0a35a9b1380074f6a10adb2e98b79d53ca3ec78c0b8c557ca895ffff42180df languageName: node linkType: hard -"@babel/preset-env@npm:^7.23.2": - version: 7.23.9 - resolution: "@babel/preset-env@npm:7.23.9" +"@babel/preset-env@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" dependencies: - "@babel/compat-data": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.4" "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1350,63 +1592,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.8" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.6" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.4" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.4" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.23.4" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0214ac9434a2496eac7f56c0c91164421232ff2083a66e1ccab633ca91e262828e54a5cbdb9036e8fe53d53530b6597aa98c99de8ff07b5193ffd95f21dc9d2c + checksum: 10/3d5cbdc2501bc1959fc76ed9d409d0ee5264bc475fa809958fd2e8e7db9b12f8eccdae750a0e05d25207373c42ca115b42bb3d5c743bc770cb12b6af05bf3bd8 languageName: node linkType: hard @@ -1436,23 +1678,23 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.22.15": - version: 7.23.3 - resolution: "@babel/preset-react@npm:7.23.3" +"@babel/preset-react@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/preset-react@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-transform-react-display-name": "npm:^7.24.1" + "@babel/plugin-transform-react-jsx": "npm:^7.23.4" "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/ef6aef131b2f36e2883e9da0d832903643cb3c9ad4f32e04fb3eecae59e4221d583139e8d8f973e25c28d15aafa6b3e60fe9f25c5fd09abd3e2df03b8637bdd2 + checksum: 10/a796c609ace7d58a56b42b6630cdd9e1d896ce2f8b35331b9ea040eaaf3cc9aa99cd2614e379a27c10410f34e89355e2739c7097e8065ce5e40900a77b13d716 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.23.2": +"@babel/preset-typescript@npm:^7.23.0": version: 7.23.3 resolution: "@babel/preset-typescript@npm:7.23.3" dependencies: @@ -1467,6 +1709,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/preset-typescript@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-syntax-jsx": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-typescript": "npm:^7.24.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ba774bd427c9f376769ddbc2723f5801a6b30113a7c3aaa14c36215508e347a527fdae98cfc294f0ecb283d800ee0c1f74e66e38e84c9bc9ed2fe6ed50dcfaf8 + languageName: node + linkType: hard + "@babel/register@npm:^7.22.15": version: 7.23.7 resolution: "@babel/register@npm:7.23.7" @@ -1489,7 +1746,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": version: 7.23.9 resolution: "@babel/runtime@npm:7.23.9" dependencies: @@ -1498,6 +1755,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/runtime@npm:7.24.4" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10/8ec8ce2c145bc7e31dd39ab66df124f357f65c11489aefacb30f431bae913b9aaa66aa5efe5321ea2bf8878af3fcee338c87e7599519a952e3a6f83aa1b03308 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": version: 7.23.9 resolution: "@babel/template@npm:7.23.9" @@ -1509,7 +1775,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.9": +"@babel/template@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" + dependencies: + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10/8c538338c7de8fac8ada691a5a812bdcbd60bd4a4eb5adae2cc9ee19773e8fb1a724312a00af9e1ce49056ffd3c3475e7287b5668cf6360bfb3f8ac827a06ffe + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.9": version: 7.23.9 resolution: "@babel/traverse@npm:7.23.9" dependencies: @@ -1527,6 +1804,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" + dependencies: + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/b9b0173c286ef549e179f3725df3c4958069ad79fe5b9840adeb99692eb4a5a08db4e735c0f086aab52e7e08ec711cee9e7c06cb908d8035641d1382172308d3 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.23.9 resolution: "@babel/types@npm:7.23.9" @@ -1538,6 +1833,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 10/a0b4875ce2e132f9daff0d5b27c7f4c4fcc97f2b084bdc5834e92c9d32592778489029e65d99d00c406da612d87b72d7a236c0afccaa1435c028d0c94c9b6da4 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -2269,6 +2575,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" @@ -2283,6 +2600,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + "@jridgewell/source-map@npm:^0.3.3": version: 0.3.5 resolution: "@jridgewell/source-map@npm:0.3.5" @@ -2310,6 +2634,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + languageName: node + linkType: hard + "@mdx-js/react@npm:^3.0.0": version: 3.0.1 resolution: "@mdx-js/react@npm:3.0.1" @@ -2396,136 +2730,393 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.2.2": - version: 14.2.2 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.2" - conditions: os=win32 & cpu=x64 +"@next/swc-win32-x64-msvc@npm:14.2.2": + version: 14.2.2 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.11": + version: 0.5.11 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" + dependencies: + ansi-html-community: "npm:^0.0.8" + common-path-prefix: "npm:^3.0.0" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + find-up: "npm:^5.0.0" + html-entities: "npm:^2.1.0" + loader-utils: "npm:^2.0.4" + schema-utils: "npm:^3.0.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 4.x || 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <5.0.0" + webpack: ">=4.43.0 <6.0.0" + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10/ee7eff63ef930c8ec37b341d12f180598a5173938a5b8d1d7c53306eab10b3f3f23adcba4824e5a93ddcd0cf185a90baa0b6f483f27a320dd86ad61941940eb6 + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10/2b93e161d3fdabe9a64919def7fa3ceaecf2848341e9211520c401181c9eaebb8451c630b066fad2256e5c639c95edc41de0ba59c40eff37e799918d019822d1 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-context@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a02187a3bae3a0f1be5fab5ad19c1ef06ceff1028d957e4d9994f0186f594a9c3d93ee34bacb86d1fa8eb274493362944398e1c17054d12cb3b75384f9ae564b + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/adbd7301586db712616a0f8dd54a25e7544853cbf61b5d6e279215d479f57ac35157847ee424d54a7e707969a926ca0a7c28934400c9ac224bd0c7cc19229aca + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-escape-keydown": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/f1626d69bb50ec226032bb7d8c5abaaf7359c2d7660309b0ed3daaedd91f30717573aac1a1cb82d589b7f915cf464b95a12da0a3b91b6acfefb6fbbc62b992de + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-focus-guards@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/1f8ca8f83b884b3612788d0742f3f054e327856d90a39841a47897dbed95e114ee512362ae314177de226d05310047cabbf66b686ae86ad1b65b6b295be24ef7 + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-focus-scope@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/3590e74c6b682737c7ac4bf8db41b3df7b09a0320f3836c619e487df9915451e5dafade9923a74383a7366c59e9436f5fff4301d70c0d15928e0e16b36e58bc9 languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@radix-ui/react-id@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-id@npm:1.0.1" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/446a453d799cc790dd2a1583ff8328da88271bff64530b5a17c102fa7fb35eece3cf8985359d416f65e330cd81aa7b8fe984ea125fc4f4eaf4b3801d698e49fe languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 +"@radix-ui/react-portal@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-portal@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c4cf35e2f26a89703189d0eef3ceeeb706ae0832e98e558730a5e929ca7c72c7cb510413a24eca94c7732f8d659a1e81942bec7b90540cb73ce9e4885d040b64 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/406f0b5a54ea4e7881e15bddc3863234bb14bf3abd4a6e56ea57c6df6f9265a9ad5cfa158e3a98614f0dcbbb7c5f537e1f7158346e57cc3f29b522d62cf28823 languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/bedb934ac07c710dc5550a7bfc7065d47e099d958cde1d37e4b1947ae5451f1b7e6f8ff5965e242578bf2c619065e6038c3a3aa779e5eafa7da3e3dbc685799f languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff +"@radix-ui/react-use-callback-ref@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b9fd39911c3644bbda14a84e4fca080682bef84212b8d8931fcaa2d2814465de242c4cfd8d7afb3020646bead9c5e539d478cea0a7031bee8a8a3bb164f3bc4c languageName: node linkType: hard -"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.11": - version: 0.5.11 - resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" +"@radix-ui/react-use-controllable-state@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" dependencies: - ansi-html-community: "npm:^0.0.8" - common-path-prefix: "npm:^3.0.0" - core-js-pure: "npm:^3.23.3" - error-stack-parser: "npm:^2.0.6" - find-up: "npm:^5.0.0" - html-entities: "npm:^2.1.0" - loader-utils: "npm:^2.0.4" - schema-utils: "npm:^3.0.0" - source-map: "npm:^0.7.3" + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: - "@types/webpack": 4.x || 5.x - react-refresh: ">=0.10.0 <1.0.0" - sockjs-client: ^1.4.0 - type-fest: ">=0.17.0 <5.0.0" - webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: - "@types/webpack": - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: + "@types/react": optional: true - checksum: 10/ee7eff63ef930c8ec37b341d12f180598a5173938a5b8d1d7c53306eab10b3f3f23adcba4824e5a93ddcd0cf185a90baa0b6f483f27a320dd86ad61941940eb6 + checksum: 10/dee2be1937d293c3a492cb6d279fc11495a8f19dc595cdbfe24b434e917302f9ac91db24e8cc5af9a065f3f209c3423115b5442e65a5be9fd1e9091338972be9 languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" +"@radix-ui/react-use-escape-keydown@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + checksum: 10/c6ed0d9ce780f67f924980eb305af1f6cce2a8acbaf043a58abe0aa3cc551d9aa76ccee14531df89bbee302ead7ecc7fce330886f82d4672c5eda52f357ef9b8 languageName: node linkType: hard -"@radix-ui/react-slot@npm:^1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 + checksum: 10/bed9c7e8de243a5ec3b93bb6a5860950b0dba359b6680c84d57c7a655e123dec9b5891c5dfe81ab970652e7779fe2ad102a23177c7896dde95f7340817d47ae5 languageName: node linkType: hard @@ -2563,7 +3154,7 @@ __metadata: "@storybook/addon-actions@file:../../../code/addons/actions::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-actions@file:../../../code/addons/actions#../../../code/addons/actions::hash=6004d9&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-actions@file:../../../code/addons/actions#../../../code/addons/actions::hash=966388&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" @@ -2571,37 +3162,39 @@ __metadata: dequal: "npm:^2.0.2" polished: "npm:^4.2.2" uuid: "npm:^9.0.0" - checksum: 10/c8bfd628f1ff4a5472b63b7126842eed94a7b8c93f65fee3bfff9a8db71ae45ea63ee7d656b42f29355729f787366e14d434abb75402645a5d0b80d48e1bbc90 + checksum: 10/ed9d4c392a62f9869255be32f64ca2b02184f5ff8bc5af66c92d9268e5dca24cb96bb80b422f853d2638ad89ff227675b8c2f644d11c8f2a24a37ff23793cd9b languageName: node linkType: hard "@storybook/addon-backgrounds@file:../../../code/addons/backgrounds::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-backgrounds@file:../../../code/addons/backgrounds#../../../code/addons/backgrounds::hash=445bce&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-backgrounds@file:../../../code/addons/backgrounds#../../../code/addons/backgrounds::hash=01e510&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" memoizerific: "npm:^1.11.3" ts-dedent: "npm:^2.0.0" - checksum: 10/7f2c66b7516beeeb976d227f27f0cebd600ac5d3abada7d5e01c30d10cc053059f15b607cb78f1c2d03c82a8294fb61598cbca41c3c5f3cf432e79587d4d15a2 + checksum: 10/ab6d7c92ac90fcd6791f49313394c19499b0b7e9683e1e3ea09842a939bbe85559ba9638194934cb128721a32c9b3397baf13ed6aabdac2b6128e48512b295af languageName: node linkType: hard "@storybook/addon-controls@file:../../../code/addons/controls::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-controls@file:../../../code/addons/controls#../../../code/addons/controls::hash=784f9c&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-controls@file:../../../code/addons/controls#../../../code/addons/controls::hash=85cf2f&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/blocks": "workspace:*" + dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" - checksum: 10/6e4db5b470f526bb357af93fd6757fe8d4976f4fdb1c3856b828f408780e27645038bdc70e318de40f8fc069a359d4d822ada860df8cffd41daf5506b5468642 + checksum: 10/2c33ed89e175f9a998776f653d1f9f7231465fb7db5cf647c9e3d1d93f35837e64ff3e723265d4cd1fa1b3e7a25b5163b79b0c99faa3d23fc0ff0c9905c634d2 languageName: node linkType: hard "@storybook/addon-docs@file:../../../code/addons/docs::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-docs@file:../../../code/addons/docs#../../../code/addons/docs::hash=9453ad&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-docs@file:../../../code/addons/docs#../../../code/addons/docs::hash=1316f0&locator=portable-stories-nextjs%40workspace%3A." dependencies: - "@babel/core": "npm:^7.12.3" + "@babel/core": "npm:^7.24.4" "@mdx-js/react": "npm:^3.0.0" "@storybook/blocks": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2621,13 +3214,13 @@ __metadata: rehype-external-links: "npm:^3.0.0" rehype-slug: "npm:^6.0.0" ts-dedent: "npm:^2.0.0" - checksum: 10/ab4de80de2f39340299317bebaf82598557655052bc1e55bd7ffc31b6ab91a3605f734991666d0cf3b18f0d0c411e2fc117aec76bdfe197854f1085c1e9bde3d + checksum: 10/e7f7fba777e2a06ceba3930da615587902410ee765776c02f7ae1be4864aca8990397c192064ab10ed1c67a40943d0e07b6833670d5a2b71c92c4ee74eb54659 languageName: node linkType: hard "@storybook/addon-essentials@file:../../../code/addons/essentials::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-essentials@file:../../../code/addons/essentials#../../../code/addons/essentials::hash=80691b&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-essentials@file:../../../code/addons/essentials#../../../code/addons/essentials::hash=716654&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/addon-actions": "workspace:*" "@storybook/addon-backgrounds": "workspace:*" @@ -2643,22 +3236,22 @@ __metadata: "@storybook/node-logger": "workspace:*" "@storybook/preview-api": "workspace:*" ts-dedent: "npm:^2.0.0" - checksum: 10/0479f4d2f488ab30b371fd9f2bd5c12b7dcd029aac9a1f8f774701886d941b63c0ec4f50c221469ea220582ce4720d7386b9458cf15a29bf2c03eb51a6c70d13 + checksum: 10/c1b11269a0da8289306c112b360d2bb6f050aa99a5263be79fdc776bd519bf2a38a5c5659f6050b308f19a80c2862d6df56b7b679639d0ddf445bd7ca97850da languageName: node linkType: hard "@storybook/addon-highlight@file:../../../code/addons/highlight::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-highlight@file:../../../code/addons/highlight#../../../code/addons/highlight::hash=7ee0d6&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-highlight@file:../../../code/addons/highlight#../../../code/addons/highlight::hash=993b1b&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" - checksum: 10/1e7db616fd4ddc6dd32583e6aff3df57d0ff001d2a5de8f990de53625d041b9f09bc6ec729accd0b528f24d54a954e10677bfbeeed07e938c00cbaed1d19c5b9 + checksum: 10/ab5eb230218718bfcf5505096d0745bb561c4109579e4c476d78ec7f73908e0decf292d21c4a635d98e369fc42a33d476649f2f8279b2ad7b9da69c32bc50368 languageName: node linkType: hard "@storybook/addon-interactions@file:../../../code/addons/interactions::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-interactions@file:../../../code/addons/interactions#../../../code/addons/interactions::hash=41e54e&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-interactions@file:../../../code/addons/interactions#../../../code/addons/interactions::hash=397921&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" "@storybook/instrumenter": "workspace:*" @@ -2666,49 +3259,49 @@ __metadata: "@storybook/types": "workspace:*" polished: "npm:^4.2.2" ts-dedent: "npm:^2.2.0" - checksum: 10/064652b4c5ed667349beef06dae49684bd28bc743c109077d46e7070336e536e09b9a117bd3cf501c9e11244c699a5ef5b4ac5f576178a9a8daee5882dd5d04d + checksum: 10/b5ef21d4cc4c68de5b4bde6e2eba1b4ac149dfb49e0af3d963f40715c5b7b9ac065118e16edb3de26b78fc2ce4510ecbbef5229b0794b48c5f194a840e54704e languageName: node linkType: hard "@storybook/addon-measure@file:../../../code/addons/measure::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-measure@file:../../../code/addons/measure#../../../code/addons/measure::hash=1bf2c0&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-measure@file:../../../code/addons/measure#../../../code/addons/measure::hash=29247d&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" tiny-invariant: "npm:^1.3.1" - checksum: 10/dbb3076c99da811d94598070cb57ed19b2a00c875668fc8d586f93d59585b6f2485f04998f61294cd037b43f8d03f21b53d1918c73d1bb9c8652bf6aa6737530 + checksum: 10/5e576ded94bd8b8f36f907073c7e1cbc3d3307763b685e2dac8298f099841fe846c9e0105e64f82ab9996adc94f962cea7406e300bb6b1ba75b01ffcce8af3ec languageName: node linkType: hard "@storybook/addon-outline@file:../../../code/addons/outline::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-outline@file:../../../code/addons/outline#../../../code/addons/outline::hash=2a387b&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-outline@file:../../../code/addons/outline#../../../code/addons/outline::hash=86d290&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" ts-dedent: "npm:^2.0.0" - checksum: 10/bc58cf5bb670333b33fa2c2414b17b0bf97ffdf92bafe89eef04f1965479f7833c388087ebb478f152780c9119f8795ae169125291419fd7e74d11cbb1410540 + checksum: 10/aee8785f7f242e0fb23070d7b31b64b922205b367f32d89d1ee3898469456a192a53377de5df67bcb024e92efdfc39e168bb7c5f9dc6bb3198854b56666a3d57 languageName: node linkType: hard "@storybook/addon-toolbars@file:../../../code/addons/toolbars::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-toolbars@file:../../../code/addons/toolbars#../../../code/addons/toolbars::hash=dba398&locator=portable-stories-nextjs%40workspace%3A." - checksum: 10/14efee7b4f58d0ee846a71aa6d614a0927a80e32c90f677325e17d0d2402ed38effc226a69c9856073dbb809d84c4c7606c339f99be6b46a6a12e0f3ce2f075b + resolution: "@storybook/addon-toolbars@file:../../../code/addons/toolbars#../../../code/addons/toolbars::hash=2a1821&locator=portable-stories-nextjs%40workspace%3A." + checksum: 10/a03029b1e981a4e06e299e9c1181d36e23db739c1b1b8efd5ff181a6e3d9577d790ac69a3f10fc5b9580a95c193eee3e241f8a354022eddbaa8e2d81f3f75584 languageName: node linkType: hard "@storybook/addon-viewport@file:../../../code/addons/viewport::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/addon-viewport@file:../../../code/addons/viewport#../../../code/addons/viewport::hash=939ad5&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/addon-viewport@file:../../../code/addons/viewport#../../../code/addons/viewport::hash=f175c3&locator=portable-stories-nextjs%40workspace%3A." dependencies: memoizerific: "npm:^1.11.3" - checksum: 10/ab29c073f7d3ce1e9466672441885600429ebbba1742bc2eb0f8656853f25d9a0d86ff865f41a5b76f0809d6929a955cbc7dba716d3834887300fd3813bfa045 + checksum: 10/64f618b94952b6ff6f6db7357610c732663db5f95dfc3f72c21cf80317c827a18e9eebf3ca24f5b27426ac97628bb16bb15314f5f624ccc3e1219614a891ee3c languageName: node linkType: hard "@storybook/blocks@file:../../../code/ui/blocks::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/blocks@file:../../../code/ui/blocks#../../../code/ui/blocks::hash=e528b8&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/blocks@file:../../../code/ui/blocks#../../../code/ui/blocks::hash=8fb5e1&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2742,13 +3335,13 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/8c5b561b365792c9cb0fbd556c20a6a69ae3e894be43b9251bf131f5b4a542b2734c981d8164992ce0cf0cc70ee8643bcdb30a09d0860c7d1a8fccff3404f79e + checksum: 10/714a875998da26fdc67047b372f4b79e20a59357fe6aa66444fef83ee827cba14a70c02e423b9867b96b3156705398c0a57c3f7b449bff0605169153530467de languageName: node linkType: hard "@storybook/builder-manager@file:../../../code/builders/builder-manager::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/builder-manager@file:../../../code/builders/builder-manager#../../../code/builders/builder-manager::hash=cdb753&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/builder-manager@file:../../../code/builders/builder-manager#../../../code/builders/builder-manager::hash=1cb036&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@fal-works/esbuild-plugin-global-externals": "npm:^2.1.2" "@storybook/core-common": "workspace:*" @@ -2764,13 +3357,13 @@ __metadata: fs-extra: "npm:^11.1.0" process: "npm:^0.11.10" util: "npm:^0.12.4" - checksum: 10/32bdfc42175480e59defece1f67634d40d2d039668c81e372736ac6990b2144cdd2676f9f9859250fbb5d7855cd12729f0107a64a07e32eb6a9704daf76d816b + checksum: 10/d3a768b0b42d2537605b3b7832b21f6ebd9a5c6d207c6925db6ef3adb647a4af23bd42dbe86546d4ef18d2b13fa408da03ff06a8639ed0cf0c2c4cdcec5cdf1a languageName: node linkType: hard "@storybook/builder-webpack5@file:../../../code/builders/builder-webpack5::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/builder-webpack5@file:../../../code/builders/builder-webpack5#../../../code/builders/builder-webpack5::hash=097abc&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/builder-webpack5@file:../../../code/builders/builder-webpack5#../../../code/builders/builder-webpack5::hash=136502&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2809,29 +3402,29 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/82379d860d3065157ad2033724299128efa169fd831d1002b2aba10232e9ae8dd93a788aae0522b8ad0cb6472754e298568f44e341154b94530f16f6683cd475 + checksum: 10/8861a56b17ba33f3d60a993612ba641b12721fa67edddf2bb0274091463a9b875090d5cfd149198e1c4d2baadb96fcd435ddbcfc82b02525dbb67e4ea57348ae languageName: node linkType: hard "@storybook/channels@file:../../../code/lib/channels::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/channels@file:../../../code/lib/channels#../../../code/lib/channels::hash=c002e8&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/channels@file:../../../code/lib/channels#../../../code/lib/channels::hash=fcc84e&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" telejson: "npm:^7.2.0" tiny-invariant: "npm:^1.3.1" - checksum: 10/011d5c3631e39ecb2e0bee1d18c238d27a3b2523f674775ced4a187b589a3165504f2e685b77334347f01c415fb07b2ecf748ad0ad12c926b188a8450db6e5b2 + checksum: 10/ef037acc097c4018b7481776d677a5c93da9bb886b2548ab1fa5bf2de8c3e39be627f7a5751af9b8758837582ee7db872a025c02f5e00f29d253cd17828eb8ce languageName: node linkType: hard "@storybook/cli@file:../../../code/lib/cli::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/cli@file:../../../code/lib/cli#../../../code/lib/cli::hash=4c4245&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/cli@file:../../../code/lib/cli#../../../code/lib/cli::hash=652a32&locator=portable-stories-nextjs%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@ndelangen/get-tarball": "npm:^3.0.7" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" @@ -2869,26 +3462,26 @@ __metadata: bin: getstorybook: ./bin/index.js sb: ./bin/index.js - checksum: 10/6e3c6c9e15ddafb9444d51c973b5fa83b11d57943dd339cfaa5f51386b1590da12e43cc84f15707080d69cee3edbef79d9dac8d18a0ed4a9c950f180b52e239e + checksum: 10/a28b1d90beb3e8a3666823ff15b8ae4476fea15080e4e688834f684fe46917e06e6f9c1fd3c09d513d2a872ca3bd302a7a7bf76a4a0812e892d786ca29a1c451 languageName: node linkType: hard "@storybook/client-logger@file:../../../code/lib/client-logger::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/client-logger@file:../../../code/lib/client-logger#../../../code/lib/client-logger::hash=3fcc66&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/client-logger@file:../../../code/lib/client-logger#../../../code/lib/client-logger::hash=28d039&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/global": "npm:^5.0.0" - checksum: 10/b9659c0914a46c81a0c8b2ab88741832504b4d87da0e785219ea5182154690d5d37107b42923143f598f36bf263b15a6f4dfa14522bdcada8abd97a581981ca3 + checksum: 10/5e11f5b9da08fe9be5be72b1bba63643444aee54b1bfb02b54281d8c5c757f791e5c2a45e7447c605a57ea787d9070384233b7d315f3fe16ac9e3c6e16dd4164 languageName: node linkType: hard "@storybook/codemod@file:../../../code/lib/codemod::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/codemod@file:../../../code/lib/codemod#../../../code/lib/codemod::hash=1c69c7&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/codemod@file:../../../code/lib/codemod#../../../code/lib/codemod::hash=f630a3&locator=portable-stories-nextjs%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/preset-env": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/node-logger": "workspace:*" @@ -2901,14 +3494,15 @@ __metadata: prettier: "npm:^3.1.1" recast: "npm:^0.23.5" tiny-invariant: "npm:^1.3.1" - checksum: 10/7a45f976805757518ab87011b5708999e4c4692911cbdfa721f662167d61f8aff1a75ced263cc0842187cd16195a2a46816a638c4e89d878bd9af182fb0d4b95 + checksum: 10/9c9e913b2bc43edc260a7957b6d88b95c1db6c3502227cd5f5c4ff8eb815d68fb2050ecab86bd8629c60a90ab384ac6d77006242bc6fbfbce9e632c59a9a73d2 languageName: node linkType: hard "@storybook/components@file:../../../code/ui/components::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/components@file:../../../code/ui/components#../../../code/ui/components::hash=609416&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/components@file:../../../code/ui/components#../../../code/ui/components::hash=59b042&locator=portable-stories-nextjs%40workspace%3A." dependencies: + "@radix-ui/react-dialog": "npm:^1.0.5" "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" "@storybook/csf": "npm:^0.1.4" @@ -2921,13 +3515,13 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/adb48901ccd03c10b6c64b8b902372a8044355a2d4c5e3c396e1b2015c8cab610d04459fe8e1b603a0ef372f27ac68e0e6595c3b701e9c6488a47d1070642276 + checksum: 10/67fcb9cf30da426ce2d5bbf6eaaecd27d7116c711bf4e9d57d79538cd430dca1d5a4d4d5fc396e558f880553d86b43b57c420f20e9516846208716ce514da265 languageName: node linkType: hard "@storybook/core-common@file:../../../code/lib/core-common::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/core-common@file:../../../code/lib/core-common#../../../code/lib/core-common::hash=c9ae25&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/core-common@file:../../../code/lib/core-common#../../../code/lib/core-common::hash=3637bb&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/core-events": "workspace:*" "@storybook/csf-tools": "workspace:*" @@ -2963,25 +3557,27 @@ __metadata: peerDependenciesMeta: prettier: optional: true - checksum: 10/55582fc9caefb8c87cf2367b64acecf11ac266fb0c28f26bdf4ca161f11ecfb1876cde9106f49e68ec112267c58624a21041c5c790bc275a213f1621e16fcc85 + checksum: 10/444a8a07b4be1b80c65efaacedb81c59e69f954c8e8c77c7dbdf27a536f8dc44802d9684ece23266953b8849789f64d756daef02f4617203aa097464b3065863 languageName: node linkType: hard "@storybook/core-events@file:../../../code/lib/core-events::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/core-events@file:../../../code/lib/core-events#../../../code/lib/core-events::hash=47f752&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/core-events@file:../../../code/lib/core-events#../../../code/lib/core-events::hash=80b42e&locator=portable-stories-nextjs%40workspace%3A." dependencies: + "@storybook/csf": "npm:^0.1.4" ts-dedent: "npm:^2.0.0" - checksum: 10/40f34bd3746cc94ecb5f8f3fcc516c9f7bd8fc12f48977fdf3987a0e9f0c5306235657c731d379b16f3de4fe0d53754b67196608009b06927d57eed8f44a89ae + checksum: 10/614b861c1761ab86274f580c08d7c6841fe179cc475cc4c80ec4295549d6c842ff07bebf52351d0e7aedf9a027ddb6590ec76bca5ba80a4505dcaaea42fbc09f languageName: node linkType: hard "@storybook/core-server@file:../../../code/lib/core-server::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/core-server@file:../../../code/lib/core-server#../../../code/lib/core-server::hash=d5e086&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/core-server@file:../../../code/lib/core-server#../../../code/lib/core-server::hash=82fafe&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" - "@babel/core": "npm:^7.23.9" + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/builder-manager": "workspace:*" "@storybook/channels": "workspace:*" @@ -2998,16 +3594,16 @@ __metadata: "@storybook/telemetry": "workspace:*" "@storybook/types": "workspace:*" "@types/detect-port": "npm:^1.3.0" + "@types/diff": "npm:^5.0.9" "@types/node": "npm:^18.0.0" "@types/pretty-hrtime": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" better-opn: "npm:^3.0.2" chalk: "npm:^4.1.0" - cjs-module-lexer: "npm:^1.2.3" cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" - es-module-lexer: "npm:^1.5.0" + diff: "npm:^5.2.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -3025,47 +3621,47 @@ __metadata: util-deprecate: "npm:^1.0.2" watchpack: "npm:^2.2.0" ws: "npm:^8.2.3" - checksum: 10/c1e7052671b91921fafaf7a2faccc0b7a80d870f44a8c36753b455f514952cd8b8b281e2a7486957ca32d2100d2143cc913b3e8542624c84074df92567903a76 + checksum: 10/630a8a4a9b0bf4c9912e4bf295df09a52f4f04976a82b212979e9f24e9b42480d37ca828fbcefbfce1409406e6225bc4e2e681ac4f7fe60626218e2b5e1fea04 languageName: node linkType: hard "@storybook/core-webpack@file:../../../code/lib/core-webpack::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/core-webpack@file:../../../code/lib/core-webpack#../../../code/lib/core-webpack::hash=c7e54c&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/core-webpack@file:../../../code/lib/core-webpack#../../../code/lib/core-webpack::hash=51f292&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/core-common": "workspace:*" "@storybook/node-logger": "workspace:*" "@storybook/types": "workspace:*" "@types/node": "npm:^18.0.0" ts-dedent: "npm:^2.0.0" - checksum: 10/4bebf551445b0567fd2f47d5827839c6f8f0c8ffb4bb0968a4ffe20a3704a6cfe6928447b6bedbb3bcb95bd574f9a87184692d17e9f23eef16aebf2348ddd599 + checksum: 10/2aa3e59de39aeb2d32054fca48323e67057b3a57f17831584fcffea420833b668152edfd018e845f36995e5d50a15bd68a9f42c47da73e3be10149ee3ed13296 languageName: node linkType: hard "@storybook/csf-plugin@file:../../../code/lib/csf-plugin::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/csf-plugin@file:../../../code/lib/csf-plugin#../../../code/lib/csf-plugin::hash=af3a0b&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/csf-plugin@file:../../../code/lib/csf-plugin#../../../code/lib/csf-plugin::hash=959b31&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/csf-tools": "workspace:*" unplugin: "npm:^1.3.1" - checksum: 10/675bedecfbd0d0deffa986ee402ef9aabc74ea3d91ee1c30d02d297ba3dc262bb148d59cfdcfe331ab920c1dde904df808c1f74f51a7feb46b90a7860ccd4ab9 + checksum: 10/cd08a6fcfa7df93e1a2cad0e2d069a66fb4bf983132ed79cc0c6e410adb469f47e2f3d93742b4183ffe9bee2b9bd22493b42665e36b9f54e5194f9c7edebae28 languageName: node linkType: hard "@storybook/csf-tools@file:../../../code/lib/csf-tools::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/csf-tools@file:../../../code/lib/csf-tools#../../../code/lib/csf-tools::hash=672378&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/csf-tools@file:../../../code/lib/csf-tools#../../../code/lib/csf-tools::hash=25e230&locator=portable-stories-nextjs%40workspace%3A." dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/generator": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" "@storybook/csf": "npm:^0.1.4" "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.5" ts-dedent: "npm:^2.0.0" - checksum: 10/c3d29f831bfc4a1d404a25301140e5f9bb364e080dd10429e72f3576a3581005788c3ce5c7c50fd1ba012a3dd0f469880250872a799ba202edf3e441e2af8b57 + checksum: 10/ff70e6f6613a353423d84d2aaa09bf9c14a8eae1d9711bd35883931886a5ce489b17de8dcf042bfd798f8746ce3cba26cbbeba88b2252cbcacb326b301c131ba languageName: node linkType: hard @@ -3096,7 +3692,7 @@ __metadata: "@storybook/docs-tools@file:../../../code/lib/docs-tools::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/docs-tools@file:../../../code/lib/docs-tools#../../../code/lib/docs-tools::hash=f77653&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/docs-tools@file:../../../code/lib/docs-tools#../../../code/lib/docs-tools::hash=51a276&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" @@ -3106,7 +3702,7 @@ __metadata: assert: "npm:^2.1.0" doctrine: "npm:^3.0.0" lodash: "npm:^4.17.21" - checksum: 10/55545067636d51223718c53d31f6fb7b9724793c4da7a8034517f1eb152c59799bcbf1da4a24ceb30ace46b074ad4d543d66aa4cbdb438f4160dd2f9769c03f0 + checksum: 10/f6ed72e99322458ab189b667640d4612a3726db7b28fbcc25fa98ef89d20cb3377e776e3192866eca143823c2618406c0cda5dba1904ef461d79abebd4dcc5ab languageName: node linkType: hard @@ -3129,7 +3725,7 @@ __metadata: "@storybook/instrumenter@file:../../../code/lib/instrumenter::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/instrumenter@file:../../../code/lib/instrumenter#../../../code/lib/instrumenter::hash=cdd3b4&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/instrumenter@file:../../../code/lib/instrumenter#../../../code/lib/instrumenter::hash=8415dd&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -3138,13 +3734,13 @@ __metadata: "@storybook/preview-api": "workspace:*" "@vitest/utils": "npm:^1.3.1" util: "npm:^0.12.4" - checksum: 10/040d6c9b45ba8a021deb572ae198e31d12a0bdce95846abaa6d603e7db6cfeb7c2e9f28d7fafdcc4b358a2c4e836436958fc92792388e6cc3adeffca978d9c46 + checksum: 10/d04c25681234640b52bc1cce890d985bb06e69053038dfb16f46e5da2b9a634517d903e8e04d943e340acd884dd0ac54c5c2b0bd53a645ce00d0b73d429fdf9e languageName: node linkType: hard "@storybook/manager-api@file:../../../code/lib/manager-api::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/manager-api@file:../../../code/lib/manager-api#../../../code/lib/manager-api::hash=70ba3e&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/manager-api@file:../../../code/lib/manager-api#../../../code/lib/manager-api::hash=8452a7&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -3161,34 +3757,34 @@ __metadata: store2: "npm:^2.14.2" telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" - checksum: 10/c5d0635ce2e725ee4640801afc1ca21120eb5af398f0a466f1bdfdb87dbbdc7d97ce3aabe9dcc53ee0b210cc4631d23ec01960cc72d6f768ee6657e3f2966095 + checksum: 10/057ae6e615270b4ce7c3ae23ed22d5642f5c2bba1a6d1486ceba407ef09e03eae604ee59cdd1425a44023c19cf1a7106d95c77c07859ef801bcf74f900be31db languageName: node linkType: hard "@storybook/manager@file:../../../code/ui/manager::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/manager@file:../../../code/ui/manager#../../../code/ui/manager::hash=a2a1d4&locator=portable-stories-nextjs%40workspace%3A." - checksum: 10/315ddc6341701e89d0fb17b42acd32b754aafcf05b37b96b1202b58a415bc0b822601fd8d2fbfd4eaac9f76bda89af4041c555374ae12c6abac60cc3d486f813 + resolution: "@storybook/manager@file:../../../code/ui/manager#../../../code/ui/manager::hash=443ad8&locator=portable-stories-nextjs%40workspace%3A." + checksum: 10/b2e3fbd4455622dea0a484aff7f8d702029450722d3edb333dc9a2e9dda5cbcf8c09e43528d094da87e6ebd786997d33f4fd2f6756d49debd884db1853e2a0b6 languageName: node linkType: hard "@storybook/nextjs@file:../../../code/frameworks/nextjs::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/nextjs@file:../../../code/frameworks/nextjs#../../../code/frameworks/nextjs::hash=ecd7b3&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/nextjs@file:../../../code/frameworks/nextjs#../../../code/frameworks/nextjs::hash=4bedef&locator=portable-stories-nextjs%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.2" + "@babel/core": "npm:^7.24.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.22.5" - "@babel/plugin-transform-class-properties": "npm:^7.22.5" - "@babel/plugin-transform-export-namespace-from": "npm:^7.22.11" - "@babel/plugin-transform-numeric-separator": "npm:^7.22.11" - "@babel/plugin-transform-object-rest-spread": "npm:^7.22.15" - "@babel/plugin-transform-runtime": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/preset-react": "npm:^7.22.15" - "@babel/preset-typescript": "npm:^7.23.2" - "@babel/runtime": "npm:^7.23.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-runtime": "npm:^7.24.3" + "@babel/preset-env": "npm:^7.24.4" + "@babel/preset-react": "npm:^7.24.1" + "@babel/preset-typescript": "npm:^7.24.1" + "@babel/runtime": "npm:^7.24.4" "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11" "@storybook/addon-actions": "workspace:*" "@storybook/builder-webpack5": "workspace:*" @@ -3234,20 +3830,20 @@ __metadata: optional: true webpack: optional: true - checksum: 10/891ddb3195346b52cd70bc7fa9abaf8c58eca580bd0d46414b1ae3ac9867792b3b806b7fc0f514b7e7ea777709fae57903463f9910fa4c4afff6da6b64487f31 + checksum: 10/bd08fb9ff000d4d03277dcadc2e242ece5113b9651d53b015921717da406a3c79d99cf160b2a3eb6fbc228dbb74d2f16c231cf0bc7344ebab7f331a47f6f6dce languageName: node linkType: hard "@storybook/node-logger@file:../../../code/lib/node-logger::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/node-logger@file:../../../code/lib/node-logger#../../../code/lib/node-logger::hash=d94edd&locator=portable-stories-nextjs%40workspace%3A." - checksum: 10/1095793116385c3d2247349869659cd7147094c2a77efa4cd925a051a0d03742563d74dd7cbc578e1de9a06d0637247a06bcafa665c43cb2f482240f3bb178af + resolution: "@storybook/node-logger@file:../../../code/lib/node-logger#../../../code/lib/node-logger::hash=9c930a&locator=portable-stories-nextjs%40workspace%3A." + checksum: 10/d0ad16cb66cf3fc9ae142413aa39bf7d985af6713f34beefe76f2742aa34e35707bbcf63b7660006d2c8b66be07f6e8f4838bc3d4e9218ed32f00f0e4caf68ca languageName: node linkType: hard "@storybook/preset-react-webpack@file:../../../code/presets/react-webpack::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/preset-react-webpack@file:../../../code/presets/react-webpack#../../../code/presets/react-webpack::hash=3d1792&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/preset-react-webpack@file:../../../code/presets/react-webpack#../../../code/presets/react-webpack::hash=b22678&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/core-webpack": "workspace:*" "@storybook/docs-tools": "workspace:*" @@ -3270,13 +3866,13 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/77a6a3b5ee2db73619642b72aa8976bf54cbc454c5aa781b6499bf55694b0f28fc4bed4f3e683d4e4964646ce793e5054a567d5d789ac5d5fd5d09794490b9a3 + checksum: 10/b3f09572a4497aabac169ff9f252b5d697351f112fc8ad47591546a504ed23ced549c60998073ebf924c868eb0a45c2e23ea8dca8a8803e066a989977416967f languageName: node linkType: hard "@storybook/preview-api@file:../../../code/lib/preview-api::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/preview-api@file:../../../code/lib/preview-api#../../../code/lib/preview-api::hash=ad0fb2&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/preview-api@file:../../../code/lib/preview-api#../../../code/lib/preview-api::hash=c6c7d0&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -3292,14 +3888,14 @@ __metadata: tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10/b6da482ccf3c0a502876d3b662a641dad102166cc55816d4f7a0e05b9a10907255f77db13a418dc272912a59136e0ddac4c518653aaa6ee7f79387fd4008c4e9 + checksum: 10/f3f4b245024f4ad1a55b932815ae0c7da9f75a83e98f4d2103d09a239a16f4378bbcb191cb67a0a882d2dd755be3133c6baf82fe446af7e165f1476c606966e5 languageName: node linkType: hard "@storybook/preview@file:../../../code/lib/preview::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/preview@file:../../../code/lib/preview#../../../code/lib/preview::hash=edab9e&locator=portable-stories-nextjs%40workspace%3A." - checksum: 10/96674966bbea60cff6399f3bc44fdcb57d765fae1d55b6c1eab0dfadc3a4c36ee55a26ba04762dab5ab0f57e86c5ac45e57bf90fa5a41e716f75877b4b3b617a + resolution: "@storybook/preview@file:../../../code/lib/preview#../../../code/lib/preview::hash=97910c&locator=portable-stories-nextjs%40workspace%3A." + checksum: 10/765d33b8bbe183caf21dba08a93d96cfd4059b3267a7835464eeeffac1cab946ade3c4193185374b644c7abb630be54d36886a019fc94ffbaad82d8bb6f7eb4d languageName: node linkType: hard @@ -3323,11 +3919,11 @@ __metadata: "@storybook/react-dom-shim@file:../../../code/lib/react-dom-shim::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/react-dom-shim@file:../../../code/lib/react-dom-shim#../../../code/lib/react-dom-shim::hash=3e505c&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/react-dom-shim@file:../../../code/lib/react-dom-shim#../../../code/lib/react-dom-shim::hash=f93b2f&locator=portable-stories-nextjs%40workspace%3A." peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/983e0f5f9dc3449173eb42e8a98a65fbac1247cf8b2f102b3438eec53ff4fdce51c84b0eb7aa7a34f002600e84a17c632397290e9614a8bb8d363fa0cb68a01a + checksum: 10/8f3a8451ae416d1b006910553477b48929f397f777e7bad1997c9f3d6edc9b8fb1911f5f21c17d687ae50e01423f8010ad4c7c48d50b73bc59259b1babb0134e languageName: node linkType: hard @@ -3369,18 +3965,18 @@ __metadata: "@storybook/router@file:../../../code/lib/router::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/router@file:../../../code/lib/router#../../../code/lib/router::hash=bd2ec4&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/router@file:../../../code/lib/router#../../../code/lib/router::hash=e80678&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/client-logger": "workspace:*" memoizerific: "npm:^1.11.3" qs: "npm:^6.10.0" - checksum: 10/226f011fb5068ed708650f9e6ff2cbf8fdf84dd7eee43dfdeb36c828aca0551a78f53f6e6fadf0c477a74b8f9c70a66c6c6ef637e5bf2684c4a8e46e74ba58ae + checksum: 10/93eb90aa2440b0a1b8533d3a51709d47f5cda489b604cf84926d382dd49286a1c9a1167f4b15c2764c9791033ea8cd288005541c72ef21b7a62dc33d89fbe151 languageName: node linkType: hard "@storybook/telemetry@file:../../../code/lib/telemetry::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/telemetry@file:../../../code/lib/telemetry#../../../code/lib/telemetry::hash=9296ee&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/telemetry@file:../../../code/lib/telemetry#../../../code/lib/telemetry::hash=cf20f8&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/client-logger": "workspace:*" "@storybook/core-common": "workspace:*" @@ -3390,13 +3986,13 @@ __metadata: fetch-retry: "npm:^5.0.2" fs-extra: "npm:^11.1.0" read-pkg-up: "npm:^7.0.1" - checksum: 10/0c7be274ef3ee1108857d012827ef3c0ceec404f11c4e3a7c2cadd69245737d8e46678ea30c581d2b52dbf0980f9893d4521f96330b335b702d07224c837f068 + checksum: 10/0e5c4cffe47aa7d5066b17a6504821dcffde1540aaf99ef072c29e787a7a07d2ea5bb5b1aa222d83d0b4f174129ae22d52a579e58cc3cc36b4452eadf1b85001 languageName: node linkType: hard "@storybook/test@file:../../../code/lib/test::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/test@file:../../../code/lib/test#../../../code/lib/test::hash=76eeb0&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/test@file:../../../code/lib/test#../../../code/lib/test::hash=865200&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" @@ -3408,13 +4004,13 @@ __metadata: "@vitest/expect": "npm:1.3.1" "@vitest/spy": "npm:^1.3.1" util: "npm:^0.12.4" - checksum: 10/739ea1586f3925a7e791f397e42f9ae2c1994df173e200a757700c2039af2eae7ee36c8aad163d69a46c716ccec73b7a6930f8c2aaa05429de45f2638bc76054 + checksum: 10/1adbfa7043d22c19bfc0a5899082752f622e2b25b15a564e4f71b753834d4300a3b9ec3964445cab62fb1224e78f0d1297a4a0865860f90039df297f2145984f languageName: node linkType: hard "@storybook/theming@file:../../../code/lib/theming::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/theming@file:../../../code/lib/theming#../../../code/lib/theming::hash=444382&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/theming@file:../../../code/lib/theming#../../../code/lib/theming::hash=5ce8f7&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.1" "@storybook/client-logger": "workspace:*" @@ -3428,18 +4024,18 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/fce2b08b28299dab7ebb21b2e66153bfa1fa592f55bdf40893f34618fa95e89839b3acd752a62065278148886bc144c272b330285f555ebfebeaceb996456f56 + checksum: 10/728b8c02ee168b384efcd376b9c90ce3e46ab301a7a58347669b2ac0ec71aba6f87238f1f5bbb4116d2f7d6c0a66abd514baddce2e30ffce61952852e94842ec languageName: node linkType: hard "@storybook/types@file:../../../code/lib/types::locator=portable-stories-nextjs%40workspace%3A.": version: 8.1.0-alpha.7 - resolution: "@storybook/types@file:../../../code/lib/types#../../../code/lib/types::hash=40be7e&locator=portable-stories-nextjs%40workspace%3A." + resolution: "@storybook/types@file:../../../code/lib/types#../../../code/lib/types::hash=23f842&locator=portable-stories-nextjs%40workspace%3A." dependencies: "@storybook/channels": "workspace:*" "@types/express": "npm:^4.7.0" file-system-cache: "npm:2.3.0" - checksum: 10/e05ca8e0de199b56817d274a3543fd2a18412cf574604c1dc2943dd77c1c5578e22b9704b005785922c32340fdb897cc536ccecbf5e02d61ef58d5d654fa97f2 + checksum: 10/27a50c8aa554c766a89eed019e7cb343777549015c19b8dd8bb84c2db72e2dc11ebacb55610173afd0fc97dc400f946b3f09ebd3e0123ee5cce014d3b37cebce languageName: node linkType: hard @@ -3622,6 +4218,13 @@ __metadata: languageName: node linkType: hard +"@types/diff@npm:^5.0.9": + version: 5.2.0 + resolution: "@types/diff@npm:5.2.0" + checksum: 10/e1d3e6e9fd9d5386496c8716dd89316288d139cd8159a064f886a079149d05d65289b7b725ce1e333d4e77ce8024e210c6e281e9875a636fc17b4c760c2cf85f + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -4698,6 +5301,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/df4bc15423aaaba3729a7d40abcbf6d3fffa5b8fd5eb33d3ac8b7da0110c47552fca60d97f2e1edfbb68a27cae1da499f1c3896966efb3e26aac4e3b57e3cc8b + languageName: node + linkType: hard + "aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -4868,39 +5480,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.8 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.8" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/6b5a79bdc1c43edf857fd3a82966b3c7ff4a90eee00ca8d663e0a98304d6e285a05759d64a4dbc16e04a2a5ea1f248673d8bf789711be5e694e368f19884887c + checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.9.0": - version: 0.9.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" +"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" - core-js-compat: "npm:^3.34.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/efdf9ba82e7848a2c66e0522adf10ac1646b16f271a9006b61a22f976b849de22a07c54c8826887114842ccd20cc9a4617b61e8e0789227a74378ab508e715cd + checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.5": - version: 0.5.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/3a9b4828673b23cd648dcfb571eadcd9d3fadfca0361d0a7c6feeb5a30474e92faaa49f067a6e1c05e49b6a09812879992028ff3ef3446229ff132d6e1de7eb6 + checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -5167,7 +5779,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.22.3": +"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -5768,7 +6380,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": +"core-js-compat@npm:^3.31.0": version: 3.36.0 resolution: "core-js-compat@npm:3.36.0" dependencies: @@ -5777,6 +6389,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.36.1": + version: 3.37.0 + resolution: "core-js-compat@npm:3.37.0" + dependencies: + browserslist: "npm:^4.23.0" + checksum: 10/5f33d7ba45acc9ceb45544d844090edfd14e46a64c2424df24084347405182c1156588cc3a877fc580c005a0b13b8a1af26bb6c73fe73f22eede89b5483b482d + languageName: node + linkType: hard + "core-js-pure@npm:^3.23.3": version: 3.36.0 resolution: "core-js-pure@npm:3.36.0" @@ -6239,6 +6860,13 @@ __metadata: languageName: node linkType: hard +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10/e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-package-manager@npm:^2.0.1": version: 2.0.1 resolution: "detect-package-manager@npm:2.0.1" @@ -6268,6 +6896,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -7494,6 +8129,13 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10/ad5104871d114a694ecc506a2d406e2331beccb961fe1e110dc25556b38bcdbf399a823a8a375976cd8889668156a9561e12ebe3fa6a4c6ba169c8466c2ff868 + languageName: node + linkType: hard + "get-npm-tarball-url@npm:^2.0.3": version: 2.1.0 resolution: "get-npm-tarball-url@npm:2.1.0" @@ -8117,6 +8759,15 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10/cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -9432,7 +10083,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -11209,6 +11860,58 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll-bar@npm:^2.3.3": + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5ab8eda61d5b10825447d11e9c824486c929351a471457c22452caa19b6898e18c3af6a46c3fa68010c713baed1eb9956106d068b4a1058bdcf97a1a9bbed734 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.5": + version: 2.5.5 + resolution: "react-remove-scroll@npm:2.5.5" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f0646ac384ce3852d1f41e30a9f9e251b11cf3b430d1d114c937c8fa7f90a895c06378d0d6b6ff0b2d00cbccf15e845921944fd6074ae67a0fb347a718106d88 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/80c58fd6aac3594e351e2e7b048d8a5b09508adb21031a38b3c40911fe58295572eddc640d4b20a7be364842c8ed1120fe30097e22ea055316b375b88d4ff02a + languageName: node + linkType: hard + "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0, react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -12682,7 +13385,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -12996,6 +13699,37 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.0": + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/3be76eae71b52ab233b4fde974eddeff72e67e6723100a0c0297df4b0d60daabedfa706ffb314d0a52645f2c1235e50fdbd53d99f374eb5df68c74d412e98a9b + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ec99e31aefeb880f6dc4d02cb19a01d123364954f857811470ece32872f70d6c3eadbe4d073770706a9b7db6136f2a9fbf1bb803e07fbb21e936a47479281690 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" diff --git a/test-storybooks/portable-stories-kitchen-sink/react/yarn.lock b/test-storybooks/portable-stories-kitchen-sink/react/yarn.lock index e56c0e31080a..0629b1e9f6ed 100644 --- a/test-storybooks/portable-stories-kitchen-sink/react/yarn.lock +++ b/test-storybooks/portable-stories-kitchen-sink/react/yarn.lock @@ -50,14 +50,31 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": +"@babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" checksum: 10/088f14f646ecbddd5ef89f120a60a1b3389a50a9705d44603dca77662707d0175a5e0e0da3943c3298f1907a4ab871468656fbbf74bb7842cd8b0686b2c19736 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9": +"@babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 10/e51faec0ac8259f03cc5029d2b4a944b4fee44cb5188c11530769d5beb81f384d031dba951febc3e33dbb48ceb8045b1184f5c1ac4c5f86ab1f5e951e9aaf7af + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9": version: 7.23.9 resolution: "@babel/core@npm:7.23.9" dependencies: @@ -80,7 +97,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": +"@babel/core@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/1e049f8df26be0fe5be36173fd7c33dfb004eeeec28152fea83c90e71784f9a6f2237296f43a2ee7d9041e2a33a05f43da48ce2d4e0cd473a682328ca07ce7e0 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": version: 7.23.6 resolution: "@babel/generator@npm:7.23.6" dependencies: @@ -92,6 +132,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10/69e1772dcf8f95baec951f422cca091d59a3f29b5eedc989ad87f7262289b94625983f6fe654302ca17aae0a32f9232332b83fcc85533311d6267b09c58b1061 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -110,7 +162,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -142,6 +194,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/86153719d98e4402f92f24d6b1be94e6b59c0236a6cc36b173a570a64b5156dbc2f16ccfe3c8485dc795524ca88acca65b14863be63049586668c45567f2acd4 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" @@ -155,9 +226,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.5.0": - version: 0.5.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -166,7 +237,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/f849e816ec4b182a3e8fa8e09ff016f88bb95259cd6b2190b815c48f83c3d3b68e973a8ec72acc5086bfe93705cbd46ec089c06476421d858597780e42235a03 + checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff languageName: node linkType: hard @@ -214,6 +285,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.1": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" + dependencies: + "@babel/types": "npm:^7.24.0" + checksum: 10/42fe124130b78eeb4bb6af8c094aa749712be0f4606f46716ce74bc18a5ea91c918c547c8bb2307a2e4b33f163e4ad2cb6a7b45f80448e624eae45b597ea3499 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -245,6 +325,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helper-plugin-utils@npm:7.24.0" + checksum: 10/dc8c7af321baf7653d93315beffee1790eb2c464b4f529273a24c8743a3f3095bf3f2d11828cb2c52d56282ef43a4bdc67a79c9ab8dd845e35d01871f3f28a0e + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -271,6 +358,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/1103b28ce0cc7fba903c21bc78035c696ff191bdbbe83c20c37030a2e10ae6254924556d942cdf8c44c48ba606a8266fdb105e6bb10945de9285f79cb1905df1 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -341,6 +441,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" + dependencies: + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + checksum: 10/54a9d0f86f2803fcc216cfa23b66b871ea0fa0a892af1c9a79075872c2437de71afbb150ed8216f30e00b19a0b9c5c9d5845173d170e1ebfbbf8887839b89dde + languageName: node + linkType: hard + "@babel/highlight@npm:^7.23.4": version: 7.23.4 resolution: "@babel/highlight@npm:7.23.4" @@ -352,6 +463,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4555124235f34403bb28f55b1de58edf598491cc181c75f8afc8fe529903cb598cd52fe3bf2faab9bc1f45c299681ef0e44eea7a848bb85c500c5a4fe13f54f6 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9": version: 7.23.9 resolution: "@babel/parser@npm:7.23.9" @@ -361,39 +484,60 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3742cc5068036287e6395269dce5a2735e6349cdc8d4b53297c75f98c580d7e1c8cb43235623999d151f2ef975d677dbc2c2357573a1855caa71c271bf3046c9 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + checksum: 10/1439e2ceec512b72f05f036503bf2c31e807d1b75ae22cf2676145e9f20740960a1c9575ea3065c6fb9f44f6b46163aab76eac513694ffa10de674e3cdd6219e languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/ec5fddc8db6de0e0082a883f21141d6f4f9f9f0bc190d662a732b5e9a506aae5d7d2337049a1bf055d7cb7add6f128036db6d4f47de5e9ac1be29e043c8b7ca8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + checksum: 10/e18235463e716ac2443938aaec3c18b40c417a1746fba0fa4c26cf4d71326b76ef26c002081ab1b445abfae98e063d561519aa55672dddc1ef80b3940211ffbb languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/3b0c9554cd0048e6e7341d7b92f29d400dbc6a5a4fc2f86dbed881d32e02ece9b55bc520387bae2eac22a5ab38a0b205c29b52b181294d99b4dd75e27309b548 + checksum: 10/3483f329bb099b438d05e5e206229ddbc1703972a69ba0240a796b5477369930b0ab2e7f6c9539ecad2cea8b0c08fa65498778b92cf87ad3d156f613de1fd2fa languageName: node linkType: hard @@ -483,25 +627,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + checksum: 10/2a463928a63b62052e9fb8f8b0018aa11a926e94f32c168260ae012afe864875c6176c6eb361e13f300542c31316dad791b08a5b8ed92436a3095c7a0e4fce65 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 10/87c8aa4a5ef931313f956871b27f2c051556f627b97ed21e9a5890ca4906b222d89062a956cde459816f5e0dec185ff128d7243d3fdc389504522acb88f0464e languageName: node linkType: hard @@ -649,67 +793,67 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + checksum: 10/58f9aa9b0de8382f8cfa3f1f1d40b69d98cd2f52340e2391733d0af745fdddda650ba392e509bc056157c880a2f52834a38ab2c5aa5569af8c61bb6ecbf45f34 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d402494087a6b803803eb5ab46b837aab100a04c4c5148e38bfa943ea1bbfc1ecfb340f1ced68972564312d3580f550c125f452372e77607a558fbbaf98c31c0 + checksum: 10/4ccc3755a3d51544cd43575db2c5c2ef42cdcd35bd5940d13cdf23f04c75496290e79ea585a62427ec6bd508a1bffb329e01556cd1114be9b38ae4254935cd19 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + checksum: 10/429004a6596aa5c9e707b604156f49a146f8d029e31a3152b1649c0b56425264fda5fd38e5db1ddaeb33c3fe45c97dc8078d7abfafe3542a979b49f229801135 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + checksum: 10/d8e18bd57b156da1cd4d3c1780ab9ea03afed56c6824ca8e6e74f67959d7989a0e953ec370fe9b417759314f2eef30c8c437395ce63ada2e26c2f469e4704f82 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bbb965a3acdfb03559806d149efbd194ac9c983b260581a60efcb15eb9fbe20e3054667970800146d867446db1c1398f8e4ee87f4454233e49b8f8ce947bd99b + checksum: 10/4093fa109cd256e8ad0b26e3ffa67ec6dac4078a1a24b7755bed63e650cf938b2a315e01696c35b221db1a37606f93cb82696c8d1bf563c2a9845620e551736e languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": +"@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: @@ -721,116 +865,128 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/95779e9eef0c0638b9631c297d48aee53ffdbb2b1b5221bf40d7eccd566a8e34f859ff3571f8f20b9159b67f1bff7d7dc81da191c15d69fbae5a645197eae7e0 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + checksum: 10/3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb4b19e7a39871c4414fb44fc5f2cc47c78f993b74c43238dfb99c9dac2d15cb99b43f8a3d42747580e1807d2b8f5e13ce7e95e593fd839bd176aa090bf9a23 + checksum: 10/eb7f4a3d852cfa20f4efd299929c564bd2b45106ac1cf4ac8b0c87baf078d4a15c39b8a21bbb01879c1922acb9baaf3c9b150486e18d84b30129e9671639793d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e75593e02c5ea473c17839e3c9d597ce3697bf039b66afe9a4d06d086a87fb3d95850b4174476897afc351dc1b46a9ec3165ee6e8fbad3732c0d65f676f855ad + checksum: 10/62bbfe1bd508517d96ba6909e68b1adb9dfd24ea61af1f4b0aa909bfc5e476044afe9c55b10ef74508fd147aa665e818df67ece834d164a9fd69b80c9ede3875 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5abd93718af5a61f8f6a97d2ccac9139499752dd5b2c533d7556fb02947ae01b2f51d4c4f5e64df569e8783d3743270018eb1fa979c43edec7dd1377acf107ed + checksum: 10/03d9a81cd9eeb24d48e207be536d460d6ad228238ac70da9b7ad4bae799847bb3be0aecfa4ea6223752f3a8d4ada3a58cd9a0f8fc70c01fdfc87ad0618f897d3 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + checksum: 10/7f623d25b6f213b94ebc1754e9e31c1077c8e288626d8b7bfa76a97b067ce80ddcd0ede402a546706c65002c0ccf45cd5ec621511c2668eed31ebcabe8391d35 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + checksum: 10/de600a958ad146fc8aca71fd2dfa5ebcfdb97df4eaa530fc9a4b0d28d85442ddb9b7039f260b396785211e88c6817125a94c183459763c363847e8c84f318ff0 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + checksum: 10/59fc561ee40b1a69f969c12c6c5fac206226d6642213985a569dd0f99f8e41c0f4eaedebd36936c255444a8335079842274c42a975a433beadb436d4c5abb79b languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + checksum: 10/f90841fe1a1e9f680b4209121d3e2992f923e85efcd322b26e5901c180ef44ff727fb89790803a23fac49af34c1ce2e480018027c22b4573b615512ac5b6fc50 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + checksum: 10/bc710ac231919df9555331885748385c11c5e695d7271824fe56fba51dd637d48d3e5cd52e1c69f2b1a384fbbb41552572bc1ca3a2285ee29571f002e9bb2421 languageName: node linkType: hard @@ -846,86 +1002,86 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b84ef1f26a2db316237ae6d10fa7c22c70ac808ed0b8e095a8ecf9101551636cbb026bee9fb95a0a7944f3b8278ff9636a9088cb4a4ac5b84830a13829242735 + checksum: 10/befd0908c3f6b31f9fa9363a3c112d25eaa0bc4a79cfad1f0a8bb5010937188b043a44fb23443bc8ffbcc40c015bb25f80e4cc585ce5cc580708e2d56e76fe37 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + checksum: 10/31eb3c75297dda7265f78eba627c446f2324e30ec0124a645ccc3e9f341254aaa40d6787bd62b2280d77c0a5c9fbfce1da2c200ef7c7f8e0a1b16a8eb3644c6f languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + checksum: 10/f42302d42fc81ac00d14e9e5d80405eb80477d7f9039d7208e712d6bcd486a4e3b32fdfa07b5f027d6c773723d8168193ee880f93b0e430c828e45f104fb82a4 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + checksum: 10/2df94e9478571852483aca7588419e574d76bde97583e78551c286f498e01321e7dbb1d0ef67bee16e8f950688f79688809cfde370c5c4b84c14d841a3ef217a languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + checksum: 10/895f2290adf457cbf327428bdb4fb90882a38a22f729bcf0629e8ad66b9b616d2721fbef488ac00411b647489d1dda1d20171bb3772d0796bb7ef5ecf057808a languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + checksum: 10/4ea641cc14a615f9084e45ad2319f95e2fee01c77ec9789685e7e11a6c286238a426a98f9c1ed91568a047d8ac834393e06e8c82d1ff01764b7aa61bee8e9023 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/48c87dee2c7dae8ed40d16901f32c9e58be4ef87bf2c3985b51dd2e78e82081f3bad0a39ee5cf6e8909e13e954e2b4bedef0a8141922f281ed833ddb59ed9be2 + checksum: 10/5a324f7c630cf0be1f09098a3a36248c2521622f2c7ea1a44a5980f54b718f5e0dd4af92a337f4b445a8824c8d533853ebea7c16de829b8a7bc8bcca127d4d73 languageName: node linkType: hard @@ -942,29 +1098,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-simple-access": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7326a62ed5f766f93ee75684868635b59884e2801533207ea11561c296de53037949fecad4055d828fa7ebeb6cc9e55908aa3e7c13f930ded3e62ad9f24680d7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb800e5a9d0d668d7421ae3672fccff7d5f2a36621fd87414d7ece6d6f4d93627f9644cfecacae934bc65ffc131c8374242aaa400cca874dcab9b281a21aff0 + checksum: 10/565ec4518037b3d957431e29bda97b3d2fbb2e245fb5ba19889310ccb8fb71353e8ce2c325cc8d3fbc5a376d3af7d7e21782d5f502c46f8da077bee7807a590f languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e3f3af83562d687899555c7826b3faf0ab93ee7976898995b1d20cbe7f4451c55e05b0e17bfb3e549937cbe7573daf5400b752912a241b0a8a64d2457c7626e5 + checksum: 10/323bb9367e1967117a829f67788ec2ff55504b4faf8f6d83ec85d398e50b41cf7d1c375c67d63883dd7ad5e75b35c8ae776d89e422330ec0c0a1fda24e362083 languageName: node linkType: hard @@ -980,18 +1149,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + checksum: 10/e0d3af66cd0fad29c9d0e3fc65e711255e18b77e2e35bbd8f10059e3db7de6c16799ef74e704daf784950feb71e7a93c5bf2c771d98f1ca3fba1ff2e0240b24a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": version: 7.23.4 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: @@ -1003,58 +1172,69 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74025e191ceb7cefc619c15d33753aab81300a03d81b96ae249d9b599bc65878f962d608f452462d3aad5d6e334b7ab2b09a6bdcfe8d101fe77ac7aacca4261e + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + checksum: 10/3247bd7d409574fc06c59e0eb573ae7470d6d61ecf780df40b550102bb4406747d8f39dcbec57eb59406df6c565a86edd3b429e396ad02e4ce201ad92050832e languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.3" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/656f09c4ec629856e807d5b386559166ae417ff75943abce19656b2c6de5101dfd0aaf23f9074e854339370b4e09f57518d3202457046ee5b567ded531005479 + checksum: 10/ff6eeefbc5497cf33d62dc86b797c6db0e9455d6a4945d6952f3b703d04baab048974c6573b503e0ec097b8112d3b98b5f4ee516e1b8a74ed47aebba4d9d2643 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + checksum: 10/d34d437456a54e2a5dcb26e9cf09ed4c55528f2a327c5edca92c93e9483c37176e228d00d6e0cf767f3d6fdbef45ae3a5d034a7c59337a009e20ae541c8220fa languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + checksum: 10/ff7c02449d32a6de41e003abb38537b4a1ad90b1eaa4c0b578cb1b55548201a677588a8c47f3e161c72738400ae811a6673ea7b8a734344755016ca0ac445dac languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": +"@babel/plugin-transform-optional-chaining@npm:^7.23.0": version: 7.23.4 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: @@ -1067,18 +1247,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8c36c3fc25f9daa46c4f6db47ea809c395dc4abc7f01c4b1391f6e5b0cd62b83b6016728b02a6a8ac21aca56207c9ec66daefc0336e9340976978de7e6e28df + checksum: 10/d41031b8e472b9b30aacd905a1561904bcec597dd888ad639b234971714dc9cd0dcb60df91a89219fc72e4feeb148e20f97bcddc39d7676e743ff0c23f62a7eb languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": +"@babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c289c188710cd1c60991db169d8173b6e8e05624ae61a7da0b64354100bfba9e44bc1332dd9223c4e3fe1b9cbc0c061e76e7c7b3a75c9588bf35d0ffec428070 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: @@ -1090,28 +1283,40 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7208c30bb3f3fbc73fb3a88bdcb78cd5cddaf6d523eb9d67c0c04e78f6fc6319ece89f4a5abc41777ceab16df55b3a13a4120e0efc9275ca6d2d89beaba80aa0 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/02eef2ee98fa86ee5052ed9bf0742d6d22b510b5df2fcce0b0f5615d6001f7786c6b31505e7f1c2f446406d8fb33603a5316d957cfa5b8365cbf78ddcc24fa42 + checksum: 10/466d1943960c2475c0361eba2ea72d504d4d8329a8e293af0eedd26887bf30a074515b330ea84be77331ace77efbf5533d5f04f8cff63428d2615f4a509ae7a4 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + checksum: 10/a73646d7ecd95b3931a3ead82c7d5efeb46e68ba362de63eb437d33531f294ec18bd31b6d24238cd3b6a3b919a6310c4a0ba4a2629927721d4d10b0518eb7715 languageName: node linkType: hard @@ -1137,82 +1342,82 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + checksum: 10/a04319388a0a7931c3f8e15715d01444c32519692178b70deccc86d53304e74c0f589a4268f6c68578d86f75e934dd1fe6e6ed9071f54ee8379f356f88ef6e42 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + checksum: 10/132c6040c65aabae2d98a39289efb5c51a8632546dc50d2ad032c8660aec307fbed74ef499856ea4f881fc8505905f49b48e0270585da2ea3d50b75e962afd89 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + checksum: 10/006a2032d1c57dca76579ce6598c679c2f20525afef0a36e9d42affe3c8cf33c1427581ad696b519cc75dfee46c5e8ecdf0c6a29ffb14250caa3e16dd68cb424 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c6372d2f788fd71d85aba12fbe08ee509e053ed27457e6674a4f9cae41ff885e2eb88aafea8fadd0ccf990601fc69ec596fa00959e05af68a15461a8d97a548d + checksum: 10/0b60cfe2f700ec2c9c1af979bb805860258539648dadcd482a5ddfc2330b733fb61bb60266404f3e068246ad0d6376040b4f9c5ab9037a3d777624d64acd89e9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + checksum: 10/e326e96a9eeb6bb01dbc4d3362f989411490671b97f62edf378b8fb102c463a018b777f28da65344d41b22aa6efcdfa01ed43d2b11fdcf202046d3174be137c5 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + checksum: 10/4c9009c72321caf20e3b6328bbe9d7057006c5ae57b794cf247a37ca34d87dfec5e27284169a16df5a6235a083bf0f3ab9e1bfcb005d1c8b75b04aed75652621 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + checksum: 10/3dda5074abf8b5df9cdef697d6ebe14a72c199bd6c2019991d033d9ad91b0be937b126b8f34c3c5a9725afee9016a3776aeef3e3b06ab9b3f54f2dd5b5aefa37 languageName: node linkType: hard @@ -1230,72 +1435,73 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + checksum: 10/d39041ff6b0cef78271ebe88be6dfd2882a3c6250a54ddae783f1b9adc815e8486a7d0ca054fabfa3fde1301c531d5be89224999fc7be83ff1eda9b77d173051 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + checksum: 10/276099b4483e707f80b054e2d29bc519158bfe52461ef5ff76f70727d592df17e30b1597ef4d8a0f04d810f6cb5a8dd887bdc1d0540af3744751710ef280090f languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + checksum: 10/400a0927bdb1425b4c0dc68a61b5b2d7d17c7d9f0e07317a1a6a373c080ef94be1dd65fdc4ac9a78fcdb58f89fd128450c7bc0d5b8ca0ae7eca3fbd98e50acba languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + checksum: 10/364342fb8e382dfaa23628b88e6484dc1097e53fb7199f4d338f1e2cd71d839bb0a35a9b1380074f6a10adb2e98b79d53ca3ec78c0b8c557ca895ffff42180df languageName: node linkType: hard -"@babel/preset-env@npm:^7.23.2": - version: 7.23.9 - resolution: "@babel/preset-env@npm:7.23.9" +"@babel/preset-env@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" dependencies: - "@babel/compat-data": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.4" "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1307,63 +1513,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.8" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.6" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.4" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.4" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.23.4" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0214ac9434a2496eac7f56c0c91164421232ff2083a66e1ccab633ca91e262828e54a5cbdb9036e8fe53d53530b6597aa98c99de8ff07b5193ffd95f21dc9d2c + checksum: 10/3d5cbdc2501bc1959fc76ed9d409d0ee5264bc475fa809958fd2e8e7db9b12f8eccdae750a0e05d25207373c42ca115b42bb3d5c743bc770cb12b6af05bf3bd8 languageName: node linkType: hard @@ -1450,7 +1656,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.9": +"@babel/template@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" + dependencies: + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10/8c538338c7de8fac8ada691a5a812bdcbd60bd4a4eb5adae2cc9ee19773e8fb1a724312a00af9e1ce49056ffd3c3475e7287b5668cf6360bfb3f8ac827a06ffe + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.9": version: 7.23.9 resolution: "@babel/traverse@npm:7.23.9" dependencies: @@ -1468,6 +1685,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" + dependencies: + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/b9b0173c286ef549e179f3725df3c4958069ad79fe5b9840adeb99692eb4a5a08db4e735c0f086aab52e7e08ec711cee9e7c06cb908d8035641d1382172308d3 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.23.9 resolution: "@babel/types@npm:7.23.9" @@ -1479,6 +1714,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 10/a0b4875ce2e132f9daff0d5b27c7f4c4fcc97f2b084bdc5834e92c9d32592778489029e65d99d00c406da612d87b72d7a236c0afccaa1435c028d0c94c9b6da4 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -2250,6 +2496,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" @@ -2264,6 +2521,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" @@ -2281,138 +2545,405 @@ __metadata: languageName: node linkType: hard -"@mdx-js/react@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/react@npm:3.0.1" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + languageName: node + linkType: hard + +"@mdx-js/react@npm:^3.0.0": + version: 3.0.1 + resolution: "@mdx-js/react@npm:3.0.1" + dependencies: + "@types/mdx": "npm:^2.0.0" + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 10/d566407af11e76f498f8133fbfa8a9d8a2ad80dc7a66ca109d29fcb92e953a2d2d7aaedc0c28571d126f1967faeb126dd2e4ab4ea474c994bf5c76fa204c5997 + languageName: node + linkType: hard + +"@ndelangen/get-tarball@npm:^3.0.7": + version: 3.0.9 + resolution: "@ndelangen/get-tarball@npm:3.0.9" + dependencies: + gunzip-maybe: "npm:^1.4.2" + pump: "npm:^3.0.0" + tar-fs: "npm:^2.1.1" + checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@playwright/experimental-ct-core@npm:1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-core@npm:1.42.1" + dependencies: + playwright: "npm:1.42.1" + playwright-core: "npm:1.42.1" + vite: "npm:^5.0.12" + bin: + playwright: cli.js + checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + languageName: node + linkType: hard + +"@playwright/experimental-ct-react@npm:^1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-react@npm:1.42.1" + dependencies: + "@playwright/experimental-ct-core": "npm:1.42.1" + "@vitejs/plugin-react": "npm:^4.2.1" + bin: + playwright: cli.js + checksum: 10/ab9a6475c9466df397c57a65b44343b73caf115b21db2cadd1ab6057c9fef98f024b3caa459543a6686ea11cae3888f56eb40683744df237f5b30abf31d7cc35 + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10/2b93e161d3fdabe9a64919def7fa3ceaecf2848341e9211520c401181c9eaebb8451c630b066fad2256e5c639c95edc41de0ba59c40eff37e799918d019822d1 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-context@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a02187a3bae3a0f1be5fab5ad19c1ef06ceff1028d957e4d9994f0186f594a9c3d93ee34bacb86d1fa8eb274493362944398e1c17054d12cb3b75384f9ae564b + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/adbd7301586db712616a0f8dd54a25e7544853cbf61b5d6e279215d479f57ac35157847ee424d54a7e707969a926ca0a7c28934400c9ac224bd0c7cc19229aca + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-escape-keydown": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/f1626d69bb50ec226032bb7d8c5abaaf7359c2d7660309b0ed3daaedd91f30717573aac1a1cb82d589b7f915cf464b95a12da0a3b91b6acfefb6fbbc62b992de + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-focus-guards@npm:1.0.1" dependencies: - "@types/mdx": "npm:^2.0.0" + "@babel/runtime": "npm:^7.13.10" peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: 10/d566407af11e76f498f8133fbfa8a9d8a2ad80dc7a66ca109d29fcb92e953a2d2d7aaedc0c28571d126f1967faeb126dd2e4ab4ea474c994bf5c76fa204c5997 + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/1f8ca8f83b884b3612788d0742f3f054e327856d90a39841a47897dbed95e114ee512362ae314177de226d05310047cabbf66b686ae86ad1b65b6b295be24ef7 languageName: node linkType: hard -"@ndelangen/get-tarball@npm:^3.0.7": - version: 3.0.9 - resolution: "@ndelangen/get-tarball@npm:3.0.9" +"@radix-ui/react-focus-scope@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-focus-scope@npm:1.0.4" dependencies: - gunzip-maybe: "npm:^1.4.2" - pump: "npm:^3.0.0" - tar-fs: "npm:^2.1.1" - checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/3590e74c6b682737c7ac4bf8db41b3df7b09a0320f3836c619e487df9915451e5dafade9923a74383a7366c59e9436f5fff4301d70c0d15928e0e16b36e58bc9 languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@radix-ui/react-id@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-id@npm:1.0.1" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/446a453d799cc790dd2a1583ff8328da88271bff64530b5a17c102fa7fb35eece3cf8985359d416f65e330cd81aa7b8fe984ea125fc4f4eaf4b3801d698e49fe languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@radix-ui/react-portal@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-portal@npm:1.0.4" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c4cf35e2f26a89703189d0eef3ceeeb706ae0832e98e558730a5e929ca7c72c7cb510413a24eca94c7732f8d659a1e81942bec7b90540cb73ce9e4885d040b64 languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/406f0b5a54ea4e7881e15bddc3863234bb14bf3abd4a6e56ea57c6df6f9265a9ad5cfa158e3a98614f0dcbbb7c5f537e1f7158346e57cc3f29b522d62cf28823 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/bedb934ac07c710dc5550a7bfc7065d47e099d958cde1d37e4b1947ae5451f1b7e6f8ff5965e242578bf2c619065e6038c3a3aa779e5eafa7da3e3dbc685799f languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff +"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 languageName: node linkType: hard -"@playwright/experimental-ct-core@npm:1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-core@npm:1.42.1" +"@radix-ui/react-use-callback-ref@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" dependencies: - playwright: "npm:1.42.1" - playwright-core: "npm:1.42.1" - vite: "npm:^5.0.12" - bin: - playwright: cli.js - checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b9fd39911c3644bbda14a84e4fca080682bef84212b8d8931fcaa2d2814465de242c4cfd8d7afb3020646bead9c5e539d478cea0a7031bee8a8a3bb164f3bc4c languageName: node linkType: hard -"@playwright/experimental-ct-react@npm:^1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-react@npm:1.42.1" +"@radix-ui/react-use-controllable-state@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" dependencies: - "@playwright/experimental-ct-core": "npm:1.42.1" - "@vitejs/plugin-react": "npm:^4.2.1" - bin: - playwright: cli.js - checksum: 10/ab9a6475c9466df397c57a65b44343b73caf115b21db2cadd1ab6057c9fef98f024b3caa459543a6686ea11cae3888f56eb40683744df237f5b30abf31d7cc35 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/dee2be1937d293c3a492cb6d279fc11495a8f19dc595cdbfe24b434e917302f9ac91db24e8cc5af9a065f3f209c3423115b5442e65a5be9fd1e9091338972be9 languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" +"@radix-ui/react-use-escape-keydown@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + checksum: 10/c6ed0d9ce780f67f924980eb305af1f6cce2a8acbaf043a58abe0aa3cc551d9aa76ccee14531df89bbee302ead7ecc7fce330886f82d4672c5eda52f357ef9b8 languageName: node linkType: hard -"@radix-ui/react-slot@npm:^1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 + checksum: 10/bed9c7e8de243a5ec3b93bb6a5860950b0dba359b6680c84d57c7a655e123dec9b5891c5dfe81ab970652e7779fe2ad102a23177c7896dde95f7340817d47ae5 languageName: node linkType: hard @@ -2583,11 +3114,9 @@ __metadata: resolution: "@storybook/addon-controls@portal:../../../code/addons/controls::locator=portable-stories-react%40workspace%3A." dependencies: "@storybook/blocks": "workspace:*" - "@storybook/core-common": "workspace:*" - cjs-module-lexer: "npm:^1.2.3" - es-module-lexer: "npm:^1.5.0" - globby: "npm:^14.0.1" + dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2596,7 +3125,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/addon-docs@portal:../../../code/addons/docs::locator=portable-stories-react%40workspace%3A." dependencies: - "@babel/core": "npm:^7.12.3" + "@babel/core": "npm:^7.24.4" "@mdx-js/react": "npm:^3.0.0" "@storybook/blocks": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2701,7 +3230,7 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" @@ -2805,8 +3334,8 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/cli@portal:../../../code/lib/cli::locator=portable-stories-react%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@ndelangen/get-tarball": "npm:^3.0.7" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" @@ -2859,10 +3388,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/codemod@portal:../../../code/lib/codemod::locator=portable-stories-react%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/core": "npm:^7.24.4" + "@babel/preset-env": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/node-logger": "workspace:*" "@storybook/types": "workspace:*" @@ -2881,9 +3410,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/components@portal:../../../code/ui/components::locator=portable-stories-react%40workspace%3A." dependencies: + "@radix-ui/react-dialog": "npm:^1.0.5" "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/theming": "workspace:*" @@ -2921,6 +3451,7 @@ __metadata: node-fetch: "npm:^2.0.0" picomatch: "npm:^2.3.0" pkg-dir: "npm:^5.0.0" + prettier-fallback: "npm:prettier@^3" pretty-hrtime: "npm:^1.0.3" resolve-from: "npm:^5.0.0" semver: "npm:^7.3.7" @@ -2928,6 +3459,11 @@ __metadata: tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" util: "npm:^0.12.4" + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true languageName: node linkType: soft @@ -2935,6 +3471,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/core-events@portal:../../../code/lib/core-events::locator=portable-stories-react%40workspace%3A." dependencies: + "@storybook/csf": "npm:^0.1.4" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2944,13 +3481,14 @@ __metadata: resolution: "@storybook/core-server@portal:../../../code/lib/core-server::locator=portable-stories-react%40workspace%3A." dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" - "@babel/core": "npm:^7.23.9" + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/builder-manager": "workspace:*" "@storybook/channels": "workspace:*" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/docs-mdx": "npm:3.0.0" "@storybook/global": "npm:^5.0.0" @@ -2961,6 +3499,7 @@ __metadata: "@storybook/telemetry": "workspace:*" "@storybook/types": "workspace:*" "@types/detect-port": "npm:^1.3.0" + "@types/diff": "npm:^5.0.9" "@types/node": "npm:^18.0.0" "@types/pretty-hrtime": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" @@ -2969,6 +3508,7 @@ __metadata: cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" + diff: "npm:^5.2.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -3002,11 +3542,11 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/csf-tools@portal:../../../code/lib/csf-tools::locator=portable-stories-react%40workspace%3A." dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/generator": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.5" @@ -3023,12 +3563,12 @@ __metadata: languageName: node linkType: hard -"@storybook/csf@npm:^0.1.2": - version: 0.1.2 - resolution: "@storybook/csf@npm:0.1.2" +"@storybook/csf@npm:^0.1.4": + version: 0.1.4 + resolution: "@storybook/csf@npm:0.1.4" dependencies: type-fest: "npm:^2.19.0" - checksum: 10/11168df65e7b6bd0e5d31e7e805c8ba80397fc190cb33424e043b72bbd85d8f826dba082503992d7f606b72484337ab9d091eca947550613e241fbef57780d4c + checksum: 10/105f3bd748613b775e87454a8470e36733d0ac25b4b88aa9dbebe060f92ff8d5fda1c98289657039d980ecc8d4d59079ef559a42e211568dc97e19d245117156 languageName: node linkType: hard @@ -3044,6 +3584,7 @@ __metadata: resolution: "@storybook/docs-tools@portal:../../../code/lib/docs-tools::locator=portable-stories-react%40workspace%3A." dependencies: "@storybook/core-common": "workspace:*" + "@storybook/core-events": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" "@types/doctrine": "npm:^0.0.3" @@ -3091,7 +3632,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/router": "workspace:*" @@ -3125,7 +3666,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/types": "workspace:*" "@types/qs": "npm:^6.9.5" @@ -3248,7 +3789,6 @@ __metadata: "@testing-library/user-event": "npm:^14.5.2" "@vitest/expect": "npm:1.3.1" "@vitest/spy": "npm:^1.3.1" - chai: "npm:^4.4.1" util: "npm:^0.12.4" languageName: node linkType: soft @@ -3587,6 +4127,13 @@ __metadata: languageName: node linkType: hard +"@types/diff@npm:^5.0.9": + version: 5.2.0 + resolution: "@types/diff@npm:5.2.0" + checksum: 10/e1d3e6e9fd9d5386496c8716dd89316288d139cd8159a064f886a079149d05d65289b7b725ce1e333d4e77ce8024e210c6e281e9875a636fc17b4c760c2cf85f + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -4464,6 +5011,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/df4bc15423aaaba3729a7d40abcbf6d3fffa5b8fd5eb33d3ac8b7da0110c47552fca60d97f2e1edfbb68a27cae1da499f1c3896966efb3e26aac4e3b57e3cc8b + languageName: node + linkType: hard + "aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -4653,39 +5209,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.8 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.8" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/6b5a79bdc1c43edf857fd3a82966b3c7ff4a90eee00ca8d663e0a98304d6e285a05759d64a4dbc16e04a2a5ea1f248673d8bf789711be5e694e368f19884887c + checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.9.0": - version: 0.9.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" +"babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" - core-js-compat: "npm:^3.34.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/efdf9ba82e7848a2c66e0522adf10ac1646b16f271a9006b61a22f976b849de22a07c54c8826887114842ccd20cc9a4617b61e8e0789227a74378ab508e715cd + checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.5": - version: 0.5.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/3a9b4828673b23cd648dcfb571eadcd9d3fadfca0361d0a7c6feeb5a30474e92faaa49f067a6e1c05e49b6a09812879992028ff3ef3446229ff132d6e1de7eb6 + checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -4867,7 +5423,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3": +"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -5003,7 +5559,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.10, chai@npm:^4.4.1": +"chai@npm:^4.3.10": version: 4.4.1 resolution: "chai@npm:4.4.1" dependencies: @@ -5121,7 +5677,7 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.3": +"cjs-module-lexer@npm:^1.0.0": version: 1.2.3 resolution: "cjs-module-lexer@npm:1.2.3" checksum: 10/f96a5118b0a012627a2b1c13bd2fcb92509778422aaa825c5da72300d6dcadfb47134dd2e9d97dfa31acd674891dd91642742772d19a09a8adc3e56bd2f5928c @@ -5361,7 +5917,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": +"core-js-compat@npm:^3.31.0": version: 3.36.0 resolution: "core-js-compat@npm:3.36.0" dependencies: @@ -5370,6 +5926,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.36.1": + version: 3.37.0 + resolution: "core-js-compat@npm:3.37.0" + dependencies: + browserslist: "npm:^4.23.0" + checksum: 10/5f33d7ba45acc9ceb45544d844090edfd14e46a64c2424df24084347405182c1156588cc3a877fc580c005a0b13b8a1af26bb6c73fe73f22eede89b5483b482d + languageName: node + linkType: hard + "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -5746,6 +6311,13 @@ __metadata: languageName: node linkType: hard +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10/e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-package-manager@npm:^2.0.1": version: 2.0.1 resolution: "detect-package-manager@npm:2.0.1" @@ -5775,6 +6347,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -7030,6 +7609,13 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10/ad5104871d114a694ecc506a2d406e2331beccb961fe1e110dc25556b38bcdbf399a823a8a375976cd8889668156a9561e12ebe3fa6a4c6ba169c8466c2ff868 + languageName: node + linkType: hard + "get-npm-tarball-url@npm:^2.0.3": version: 2.1.0 resolution: "get-npm-tarball-url@npm:2.1.0" @@ -7616,6 +8202,15 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10/cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -8978,7 +9573,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -10056,7 +10651,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.1": +"prettier-fallback@npm:prettier@^3, prettier@npm:^3.1.1": version: 3.2.5 resolution: "prettier@npm:3.2.5" bin: @@ -10387,6 +10982,58 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll-bar@npm:^2.3.3": + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5ab8eda61d5b10825447d11e9c824486c929351a471457c22452caa19b6898e18c3af6a46c3fa68010c713baed1eb9956106d068b4a1058bdcf97a1a9bbed734 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.5": + version: 2.5.5 + resolution: "react-remove-scroll@npm:2.5.5" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f0646ac384ce3852d1f41e30a9f9e251b11cf3b430d1d114c937c8fa7f90a895c06378d0d6b6ff0b2d00cbccf15e845921944fd6074ae67a0fb347a718106d88 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/80c58fd6aac3594e351e2e7b048d8a5b09508adb21031a38b3c40911fe58295572eddc640d4b20a7be364842c8ed1120fe30097e22ea055316b375b88d4ff02a + languageName: node + linkType: hard + "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0, react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -11625,7 +12272,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -11938,6 +12585,37 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.0": + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/3be76eae71b52ab233b4fde974eddeff72e67e6723100a0c0297df4b0d60daabedfa706ffb314d0a52645f2c1235e50fdbd53d99f374eb5df68c74d412e98a9b + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ec99e31aefeb880f6dc4d02cb19a01d123364954f857811470ece32872f70d6c3eadbe4d073770706a9b7db6136f2a9fbf1bb803e07fbb21e936a47479281690 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" diff --git a/test-storybooks/portable-stories-kitchen-sink/svelte/yarn.lock b/test-storybooks/portable-stories-kitchen-sink/svelte/yarn.lock index 24ddbf299123..6f1ba695f773 100644 --- a/test-storybooks/portable-stories-kitchen-sink/svelte/yarn.lock +++ b/test-storybooks/portable-stories-kitchen-sink/svelte/yarn.lock @@ -50,6 +50,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" @@ -57,7 +67,14 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.12.3, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9": +"@babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 10/e51faec0ac8259f03cc5029d2b4a944b4fee44cb5188c11530769d5beb81f384d031dba951febc3e33dbb48ceb8045b1184f5c1ac4c5f86ab1f5e951e9aaf7af + languageName: node + linkType: hard + +"@babel/core@npm:^7.23.0": version: 7.24.0 resolution: "@babel/core@npm:7.24.0" dependencies: @@ -80,7 +97,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6": +"@babel/core@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/1e049f8df26be0fe5be36173fd7c33dfb004eeeec28152fea83c90e71784f9a6f2237296f43a2ee7d9041e2a33a05f43da48ce2d4e0cd473a682328ca07ce7e0 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.6": version: 7.23.6 resolution: "@babel/generator@npm:7.23.6" dependencies: @@ -92,6 +132,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10/69e1772dcf8f95baec951f422cca091d59a3f29b5eedc989ad87f7262289b94625983f6fe654302ca17aae0a32f9232332b83fcc85533311d6267b09c58b1061 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -110,7 +162,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -142,6 +194,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/86153719d98e4402f92f24d6b1be94e6b59c0236a6cc36b173a570a64b5156dbc2f16ccfe3c8485dc795524ca88acca65b14863be63049586668c45567f2acd4 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" @@ -155,9 +226,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.5.0": - version: 0.5.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1": + version: 0.6.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -166,13 +237,13 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/f849e816ec4b182a3e8fa8e09ff016f88bb95259cd6b2190b815c48f83c3d3b68e973a8ec72acc5086bfe93705cbd46ec089c06476421d858597780e42235a03 + checksum: 10/316e7c0f05d2ae233d5fbb622c6339436da8d2b2047be866b64a16e6996c078a23b4adfebbdb33bc6a9882326a6cc20b95daa79a5e0edc92e9730e36d45fa523 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.1": - version: 0.6.1 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" +"@babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -181,7 +252,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/316e7c0f05d2ae233d5fbb622c6339436da8d2b2047be866b64a16e6996c078a23b4adfebbdb33bc6a9882326a6cc20b95daa79a5e0edc92e9730e36d45fa523 + checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff languageName: node linkType: hard @@ -229,6 +300,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.1": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" + dependencies: + "@babel/types": "npm:^7.24.0" + checksum: 10/42fe124130b78eeb4bb6af8c094aa749712be0f4606f46716ce74bc18a5ea91c918c547c8bb2307a2e4b33f163e4ad2cb6a7b45f80448e624eae45b597ea3499 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -286,6 +366,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/1103b28ce0cc7fba903c21bc78035c696ff191bdbbe83c20c37030a2e10ae6254924556d942cdf8c44c48ba606a8266fdb105e6bb10945de9285f79cb1905df1 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -356,6 +449,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" + dependencies: + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + checksum: 10/54a9d0f86f2803fcc216cfa23b66b871ea0fa0a892af1c9a79075872c2437de71afbb150ed8216f30e00b19a0b9c5c9d5845173d170e1ebfbbf8887839b89dde + languageName: node + linkType: hard + "@babel/highlight@npm:^7.23.4": version: 7.23.4 resolution: "@babel/highlight@npm:7.23.4" @@ -367,6 +471,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4555124235f34403bb28f55b1de58edf598491cc181c75f8afc8fe529903cb598cd52fe3bf2faab9bc1f45c299681ef0e44eea7a848bb85c500c5a4fe13f54f6 + languageName: node + linkType: hard + "@babel/parser@npm:^7.23.0, @babel/parser@npm:^7.24.0": version: 7.24.0 resolution: "@babel/parser@npm:7.24.0" @@ -376,39 +492,60 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3742cc5068036287e6395269dce5a2735e6349cdc8d4b53297c75f98c580d7e1c8cb43235623999d151f2ef975d677dbc2c2357573a1855caa71c271bf3046c9 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + checksum: 10/1439e2ceec512b72f05f036503bf2c31e807d1b75ae22cf2676145e9f20740960a1c9575ea3065c6fb9f44f6b46163aab76eac513694ffa10de674e3cdd6219e languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/ec5fddc8db6de0e0082a883f21141d6f4f9f9f0bc190d662a732b5e9a506aae5d7d2337049a1bf055d7cb7add6f128036db6d4f47de5e9ac1be29e043c8b7ca8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + checksum: 10/e18235463e716ac2443938aaec3c18b40c417a1746fba0fa4c26cf4d71326b76ef26c002081ab1b445abfae98e063d561519aa55672dddc1ef80b3940211ffbb languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/3b0c9554cd0048e6e7341d7b92f29d400dbc6a5a4fc2f86dbed881d32e02ece9b55bc520387bae2eac22a5ab38a0b205c29b52b181294d99b4dd75e27309b548 + checksum: 10/3483f329bb099b438d05e5e206229ddbc1703972a69ba0240a796b5477369930b0ab2e7f6c9539ecad2cea8b0c08fa65498778b92cf87ad3d156f613de1fd2fa languageName: node linkType: hard @@ -487,25 +624,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + checksum: 10/2a463928a63b62052e9fb8f8b0018aa11a926e94f32c168260ae012afe864875c6176c6eb361e13f300542c31316dad791b08a5b8ed92436a3095c7a0e4fce65 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 10/87c8aa4a5ef931313f956871b27f2c051556f627b97ed21e9a5890ca4906b222d89062a956cde459816f5e0dec185ff128d7243d3fdc389504522acb88f0464e languageName: node linkType: hard @@ -653,67 +790,67 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + checksum: 10/58f9aa9b0de8382f8cfa3f1f1d40b69d98cd2f52340e2391733d0af745fdddda650ba392e509bc056157c880a2f52834a38ab2c5aa5569af8c61bb6ecbf45f34 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d402494087a6b803803eb5ab46b837aab100a04c4c5148e38bfa943ea1bbfc1ecfb340f1ced68972564312d3580f550c125f452372e77607a558fbbaf98c31c0 + checksum: 10/4ccc3755a3d51544cd43575db2c5c2ef42cdcd35bd5940d13cdf23f04c75496290e79ea585a62427ec6bd508a1bffb329e01556cd1114be9b38ae4254935cd19 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + checksum: 10/429004a6596aa5c9e707b604156f49a146f8d029e31a3152b1649c0b56425264fda5fd38e5db1ddaeb33c3fe45c97dc8078d7abfafe3542a979b49f229801135 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + checksum: 10/d8e18bd57b156da1cd4d3c1780ab9ea03afed56c6824ca8e6e74f67959d7989a0e953ec370fe9b417759314f2eef30c8c437395ce63ada2e26c2f469e4704f82 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bbb965a3acdfb03559806d149efbd194ac9c983b260581a60efcb15eb9fbe20e3054667970800146d867446db1c1398f8e4ee87f4454233e49b8f8ce947bd99b + checksum: 10/4093fa109cd256e8ad0b26e3ffa67ec6dac4078a1a24b7755bed63e650cf938b2a315e01696c35b221db1a37606f93cb82696c8d1bf563c2a9845620e551736e languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": +"@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: @@ -725,116 +862,128 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/95779e9eef0c0638b9631c297d48aee53ffdbb2b1b5221bf40d7eccd566a8e34f859ff3571f8f20b9159b67f1bff7d7dc81da191c15d69fbae5a645197eae7e0 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + checksum: 10/3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb4b19e7a39871c4414fb44fc5f2cc47c78f993b74c43238dfb99c9dac2d15cb99b43f8a3d42747580e1807d2b8f5e13ce7e95e593fd839bd176aa090bf9a23 + checksum: 10/eb7f4a3d852cfa20f4efd299929c564bd2b45106ac1cf4ac8b0c87baf078d4a15c39b8a21bbb01879c1922acb9baaf3c9b150486e18d84b30129e9671639793d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e75593e02c5ea473c17839e3c9d597ce3697bf039b66afe9a4d06d086a87fb3d95850b4174476897afc351dc1b46a9ec3165ee6e8fbad3732c0d65f676f855ad + checksum: 10/62bbfe1bd508517d96ba6909e68b1adb9dfd24ea61af1f4b0aa909bfc5e476044afe9c55b10ef74508fd147aa665e818df67ece834d164a9fd69b80c9ede3875 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5abd93718af5a61f8f6a97d2ccac9139499752dd5b2c533d7556fb02947ae01b2f51d4c4f5e64df569e8783d3743270018eb1fa979c43edec7dd1377acf107ed + checksum: 10/03d9a81cd9eeb24d48e207be536d460d6ad228238ac70da9b7ad4bae799847bb3be0aecfa4ea6223752f3a8d4ada3a58cd9a0f8fc70c01fdfc87ad0618f897d3 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + checksum: 10/7f623d25b6f213b94ebc1754e9e31c1077c8e288626d8b7bfa76a97b067ce80ddcd0ede402a546706c65002c0ccf45cd5ec621511c2668eed31ebcabe8391d35 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + checksum: 10/de600a958ad146fc8aca71fd2dfa5ebcfdb97df4eaa530fc9a4b0d28d85442ddb9b7039f260b396785211e88c6817125a94c183459763c363847e8c84f318ff0 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + checksum: 10/59fc561ee40b1a69f969c12c6c5fac206226d6642213985a569dd0f99f8e41c0f4eaedebd36936c255444a8335079842274c42a975a433beadb436d4c5abb79b languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + checksum: 10/f90841fe1a1e9f680b4209121d3e2992f923e85efcd322b26e5901c180ef44ff727fb89790803a23fac49af34c1ce2e480018027c22b4573b615512ac5b6fc50 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + checksum: 10/bc710ac231919df9555331885748385c11c5e695d7271824fe56fba51dd637d48d3e5cd52e1c69f2b1a384fbbb41552572bc1ca3a2285ee29571f002e9bb2421 languageName: node linkType: hard @@ -850,86 +999,86 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b84ef1f26a2db316237ae6d10fa7c22c70ac808ed0b8e095a8ecf9101551636cbb026bee9fb95a0a7944f3b8278ff9636a9088cb4a4ac5b84830a13829242735 + checksum: 10/befd0908c3f6b31f9fa9363a3c112d25eaa0bc4a79cfad1f0a8bb5010937188b043a44fb23443bc8ffbcc40c015bb25f80e4cc585ce5cc580708e2d56e76fe37 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + checksum: 10/31eb3c75297dda7265f78eba627c446f2324e30ec0124a645ccc3e9f341254aaa40d6787bd62b2280d77c0a5c9fbfce1da2c200ef7c7f8e0a1b16a8eb3644c6f languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + checksum: 10/f42302d42fc81ac00d14e9e5d80405eb80477d7f9039d7208e712d6bcd486a4e3b32fdfa07b5f027d6c773723d8168193ee880f93b0e430c828e45f104fb82a4 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + checksum: 10/2df94e9478571852483aca7588419e574d76bde97583e78551c286f498e01321e7dbb1d0ef67bee16e8f950688f79688809cfde370c5c4b84c14d841a3ef217a languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + checksum: 10/895f2290adf457cbf327428bdb4fb90882a38a22f729bcf0629e8ad66b9b616d2721fbef488ac00411b647489d1dda1d20171bb3772d0796bb7ef5ecf057808a languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + checksum: 10/4ea641cc14a615f9084e45ad2319f95e2fee01c77ec9789685e7e11a6c286238a426a98f9c1ed91568a047d8ac834393e06e8c82d1ff01764b7aa61bee8e9023 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/48c87dee2c7dae8ed40d16901f32c9e58be4ef87bf2c3985b51dd2e78e82081f3bad0a39ee5cf6e8909e13e954e2b4bedef0a8141922f281ed833ddb59ed9be2 + checksum: 10/5a324f7c630cf0be1f09098a3a36248c2521622f2c7ea1a44a5980f54b718f5e0dd4af92a337f4b445a8824c8d533853ebea7c16de829b8a7bc8bcca127d4d73 languageName: node linkType: hard @@ -946,29 +1095,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-simple-access": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7326a62ed5f766f93ee75684868635b59884e2801533207ea11561c296de53037949fecad4055d828fa7ebeb6cc9e55908aa3e7c13f930ded3e62ad9f24680d7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb800e5a9d0d668d7421ae3672fccff7d5f2a36621fd87414d7ece6d6f4d93627f9644cfecacae934bc65ffc131c8374242aaa400cca874dcab9b281a21aff0 + checksum: 10/565ec4518037b3d957431e29bda97b3d2fbb2e245fb5ba19889310ccb8fb71353e8ce2c325cc8d3fbc5a376d3af7d7e21782d5f502c46f8da077bee7807a590f languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e3f3af83562d687899555c7826b3faf0ab93ee7976898995b1d20cbe7f4451c55e05b0e17bfb3e549937cbe7573daf5400b752912a241b0a8a64d2457c7626e5 + checksum: 10/323bb9367e1967117a829f67788ec2ff55504b4faf8f6d83ec85d398e50b41cf7d1c375c67d63883dd7ad5e75b35c8ae776d89e422330ec0c0a1fda24e362083 languageName: node linkType: hard @@ -984,18 +1146,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + checksum: 10/e0d3af66cd0fad29c9d0e3fc65e711255e18b77e2e35bbd8f10059e3db7de6c16799ef74e704daf784950feb71e7a93c5bf2c771d98f1ca3fba1ff2e0240b24a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": version: 7.23.4 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: @@ -1007,58 +1169,69 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74025e191ceb7cefc619c15d33753aab81300a03d81b96ae249d9b599bc65878f962d608f452462d3aad5d6e334b7ab2b09a6bdcfe8d101fe77ac7aacca4261e + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + checksum: 10/3247bd7d409574fc06c59e0eb573ae7470d6d61ecf780df40b550102bb4406747d8f39dcbec57eb59406df6c565a86edd3b429e396ad02e4ce201ad92050832e languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.0" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1dfafd9461723769b29f724fcbdca974c4280f68a9e03c8ff412643ffe88930755f093f9cbf919cdb6d0d53751614892dd2882bccad286e14e9e995c5a8242ed + checksum: 10/ff6eeefbc5497cf33d62dc86b797c6db0e9455d6a4945d6952f3b703d04baab048974c6573b503e0ec097b8112d3b98b5f4ee516e1b8a74ed47aebba4d9d2643 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + checksum: 10/d34d437456a54e2a5dcb26e9cf09ed4c55528f2a327c5edca92c93e9483c37176e228d00d6e0cf767f3d6fdbef45ae3a5d034a7c59337a009e20ae541c8220fa languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + checksum: 10/ff7c02449d32a6de41e003abb38537b4a1ad90b1eaa4c0b578cb1b55548201a677588a8c47f3e161c72738400ae811a6673ea7b8a734344755016ca0ac445dac languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": +"@babel/plugin-transform-optional-chaining@npm:^7.23.0": version: 7.23.4 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: @@ -1071,18 +1244,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d41031b8e472b9b30aacd905a1561904bcec597dd888ad639b234971714dc9cd0dcb60df91a89219fc72e4feeb148e20f97bcddc39d7676e743ff0c23f62a7eb + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8c36c3fc25f9daa46c4f6db47ea809c395dc4abc7f01c4b1391f6e5b0cd62b83b6016728b02a6a8ac21aca56207c9ec66daefc0336e9340976978de7e6e28df + checksum: 10/c289c188710cd1c60991db169d8173b6e8e05624ae61a7da0b64354100bfba9e44bc1332dd9223c4e3fe1b9cbc0c061e76e7c7b3a75c9588bf35d0ffec428070 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": +"@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: @@ -1094,107 +1280,119 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7208c30bb3f3fbc73fb3a88bdcb78cd5cddaf6d523eb9d67c0c04e78f6fc6319ece89f4a5abc41777ceab16df55b3a13a4120e0efc9275ca6d2d89beaba80aa0 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/02eef2ee98fa86ee5052ed9bf0742d6d22b510b5df2fcce0b0f5615d6001f7786c6b31505e7f1c2f446406d8fb33603a5316d957cfa5b8365cbf78ddcc24fa42 + checksum: 10/466d1943960c2475c0361eba2ea72d504d4d8329a8e293af0eedd26887bf30a074515b330ea84be77331ace77efbf5533d5f04f8cff63428d2615f4a509ae7a4 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + checksum: 10/a73646d7ecd95b3931a3ead82c7d5efeb46e68ba362de63eb437d33531f294ec18bd31b6d24238cd3b6a3b919a6310c4a0ba4a2629927721d4d10b0518eb7715 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + checksum: 10/a04319388a0a7931c3f8e15715d01444c32519692178b70deccc86d53304e74c0f589a4268f6c68578d86f75e934dd1fe6e6ed9071f54ee8379f356f88ef6e42 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + checksum: 10/132c6040c65aabae2d98a39289efb5c51a8632546dc50d2ad032c8660aec307fbed74ef499856ea4f881fc8505905f49b48e0270585da2ea3d50b75e962afd89 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + checksum: 10/006a2032d1c57dca76579ce6598c679c2f20525afef0a36e9d42affe3c8cf33c1427581ad696b519cc75dfee46c5e8ecdf0c6a29ffb14250caa3e16dd68cb424 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c6372d2f788fd71d85aba12fbe08ee509e053ed27457e6674a4f9cae41ff885e2eb88aafea8fadd0ccf990601fc69ec596fa00959e05af68a15461a8d97a548d + checksum: 10/0b60cfe2f700ec2c9c1af979bb805860258539648dadcd482a5ddfc2330b733fb61bb60266404f3e068246ad0d6376040b4f9c5ab9037a3d777624d64acd89e9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + checksum: 10/e326e96a9eeb6bb01dbc4d3362f989411490671b97f62edf378b8fb102c463a018b777f28da65344d41b22aa6efcdfa01ed43d2b11fdcf202046d3174be137c5 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + checksum: 10/4c9009c72321caf20e3b6328bbe9d7057006c5ae57b794cf247a37ca34d87dfec5e27284169a16df5a6235a083bf0f3ab9e1bfcb005d1c8b75b04aed75652621 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + checksum: 10/3dda5074abf8b5df9cdef697d6ebe14a72c199bd6c2019991d033d9ad91b0be937b126b8f34c3c5a9725afee9016a3776aeef3e3b06ab9b3f54f2dd5b5aefa37 languageName: node linkType: hard @@ -1212,72 +1410,73 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + checksum: 10/d39041ff6b0cef78271ebe88be6dfd2882a3c6250a54ddae783f1b9adc815e8486a7d0ca054fabfa3fde1301c531d5be89224999fc7be83ff1eda9b77d173051 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + checksum: 10/276099b4483e707f80b054e2d29bc519158bfe52461ef5ff76f70727d592df17e30b1597ef4d8a0f04d810f6cb5a8dd887bdc1d0540af3744751710ef280090f languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + checksum: 10/400a0927bdb1425b4c0dc68a61b5b2d7d17c7d9f0e07317a1a6a373c080ef94be1dd65fdc4ac9a78fcdb58f89fd128450c7bc0d5b8ca0ae7eca3fbd98e50acba languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + checksum: 10/364342fb8e382dfaa23628b88e6484dc1097e53fb7199f4d338f1e2cd71d839bb0a35a9b1380074f6a10adb2e98b79d53ca3ec78c0b8c557ca895ffff42180df languageName: node linkType: hard -"@babel/preset-env@npm:^7.23.2": - version: 7.24.0 - resolution: "@babel/preset-env@npm:7.24.0" +"@babel/preset-env@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" dependencies: - "@babel/compat-data": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.4" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1289,63 +1488,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.8" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.6" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.4" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.4" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.0" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/88bca150a09e658124997178ee1ff375a9aceecfd70ec11c7ccc12e82f5be5f7ff2ddfefba5b10fb617891645f92949392b350509de9742d2aa138f42959e190 + checksum: 10/3d5cbdc2501bc1959fc76ed9d409d0ee5264bc475fa809958fd2e8e7db9b12f8eccdae750a0e05d25207373c42ca115b42bb3d5c743bc770cb12b6af05bf3bd8 languageName: node linkType: hard @@ -1432,7 +1631,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.24.0": +"@babel/traverse@npm:^7.24.0": version: 7.24.0 resolution: "@babel/traverse@npm:7.24.0" dependencies: @@ -1450,6 +1649,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" + dependencies: + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/b9b0173c286ef549e179f3725df3c4958069ad79fe5b9840adeb99692eb4a5a08db4e735c0f086aab52e7e08ec711cee9e7c06cb908d8035641d1382172308d3 + languageName: node + linkType: hard + "@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.24.0 resolution: "@babel/types@npm:7.24.0" @@ -1939,7 +2156,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24": +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -1961,126 +2178,383 @@ __metadata: languageName: node linkType: hard -"@ndelangen/get-tarball@npm:^3.0.7": - version: 3.0.9 - resolution: "@ndelangen/get-tarball@npm:3.0.9" +"@ndelangen/get-tarball@npm:^3.0.7": + version: 3.0.9 + resolution: "@ndelangen/get-tarball@npm:3.0.9" + dependencies: + gunzip-maybe: "npm:^1.4.2" + pump: "npm:^3.0.0" + tar-fs: "npm:^2.1.1" + checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@playwright/experimental-ct-core@npm:1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-core@npm:1.42.1" + dependencies: + playwright: "npm:1.42.1" + playwright-core: "npm:1.42.1" + vite: "npm:^5.0.12" + bin: + playwright: cli.js + checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + languageName: node + linkType: hard + +"@playwright/experimental-ct-svelte@npm:^1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-svelte@npm:1.42.1" + dependencies: + "@playwright/experimental-ct-core": "npm:1.42.1" + "@sveltejs/vite-plugin-svelte": "npm:^3.0.1" + bin: + playwright: cli.js + checksum: 10/444ef225523b6864b91b4568acf4fc8e6aa447efd29c1e824fbcbc56c1c5a23802dcb27a81cd0b1d99319db2c6bac475ba00aa3b18b12947d84691e20d9634b9 + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10/2b93e161d3fdabe9a64919def7fa3ceaecf2848341e9211520c401181c9eaebb8451c630b066fad2256e5c639c95edc41de0ba59c40eff37e799918d019822d1 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-context@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a02187a3bae3a0f1be5fab5ad19c1ef06ceff1028d957e4d9994f0186f594a9c3d93ee34bacb86d1fa8eb274493362944398e1c17054d12cb3b75384f9ae564b + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/adbd7301586db712616a0f8dd54a25e7544853cbf61b5d6e279215d479f57ac35157847ee424d54a7e707969a926ca0a7c28934400c9ac224bd0c7cc19229aca + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-escape-keydown": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/f1626d69bb50ec226032bb7d8c5abaaf7359c2d7660309b0ed3daaedd91f30717573aac1a1cb82d589b7f915cf464b95a12da0a3b91b6acfefb6fbbc62b992de + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-focus-guards@npm:1.0.1" dependencies: - gunzip-maybe: "npm:^1.4.2" - pump: "npm:^3.0.0" - tar-fs: "npm:^2.1.1" - checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/1f8ca8f83b884b3612788d0742f3f054e327856d90a39841a47897dbed95e114ee512362ae314177de226d05310047cabbf66b686ae86ad1b65b6b295be24ef7 languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@radix-ui/react-focus-scope@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-focus-scope@npm:1.0.4" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/3590e74c6b682737c7ac4bf8db41b3df7b09a0320f3836c619e487df9915451e5dafade9923a74383a7366c59e9436f5fff4301d70c0d15928e0e16b36e58bc9 languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 +"@radix-ui/react-id@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-id@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/446a453d799cc790dd2a1583ff8328da88271bff64530b5a17c102fa7fb35eece3cf8985359d416f65e330cd81aa7b8fe984ea125fc4f4eaf4b3801d698e49fe languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@radix-ui/react-portal@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-portal@npm:1.0.4" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c4cf35e2f26a89703189d0eef3ceeeb706ae0832e98e558730a5e929ca7c72c7cb510413a24eca94c7732f8d659a1e81942bec7b90540cb73ce9e4885d040b64 languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/406f0b5a54ea4e7881e15bddc3863234bb14bf3abd4a6e56ea57c6df6f9265a9ad5cfa158e3a98614f0dcbbb7c5f537e1f7158346e57cc3f29b522d62cf28823 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/bedb934ac07c710dc5550a7bfc7065d47e099d958cde1d37e4b1947ae5451f1b7e6f8ff5965e242578bf2c619065e6038c3a3aa779e5eafa7da3e3dbc685799f languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff +"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 languageName: node linkType: hard -"@playwright/experimental-ct-core@npm:1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-core@npm:1.42.1" +"@radix-ui/react-use-callback-ref@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" dependencies: - playwright: "npm:1.42.1" - playwright-core: "npm:1.42.1" - vite: "npm:^5.0.12" - bin: - playwright: cli.js - checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b9fd39911c3644bbda14a84e4fca080682bef84212b8d8931fcaa2d2814465de242c4cfd8d7afb3020646bead9c5e539d478cea0a7031bee8a8a3bb164f3bc4c languageName: node linkType: hard -"@playwright/experimental-ct-svelte@npm:^1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-svelte@npm:1.42.1" +"@radix-ui/react-use-controllable-state@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" dependencies: - "@playwright/experimental-ct-core": "npm:1.42.1" - "@sveltejs/vite-plugin-svelte": "npm:^3.0.1" - bin: - playwright: cli.js - checksum: 10/444ef225523b6864b91b4568acf4fc8e6aa447efd29c1e824fbcbc56c1c5a23802dcb27a81cd0b1d99319db2c6bac475ba00aa3b18b12947d84691e20d9634b9 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/dee2be1937d293c3a492cb6d279fc11495a8f19dc595cdbfe24b434e917302f9ac91db24e8cc5af9a065f3f209c3423115b5442e65a5be9fd1e9091338972be9 languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" +"@radix-ui/react-use-escape-keydown@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + checksum: 10/c6ed0d9ce780f67f924980eb305af1f6cce2a8acbaf043a58abe0aa3cc551d9aa76ccee14531df89bbee302ead7ecc7fce330886f82d4672c5eda52f357ef9b8 languageName: node linkType: hard -"@radix-ui/react-slot@npm:^1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 + checksum: 10/bed9c7e8de243a5ec3b93bb6a5860950b0dba359b6680c84d57c7a655e123dec9b5891c5dfe81ab970652e7779fe2ad102a23177c7896dde95f7340817d47ae5 languageName: node linkType: hard @@ -2217,11 +2691,9 @@ __metadata: resolution: "@storybook/addon-controls@portal:../../../code/addons/controls::locator=portable-stories-svelte%40workspace%3A." dependencies: "@storybook/blocks": "workspace:*" - "@storybook/core-common": "workspace:*" - cjs-module-lexer: "npm:^1.2.3" - es-module-lexer: "npm:^1.5.0" - globby: "npm:^14.0.1" + dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2230,7 +2702,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/addon-docs@portal:../../../code/addons/docs::locator=portable-stories-svelte%40workspace%3A." dependencies: - "@babel/core": "npm:^7.12.3" + "@babel/core": "npm:^7.24.4" "@mdx-js/react": "npm:^3.0.0" "@storybook/blocks": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2335,7 +2807,7 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" @@ -2439,8 +2911,8 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/cli@portal:../../../code/lib/cli::locator=portable-stories-svelte%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@ndelangen/get-tarball": "npm:^3.0.7" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" @@ -2493,10 +2965,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/codemod@portal:../../../code/lib/codemod::locator=portable-stories-svelte%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/core": "npm:^7.24.4" + "@babel/preset-env": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/node-logger": "workspace:*" "@storybook/types": "workspace:*" @@ -2515,9 +2987,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/components@portal:../../../code/ui/components::locator=portable-stories-svelte%40workspace%3A." dependencies: + "@radix-ui/react-dialog": "npm:^1.0.5" "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/theming": "workspace:*" @@ -2555,6 +3028,7 @@ __metadata: node-fetch: "npm:^2.0.0" picomatch: "npm:^2.3.0" pkg-dir: "npm:^5.0.0" + prettier-fallback: "npm:prettier@^3" pretty-hrtime: "npm:^1.0.3" resolve-from: "npm:^5.0.0" semver: "npm:^7.3.7" @@ -2562,6 +3036,11 @@ __metadata: tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" util: "npm:^0.12.4" + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true languageName: node linkType: soft @@ -2569,6 +3048,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/core-events@portal:../../../code/lib/core-events::locator=portable-stories-svelte%40workspace%3A." dependencies: + "@storybook/csf": "npm:^0.1.4" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2578,13 +3058,14 @@ __metadata: resolution: "@storybook/core-server@portal:../../../code/lib/core-server::locator=portable-stories-svelte%40workspace%3A." dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" - "@babel/core": "npm:^7.23.9" + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/builder-manager": "workspace:*" "@storybook/channels": "workspace:*" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/docs-mdx": "npm:3.0.0" "@storybook/global": "npm:^5.0.0" @@ -2595,6 +3076,7 @@ __metadata: "@storybook/telemetry": "workspace:*" "@storybook/types": "workspace:*" "@types/detect-port": "npm:^1.3.0" + "@types/diff": "npm:^5.0.9" "@types/node": "npm:^18.0.0" "@types/pretty-hrtime": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" @@ -2603,6 +3085,7 @@ __metadata: cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" + diff: "npm:^5.2.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -2636,11 +3119,11 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/csf-tools@portal:../../../code/lib/csf-tools::locator=portable-stories-svelte%40workspace%3A." dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/generator": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.5" @@ -2648,12 +3131,12 @@ __metadata: languageName: node linkType: soft -"@storybook/csf@npm:^0.1.2": - version: 0.1.2 - resolution: "@storybook/csf@npm:0.1.2" +"@storybook/csf@npm:^0.1.4": + version: 0.1.4 + resolution: "@storybook/csf@npm:0.1.4" dependencies: type-fest: "npm:^2.19.0" - checksum: 10/11168df65e7b6bd0e5d31e7e805c8ba80397fc190cb33424e043b72bbd85d8f826dba082503992d7f606b72484337ab9d091eca947550613e241fbef57780d4c + checksum: 10/105f3bd748613b775e87454a8470e36733d0ac25b4b88aa9dbebe060f92ff8d5fda1c98289657039d980ecc8d4d59079ef559a42e211568dc97e19d245117156 languageName: node linkType: hard @@ -2669,6 +3152,7 @@ __metadata: resolution: "@storybook/docs-tools@portal:../../../code/lib/docs-tools::locator=portable-stories-svelte%40workspace%3A." dependencies: "@storybook/core-common": "workspace:*" + "@storybook/core-events": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" "@types/doctrine": "npm:^0.0.3" @@ -2716,7 +3200,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/router": "workspace:*" @@ -2750,7 +3234,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/types": "workspace:*" "@types/qs": "npm:^6.9.5" @@ -2853,7 +3337,6 @@ __metadata: "@testing-library/user-event": "npm:^14.5.2" "@vitest/expect": "npm:1.3.1" "@vitest/spy": "npm:^1.3.1" - chai: "npm:^4.4.1" util: "npm:^0.12.4" languageName: node linkType: soft @@ -3036,6 +3519,13 @@ __metadata: languageName: node linkType: hard +"@types/diff@npm:^5.0.9": + version: 5.2.0 + resolution: "@types/diff@npm:5.2.0" + checksum: 10/e1d3e6e9fd9d5386496c8716dd89316288d139cd8159a064f886a079149d05d65289b7b725ce1e333d4e77ce8024e210c6e281e9875a636fc17b4c760c2cf85f + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -3547,6 +4037,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/df4bc15423aaaba3729a7d40abcbf6d3fffa5b8fd5eb33d3ac8b7da0110c47552fca60d97f2e1edfbb68a27cae1da499f1c3896966efb3e26aac4e3b57e3cc8b + languageName: node + linkType: hard + "aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -3703,39 +4202,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.10 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.10" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/9fb5e59a3235eba66fb05060b2a3ecd6923084f100df7526ab74b6272347d7adcf99e17366b82df36e592cde4e82fdb7ae24346a990eced76c7d504cac243400 + checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.9.0": - version: 0.9.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" +"babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" - core-js-compat: "npm:^3.34.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/efdf9ba82e7848a2c66e0522adf10ac1646b16f271a9006b61a22f976b849de22a07c54c8826887114842ccd20cc9a4617b61e8e0789227a74378ab508e715cd + checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.5": - version: 0.5.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/3a9b4828673b23cd648dcfb571eadcd9d3fadfca0361d0a7c6feeb5a30474e92faaa49f067a6e1c05e49b6a09812879992028ff3ef3446229ff132d6e1de7eb6 + checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -3883,7 +4382,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3": +"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -4003,7 +4502,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.10, chai@npm:^4.4.1": +"chai@npm:^4.3.10": version: 4.4.1 resolution: "chai@npm:4.4.1" dependencies: @@ -4114,13 +4613,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.2.3": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10/f96a5118b0a012627a2b1c13bd2fcb92509778422aaa825c5da72300d6dcadfb47134dd2e9d97dfa31acd674891dd91642742772d19a09a8adc3e56bd2f5928c - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -4342,7 +4834,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": +"core-js-compat@npm:^3.31.0": version: 3.36.0 resolution: "core-js-compat@npm:3.36.0" dependencies: @@ -4351,6 +4843,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.36.1": + version: 3.37.0 + resolution: "core-js-compat@npm:3.37.0" + dependencies: + browserslist: "npm:^4.23.0" + checksum: 10/5f33d7ba45acc9ceb45544d844090edfd14e46a64c2424df24084347405182c1156588cc3a877fc580c005a0b13b8a1af26bb6c73fe73f22eede89b5483b482d + languageName: node + linkType: hard + "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -4686,6 +5187,13 @@ __metadata: languageName: node linkType: hard +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10/e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-package-manager@npm:^2.0.1": version: 2.0.1 resolution: "detect-package-manager@npm:2.0.1" @@ -4715,6 +5223,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -5934,6 +6449,13 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10/ad5104871d114a694ecc506a2d406e2331beccb961fe1e110dc25556b38bcdbf399a823a8a375976cd8889668156a9561e12ebe3fa6a4c6ba169c8466c2ff868 + languageName: node + linkType: hard + "get-npm-tarball-url@npm:^2.0.3": version: 2.1.0 resolution: "get-npm-tarball-url@npm:2.1.0" @@ -6451,6 +6973,15 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10/cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -7297,7 +7828,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.1.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -8392,7 +8923,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.1": +"prettier-fallback@npm:prettier@^3, prettier@npm:^3.1.1": version: 3.2.5 resolution: "prettier@npm:3.2.5" bin: @@ -8650,6 +9181,58 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll-bar@npm:^2.3.3": + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5ab8eda61d5b10825447d11e9c824486c929351a471457c22452caa19b6898e18c3af6a46c3fa68010c713baed1eb9956106d068b4a1058bdcf97a1a9bbed734 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.5": + version: 2.5.5 + resolution: "react-remove-scroll@npm:2.5.5" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f0646ac384ce3852d1f41e30a9f9e251b11cf3b430d1d114c937c8fa7f90a895c06378d0d6b6ff0b2d00cbccf15e845921944fd6074ae67a0fb347a718106d88 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/80c58fd6aac3594e351e2e7b048d8a5b09508adb21031a38b3c40911fe58295572eddc640d4b20a7be364842c8ed1120fe30097e22ea055316b375b88d4ff02a + languageName: node + linkType: hard + "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -9958,7 +10541,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -10260,6 +10843,37 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.0": + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/3be76eae71b52ab233b4fde974eddeff72e67e6723100a0c0297df4b0d60daabedfa706ffb314d0a52645f2c1235e50fdbd53d99f374eb5df68c74d412e98a9b + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ec99e31aefeb880f6dc4d02cb19a01d123364954f857811470ece32872f70d6c3eadbe4d073770706a9b7db6136f2a9fbf1bb803e07fbb21e936a47479281690 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" diff --git a/test-storybooks/portable-stories-kitchen-sink/vue3/yarn.lock b/test-storybooks/portable-stories-kitchen-sink/vue3/yarn.lock index bab162b80aac..ea28f0f35a1b 100644 --- a/test-storybooks/portable-stories-kitchen-sink/vue3/yarn.lock +++ b/test-storybooks/portable-stories-kitchen-sink/vue3/yarn.lock @@ -50,6 +50,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" @@ -57,7 +67,14 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.12.3, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9": +"@babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 10/e51faec0ac8259f03cc5029d2b4a944b4fee44cb5188c11530769d5beb81f384d031dba951febc3e33dbb48ceb8045b1184f5c1ac4c5f86ab1f5e951e9aaf7af + languageName: node + linkType: hard + +"@babel/core@npm:^7.23.0": version: 7.24.0 resolution: "@babel/core@npm:7.24.0" dependencies: @@ -80,7 +97,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6": +"@babel/core@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.4" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/1e049f8df26be0fe5be36173fd7c33dfb004eeeec28152fea83c90e71784f9a6f2237296f43a2ee7d9041e2a33a05f43da48ce2d4e0cd473a682328ca07ce7e0 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.6": version: 7.23.6 resolution: "@babel/generator@npm:7.23.6" dependencies: @@ -92,6 +132,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10/69e1772dcf8f95baec951f422cca091d59a3f29b5eedc989ad87f7262289b94625983f6fe654302ca17aae0a32f9232332b83fcc85533311d6267b09c58b1061 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -110,7 +162,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -142,6 +194,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/86153719d98e4402f92f24d6b1be94e6b59c0236a6cc36b173a570a64b5156dbc2f16ccfe3c8485dc795524ca88acca65b14863be63049586668c45567f2acd4 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" @@ -155,9 +226,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.5.0": - version: 0.5.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1": + version: 0.6.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -166,13 +237,13 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/f849e816ec4b182a3e8fa8e09ff016f88bb95259cd6b2190b815c48f83c3d3b68e973a8ec72acc5086bfe93705cbd46ec089c06476421d858597780e42235a03 + checksum: 10/316e7c0f05d2ae233d5fbb622c6339436da8d2b2047be866b64a16e6996c078a23b4adfebbdb33bc6a9882326a6cc20b95daa79a5e0edc92e9730e36d45fa523 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.1": - version: 0.6.1 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" +"@babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -181,7 +252,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/316e7c0f05d2ae233d5fbb622c6339436da8d2b2047be866b64a16e6996c078a23b4adfebbdb33bc6a9882326a6cc20b95daa79a5e0edc92e9730e36d45fa523 + checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff languageName: node linkType: hard @@ -229,6 +300,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.1": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" + dependencies: + "@babel/types": "npm:^7.24.0" + checksum: 10/42fe124130b78eeb4bb6af8c094aa749712be0f4606f46716ce74bc18a5ea91c918c547c8bb2307a2e4b33f163e4ad2cb6a7b45f80448e624eae45b597ea3499 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -286,6 +366,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/1103b28ce0cc7fba903c21bc78035c696ff191bdbbe83c20c37030a2e10ae6254924556d942cdf8c44c48ba606a8266fdb105e6bb10945de9285f79cb1905df1 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -356,6 +449,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" + dependencies: + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + checksum: 10/54a9d0f86f2803fcc216cfa23b66b871ea0fa0a892af1c9a79075872c2437de71afbb150ed8216f30e00b19a0b9c5c9d5845173d170e1ebfbbf8887839b89dde + languageName: node + linkType: hard + "@babel/highlight@npm:^7.23.4": version: 7.23.4 resolution: "@babel/highlight@npm:7.23.4" @@ -367,6 +471,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4555124235f34403bb28f55b1de58edf598491cc181c75f8afc8fe529903cb598cd52fe3bf2faab9bc1f45c299681ef0e44eea7a848bb85c500c5a4fe13f54f6 + languageName: node + linkType: hard + "@babel/parser@npm:^7.21.4, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": version: 7.24.0 resolution: "@babel/parser@npm:7.24.0" @@ -376,39 +492,60 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3742cc5068036287e6395269dce5a2735e6349cdc8d4b53297c75f98c580d7e1c8cb43235623999d151f2ef975d677dbc2c2357573a1855caa71c271bf3046c9 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + checksum: 10/1439e2ceec512b72f05f036503bf2c31e807d1b75ae22cf2676145e9f20740960a1c9575ea3065c6fb9f44f6b46163aab76eac513694ffa10de674e3cdd6219e languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/ec5fddc8db6de0e0082a883f21141d6f4f9f9f0bc190d662a732b5e9a506aae5d7d2337049a1bf055d7cb7add6f128036db6d4f47de5e9ac1be29e043c8b7ca8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + checksum: 10/e18235463e716ac2443938aaec3c18b40c417a1746fba0fa4c26cf4d71326b76ef26c002081ab1b445abfae98e063d561519aa55672dddc1ef80b3940211ffbb languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/3b0c9554cd0048e6e7341d7b92f29d400dbc6a5a4fc2f86dbed881d32e02ece9b55bc520387bae2eac22a5ab38a0b205c29b52b181294d99b4dd75e27309b548 + checksum: 10/3483f329bb099b438d05e5e206229ddbc1703972a69ba0240a796b5477369930b0ab2e7f6c9539ecad2cea8b0c08fa65498778b92cf87ad3d156f613de1fd2fa languageName: node linkType: hard @@ -487,25 +624,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + checksum: 10/2a463928a63b62052e9fb8f8b0018aa11a926e94f32c168260ae012afe864875c6176c6eb361e13f300542c31316dad791b08a5b8ed92436a3095c7a0e4fce65 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 10/87c8aa4a5ef931313f956871b27f2c051556f627b97ed21e9a5890ca4906b222d89062a956cde459816f5e0dec185ff128d7243d3fdc389504522acb88f0464e languageName: node linkType: hard @@ -653,67 +790,67 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + checksum: 10/58f9aa9b0de8382f8cfa3f1f1d40b69d98cd2f52340e2391733d0af745fdddda650ba392e509bc056157c880a2f52834a38ab2c5aa5569af8c61bb6ecbf45f34 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d402494087a6b803803eb5ab46b837aab100a04c4c5148e38bfa943ea1bbfc1ecfb340f1ced68972564312d3580f550c125f452372e77607a558fbbaf98c31c0 + checksum: 10/4ccc3755a3d51544cd43575db2c5c2ef42cdcd35bd5940d13cdf23f04c75496290e79ea585a62427ec6bd508a1bffb329e01556cd1114be9b38ae4254935cd19 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + checksum: 10/429004a6596aa5c9e707b604156f49a146f8d029e31a3152b1649c0b56425264fda5fd38e5db1ddaeb33c3fe45c97dc8078d7abfafe3542a979b49f229801135 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + checksum: 10/d8e18bd57b156da1cd4d3c1780ab9ea03afed56c6824ca8e6e74f67959d7989a0e953ec370fe9b417759314f2eef30c8c437395ce63ada2e26c2f469e4704f82 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bbb965a3acdfb03559806d149efbd194ac9c983b260581a60efcb15eb9fbe20e3054667970800146d867446db1c1398f8e4ee87f4454233e49b8f8ce947bd99b + checksum: 10/4093fa109cd256e8ad0b26e3ffa67ec6dac4078a1a24b7755bed63e650cf938b2a315e01696c35b221db1a37606f93cb82696c8d1bf563c2a9845620e551736e languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": +"@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: @@ -725,116 +862,128 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/95779e9eef0c0638b9631c297d48aee53ffdbb2b1b5221bf40d7eccd566a8e34f859ff3571f8f20b9159b67f1bff7d7dc81da191c15d69fbae5a645197eae7e0 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.4" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + checksum: 10/3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb4b19e7a39871c4414fb44fc5f2cc47c78f993b74c43238dfb99c9dac2d15cb99b43f8a3d42747580e1807d2b8f5e13ce7e95e593fd839bd176aa090bf9a23 + checksum: 10/eb7f4a3d852cfa20f4efd299929c564bd2b45106ac1cf4ac8b0c87baf078d4a15c39b8a21bbb01879c1922acb9baaf3c9b150486e18d84b30129e9671639793d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e75593e02c5ea473c17839e3c9d597ce3697bf039b66afe9a4d06d086a87fb3d95850b4174476897afc351dc1b46a9ec3165ee6e8fbad3732c0d65f676f855ad + checksum: 10/62bbfe1bd508517d96ba6909e68b1adb9dfd24ea61af1f4b0aa909bfc5e476044afe9c55b10ef74508fd147aa665e818df67ece834d164a9fd69b80c9ede3875 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5abd93718af5a61f8f6a97d2ccac9139499752dd5b2c533d7556fb02947ae01b2f51d4c4f5e64df569e8783d3743270018eb1fa979c43edec7dd1377acf107ed + checksum: 10/03d9a81cd9eeb24d48e207be536d460d6ad228238ac70da9b7ad4bae799847bb3be0aecfa4ea6223752f3a8d4ada3a58cd9a0f8fc70c01fdfc87ad0618f897d3 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + checksum: 10/7f623d25b6f213b94ebc1754e9e31c1077c8e288626d8b7bfa76a97b067ce80ddcd0ede402a546706c65002c0ccf45cd5ec621511c2668eed31ebcabe8391d35 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + checksum: 10/de600a958ad146fc8aca71fd2dfa5ebcfdb97df4eaa530fc9a4b0d28d85442ddb9b7039f260b396785211e88c6817125a94c183459763c363847e8c84f318ff0 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + checksum: 10/59fc561ee40b1a69f969c12c6c5fac206226d6642213985a569dd0f99f8e41c0f4eaedebd36936c255444a8335079842274c42a975a433beadb436d4c5abb79b languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + checksum: 10/f90841fe1a1e9f680b4209121d3e2992f923e85efcd322b26e5901c180ef44ff727fb89790803a23fac49af34c1ce2e480018027c22b4573b615512ac5b6fc50 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + checksum: 10/bc710ac231919df9555331885748385c11c5e695d7271824fe56fba51dd637d48d3e5cd52e1c69f2b1a384fbbb41552572bc1ca3a2285ee29571f002e9bb2421 languageName: node linkType: hard @@ -850,86 +999,86 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b84ef1f26a2db316237ae6d10fa7c22c70ac808ed0b8e095a8ecf9101551636cbb026bee9fb95a0a7944f3b8278ff9636a9088cb4a4ac5b84830a13829242735 + checksum: 10/befd0908c3f6b31f9fa9363a3c112d25eaa0bc4a79cfad1f0a8bb5010937188b043a44fb23443bc8ffbcc40c015bb25f80e4cc585ce5cc580708e2d56e76fe37 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + checksum: 10/31eb3c75297dda7265f78eba627c446f2324e30ec0124a645ccc3e9f341254aaa40d6787bd62b2280d77c0a5c9fbfce1da2c200ef7c7f8e0a1b16a8eb3644c6f languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + checksum: 10/f42302d42fc81ac00d14e9e5d80405eb80477d7f9039d7208e712d6bcd486a4e3b32fdfa07b5f027d6c773723d8168193ee880f93b0e430c828e45f104fb82a4 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + checksum: 10/2df94e9478571852483aca7588419e574d76bde97583e78551c286f498e01321e7dbb1d0ef67bee16e8f950688f79688809cfde370c5c4b84c14d841a3ef217a languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + checksum: 10/895f2290adf457cbf327428bdb4fb90882a38a22f729bcf0629e8ad66b9b616d2721fbef488ac00411b647489d1dda1d20171bb3772d0796bb7ef5ecf057808a languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + checksum: 10/4ea641cc14a615f9084e45ad2319f95e2fee01c77ec9789685e7e11a6c286238a426a98f9c1ed91568a047d8ac834393e06e8c82d1ff01764b7aa61bee8e9023 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/48c87dee2c7dae8ed40d16901f32c9e58be4ef87bf2c3985b51dd2e78e82081f3bad0a39ee5cf6e8909e13e954e2b4bedef0a8141922f281ed833ddb59ed9be2 + checksum: 10/5a324f7c630cf0be1f09098a3a36248c2521622f2c7ea1a44a5980f54b718f5e0dd4af92a337f4b445a8824c8d533853ebea7c16de829b8a7bc8bcca127d4d73 languageName: node linkType: hard @@ -946,29 +1095,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-simple-access": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7326a62ed5f766f93ee75684868635b59884e2801533207ea11561c296de53037949fecad4055d828fa7ebeb6cc9e55908aa3e7c13f930ded3e62ad9f24680d7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4bb800e5a9d0d668d7421ae3672fccff7d5f2a36621fd87414d7ece6d6f4d93627f9644cfecacae934bc65ffc131c8374242aaa400cca874dcab9b281a21aff0 + checksum: 10/565ec4518037b3d957431e29bda97b3d2fbb2e245fb5ba19889310ccb8fb71353e8ce2c325cc8d3fbc5a376d3af7d7e21782d5f502c46f8da077bee7807a590f languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e3f3af83562d687899555c7826b3faf0ab93ee7976898995b1d20cbe7f4451c55e05b0e17bfb3e549937cbe7573daf5400b752912a241b0a8a64d2457c7626e5 + checksum: 10/323bb9367e1967117a829f67788ec2ff55504b4faf8f6d83ec85d398e50b41cf7d1c375c67d63883dd7ad5e75b35c8ae776d89e422330ec0c0a1fda24e362083 languageName: node linkType: hard @@ -984,18 +1146,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + checksum: 10/e0d3af66cd0fad29c9d0e3fc65e711255e18b77e2e35bbd8f10059e3db7de6c16799ef74e704daf784950feb71e7a93c5bf2c771d98f1ca3fba1ff2e0240b24a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": version: 7.23.4 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: @@ -1007,58 +1169,69 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74025e191ceb7cefc619c15d33753aab81300a03d81b96ae249d9b599bc65878f962d608f452462d3aad5d6e334b7ab2b09a6bdcfe8d101fe77ac7aacca4261e + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + checksum: 10/3247bd7d409574fc06c59e0eb573ae7470d6d61ecf780df40b550102bb4406747d8f39dcbec57eb59406df6c565a86edd3b429e396ad02e4ce201ad92050832e languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.0" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1dfafd9461723769b29f724fcbdca974c4280f68a9e03c8ff412643ffe88930755f093f9cbf919cdb6d0d53751614892dd2882bccad286e14e9e995c5a8242ed + checksum: 10/ff6eeefbc5497cf33d62dc86b797c6db0e9455d6a4945d6952f3b703d04baab048974c6573b503e0ec097b8112d3b98b5f4ee516e1b8a74ed47aebba4d9d2643 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + checksum: 10/d34d437456a54e2a5dcb26e9cf09ed4c55528f2a327c5edca92c93e9483c37176e228d00d6e0cf767f3d6fdbef45ae3a5d034a7c59337a009e20ae541c8220fa languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + checksum: 10/ff7c02449d32a6de41e003abb38537b4a1ad90b1eaa4c0b578cb1b55548201a677588a8c47f3e161c72738400ae811a6673ea7b8a734344755016ca0ac445dac languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": +"@babel/plugin-transform-optional-chaining@npm:^7.23.0": version: 7.23.4 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: @@ -1071,18 +1244,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d41031b8e472b9b30aacd905a1561904bcec597dd888ad639b234971714dc9cd0dcb60df91a89219fc72e4feeb148e20f97bcddc39d7676e743ff0c23f62a7eb + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8c36c3fc25f9daa46c4f6db47ea809c395dc4abc7f01c4b1391f6e5b0cd62b83b6016728b02a6a8ac21aca56207c9ec66daefc0336e9340976978de7e6e28df + checksum: 10/c289c188710cd1c60991db169d8173b6e8e05624ae61a7da0b64354100bfba9e44bc1332dd9223c4e3fe1b9cbc0c061e76e7c7b3a75c9588bf35d0ffec428070 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": +"@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: @@ -1094,107 +1280,119 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7208c30bb3f3fbc73fb3a88bdcb78cd5cddaf6d523eb9d67c0c04e78f6fc6319ece89f4a5abc41777ceab16df55b3a13a4120e0efc9275ca6d2d89beaba80aa0 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/02eef2ee98fa86ee5052ed9bf0742d6d22b510b5df2fcce0b0f5615d6001f7786c6b31505e7f1c2f446406d8fb33603a5316d957cfa5b8365cbf78ddcc24fa42 + checksum: 10/466d1943960c2475c0361eba2ea72d504d4d8329a8e293af0eedd26887bf30a074515b330ea84be77331ace77efbf5533d5f04f8cff63428d2615f4a509ae7a4 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + checksum: 10/a73646d7ecd95b3931a3ead82c7d5efeb46e68ba362de63eb437d33531f294ec18bd31b6d24238cd3b6a3b919a6310c4a0ba4a2629927721d4d10b0518eb7715 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + checksum: 10/a04319388a0a7931c3f8e15715d01444c32519692178b70deccc86d53304e74c0f589a4268f6c68578d86f75e934dd1fe6e6ed9071f54ee8379f356f88ef6e42 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + checksum: 10/132c6040c65aabae2d98a39289efb5c51a8632546dc50d2ad032c8660aec307fbed74ef499856ea4f881fc8505905f49b48e0270585da2ea3d50b75e962afd89 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + checksum: 10/006a2032d1c57dca76579ce6598c679c2f20525afef0a36e9d42affe3c8cf33c1427581ad696b519cc75dfee46c5e8ecdf0c6a29ffb14250caa3e16dd68cb424 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c6372d2f788fd71d85aba12fbe08ee509e053ed27457e6674a4f9cae41ff885e2eb88aafea8fadd0ccf990601fc69ec596fa00959e05af68a15461a8d97a548d + checksum: 10/0b60cfe2f700ec2c9c1af979bb805860258539648dadcd482a5ddfc2330b733fb61bb60266404f3e068246ad0d6376040b4f9c5ab9037a3d777624d64acd89e9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + checksum: 10/e326e96a9eeb6bb01dbc4d3362f989411490671b97f62edf378b8fb102c463a018b777f28da65344d41b22aa6efcdfa01ed43d2b11fdcf202046d3174be137c5 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + checksum: 10/4c9009c72321caf20e3b6328bbe9d7057006c5ae57b794cf247a37ca34d87dfec5e27284169a16df5a6235a083bf0f3ab9e1bfcb005d1c8b75b04aed75652621 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + checksum: 10/3dda5074abf8b5df9cdef697d6ebe14a72c199bd6c2019991d033d9ad91b0be937b126b8f34c3c5a9725afee9016a3776aeef3e3b06ab9b3f54f2dd5b5aefa37 languageName: node linkType: hard @@ -1212,72 +1410,73 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + checksum: 10/d39041ff6b0cef78271ebe88be6dfd2882a3c6250a54ddae783f1b9adc815e8486a7d0ca054fabfa3fde1301c531d5be89224999fc7be83ff1eda9b77d173051 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + checksum: 10/276099b4483e707f80b054e2d29bc519158bfe52461ef5ff76f70727d592df17e30b1597ef4d8a0f04d810f6cb5a8dd887bdc1d0540af3744751710ef280090f languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + checksum: 10/400a0927bdb1425b4c0dc68a61b5b2d7d17c7d9f0e07317a1a6a373c080ef94be1dd65fdc4ac9a78fcdb58f89fd128450c7bc0d5b8ca0ae7eca3fbd98e50acba languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + checksum: 10/364342fb8e382dfaa23628b88e6484dc1097e53fb7199f4d338f1e2cd71d839bb0a35a9b1380074f6a10adb2e98b79d53ca3ec78c0b8c557ca895ffff42180df languageName: node linkType: hard -"@babel/preset-env@npm:^7.23.2": - version: 7.24.0 - resolution: "@babel/preset-env@npm:7.24.0" +"@babel/preset-env@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" dependencies: - "@babel/compat-data": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.4" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1289,63 +1488,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.8" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.6" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.4" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.4" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.0" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/88bca150a09e658124997178ee1ff375a9aceecfd70ec11c7ccc12e82f5be5f7ff2ddfefba5b10fb617891645f92949392b350509de9742d2aa138f42959e190 + checksum: 10/3d5cbdc2501bc1959fc76ed9d409d0ee5264bc475fa809958fd2e8e7db9b12f8eccdae750a0e05d25207373c42ca115b42bb3d5c743bc770cb12b6af05bf3bd8 languageName: node linkType: hard @@ -1432,7 +1631,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.24.0": +"@babel/traverse@npm:^7.24.0": version: 7.24.0 resolution: "@babel/traverse@npm:7.24.0" dependencies: @@ -1450,6 +1649,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" + dependencies: + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/b9b0173c286ef549e179f3725df3c4958069ad79fe5b9840adeb99692eb4a5a08db4e735c0f086aab52e7e08ec711cee9e7c06cb908d8035641d1382172308d3 + languageName: node + linkType: hard + "@babel/types@npm:^7.21.4, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.8.3, @babel/types@npm:^7.9.6": version: 7.24.0 resolution: "@babel/types@npm:7.24.0" @@ -1971,7 +2188,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.24": +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -1993,126 +2210,383 @@ __metadata: languageName: node linkType: hard -"@ndelangen/get-tarball@npm:^3.0.7": - version: 3.0.9 - resolution: "@ndelangen/get-tarball@npm:3.0.9" +"@ndelangen/get-tarball@npm:^3.0.7": + version: 3.0.9 + resolution: "@ndelangen/get-tarball@npm:3.0.9" + dependencies: + gunzip-maybe: "npm:^1.4.2" + pump: "npm:^3.0.0" + tar-fs: "npm:^2.1.1" + checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@playwright/experimental-ct-core@npm:1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-core@npm:1.42.1" + dependencies: + playwright: "npm:1.42.1" + playwright-core: "npm:1.42.1" + vite: "npm:^5.0.12" + bin: + playwright: cli.js + checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + languageName: node + linkType: hard + +"@playwright/experimental-ct-vue@npm:^1.42.1": + version: 1.42.1 + resolution: "@playwright/experimental-ct-vue@npm:1.42.1" + dependencies: + "@playwright/experimental-ct-core": "npm:1.42.1" + "@vitejs/plugin-vue": "npm:^4.2.1" + bin: + playwright: cli.js + checksum: 10/c9511f965cd44999697d30065647df79bb352e7b5f670decdaf1f9b6f1928b22ce5d399a9acffabce66c14c97cee7ced0d94c5cc748e5a53b3934bfe127e4fea + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10/2b93e161d3fdabe9a64919def7fa3ceaecf2848341e9211520c401181c9eaebb8451c630b066fad2256e5c639c95edc41de0ba59c40eff37e799918d019822d1 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-context@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a02187a3bae3a0f1be5fab5ad19c1ef06ceff1028d957e4d9994f0186f594a9c3d93ee34bacb86d1fa8eb274493362944398e1c17054d12cb3b75384f9ae564b + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/adbd7301586db712616a0f8dd54a25e7544853cbf61b5d6e279215d479f57ac35157847ee424d54a7e707969a926ca0a7c28934400c9ac224bd0c7cc19229aca + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-escape-keydown": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/f1626d69bb50ec226032bb7d8c5abaaf7359c2d7660309b0ed3daaedd91f30717573aac1a1cb82d589b7f915cf464b95a12da0a3b91b6acfefb6fbbc62b992de + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-focus-guards@npm:1.0.1" dependencies: - gunzip-maybe: "npm:^1.4.2" - pump: "npm:^3.0.0" - tar-fs: "npm:^2.1.1" - checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/1f8ca8f83b884b3612788d0742f3f054e327856d90a39841a47897dbed95e114ee512362ae314177de226d05310047cabbf66b686ae86ad1b65b6b295be24ef7 languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@radix-ui/react-focus-scope@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-focus-scope@npm:1.0.4" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/3590e74c6b682737c7ac4bf8db41b3df7b09a0320f3836c619e487df9915451e5dafade9923a74383a7366c59e9436f5fff4301d70c0d15928e0e16b36e58bc9 languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 +"@radix-ui/react-id@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-id@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/446a453d799cc790dd2a1583ff8328da88271bff64530b5a17c102fa7fb35eece3cf8985359d416f65e330cd81aa7b8fe984ea125fc4f4eaf4b3801d698e49fe languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@radix-ui/react-portal@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-portal@npm:1.0.4" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c4cf35e2f26a89703189d0eef3ceeeb706ae0832e98e558730a5e929ca7c72c7cb510413a24eca94c7732f8d659a1e81942bec7b90540cb73ce9e4885d040b64 languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10/d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/406f0b5a54ea4e7881e15bddc3863234bb14bf3abd4a6e56ea57c6df6f9265a9ad5cfa158e3a98614f0dcbbb7c5f537e1f7158346e57cc3f29b522d62cf28823 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/bedb934ac07c710dc5550a7bfc7065d47e099d958cde1d37e4b1947ae5451f1b7e6f8ff5965e242578bf2c619065e6038c3a3aa779e5eafa7da3e3dbc685799f languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff +"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 languageName: node linkType: hard -"@playwright/experimental-ct-core@npm:1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-core@npm:1.42.1" +"@radix-ui/react-use-callback-ref@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" dependencies: - playwright: "npm:1.42.1" - playwright-core: "npm:1.42.1" - vite: "npm:^5.0.12" - bin: - playwright: cli.js - checksum: 10/ec62a3f0b8c82720101741884f2c5125f1daaba01fc6c9d3eee627b28ce5f9a40f2abc44bd2f40dd1a6a1856d1540468d13b7c05e301cf576d0c8d2984ca722d + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b9fd39911c3644bbda14a84e4fca080682bef84212b8d8931fcaa2d2814465de242c4cfd8d7afb3020646bead9c5e539d478cea0a7031bee8a8a3bb164f3bc4c languageName: node linkType: hard -"@playwright/experimental-ct-vue@npm:^1.42.1": - version: 1.42.1 - resolution: "@playwright/experimental-ct-vue@npm:1.42.1" +"@radix-ui/react-use-controllable-state@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" dependencies: - "@playwright/experimental-ct-core": "npm:1.42.1" - "@vitejs/plugin-vue": "npm:^4.2.1" - bin: - playwright: cli.js - checksum: 10/c9511f965cd44999697d30065647df79bb352e7b5f670decdaf1f9b6f1928b22ce5d399a9acffabce66c14c97cee7ced0d94c5cc748e5a53b3934bfe127e4fea + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/dee2be1937d293c3a492cb6d279fc11495a8f19dc595cdbfe24b434e917302f9ac91db24e8cc5af9a065f3f209c3423115b5442e65a5be9fd1e9091338972be9 languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" +"@radix-ui/react-use-escape-keydown@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + checksum: 10/c6ed0d9ce780f67f924980eb305af1f6cce2a8acbaf043a58abe0aa3cc551d9aa76ccee14531df89bbee302ead7ecc7fce330886f82d4672c5eda52f357ef9b8 languageName: node linkType: hard -"@radix-ui/react-slot@npm:^1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/734866561e991438fbcf22af06e56b272ed6ee8f7b536489ee3bf2f736f8b53bf6bc14ebde94834aa0aceda854d018a0ce20bb171defffbaed1f566006cbb887 + checksum: 10/bed9c7e8de243a5ec3b93bb6a5860950b0dba359b6680c84d57c7a655e123dec9b5891c5dfe81ab970652e7779fe2ad102a23177c7896dde95f7340817d47ae5 languageName: node linkType: hard @@ -2249,11 +2723,9 @@ __metadata: resolution: "@storybook/addon-controls@portal:../../../code/addons/controls::locator=portable-stories-vue3%40workspace%3A." dependencies: "@storybook/blocks": "workspace:*" - "@storybook/core-common": "workspace:*" - cjs-module-lexer: "npm:^1.2.3" - es-module-lexer: "npm:^1.5.0" - globby: "npm:^14.0.1" + dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" + telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2262,7 +2734,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/addon-docs@portal:../../../code/addons/docs::locator=portable-stories-vue3%40workspace%3A." dependencies: - "@babel/core": "npm:^7.12.3" + "@babel/core": "npm:^7.24.4" "@mdx-js/react": "npm:^3.0.0" "@storybook/blocks": "workspace:*" "@storybook/client-logger": "workspace:*" @@ -2367,7 +2839,7 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" @@ -2471,8 +2943,8 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/cli@portal:../../../code/lib/cli::locator=portable-stories-vue3%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" "@ndelangen/get-tarball": "npm:^3.0.7" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" @@ -2525,10 +2997,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/codemod@portal:../../../code/lib/codemod::locator=portable-stories-vue3%40workspace%3A." dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/preset-env": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/core": "npm:^7.24.4" + "@babel/preset-env": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/node-logger": "workspace:*" "@storybook/types": "workspace:*" @@ -2547,9 +3019,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/components@portal:../../../code/ui/components::locator=portable-stories-vue3%40workspace%3A." dependencies: + "@radix-ui/react-dialog": "npm:^1.0.5" "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/theming": "workspace:*" @@ -2587,6 +3060,7 @@ __metadata: node-fetch: "npm:^2.0.0" picomatch: "npm:^2.3.0" pkg-dir: "npm:^5.0.0" + prettier-fallback: "npm:prettier@^3" pretty-hrtime: "npm:^1.0.3" resolve-from: "npm:^5.0.0" semver: "npm:^7.3.7" @@ -2594,6 +3068,11 @@ __metadata: tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" util: "npm:^0.12.4" + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true languageName: node linkType: soft @@ -2601,6 +3080,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/core-events@portal:../../../code/lib/core-events::locator=portable-stories-vue3%40workspace%3A." dependencies: + "@storybook/csf": "npm:^0.1.4" ts-dedent: "npm:^2.0.0" languageName: node linkType: soft @@ -2610,13 +3090,14 @@ __metadata: resolution: "@storybook/core-server@portal:../../../code/lib/core-server::locator=portable-stories-vue3%40workspace%3A." dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" - "@babel/core": "npm:^7.23.9" + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" "@discoveryjs/json-ext": "npm:^0.5.3" "@storybook/builder-manager": "workspace:*" "@storybook/channels": "workspace:*" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/csf-tools": "workspace:*" "@storybook/docs-mdx": "npm:3.0.0" "@storybook/global": "npm:^5.0.0" @@ -2627,6 +3108,7 @@ __metadata: "@storybook/telemetry": "workspace:*" "@storybook/types": "workspace:*" "@types/detect-port": "npm:^1.3.0" + "@types/diff": "npm:^5.0.9" "@types/node": "npm:^18.0.0" "@types/pretty-hrtime": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" @@ -2635,6 +3117,7 @@ __metadata: cli-table3: "npm:^0.6.1" compression: "npm:^1.7.4" detect-port: "npm:^1.3.0" + diff: "npm:^5.2.0" express: "npm:^4.17.3" fs-extra: "npm:^11.1.0" globby: "npm:^14.0.1" @@ -2668,11 +3151,11 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/csf-tools@portal:../../../code/lib/csf-tools::locator=portable-stories-vue3%40workspace%3A." dependencies: - "@babel/generator": "npm:^7.23.0" - "@babel/parser": "npm:^7.23.0" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@storybook/csf": "npm:^0.1.2" + "@babel/generator": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + "@storybook/csf": "npm:^0.1.4" "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.5" @@ -2689,12 +3172,12 @@ __metadata: languageName: node linkType: hard -"@storybook/csf@npm:^0.1.2": - version: 0.1.2 - resolution: "@storybook/csf@npm:0.1.2" +"@storybook/csf@npm:^0.1.4": + version: 0.1.4 + resolution: "@storybook/csf@npm:0.1.4" dependencies: type-fest: "npm:^2.19.0" - checksum: 10/11168df65e7b6bd0e5d31e7e805c8ba80397fc190cb33424e043b72bbd85d8f826dba082503992d7f606b72484337ab9d091eca947550613e241fbef57780d4c + checksum: 10/105f3bd748613b775e87454a8470e36733d0ac25b4b88aa9dbebe060f92ff8d5fda1c98289657039d980ecc8d4d59079ef559a42e211568dc97e19d245117156 languageName: node linkType: hard @@ -2710,6 +3193,7 @@ __metadata: resolution: "@storybook/docs-tools@portal:../../../code/lib/docs-tools::locator=portable-stories-vue3%40workspace%3A." dependencies: "@storybook/core-common": "workspace:*" + "@storybook/core-events": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" "@types/doctrine": "npm:^0.0.3" @@ -2757,7 +3241,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.2.5" "@storybook/router": "workspace:*" @@ -2791,7 +3275,7 @@ __metadata: "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/core-events": "workspace:*" - "@storybook/csf": "npm:^0.1.2" + "@storybook/csf": "npm:^0.1.4" "@storybook/global": "npm:^5.0.0" "@storybook/types": "workspace:*" "@types/qs": "npm:^6.9.5" @@ -2858,7 +3342,6 @@ __metadata: "@testing-library/user-event": "npm:^14.5.2" "@vitest/expect": "npm:1.3.1" "@vitest/spy": "npm:^1.3.1" - chai: "npm:^4.4.1" util: "npm:^0.12.4" languageName: node linkType: soft @@ -3027,6 +3510,13 @@ __metadata: languageName: node linkType: hard +"@types/diff@npm:^5.0.9": + version: 5.2.0 + resolution: "@types/diff@npm:5.2.0" + checksum: 10/e1d3e6e9fd9d5386496c8716dd89316288d139cd8159a064f886a079149d05d65289b7b725ce1e333d4e77ce8024e210c6e281e9875a636fc17b4c760c2cf85f + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -3894,6 +4384,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/df4bc15423aaaba3729a7d40abcbf6d3fffa5b8fd5eb33d3ac8b7da0110c47552fca60d97f2e1edfbb68a27cae1da499f1c3896966efb3e26aac4e3b57e3cc8b + languageName: node + linkType: hard + "aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -4055,39 +4554,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.10 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.10" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/9fb5e59a3235eba66fb05060b2a3ecd6923084f100df7526ab74b6272347d7adcf99e17366b82df36e592cde4e82fdb7ae24346a990eced76c7d504cac243400 + checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.9.0": - version: 0.9.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" +"babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" - core-js-compat: "npm:^3.34.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/efdf9ba82e7848a2c66e0522adf10ac1646b16f271a9006b61a22f976b849de22a07c54c8826887114842ccd20cc9a4617b61e8e0789227a74378ab508e715cd + checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.5": - version: 0.5.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/3a9b4828673b23cd648dcfb571eadcd9d3fadfca0361d0a7c6feeb5a30474e92faaa49f067a6e1c05e49b6a09812879992028ff3ef3446229ff132d6e1de7eb6 + checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -4244,7 +4743,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3": +"browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -4357,7 +4856,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.10, chai@npm:^4.4.1": +"chai@npm:^4.3.10": version: 4.4.1 resolution: "chai@npm:4.4.1" dependencies: @@ -4477,13 +4976,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.2.3": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10/f96a5118b0a012627a2b1c13bd2fcb92509778422aaa825c5da72300d6dcadfb47134dd2e9d97dfa31acd674891dd91642742772d19a09a8adc3e56bd2f5928c - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -4709,7 +5201,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": +"core-js-compat@npm:^3.31.0": version: 3.36.0 resolution: "core-js-compat@npm:3.36.0" dependencies: @@ -4718,6 +5210,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.36.1": + version: 3.37.0 + resolution: "core-js-compat@npm:3.37.0" + dependencies: + browserslist: "npm:^4.23.0" + checksum: 10/5f33d7ba45acc9ceb45544d844090edfd14e46a64c2424df24084347405182c1156588cc3a877fc580c005a0b13b8a1af26bb6c73fe73f22eede89b5483b482d + languageName: node + linkType: hard + "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -5017,6 +5518,13 @@ __metadata: languageName: node linkType: hard +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10/e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-package-manager@npm:^2.0.1": version: 2.0.1 resolution: "detect-package-manager@npm:2.0.1" @@ -5046,6 +5554,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -6216,6 +6731,13 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10/ad5104871d114a694ecc506a2d406e2331beccb961fe1e110dc25556b38bcdbf399a823a8a375976cd8889668156a9561e12ebe3fa6a4c6ba169c8466c2ff868 + languageName: node + linkType: hard + "get-npm-tarball-url@npm:^2.0.3": version: 2.1.0 resolution: "get-npm-tarball-url@npm:2.1.0" @@ -6728,6 +7250,15 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10/cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -7520,7 +8051,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.1.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -8557,7 +9088,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.1": +"prettier-fallback@npm:prettier@^3, prettier@npm:^3.1.1": version: 3.2.5 resolution: "prettier@npm:3.2.5" bin: @@ -8944,6 +9475,58 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll-bar@npm:^2.3.3": + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5ab8eda61d5b10825447d11e9c824486c929351a471457c22452caa19b6898e18c3af6a46c3fa68010c713baed1eb9956106d068b4a1058bdcf97a1a9bbed734 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.5": + version: 2.5.5 + resolution: "react-remove-scroll@npm:2.5.5" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f0646ac384ce3852d1f41e30a9f9e251b11cf3b430d1d114c937c8fa7f90a895c06378d0d6b6ff0b2d00cbccf15e845921944fd6074ae67a0fb347a718106d88 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/80c58fd6aac3594e351e2e7b048d8a5b09508adb21031a38b3c40911fe58295572eddc640d4b20a7be364842c8ed1120fe30097e22ea055316b375b88d4ff02a + languageName: node + linkType: hard + "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -10045,7 +10628,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -10358,6 +10941,37 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.0": + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/3be76eae71b52ab233b4fde974eddeff72e67e6723100a0c0297df4b0d60daabedfa706ffb314d0a52645f2c1235e50fdbd53d99f374eb5df68c74d412e98a9b + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ec99e31aefeb880f6dc4d02cb19a01d123364954f857811470ece32872f70d6c3eadbe4d073770706a9b7db6136f2a9fbf1bb803e07fbb21e936a47479281690 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" From 7c89f0fb5d8132c52e71538fa5548382e5712798 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 25 Apr 2024 13:36:46 -0600 Subject: [PATCH 145/180] Update snapshot --- .../docgen-components/8428-js-static-prop-types/docgen.snapshot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/renderers/react/template/stories/docgen-components/8428-js-static-prop-types/docgen.snapshot b/code/renderers/react/template/stories/docgen-components/8428-js-static-prop-types/docgen.snapshot index 51b837feb2b6..2fb12d5579e7 100644 --- a/code/renderers/react/template/stories/docgen-components/8428-js-static-prop-types/docgen.snapshot +++ b/code/renderers/react/template/stories/docgen-components/8428-js-static-prop-types/docgen.snapshot @@ -1,5 +1,5 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import React from 'react'; import PropTypes from 'prop-types'; From 397ab28ec2b094f24f36b247cb79d6e8966a01c2 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 25 Apr 2024 16:58:16 -0600 Subject: [PATCH 146/180] Fix play function --- .../manager/src/components/sidebar/FileSearchModal.stories.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx index d27d61b0457e..aaa604953aea 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.stories.tsx @@ -101,6 +101,7 @@ export const WithSearchResults: Story = { await fireEvent.click(moduleSingleExport); expect(args.onCreateNewStory).toHaveBeenCalledWith({ + componentExportCount: 1, componentExportName: 'default', componentFilePath: 'src/module-single-export.js', componentIsDefaultExport: true, From 5ccf7415990a51524f837347e3f118c88f84e77f Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 08:58:23 +0200 Subject: [PATCH 147/180] dedupe --- code/yarn.lock | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/code/yarn.lock b/code/yarn.lock index e1b518ce055d..4ec31236d421 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -548,7 +548,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.0, @babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": version: 0.6.2 resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: @@ -10552,7 +10552,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": +"babel-plugin-polyfill-corejs2@npm:^0.4.10, babel-plugin-polyfill-corejs2@npm:^0.4.8": version: 0.4.11 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: @@ -10565,19 +10565,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.9 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.9" - dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/2cd47af763eb40aa41f1d6d9cbf1bdd217ff6c28f614b057c0328ee42a4d82cbcdcbc7d081d93e2a2d80446c899f25c3ebec048a63d260ef65a0a364134f71cd - languageName: node - linkType: hard - "babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": version: 0.10.4 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" @@ -11232,7 +11219,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.21.5, browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": +"browserslist@npm:^4.21.10, browserslist@npm:^4.21.5, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -12426,16 +12413,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": - version: 3.36.0 - resolution: "core-js-compat@npm:3.36.0" - dependencies: - browserslist: "npm:^4.22.3" - checksum: 10c0/5ce2ad0ece8379883c01958e196575abc015692fc0394b8917f132b6b32e5c2bfb2612902c3f98f270cfa2d9d6522c28d36665038f3726796f1f4b436e4f863e - languageName: node - linkType: hard - -"core-js-compat@npm:^3.36.1": +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0, core-js-compat@npm:^3.36.1": version: 3.37.0 resolution: "core-js-compat@npm:3.37.0" dependencies: From 1b1af0b39e1e88aaba9fc266eae25b9848dc0dcc Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 10:11:25 +0200 Subject: [PATCH 148/180] throw error when asked to convert CSF2 --- .../duplicate-story-with-new-name.test.ts | 21 ++++++++++++------- .../duplicate-story-with-new-name.ts | 5 +++++ .../mocks/csf-variances.stories.tsx | 3 --- .../unsupported-csf-variances.stories.tsx | 19 +++++++++++++++++ .../update-args-in-csf-file.test.ts | 13 ++++++++++++ .../save-story/update-args-in-csf-file.ts | 5 +++++ 6 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-story/mocks/unsupported-csf-variances.stories.tsx diff --git a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts index 42131e534578..59250060f5d2 100644 --- a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts +++ b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.test.ts @@ -12,6 +12,7 @@ const makeTitle = (userTitle: string) => userTitle; const FILES = { csfVariances: join(__dirname, 'mocks/csf-variances.stories.tsx'), + unsupportedCsfVariances: join(__dirname, 'mocks/unsupported-csf-variances.stories.tsx'), typescriptConstructs: join(__dirname, 'mocks/typescript-constructs.stories.tsx'), }; @@ -39,9 +40,9 @@ describe('success', () => { // check if the code was updated correctly expect(getDiff(before, after)).toMatchInlineSnapshot(` " ... - - // editing this should fail - export const CSF2 = () => ; + canvasElement.style.backgroundColor = "red"; + }, + } satisfies Story; + export const EmptyDuplicated = {} satisfies Story; + export const EmptyWithCommentDuplicated = {} satisfies Story; @@ -70,13 +71,19 @@ describe('success', () => { + canvasElement.style.backgroundColor = "red"; + }, + } satisfies Story; - + - + export const CSF2Duplicated = () => ( - + - + ); + " `); }); + test('Unsupported CSF Variances', async () => { + const CSF = await readCsf(FILES.unsupportedCsfVariances, { makeTitle }); + + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + + names.forEach((name) => { + expect(() => duplicateStoryWithNewName(parsed, name, name + 'Duplicated')).toThrow(); + }); + }); test('Typescript Constructs', async () => { const before = await format(await readFile(FILES.typescriptConstructs, 'utf-8'), { parser: 'typescript', diff --git a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts index 05dae1d39e38..41584283faaa 100644 --- a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts +++ b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts @@ -35,6 +35,11 @@ export const duplicateStoryWithNewName = (csfFile: In, storyName: string, newSto noScope: true, }); + // detect CSF2 and throw + if (t.isArrowFunctionExpression(cloned.init) || t.isCallExpression(cloned.init)) { + throw new Error(`CSF2 is not supported`); + } + traverse.default(csfFile._ast, { Program(path) { path.pushContainer( diff --git a/code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx index e8eedcd3bccc..9fcbc4bd4df3 100644 --- a/code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx +++ b/code/lib/core-server/src/utils/save-story/mocks/csf-variances.stories.tsx @@ -71,6 +71,3 @@ export const HasPlayFunction = { canvasElement.style.backgroundColor = 'red'; }, } satisfies Story; - -// editing this should fail -export const CSF2 = () => ; diff --git a/code/lib/core-server/src/utils/save-story/mocks/unsupported-csf-variances.stories.tsx b/code/lib/core-server/src/utils/save-story/mocks/unsupported-csf-variances.stories.tsx new file mode 100644 index 000000000000..b86095381faa --- /dev/null +++ b/code/lib/core-server/src/utils/save-story/mocks/unsupported-csf-variances.stories.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import type { FC } from 'react'; +import type { Meta } from '@storybook/react'; + +export default { + title: 'MyComponent', + args: { + initial: 'foo', + }, +} satisfies Meta; + +// dummy component +const MyComponent: FC<{ absolute: boolean; bordered: boolean; initial: string }> = (props) => ( +
{JSON.stringify(props)}
+); + +export const CSF2 = () => ; + +export const CSF2b = CSF2.bind({}); diff --git a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts index bcaee0576e92..8f0f2fb6b737 100644 --- a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts +++ b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.test.ts @@ -13,6 +13,7 @@ const makeTitle = (userTitle: string) => userTitle; const FILES = { typescriptConstructs: join(__dirname, 'mocks/typescript-constructs.stories.tsx'), csfVariances: join(__dirname, 'mocks/csf-variances.stories.tsx'), + unsupportedCsfVariances: join(__dirname, 'mocks/unsupported-csf-variances.stories.tsx'), exportVariances: join(__dirname, 'mocks/export-variances.stories.tsx'), dataVariances: join(__dirname, 'mocks/data-variances.stories.tsx'), }; @@ -91,6 +92,18 @@ describe('success', () => { " `); }); + test('Unsupported CSF Variances', async () => { + const newArgs = { bordered: true, initial: 'test1' }; + + const CSF = await readCsf(FILES.unsupportedCsfVariances, { makeTitle }); + const parsed = CSF.parse(); + const names = Object.keys(parsed._stories); + const nodes = names.map((name) => CSF.getStoryExport(name)); + + nodes.forEach((node) => { + expect(() => updateArgsInCsfFile(node, newArgs)).rejects.toThrowError(); + }); + }); test('CSF Variances', async () => { const newArgs = { bordered: true, initial: 'test1' }; diff --git a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts index d51ba1ad73d9..9b95114e7537 100644 --- a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts @@ -10,6 +10,11 @@ export const updateArgsInCsfFile = async (node: t.Node, input: Record { From 8841ef7182cf38bf582ad57dc1e4e1ce41c29f16 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 10:18:32 +0200 Subject: [PATCH 149/180] only explicitly support empty function when save-from-controls is used --- code/addons/controls/package.json | 1 - code/addons/controls/src/manager.tsx | 9 +++------ .../core-server/src/utils/save-story/save-story.ts | 11 +++++------ code/yarn.lock | 1 - 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/code/addons/controls/package.json b/code/addons/controls/package.json index 5c9bcd56f1ee..482e56e196ee 100644 --- a/code/addons/controls/package.json +++ b/code/addons/controls/package.json @@ -54,7 +54,6 @@ "@storybook/blocks": "workspace:*", "dequal": "^2.0.2", "lodash": "^4.17.21", - "telejson": "^7.2.0", "ts-dedent": "^2.0.0" }, "devDependencies": { diff --git a/code/addons/controls/src/manager.tsx b/code/addons/controls/src/manager.tsx index d7195cd544e1..2601b2787ec1 100644 --- a/code/addons/controls/src/manager.tsx +++ b/code/addons/controls/src/manager.tsx @@ -1,4 +1,3 @@ -import { stringify } from 'telejson'; import React from 'react'; import { dequal as deepEqual } from 'dequal'; import { AddonPanel, Badge, Spaced } from '@storybook/components'; @@ -32,11 +31,9 @@ function Title() { } const stringifyArgs = (args: Record) => - stringify(args, { - allowDate: true, - allowFunction: true, - allowUndefined: true, - allowSymbol: true, + JSON.stringify(args, (_, value) => { + if (typeof value === 'function') return '__sb_empty_function_arg__'; + return value; }); addons.register(ADDON_ID, (api) => { diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 506be3147439..0077e86b2816 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -1,6 +1,5 @@ /* eslint-disable no-underscore-dangle */ import fs from 'node:fs/promises'; -import { parse } from 'telejson'; import type { Channel } from '@storybook/channels'; import type { RequestData, @@ -21,11 +20,11 @@ import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; import { formatFileContent } from '@storybook/core-common'; const parseArgs = (args: string): Record => - parse(args, { - allowDate: true, - allowFunction: true, - allowUndefined: true, - allowSymbol: true, + JSON.parse(args, (_, value) => { + if (value === '__sb_empty_function_arg__') { + return () => {}; + } + return value; }); // Removes extra newlines between story properties. See https://github.com/benjamn/recast/issues/242 diff --git a/code/yarn.lock b/code/yarn.lock index 4ec31236d421..dc4aa34818a1 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -5175,7 +5175,6 @@ __metadata: lodash: "npm:^4.17.21" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" - telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" languageName: unknown linkType: soft From b336534dd79a81e886796bbaec8e1945ab456091 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 10:44:00 +0200 Subject: [PATCH 150/180] improve mobile layout --- code/addons/controls/src/SaveStory.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/addons/controls/src/SaveStory.tsx b/code/addons/controls/src/SaveStory.tsx index 614e8364ff74..8f72826c6460 100644 --- a/code/addons/controls/src/SaveStory.tsx +++ b/code/addons/controls/src/SaveStory.tsx @@ -43,6 +43,11 @@ const Bar = styled(BaseBar)(({ theme }) => ({ background: theme.background.bar, borderTop: `1px solid ${theme.appBorderColor}`, fontSize: theme.typography.size.s2, + + '@container (max-width: 799px)': { + flexDirection: 'row', + justifyContent: 'flex-end', + }, })); const Info = styled.div({ From 2a468275af51c3046c9351547872debe8d01169a Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 29 Apr 2024 12:28:18 +0200 Subject: [PATCH 151/180] Add arrow navigation to the Save From Controls Modal search results --- .../sidebar/FIleSearchList.utils.tsx | 118 ++++++++++++++++++ .../src/components/sidebar/FileList.tsx | 2 +- .../src/components/sidebar/FileSearchList.tsx | 29 +++-- 3 files changed, 136 insertions(+), 13 deletions(-) create mode 100644 code/ui/manager/src/components/sidebar/FIleSearchList.utils.tsx diff --git a/code/ui/manager/src/components/sidebar/FIleSearchList.utils.tsx b/code/ui/manager/src/components/sidebar/FIleSearchList.utils.tsx new file mode 100644 index 000000000000..83e2dac00f83 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/FIleSearchList.utils.tsx @@ -0,0 +1,118 @@ +import type { Virtualizer } from '@tanstack/react-virtual'; +import { useEffect } from 'react'; +import { flushSync } from 'react-dom'; + +interface UseArrowKeyNavigationProps { + rowVirtualizer: Virtualizer; + parentRef: React.MutableRefObject; + selectedItem: number | null; +} + +/** + * Hook to navigate through the list of items and subitems using the arrow keys + */ +export const useArrowKeyNavigation = ({ + parentRef, + rowVirtualizer, + selectedItem, +}: UseArrowKeyNavigationProps) => { + useEffect(() => { + const handleArrowKeys = (event: KeyboardEvent) => { + if (!parentRef.current) { + return; + } + + const maxIndex = rowVirtualizer.options.count; + const activeElement = document.activeElement; + const rowIndex = parseInt(activeElement.getAttribute('data-index') || '-1', 10); + const isActiveElementInput = activeElement.tagName === 'INPUT'; + + const getFirstElement = () => + document.querySelector('[data-index="0"]') as HTMLElement | null; + const getLastElement = () => + document.querySelector(`[data-index="${maxIndex - 1}"]`) as HTMLElement | null; + + if (event.code === 'ArrowDown' && activeElement) { + event.stopPropagation(); + + // If the search input is focused, focus the first element + if (isActiveElementInput) { + getFirstElement()?.focus(); + return; + } + + // if the last element is focused, focus the first element + if (rowIndex === maxIndex - 1) { + flushSync(() => { + rowVirtualizer.scrollToIndex(0, { align: 'start' }); + }); + setTimeout(() => { + getFirstElement()?.focus(); + }, 100); + return; + } + + // if the focus is on an selected element, focus the first element in the sublist + if (selectedItem === rowIndex) { + const firstSubListItem = document.querySelector( + `[data-index-position="${selectedItem}_first"]` + ) as HTMLElement; + firstSubListItem?.focus(); + return; + } + + // if the focus is on the last element on a sublist, focus the next parent list element + if (selectedItem !== null) { + const isLastElementSelected = activeElement + .getAttribute('data-index-position') + ?.includes('last'); + if (isLastElementSelected) { + const nextElement = document.querySelector( + `[data-index="${selectedItem + 1}"]` + ) as HTMLElement; + nextElement?.focus(); + return; + } + } + + const nextElement = activeElement.nextElementSibling as HTMLElement; + nextElement?.focus(); + } + + if (event.code === 'ArrowUp' && activeElement) { + if (isActiveElementInput) { + flushSync(() => { + rowVirtualizer.scrollToIndex(maxIndex - 1, { align: 'start' }); + }); + setTimeout(() => { + getLastElement()?.focus(); + }, 100); + return; + } + + // if the focus is on the first element on a sublist, focus the previous parent list element + if (selectedItem !== null) { + const isLastElementSelected = activeElement + .getAttribute('data-index-position') + ?.includes('first'); + if (isLastElementSelected) { + const prevElement = document.querySelector( + `[data-index="${selectedItem}"]` + ) as HTMLElement; + prevElement?.focus(); + return; + } + } + + const previousElement = activeElement.previousElementSibling as HTMLElement; + previousElement?.focus(); + } + }; + // listener for arrow keys to select the next/previous element by using the current active element as base + document.addEventListener('keydown', handleArrowKeys, { capture: true }); + + return () => { + document.removeEventListener('keydown', handleArrowKeys, { capture: true }); + }; + }, [rowVirtualizer, selectedItem, parentRef]); +}; diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index e5087a132639..d56cfc096720 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -31,7 +31,7 @@ export const FileListLi = styled('li')(({ theme }) => ({ ':focus-visible': { outline: 'none', - '> div': { + '.file-list-item': { borderRadius: '4px', background: theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 8765d3b3da87..381e2812d276 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -1,4 +1,4 @@ -import React, { memo, useCallback, useLayoutEffect, useMemo, useState } from 'react'; +import React, { memo, useCallback, useMemo, useState } from 'react'; import { ChevronDownIcon, ChevronRightIcon, ComponentIcon } from '@storybook/icons'; import { styled } from '@storybook/theming'; import { FileSearchListLoadingSkeleton } from './FileSearchListSkeleton'; @@ -29,6 +29,7 @@ import type { ResponseData, } from '@storybook/core-events'; import { WithTooltip, TooltipNote } from '@storybook/components'; +import { useArrowKeyNavigation } from './FIleSearchList.utils'; export type SearchResult = ResponseData['payload']['files'][0]; @@ -80,7 +81,7 @@ export const FileSearchList = memo(function FileSearchList({ errorItemId, }: FileSearchListProps) { const [selectedItem, setSelectedItem] = useState(null); - const parentRef = React.useRef(); + const parentRef = React.useRef(); const sortedSearchResults = useMemo(() => { // search results with no exports should be at the end of the list @@ -107,8 +108,10 @@ export const FileSearchList = memo(function FileSearchList({ }); }, [searchResults]); + const count = searchResults?.length || 0; + const rowVirtualizer = useVirtualizer({ - count: searchResults?.length || 0, + count, getScrollElement: () => parentRef.current, paddingStart: 16, paddingEnd: 40, @@ -116,13 +119,7 @@ export const FileSearchList = memo(function FileSearchList({ overscan: 2, }); - useLayoutEffect(() => { - if (selectedItem !== null) { - rowVirtualizer.scrollToIndex(selectedItem, { - align: 'start', - }); - } - }, [rowVirtualizer, selectedItem]); + useArrowKeyNavigation({ rowVirtualizer, parentRef, selectedItem }); const handleFileItemSelection = useCallback( ({ virtualItem, searchResult, itemId }: FileItemSelectionPayload) => { @@ -172,6 +169,7 @@ export const FileSearchList = memo(function FileSearchList({ id={`file-list-item-wrapper-${virtualItem.index}`} > {searchResult.exportedComponents?.map((component, itemExportId) => { const itemExportError = errorItemId === `${searchResult.filepath}_${itemExportId}`; + const position = + itemExportId === 0 + ? 'first' + : itemExportId === searchResult.exportedComponents.length - 1 + ? 'last' + : 'middle'; + return ( { @@ -263,8 +269,7 @@ export const FileSearchList = memo(function FileSearchList({

We could not find any file with that name

- You may want to try using different keywords, checking for typos or adjusting your - filters. + You may want to try using different keywords, check for typos, and adjust your filters
); From 88fdc096402e4b0ef5db027dfd3359e934faec77 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 29 Apr 2024 12:39:02 +0200 Subject: [PATCH 152/180] Enhance error messaging for the user when updating CSF2 stories --- .../src/utils/save-story/duplicate-story-with-new-name.ts | 5 +++-- code/lib/core-server/src/utils/save-story/save-story.ts | 3 +-- .../src/utils/save-story/update-args-in-csf-file.ts | 3 ++- code/lib/core-server/src/utils/save-story/utils.ts | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 code/lib/core-server/src/utils/save-story/utils.ts diff --git a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts index 41584283faaa..3ab01043752d 100644 --- a/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts +++ b/code/lib/core-server/src/utils/save-story/duplicate-story-with-new-name.ts @@ -2,6 +2,7 @@ import type { CsfFile } from '@storybook/csf-tools'; import * as traverse from '@babel/traverse'; import * as t from '@babel/types'; +import { SaveStoryError } from './utils'; type In = ReturnType; @@ -10,7 +11,7 @@ export const duplicateStoryWithNewName = (csfFile: In, storyName: string, newSto const cloned = t.cloneNode(node) as t.VariableDeclarator; if (!cloned) { - throw new Error(`cannot clone Node`); + throw new SaveStoryError(`cannot clone Node`); } let found = false; @@ -37,7 +38,7 @@ export const duplicateStoryWithNewName = (csfFile: In, storyName: string, newSto // detect CSF2 and throw if (t.isArrowFunctionExpression(cloned.init) || t.isCallExpression(cloned.init)) { - throw new Error(`CSF2 is not supported`); + throw new SaveStoryError(`Creating a new story based on a CSF2 story is not supported`); } traverse.default(csfFile._ast, { diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 0077e86b2816..8c2a69af9e4e 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -18,6 +18,7 @@ import { basename, join } from 'path'; import { updateArgsInCsfFile } from './update-args-in-csf-file'; import { duplicateStoryWithNewName } from './duplicate-story-with-new-name'; import { formatFileContent } from '@storybook/core-common'; +import { SaveStoryError } from './utils'; const parseArgs = (args: string): Record => JSON.parse(args, (_, value) => { @@ -44,8 +45,6 @@ const removeExtraNewlines = (code: string, name: string) => { : code; }; -class SaveStoryError extends Error {} - export function initializeSaveStory(channel: Channel, options: Options, coreConfig: CoreConfig) { channel.on(SAVE_STORY_REQUEST, async ({ id, payload }: RequestData) => { const { csfId, importPath, args, name } = payload; diff --git a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts index 9b95114e7537..f32db42f7978 100644 --- a/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts +++ b/code/lib/core-server/src/utils/save-story/update-args-in-csf-file.ts @@ -1,6 +1,7 @@ import * as t from '@babel/types'; import * as traverse from '@babel/traverse'; import { valueToAST } from './valueToAST'; +import { SaveStoryError } from './utils'; export const updateArgsInCsfFile = async (node: t.Node, input: Record) => { let found = false; @@ -12,7 +13,7 @@ export const updateArgsInCsfFile = async (node: t.Node, input: Record Date: Mon, 29 Apr 2024 12:54:19 +0200 Subject: [PATCH 153/180] Maintain cursor position in FileSearchModal input field while typing --- .../manager/src/components/sidebar/FileSearchModal.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index 4fb0717c4c6b..bfc007e75c0e 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -139,6 +139,9 @@ export const FileSearchModal = ({ const [modalContentRef, modalContentDimensions] = useMeasure(); const [modalMaxHeight, setModalMaxHeight] = useState(modalContentDimensions.height); const [, startTransition] = useTransition(); + // This internal state is used to maintain cursor position when the user types in the search input + // See: https://github.com/facebook/react/issues/5386#issuecomment-334001976 + const [searchInputValue, setSearchInputValue] = useState(fileSearchQuery); useEffect(() => { if (modalMaxHeight < modalContentDimensions.height) { @@ -175,10 +178,12 @@ export const FileSearchModal = ({ type="search" required autoFocus - value={fileSearchQuery} + value={searchInputValue} onChange={(e) => { + const newValue = (e.target as HTMLInputElement).value; + setSearchInputValue(newValue); startTransition(() => { - setFileSearchQuery((e.target as HTMLInputElement).value); + setFileSearchQuery(newValue); }); }} /> From d9851f72b11de2d4f664993e5763437b6f7e9ea9 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 29 Apr 2024 13:30:44 +0200 Subject: [PATCH 154/180] Improve required args extraction by taking account controls type --- .../sidebar/FileSearchModal.utils.test.tsx | 46 +++++++++++++++++-- .../sidebar/FileSearchModal.utils.tsx | 20 ++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx index aa7481952ba7..d44fc59cae75 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -52,15 +52,55 @@ describe('FileSearchModal.utils', () => { enum: { type: { name: 'union', required: false, value: [] }, }, + otherObject: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'object' }, + }, + otherInlineRadio: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'inline-radio', options: ['a', 'b', 'c'] }, + }, + otherRadio: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'radio', options: ['d', 'e', 'f'] }, + }, + otherInlineCheck: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'inline-check', options: ['g', 'h', 'i'] }, + }, + otherCheck: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'check', options: ['j', 'k', 'l'] }, + }, + otherSelect: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'select', options: ['m', 'n', 'o'] }, + }, + otherMultiSelect: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'multi-select', options: ['p', 'q', 'r'] }, + }, + otherColor: { + type: { name: 'other', required: true, value: '' }, + control: { type: 'color' }, + }, } as ArgTypes; expect(extractSeededRequiredArgs(argTypes)).toEqual({ - stringRequired: 'stringRequired', - numberRequired: 0, booleanRequired: true, + enumRequired: 'a', functionRequired: expect.any(Function), + numberRequired: 0, + otherCheck: 'j', + otherColor: '#000000', + otherInlineCheck: 'g', + otherInlineRadio: 'a', + otherMultiSelect: 'p', + otherObject: {}, + otherRadio: 'd', + otherSelect: 'm', + stringRequired: 'stringRequired', unionRequired: 'a', - enumRequired: 'a', }); }); }); diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index 5dd02ba67806..849e780fb466 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -29,6 +29,26 @@ export function extractSeededRequiredArgs(argTypes: ArgTypes) { acc[key] = () => {}; break; default: + if (typeof argType.control === 'object' && 'type' in argType.control) { + switch (argType.control.type) { + case 'object': + acc[key] = {}; + break; + case 'inline-radio': + case 'radio': + case 'inline-check': + case 'check': + case 'select': + case 'multi-select': + acc[key] = argType.control.options?.[0]; + break; + case 'color': + acc[key] = '#000000'; + break; + default: + break; + } + } break; } } From 7cb3ecf353f029f114ef29ad9f7f19c9c1e78d45 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 29 Apr 2024 15:29:19 +0200 Subject: [PATCH 155/180] Enhance extractSeededRequiredArgs function --- .../sidebar/FileSearchModal.utils.test.tsx | 76 +++++++----- .../sidebar/FileSearchModal.utils.tsx | 115 +++++++++++------- 2 files changed, 121 insertions(+), 70 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx index d44fc59cae75..d5ca221d039c 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -6,42 +6,39 @@ describe('FileSearchModal.utils', () => { describe('extractSeededRequiredArgs', () => { it('should extract seeded required args', () => { const argTypes = { - stringRequired: { + string: { type: { name: 'string', required: true }, }, - string: { + stringOptional: { type: { name: 'string', required: false }, }, - numberRequired: { - type: { name: 'number', required: true }, - }, number: { - type: { name: 'number', required: false }, - }, - booleanRequired: { - type: { name: 'boolean', required: true }, + type: { name: 'number', required: true }, }, boolean: { - type: { name: 'boolean', required: false }, - }, - functionRequired: { - type: { name: 'function', required: true }, + type: { name: 'boolean', required: true }, }, function: { - type: { name: 'function', required: false }, + type: { name: 'function', required: true }, }, - unionRequired: { + object: { type: { - name: 'union', + name: 'object', required: true, - value: [], + value: { + a: { name: 'string', required: true }, + b: { name: 'number' }, + }, }, - options: ['a', 'b', 'c'], }, union: { - type: { name: 'union', required: false, value: [] }, + type: { + name: 'union', + required: true, + value: [{ name: 'string', required: true }, { name: 'number' }], + }, }, - enumRequired: { + enum: { type: { name: 'enum', required: true, @@ -49,9 +46,6 @@ describe('FileSearchModal.utils', () => { }, options: ['a', 'b', 'c'], }, - enum: { - type: { name: 'union', required: false, value: [] }, - }, otherObject: { type: { name: 'other', required: true, value: '' }, control: { type: 'object' }, @@ -84,13 +78,34 @@ describe('FileSearchModal.utils', () => { type: { name: 'other', required: true, value: '' }, control: { type: 'color' }, }, + intersection: { + type: { + name: 'intersection', + required: true, + value: [ + { + name: 'object', + value: { + a: { name: 'string', required: true }, + b: { name: 'number' }, + }, + }, + ], + }, + }, + tuple: { + type: { + name: 'other', + required: true, + value: 'tuple', + }, + }, } as ArgTypes; expect(extractSeededRequiredArgs(argTypes)).toEqual({ - booleanRequired: true, - enumRequired: 'a', - functionRequired: expect.any(Function), - numberRequired: 0, + boolean: true, + function: expect.any(Function), + number: 0, otherCheck: 'j', otherColor: '#000000', otherInlineCheck: 'g', @@ -99,8 +114,11 @@ describe('FileSearchModal.utils', () => { otherObject: {}, otherRadio: 'd', otherSelect: 'm', - stringRequired: 'stringRequired', - unionRequired: 'a', + string: 'string', + object: { a: 'a' }, + union: 'union', + intersection: { a: 'a' }, + tuple: [], }); }); }); diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index 849e780fb466..3b9aacd981e2 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -1,57 +1,90 @@ -import type { ArgTypes } from '@storybook/csf'; +import type { ArgTypes, SBType } from '@storybook/csf'; + +function setArgType( + type: 'string' | 'number' | 'boolean' | 'symbol' | 'function' | SBType, + obj: Record, + objKey: string | number +) { + if (typeof type === 'string' || !type.required) { + return; + } + + switch (type.name) { + case 'boolean': + obj[objKey] = true; + break; + case 'number': + obj[objKey] = 0; + break; + case 'string': + obj[objKey] = objKey; + break; + case 'array': + obj[objKey] = []; + break; + case 'object': + obj[objKey] = {}; + Object.entries(type.value ?? {}).forEach(([typeKey, typeVal]) => { + setArgType(typeVal, obj[objKey], typeKey); + }); + break; + case 'function': + obj[objKey] = () => {}; + break; + case 'intersection': + if (type.value?.every((v) => v.name === 'object')) { + obj[objKey] = {}; + type.value?.forEach((typeVal) => { + if (typeVal.name === 'object') { + Object.entries(typeVal.value ?? {}).forEach(([typeValKey, typeValVal]) => { + setArgType(typeValVal, obj[objKey], typeValKey); + }); + } + }); + } + break; + case 'union': + if (type.value[0]) { + setArgType(type.value[0], obj, objKey); + } + + case 'other': + if (typeof type.value === 'string' && type.value === 'tuple') { + obj[objKey] = []; + } + break; + default: + break; + } +} export function extractSeededRequiredArgs(argTypes: ArgTypes) { const extractedArgTypes = Object.keys(argTypes).reduce( (acc, key: keyof typeof argTypes) => { const argType = argTypes[key]; - if (typeof argType.type !== 'string' && argType.type.required) { - switch (argType.type.name) { - case 'boolean': - acc[key] = true; - break; - case 'number': - acc[key] = 0; - break; - case 'string': - acc[key] = key; - break; - case 'union': - case 'enum': - acc[key] = argType.options?.[0]; - break; - case 'array': - acc[key] = []; - break; + + if (typeof argType.control === 'object' && 'type' in argType.control) { + switch (argType.control.type) { case 'object': acc[key] = {}; break; - case 'function': - acc[key] = () => {}; + case 'inline-radio': + case 'radio': + case 'inline-check': + case 'check': + case 'select': + case 'multi-select': + acc[key] = argType.control.options?.[0]; + break; + case 'color': + acc[key] = '#000000'; break; default: - if (typeof argType.control === 'object' && 'type' in argType.control) { - switch (argType.control.type) { - case 'object': - acc[key] = {}; - break; - case 'inline-radio': - case 'radio': - case 'inline-check': - case 'check': - case 'select': - case 'multi-select': - acc[key] = argType.control.options?.[0]; - break; - case 'color': - acc[key] = '#000000'; - break; - default: - break; - } - } break; } } + + setArgType(argType.type, acc, key); return acc; }, {} as Record From bc129cb2a76de239a03a14db4b092e51f9fd40d8 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 29 Apr 2024 15:43:08 +0200 Subject: [PATCH 156/180] Fix stringification of function for saving a new story --- .../sidebar/CreateNewStoryFileModal.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index b68ef9336c57..3d5cd4ea7aa8 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -1,6 +1,5 @@ import React, { useCallback, useDeferredValue, useEffect, useRef, useState } from 'react'; import { AlertIcon, CheckIcon } from '@storybook/icons'; -import { stringify } from 'telejson'; import type { ArgTypesRequestPayload, ArgTypesResponsePayload, @@ -36,11 +35,9 @@ interface CreateNewStoryFileModalProps { } const stringifyArgs = (args: Record) => - stringify(args, { - allowDate: true, - allowFunction: true, - allowUndefined: true, - allowSymbol: true, + JSON.stringify(args, (_, value) => { + if (typeof value === 'function') return '__sb_empty_function_arg__'; + return value; }); export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFileModalProps) => { @@ -184,12 +181,7 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi setError({ selectedItemId: selectedItemId, error: e?.message }); } }, - [ - api?.selectStory, - handleSuccessfullyCreatedStory, - handleFileSearch, - handleErrorWhenCreatingStory, - ] + [api?.selectStory, handleSuccessfullyCreatedStory, handleFileSearch] ); useEffect(() => { From eeabdb6c7142ebc3508b81a7df58f50efe6d2701 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 17:42:21 +0200 Subject: [PATCH 157/180] redesign error screen --- .../templates/base-preview-body.html | 36 +++++- .../templates/base-preview-head.html | 116 ++++++++++++++++-- code/lib/preview-api/src/Errors.stories.tsx | 54 ++++++++ code/ui/.storybook/main.ts | 5 +- 4 files changed, 201 insertions(+), 10 deletions(-) create mode 100644 code/lib/preview-api/src/Errors.stories.tsx diff --git a/code/lib/core-common/templates/base-preview-body.html b/code/lib/core-common/templates/base-preview-body.html index 094286c31b41..b6314fd75900 100644 --- a/code/lib/core-common/templates/base-preview-body.html +++ b/code/lib/core-common/templates/base-preview-body.html @@ -82,6 +82,38 @@

No Preview

-

-  
+
+

+

+ The component failed to render properly, likely due to a configuration issue in Storybook. + Here are some common causes and how you can address them: +

+
    +
  1. + Missing Context/Providers: You can use decorators to supply specific + contexts or providers, which are sometimes necessary for components to render correctly. For + detailed instructions on using decorators, please visit the + Decorators documentation. +
  2. +
  3. + Misconfigured Webpack or Vite: Verify that Storybook picks up all necessary + settings for loaders, plugins, and other relevant parameters. You can find step-by-step + guides for configuring + Webpack or + Vite + with Storybook. +
  4. +
  5. + Missing Environment Variables: Your Storybook may require specific + environment variables to function as intended. You can set up custom environment variables + as outlined in the + Environment Variables documentation. +
  6. +
+
+
diff --git a/code/lib/core-common/templates/base-preview-head.html b/code/lib/core-common/templates/base-preview-head.html index c4732d25281c..ca71c17faa95 100644 --- a/code/lib/core-common/templates/base-preview-head.html +++ b/code/lib/core-common/templates/base-preview-head.html @@ -30,7 +30,8 @@ box-sizing: border-box; margin: auto; padding: 1rem; - max-height: 100%; /* Hack for centering correctly in IE11 */ + max-height: 100%; + /* Hack for centering correctly in IE11 */ } /* Vertical centering fix for IE11 */ @@ -61,7 +62,7 @@ bottom: 0; left: 0; right: 0; - padding: 20px; + padding: 40px; font-family: 'Nunito Sans', -apple-system, @@ -77,6 +78,18 @@ overflow: auto; } + @media (max-width: 700px) { + .sb-wrapper { + padding: 20px; + } + } + + @media (max-width: 500px) { + .sb-wrapper { + padding: 10px; + } + } + .sb-heading { font-size: 14px; font-weight: 600; @@ -103,54 +116,127 @@ } .sb-errordisplay { - border: 20px solid rgb(187, 49, 49); - background: #222; - color: #fff; + background: #f6f9fc; z-index: 999999; + width: 100vw; + min-height: 100vh; + + & ol { + padding-left: 18px; + margin: 0; + } + + & h1 { + font-family: Nunito Sans; + font-size: 22px; + font-weight: 400; + line-height: 30px; + font-weight: normal; + margin: 0; + + &::before { + content: ''; + display: inline-block; + width: 12px; + height: 12px; + background: #ff4400; + border-radius: 50%; + margin-right: 8px; + } + } + + & p, + & ol { + font-family: Nunito Sans; + font-size: 14px; + font-weight: 400; + line-height: 19px; + margin: 0; + } + + & li + li { + margin: 0; + padding: 0; + padding-top: 12px; + } + + & a { + color: currentColor; + } + } + + .sb-errordisplay_main { + margin: auto; + padding: 24px; + display: flex; + flex-direction: column; + min-height: 100%; + width: 100%; + border-radius: 6px; + background: white; + border: 1px solid #ff0000; + box-shadow: 0 0 64px rgba(0, 0, 0, 0.1); + gap: 24px; } .sb-errordisplay_code { padding: 10px; - background: #000; - color: #eee; + flex: 1; + background: #242424; + color: #c6c6c6; + font-size: 14px; + font-weight: 400; + line-height: 19px; + border-radius: 4px; + font-family: 'Operator Mono', 'Fira Code Retina', 'Fira Code', 'FiraCode-Retina', 'Andale Mono', 'Lucida Console', Consolas, Monaco, monospace; + margin: 0; + overflow: auto; } .sb-errordisplay pre { white-space: pre-wrap; + white-space: revert; } @-webkit-keyframes sb-rotate360 { from { transform: rotate(0deg); } + to { transform: rotate(360deg); } } + @keyframes sb-rotate360 { from { transform: rotate(0deg); } + to { transform: rotate(360deg); } } + @-webkit-keyframes sb-glow { 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } } + @keyframes sb-glow { 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } @@ -213,6 +299,7 @@ height: 14px; width: 14px; } + .sb-previewBlock_icon:last-child { margin-left: auto; } @@ -234,23 +321,28 @@ text-align: left; width: 100%; } + .sb-argstableBlock th:first-of-type, .sb-argstableBlock td:first-of-type { padding-left: 20px; } + .sb-argstableBlock th:nth-of-type(2), .sb-argstableBlock td:nth-of-type(2) { width: 35%; } + .sb-argstableBlock th:nth-of-type(3), .sb-argstableBlock td:nth-of-type(3) { width: 15%; } + .sb-argstableBlock th:last-of-type, .sb-argstableBlock td:last-of-type { width: 25%; padding-right: 20px; } + .sb-argstableBlock th span, .sb-argstableBlock td span { -webkit-animation: sb-glow 1.5s ease-in-out infinite; @@ -260,6 +352,7 @@ box-shadow: none; color: transparent; } + .sb-argstableBlock th { padding: 10px 15px; } @@ -270,35 +363,44 @@ rgba(0, 0, 0, 0.1) 0 1px 3px 1px, rgba(0, 0, 0, 0.065) 0 0 0 1px; } + .sb-argstableBlock-body tr { background: transparent; overflow: hidden; } + .sb-argstableBlock-body tr:not(:first-child) { border-top: 1px solid #e6e6e6; } + .sb-argstableBlock-body tr:first-child td:first-child { border-top-left-radius: 4px; } + .sb-argstableBlock-body tr:first-child td:last-child { border-top-right-radius: 4px; } + .sb-argstableBlock-body tr:last-child td:first-child { border-bottom-left-radius: 4px; } + .sb-argstableBlock-body tr:last-child td:last-child { border-bottom-right-radius: 4px; } + .sb-argstableBlock-body td { background: #fff; padding-bottom: 10px; padding-top: 10px; vertical-align: top; } + .sb-argstableBlock-body td:not(:first-of-type) { padding-left: 15px; padding-right: 15px; } + .sb-argstableBlock-body button { -webkit-animation: sb-glow 1.5s ease-in-out infinite; animation: sb-glow 1.5s ease-in-out infinite; diff --git a/code/lib/preview-api/src/Errors.stories.tsx b/code/lib/preview-api/src/Errors.stories.tsx new file mode 100644 index 000000000000..cb7cd658bebc --- /dev/null +++ b/code/lib/preview-api/src/Errors.stories.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import AnsiToHtml from 'ansi-to-html'; + +const ansiConverter = new AnsiToHtml({ + escapeXML: true, +}); + +const Component = ({ id, header, detail }: any) => { + const element = document.querySelector('.' + id); + if (!element) { + return
Element not found
; + } + + if (header) { + document.getElementById('error-message')!.innerHTML = ansiConverter.toHtml(header); + } + + if (detail) { + document.getElementById('error-stack')!.innerHTML = ansiConverter.toHtml(detail); + } + + const content = element.outerHTML; + + return ( +
+ ); +}; + +export default { + component: Component, + parameters: { + layout: 'fullscreen', + }, + title: 'Errors', + args: { + id: 'sb-errordisplay', + }, +}; + +export const MyError = { + args: { + header: new Error('ow no, something went wrong').message, + detail: new Error('ow no, something went wrong').stack, + }, +}; + +export const Missing = { + args: { + id: 'sb-nopreview', + }, +}; diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index 55a7a09b611d..03dea1aea08d 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -8,9 +8,12 @@ const isBlocksOnly = process.env.STORYBOOK_BLOCKS_ONLY === 'true'; const allStories = [ { directory: '../manager/src', - files: '**/*.stories.@(js|jsx|mjs|ts|tsx|mdx)', titlePrefix: '@manager', }, + { + directory: '../../lib/preview-api/src', + titlePrefix: '@preview', + }, { directory: '../components/src/components', titlePrefix: '@components', From 13a9f3753679cca1a2d7899b5277ef7b2417bbf5 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 18:18:03 +0200 Subject: [PATCH 158/180] fix --- .../manager/src/components/sidebar/CreateNewStoryFileModal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index 3d5cd4ea7aa8..c8d10640223e 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -53,6 +53,7 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi const [searchResults, setSearchResults] = useState(null); + // @ts-expect-error (not used yet) const handleErrorWhenCreatingStory = useCallback(() => { api.addNotification({ id: 'create-new-story-file-error', From 15901b9c9aadfe996a6f8249f1ccdd5da84d23cb Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 29 Apr 2024 20:54:08 +0200 Subject: [PATCH 159/180] thrown when missing --- code/lib/core-common/templates/base-preview-head.html | 1 + code/lib/preview-api/src/Errors.stories.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/lib/core-common/templates/base-preview-head.html b/code/lib/core-common/templates/base-preview-head.html index ca71c17faa95..6a0f561a16f5 100644 --- a/code/lib/core-common/templates/base-preview-head.html +++ b/code/lib/core-common/templates/base-preview-head.html @@ -117,6 +117,7 @@ .sb-errordisplay { background: #f6f9fc; + color: black; z-index: 999999; width: 100vw; min-height: 100vh; diff --git a/code/lib/preview-api/src/Errors.stories.tsx b/code/lib/preview-api/src/Errors.stories.tsx index cb7cd658bebc..9e264c53082a 100644 --- a/code/lib/preview-api/src/Errors.stories.tsx +++ b/code/lib/preview-api/src/Errors.stories.tsx @@ -8,7 +8,7 @@ const ansiConverter = new AnsiToHtml({ const Component = ({ id, header, detail }: any) => { const element = document.querySelector('.' + id); if (!element) { - return
Element not found
; + throw new Error('Element not found'); } if (header) { @@ -33,6 +33,7 @@ export default { component: Component, parameters: { layout: 'fullscreen', + theme: 'light', }, title: 'Errors', args: { From 41f88195a7f523a3ef322ddd0b4ff729da9f94a7 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 30 Apr 2024 00:32:49 +0200 Subject: [PATCH 160/180] fix chromatic --- code/lib/preview-api/src/Errors.stories.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/lib/preview-api/src/Errors.stories.tsx b/code/lib/preview-api/src/Errors.stories.tsx index 9e264c53082a..5c65e56c65b3 100644 --- a/code/lib/preview-api/src/Errors.stories.tsx +++ b/code/lib/preview-api/src/Errors.stories.tsx @@ -19,7 +19,12 @@ const Component = ({ id, header, detail }: any) => { document.getElementById('error-stack')!.innerHTML = ansiConverter.toHtml(detail); } - const content = element.outerHTML; + // remove the ids, otherwise chromatic will assume the story failed to render + const content = element.outerHTML.replace('error-message', '').replace('error-stack', ''); + + // remove the content, otherwise chromatic will assume the story failed to render + document.getElementById('error-message')!.innerHTML = ''; + document.getElementById('error-stack')!.innerHTML = ''; return (
Date: Tue, 30 Apr 2024 09:02:43 +0200 Subject: [PATCH 161/180] make stacktrace deterministic --- code/lib/preview-api/src/Errors.stories.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/code/lib/preview-api/src/Errors.stories.tsx b/code/lib/preview-api/src/Errors.stories.tsx index 5c65e56c65b3..41363ff5c566 100644 --- a/code/lib/preview-api/src/Errors.stories.tsx +++ b/code/lib/preview-api/src/Errors.stories.tsx @@ -1,5 +1,6 @@ import React from 'react'; import AnsiToHtml from 'ansi-to-html'; +import dedent from 'ts-dedent'; const ansiConverter = new AnsiToHtml({ escapeXML: true, @@ -48,8 +49,19 @@ export default { export const MyError = { args: { - header: new Error('ow no, something went wrong').message, - detail: new Error('ow no, something went wrong').stack, + header: `FAIL is not defined`, + detail: dedent` + ReferenceError: FAIL is not defined + at Constraint.execute (the-best-file.js:525:2) + at Constraint.recalculate (the-best-file.js:424:21) + at Planner.addPropagate (the-best-file.js:701:6) + at Constraint.satisfy (the-best-file.js:184:15) + at Planner.incrementalAdd (the-best-file.js:591:21) + at Constraint.addConstraint (the-best-file.js:162:10) + at Constraint.BinaryConstraint (the-best-file.js:346:7) + at Constraint.EqualityConstraint (the-best-file.js:515:38) + at chainTest (the-best-file.js:807:6) + at deltaBlue (the-best-file.js:879:2)`, }, }; From 5e63c2fd07ee6cde8bc9077a33951a9afeda8ee9 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:07:42 +0200 Subject: [PATCH 162/180] Fix issue with getProjectRoot function in paths.ts when user does not use revision control --- code/lib/core-common/src/utils/paths.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/lib/core-common/src/utils/paths.ts b/code/lib/core-common/src/utils/paths.ts index 3895a69dd2b1..f81426aa5893 100644 --- a/code/lib/core-common/src/utils/paths.ts +++ b/code/lib/core-common/src/utils/paths.ts @@ -32,16 +32,18 @@ export const getProjectRoot = () => { } catch (e) { // } + try { - const found = findUp.sync('.yarn', { type: 'directory' }); - if (found) { - result = result || path.join(found, '..'); - } + result = result || __dirname.split('node_modules')[0]; } catch (e) { // } + try { - result = result || __dirname.split('node_modules')[0]; + const found = findUp.sync('.yarn', { type: 'directory' }); + if (found) { + result = result || path.join(found, '..'); + } } catch (e) { // } From 38447651363aff98178a00596fe13bb51c118aba Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:10:03 +0200 Subject: [PATCH 163/180] Fix issues with disabled checkboxes and radios --- code/ui/blocks/src/controls/options/Checkbox.tsx | 2 +- code/ui/blocks/src/controls/options/Radio.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ui/blocks/src/controls/options/Checkbox.tsx b/code/ui/blocks/src/controls/options/Checkbox.tsx index 6be088b111ba..7c883c21300c 100644 --- a/code/ui/blocks/src/controls/options/Checkbox.tsx +++ b/code/ui/blocks/src/controls/options/Checkbox.tsx @@ -27,7 +27,7 @@ const Wrapper = styled.div<{ isInline: boolean }>( }, }, (props) => { - if ([props['aria-readonly']]) { + if (props['aria-readonly'] === 'true') { return { input: { cursor: 'not-allowed', diff --git a/code/ui/blocks/src/controls/options/Radio.tsx b/code/ui/blocks/src/controls/options/Radio.tsx index d3bc514f3361..76c3239e747a 100644 --- a/code/ui/blocks/src/controls/options/Radio.tsx +++ b/code/ui/blocks/src/controls/options/Radio.tsx @@ -27,7 +27,7 @@ const Wrapper = styled.div<{ isInline: boolean }>( }, }, (props) => { - if ([props['aria-readonly']]) { + if (props['aria-readonly'] === 'true') { return { input: { cursor: 'not-allowed', From 313c50dc3ba315a6de5b2b19b749b93a39af59e3 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:32:37 +0200 Subject: [PATCH 164/180] Improve required args extraction by considering enums --- .../sidebar/FileSearchModal.utils.test.tsx | 3 +- .../sidebar/FileSearchModal.utils.tsx | 77 ++++++++++--------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx index d5ca221d039c..d86a9c208d68 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.test.tsx @@ -42,7 +42,7 @@ describe('FileSearchModal.utils', () => { type: { name: 'enum', required: true, - value: [], + value: ['a', 'b', 'c'], }, options: ['a', 'b', 'c'], }, @@ -106,6 +106,7 @@ describe('FileSearchModal.utils', () => { boolean: true, function: expect.any(Function), number: 0, + enum: 'a', otherCheck: 'j', otherColor: '#000000', otherInlineCheck: 'g', diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx index 3b9aacd981e2..f334aadc461c 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.utils.tsx @@ -1,5 +1,39 @@ import type { ArgTypes, SBType } from '@storybook/csf'; +export function extractSeededRequiredArgs(argTypes: ArgTypes) { + const extractedArgTypes = Object.keys(argTypes).reduce( + (acc, key: keyof typeof argTypes) => { + const argType = argTypes[key]; + + if (typeof argType.control === 'object' && 'type' in argType.control) { + switch (argType.control.type) { + case 'object': + acc[key] = {}; + break; + case 'inline-radio': + case 'radio': + case 'inline-check': + case 'check': + case 'select': + case 'multi-select': + acc[key] = argType.control.options?.[0]; + break; + case 'color': + acc[key] = '#000000'; + break; + default: + break; + } + } + + setArgType(argType.type, acc, key); + return acc; + }, + {} as Record + ); + return extractedArgTypes; +} + function setArgType( type: 'string' | 'number' | 'boolean' | 'symbol' | 'function' | SBType, obj: Record, @@ -44,9 +78,16 @@ function setArgType( } break; case 'union': - if (type.value[0]) { + if (type.value?.[0] !== undefined) { setArgType(type.value[0], obj, objKey); } + break; + + case 'enum': + if (type.value?.[0] !== undefined) { + obj[objKey] = type.value?.[0]; + } + break; case 'other': if (typeof type.value === 'string' && type.value === 'tuple') { @@ -58,40 +99,6 @@ function setArgType( } } -export function extractSeededRequiredArgs(argTypes: ArgTypes) { - const extractedArgTypes = Object.keys(argTypes).reduce( - (acc, key: keyof typeof argTypes) => { - const argType = argTypes[key]; - - if (typeof argType.control === 'object' && 'type' in argType.control) { - switch (argType.control.type) { - case 'object': - acc[key] = {}; - break; - case 'inline-radio': - case 'radio': - case 'inline-check': - case 'check': - case 'select': - case 'multi-select': - acc[key] = argType.control.options?.[0]; - break; - case 'color': - acc[key] = '#000000'; - break; - default: - break; - } - } - - setArgType(argType.type, acc, key); - return acc; - }, - {} as Record - ); - return extractedArgTypes; -} - export async function trySelectNewStory( selectStory: (id: string) => Promise | void, storyId: string, From 9b836feb01bb55865b43d631066a21e5006a7f50 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:43:20 +0200 Subject: [PATCH 165/180] Fix paths util --- code/lib/core-common/src/utils/paths.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/lib/core-common/src/utils/paths.ts b/code/lib/core-common/src/utils/paths.ts index f81426aa5893..bb5896cc4f67 100644 --- a/code/lib/core-common/src/utils/paths.ts +++ b/code/lib/core-common/src/utils/paths.ts @@ -34,7 +34,8 @@ export const getProjectRoot = () => { } try { - result = result || __dirname.split('node_modules')[0]; + const splitDirname = __dirname.split('node_modules'); + result = result || (splitDirname.length >= 2 ? splitDirname[0] : undefined); } catch (e) { // } From abf5d99f38e9ef503536f959c2d7a54ac1198609 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:44:14 +0200 Subject: [PATCH 166/180] Fix existing story evaluation --- .../file-search-channel.test.ts | 2 +- .../src/server-channel/file-search-channel.ts | 9 ++++--- .../src/utils/get-new-story-file.ts | 26 ++++++++++++------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index 0b4295ee145f..1ecc2a753c04 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -102,7 +102,7 @@ describe('file-search-channel', () => { }, ], filepath: 'src/es-module.js', - storyFileExists: false, + storyFileExists: true, }, ], }, diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index 007091d222d0..721ab5d1707c 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -7,7 +7,6 @@ import { } from '@storybook/core-common'; import path from 'path'; import fs from 'fs/promises'; -import { existsSync } from 'fs'; import { getParser } from '../utils/parser'; import { searchFiles } from '../utils/search-files'; @@ -21,7 +20,7 @@ import { FILE_COMPONENT_SEARCH_REQUEST, FILE_COMPONENT_SEARCH_RESPONSE, } from '@storybook/core-events'; -import { getStoryMetadata } from '../utils/get-new-story-file'; +import { doesStoryFileExist, getStoryMetadata } from '../utils/get-new-story-file'; export function initFileSearchChannel(channel: Channel, options: Options) { /** @@ -57,7 +56,11 @@ export function initFileSearchChannel(channel: Channel, options: Options) { const { storyFileName } = getStoryMetadata(path.join(projectRoot, file)); const dirname = path.dirname(file); - const storyFileExists = existsSync(path.join(projectRoot, dirname, storyFileName)); + const storyFileExists = doesStoryFileExist( + path.join(projectRoot, dirname), + storyFileName + ); + const info = await parser.parse(content); return { diff --git a/code/lib/core-server/src/utils/get-new-story-file.ts b/code/lib/core-server/src/utils/get-new-story-file.ts index be03c48d8e35..32c50c2e5009 100644 --- a/code/lib/core-server/src/utils/get-new-story-file.ts +++ b/code/lib/core-server/src/utils/get-new-story-file.ts @@ -33,9 +33,9 @@ export async function getNewStoryFile( const basenameWithoutExtension = basename.replace(extension, ''); const dirname = path.dirname(componentFilePath); - const { storyFileName, isTypescript } = getStoryMetadata(componentFilePath); - const storyFileExtension = isTypescript ? 'tsx' : 'jsx'; - const alternativeStoryFileName = `${basenameWithoutExtension}.${componentExportName}.stories.${storyFileExtension}`; + const { storyFileName, isTypescript, storyFileExtension } = getStoryMetadata(componentFilePath); + const storyFileNameWithExtension = `${storyFileName}.${storyFileExtension}`; + const alternativeStoryFileNameWithExtension = `${basenameWithoutExtension}.${componentExportName}.stories.${storyFileExtension}`; const exportedStoryName = 'Default'; @@ -55,12 +55,10 @@ export async function getNewStoryFile( exportedStoryName, }); - const doesStoryFileExist = fs.existsSync(path.join(cwd, dirname, storyFileName)); - const storyFilePath = - doesStoryFileExist && componentExportCount > 1 - ? path.join(cwd, dirname, alternativeStoryFileName) - : path.join(cwd, dirname, storyFileName); + doesStoryFileExist(path.join(cwd, dirname), storyFileName) && componentExportCount > 1 + ? path.join(cwd, dirname, alternativeStoryFileNameWithExtension) + : path.join(cwd, dirname, storyFileNameWithExtension); return { storyFilePath, exportedStoryName, storyFileContent, dirname }; } @@ -72,7 +70,17 @@ export const getStoryMetadata = (componentFilePath: string) => { const basenameWithoutExtension = basename.replace(extension, ''); const storyFileExtension = isTypescript ? 'tsx' : 'jsx'; return { - storyFileName: `${basenameWithoutExtension}.stories.${storyFileExtension}`, + storyFileName: `${basenameWithoutExtension}.stories`, + storyFileExtension, isTypescript, }; }; + +export const doesStoryFileExist = (parentFolder: string, storyFileName: string) => { + return ( + fs.existsSync(path.join(parentFolder, `${storyFileName}.ts`)) || + fs.existsSync(path.join(parentFolder, `${storyFileName}.tsx`)) || + fs.existsSync(path.join(parentFolder, `${storyFileName}.js`)) || + fs.existsSync(path.join(parentFolder, `${storyFileName}.jsx`)) + ); +}; From b1063c833f7ac36352cd42f9dadb4fbcbc8b0dfa Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 10:51:12 +0200 Subject: [PATCH 167/180] Enhance handleFileSearch --- .../sidebar/CreateNewStoryFileModal.tsx | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index c8d10640223e..ffb12fe67b3e 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useDeferredValue, useEffect, useRef, useState } from 'react'; -import { AlertIcon, CheckIcon } from '@storybook/icons'; +import { CheckIcon } from '@storybook/icons'; import type { ArgTypesRequestPayload, ArgTypesResponsePayload, @@ -53,21 +53,6 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi const [searchResults, setSearchResults] = useState(null); - // @ts-expect-error (not used yet) - const handleErrorWhenCreatingStory = useCallback(() => { - api.addNotification({ - id: 'create-new-story-file-error', - content: { - headline: 'Error while creating story file', - subHeadline: `Take a look at your developer console for more information`, - }, - duration: 8_000, - icon: , - }); - - onOpenChange(false); - }, [api, onOpenChange]); - const handleSuccessfullyCreatedStory = useCallback( (componentExportName: string) => { api.addNotification({ @@ -90,17 +75,15 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi const channel = addons.getChannel(); const set = (data: ResponseData) => { - const isLatestRequest = data.id === fileSearchQueryDeferred && data.payload.files; + const isLatestRequest = data.id === fileSearchQueryDeferred; - if (data.success) { - if (isLatestRequest) { + if (isLatestRequest) { + if (data.success) { setSearchResults(data.payload.files); + } else { + setError({ error: data.error }); } - } else { - setError({ error: data.error }); - } - if (isLatestRequest) { channel.off(FILE_COMPONENT_SEARCH_RESPONSE, set); setLoading(false); emittedValue.current = null; From aee76c78661e297e5fb8e7d8b173c3ed79492193 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 30 Apr 2024 11:15:56 +0200 Subject: [PATCH 168/180] fix layout of error screen in preview --- code/lib/core-common/templates/base-preview-head.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/lib/core-common/templates/base-preview-head.html b/code/lib/core-common/templates/base-preview-head.html index 6a0f561a16f5..d76e3a5004d4 100644 --- a/code/lib/core-common/templates/base-preview-head.html +++ b/code/lib/core-common/templates/base-preview-head.html @@ -62,6 +62,8 @@ bottom: 0; left: 0; right: 0; + box-sizing: border-box; + padding: 40px; font-family: 'Nunito Sans', @@ -102,6 +104,7 @@ display: flex; align-content: center; justify-content: center; + box-sizing: border-box; } .sb-nopreview_main { @@ -121,6 +124,7 @@ z-index: 999999; width: 100vw; min-height: 100vh; + box-sizing: border-box; & ol { padding-left: 18px; @@ -170,6 +174,8 @@ margin: auto; padding: 24px; display: flex; + box-sizing: border-box; + flex-direction: column; min-height: 100%; width: 100%; @@ -185,6 +191,8 @@ flex: 1; background: #242424; color: #c6c6c6; + box-sizing: border-box; + font-size: 14px; font-weight: 400; line-height: 19px; From 8ede2572b6dd1fb3a0ba72989a35aac5af927840 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Tue, 30 Apr 2024 12:04:33 +0200 Subject: [PATCH 169/180] Update executor class in CircleCI to xlarge for build --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ad07b40429a4..d9846f300ccb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -124,7 +124,7 @@ jobs: yarn docs:prettier:check build: executor: - class: large + class: xlarge name: sb_node_16_classic steps: - git-shallow-clone/checkout_advanced: From 8c1740f805912a3154a2867b60855eb7e409f2ee Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 14:37:48 +0200 Subject: [PATCH 170/180] When creating a story, navigate to it if it exists --- .../core-events/src/data/create-new-story.ts | 5 +++ .../core-events/src/data/request-response.ts | 4 +- .../create-new-story-channel.ts | 16 +++++-- .../src/server-channel/file-search-channel.ts | 1 - .../src/utils/save-story/save-story.ts | 1 - .../manager-api/src/lib/request-response.ts | 21 +++++++-- .../src/modules/preview-web/Preview.tsx | 1 - .../sidebar/CreateNewStoryFileModal.tsx | 43 ++++++++++++++++--- .../src/components/sidebar/FileSearchList.tsx | 24 ++++------- code/ui/manager/src/globals/exports.ts | 1 + 10 files changed, 84 insertions(+), 33 deletions(-) diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts index 362ca55511d4..733b273d5056 100644 --- a/code/lib/core-events/src/data/create-new-story.ts +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -17,3 +17,8 @@ export interface CreateNewStoryResponsePayload { // The name of the story export in the file exportedStoryName: string; } + +export type CreateNewStoryErrorPayload = { + type: 'STORY_FILE_EXISTS'; + storyId: string; +}; diff --git a/code/lib/core-events/src/data/request-response.ts b/code/lib/core-events/src/data/request-response.ts index 998ebcdc0f3d..d2bd4b5510b8 100644 --- a/code/lib/core-events/src/data/request-response.ts +++ b/code/lib/core-events/src/data/request-response.ts @@ -3,6 +3,6 @@ export type RequestData = { payload: Payload; }; -export type ResponseData = +export type ResponseData | void = void> = | { id: string; success: true; error: null; payload: Payload } - | { id: string; success: false; error: string; payload: null }; + | { id: string; success: false; error: string; payload?: ErrorPayload }; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index d11ab389ecc3..4b61b53d5b2a 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -1,6 +1,7 @@ import type { Options } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import type { + CreateNewStoryErrorPayload, CreateNewStoryRequestPayload, CreateNewStoryResponsePayload, RequestData, @@ -31,14 +32,22 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); + const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); + if (existsSync(storyFilePath)) { - throw new Error(`Story file already exists at ${relativeStoryFilePath}`); + channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { + success: false, + id: data.id, + payload: { + type: 'STORY_FILE_EXISTS', + storyId: storyId, + }, + error: `A story file already exists at ${relativeStoryFilePath}`, + } satisfies ResponseData); } await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); - const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); - channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: true, id: data.id, @@ -53,7 +62,6 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: false, id: data.id, - payload: null, error: e?.message, } satisfies ResponseData); } diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index 721ab5d1707c..e0d92c24ad72 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -92,7 +92,6 @@ export function initFileSearchChannel(channel: Channel, options: Options) { channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { success: false, id: searchQuery ?? '', - payload: null, error: `An error occurred while searching for components in the project.\n${e?.message}`, } satisfies ResponseData); } diff --git a/code/lib/core-server/src/utils/save-story/save-story.ts b/code/lib/core-server/src/utils/save-story/save-story.ts index 8c2a69af9e4e..03e359e85c03 100644 --- a/code/lib/core-server/src/utils/save-story/save-story.ts +++ b/code/lib/core-server/src/utils/save-story/save-story.ts @@ -124,7 +124,6 @@ export function initializeSaveStory(channel: Channel, options: Options, coreConf id, success: false, error: error instanceof SaveStoryError ? error.message : 'Unknown error', - payload: null, } satisfies ResponseData); logger.error( diff --git a/code/lib/manager-api/src/lib/request-response.ts b/code/lib/manager-api/src/lib/request-response.ts index c52e8ad8da2d..bed05f576461 100644 --- a/code/lib/manager-api/src/lib/request-response.ts +++ b/code/lib/manager-api/src/lib/request-response.ts @@ -1,10 +1,21 @@ import type { Channel } from '@storybook/channels'; import type { RequestData, ResponseData } from '@storybook/core-events'; -class RequestResponseError extends Error {} +export class RequestResponseError | void> extends Error { + payload: Payload | undefined = undefined; + + constructor(message: string, payload?: Payload) { + super(message); + this.payload = payload; + } +} // eslint-disable-next-line @typescript-eslint/naming-convention -export const experimental_requestResponse = ( +export const experimental_requestResponse = < + RequestPayload, + ResponsePayload = void, + CreateNewStoryErrorPayload extends Record | void = void, +>( channel: Channel, requestEvent: string, responseEvent: string, @@ -19,12 +30,14 @@ export const experimental_requestResponse = ) => { + const responseHandler = ( + response: ResponseData + ) => { if (response.id !== request.id) return; clearTimeout(timeoutId); channel.off(responseEvent, responseHandler); if (response.success) resolve(response.payload); - else reject(new RequestResponseError(response.error)); + else reject(new RequestResponseError(response.error, response.payload)); }; channel.emit(requestEvent, request); diff --git a/code/lib/preview-api/src/modules/preview-web/Preview.tsx b/code/lib/preview-api/src/modules/preview-web/Preview.tsx index 69dace1ba1a3..ee4524c32ecf 100644 --- a/code/lib/preview-api/src/modules/preview-web/Preview.tsx +++ b/code/lib/preview-api/src/modules/preview-web/Preview.tsx @@ -318,7 +318,6 @@ export class Preview { this.channel.emit(ARGTYPES_INFO_RESPONSE, { id, success: false, - payload: null, error: e?.message, } satisfies ResponseData); } diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index ffb12fe67b3e..bfaec7e0e8e9 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -3,6 +3,7 @@ import { CheckIcon } from '@storybook/icons'; import type { ArgTypesRequestPayload, ArgTypesResponsePayload, + CreateNewStoryErrorPayload, CreateNewStoryRequestPayload, CreateNewStoryResponsePayload, FileComponentSearchRequestPayload, @@ -22,7 +23,12 @@ import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, } from '@storybook/core-events'; -import { addons, experimental_requestResponse, useStorybookApi } from '@storybook/manager-api'; +import { + RequestResponseError, + addons, + experimental_requestResponse, + useStorybookApi, +} from '@storybook/manager-api'; import { useDebounce } from '../../hooks/useDebounce'; import type { NewStoryPayload, SearchResult } from './FileSearchList'; @@ -70,6 +76,23 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi [api, onOpenChange] ); + const handleStoryAlreadyExists = useCallback( + (storyId: string) => { + api.addNotification({ + id: 'create-new-story-file-error', + content: { + headline: 'Story already exists', + subHeadline: `Successfully navigated to existing story`, + }, + duration: 8_000, + icon: , + }); + + onOpenChange(false); + }, + [api, onOpenChange] + ); + const handleFileSearch = useCallback(() => { setLoading(true); const channel = addons.getChannel(); @@ -121,7 +144,8 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi const createNewStoryResult = await experimental_requestResponse< CreateNewStoryRequestPayload, - CreateNewStoryResponsePayload + CreateNewStoryResponsePayload, + CreateNewStoryErrorPayload >(channel, CREATE_NEW_STORYFILE_REQUEST, CREATE_NEW_STORYFILE_RESPONSE, { componentExportName, componentFilePath, @@ -161,11 +185,20 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi handleSuccessfullyCreatedStory(componentExportName); handleFileSearch(); - } catch (e) { - setError({ selectedItemId: selectedItemId, error: e?.message }); + } catch (e: unknown) { + if (e instanceof RequestResponseError) { + const err = e as RequestResponseError; + if (err.payload.type === 'STORY_FILE_EXISTS') { + await trySelectNewStory(api.selectStory, err.payload.storyId); + handleStoryAlreadyExists(err.payload.storyId); + return; + } + } + + setError({ selectedItemId: selectedItemId, error: (e as any)?.message }); } }, - [api?.selectStory, handleSuccessfullyCreatedStory, handleFileSearch] + [api?.selectStory, handleSuccessfullyCreatedStory, handleFileSearch, handleStoryAlreadyExists] ); useEffect(() => { diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 381e2812d276..11dfe7cd7e9b 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -26,12 +26,11 @@ import { useVirtualizer } from '@tanstack/react-virtual'; import type { CreateNewStoryRequestPayload, FileComponentSearchResponsePayload, - ResponseData, } from '@storybook/core-events'; import { WithTooltip, TooltipNote } from '@storybook/components'; import { useArrowKeyNavigation } from './FIleSearchList.utils'; -export type SearchResult = ResponseData['payload']['files'][0]; +export type SearchResult = FileComponentSearchResponsePayload['files'][0]; export interface NewStoryPayload extends CreateNewStoryRequestPayload { selectedItemId: string | number; @@ -86,21 +85,21 @@ export const FileSearchList = memo(function FileSearchList({ const sortedSearchResults = useMemo(() => { // search results with no exports should be at the end of the list return [...(searchResults ?? [])]?.sort((a, b) => { - const isADisabled = + const isALowPriority = a.exportedComponents === null || a.exportedComponents?.length === 0 || (a.storyFileExists && a.exportedComponents?.length < 2); - const isBDisabled = + const isBLowPriority = b.exportedComponents === null || b.exportedComponents?.length === 0 || (b.storyFileExists && b.exportedComponents?.length < 2); - if (isADisabled && !isBDisabled) { + if (isALowPriority && !isBLowPriority) { return 1; } - if (!isADisabled && isBDisabled) { + if (!isALowPriority && isBLowPriority) { return -1; } @@ -131,7 +130,7 @@ export const FileSearchList = memo(function FileSearchList({ return virtualItem.index; }); - } else if (searchResult?.exportedComponents?.length === 1 && !searchResult?.storyFileExists) { + } else if (searchResult?.exportedComponents?.length === 1) { onNewStory({ componentExportName: searchResult.exportedComponents[0].name, componentFilePath: searchResult.filepath, @@ -174,8 +173,7 @@ export const FileSearchList = memo(function FileSearchList({ error={itemError} disabled={ searchResult.exportedComponents === null || - searchResult.exportedComponents?.length === 0 || - (searchResult.storyFileExists && searchResult.exportedComponents?.length < 2) + searchResult.exportedComponents?.length === 0 } > @@ -289,8 +287,6 @@ export const FileSearchList = memo(function FileSearchList({ const noExports = searchResult.exportedComponents === null || searchResult.exportedComponents?.length === 0; - const hasStoryFile = - searchResult.exportedComponents?.length === 1 && searchResult.storyFileExists; const itemProps = {}; @@ -324,7 +320,7 @@ export const FileSearchList = memo(function FileSearchList({ }} tabIndex={0} > - {noExports || hasStoryFile ? ( + {noExports ? ( } diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index 7140911fe003..d89f2fc14018 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -469,6 +469,7 @@ export default { 'Consumer', 'ManagerContext', 'Provider', + 'RequestResponseError', 'addons', 'combineParameters', 'controlOrMetaKey', From 50fbf501f35ba848e8a498f17e69aceda6687d1d Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 14:53:07 +0200 Subject: [PATCH 171/180] Fix tests --- .../src/server-channel/create-new-story-channel.test.ts | 1 - .../core-server/src/server-channel/file-search-channel.test.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index 12aa76d02f5d..e3311626b4b1 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -126,7 +126,6 @@ describe('createNewStoryChannel', () => { expect(createNewStoryFileEventListener).toHaveBeenCalledWith({ error: 'Failed to write file', - payload: null, id: 'components-page--default', success: false, }); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index 1ecc2a753c04..092445194219 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -165,7 +165,6 @@ describe('file-search-channel', () => { expect(searchResultChannelListener).toHaveBeenCalledWith({ id: data.searchQuery, - payload: null, error: 'An error occurred while searching for components in the project.\nENOENT: no such file or directory', success: false, From ad1b0b0b8d46b7eee38e34a5fb6b7e853dd85826 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 15:10:26 +0200 Subject: [PATCH 172/180] Implement telemetry for create-new-story-file flow --- .../core-server/src/presets/common-preset.ts | 4 +- .../create-new-story-channel.test.ts | 56 +++++++++++-------- .../create-new-story-channel.ts | 31 +++++++++- .../file-search-channel.test.ts | 6 +- .../src/server-channel/file-search-channel.ts | 32 ++++++++++- code/lib/telemetry/src/types.ts | 4 +- 6 files changed, 99 insertions(+), 34 deletions(-) diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 2450812dd8d9..0089a4a74fa7 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -241,8 +241,8 @@ export const experimental_serverChannel = async ( initializeWhatsNew(channel, options, coreOptions); initializeSaveStory(channel, options, coreOptions); - initFileSearchChannel(channel, options); - initCreateNewStoryChannel(channel, options); + initFileSearchChannel(channel, options, coreOptions); + initCreateNewStoryChannel(channel, options, coreOptions); return channel; }; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts index e3311626b4b1..dc3763cb2d6b 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.test.ts @@ -49,19 +49,23 @@ describe('createNewStoryChannel', () => { mockChannel.addListener(CREATE_NEW_STORYFILE_RESPONSE, createNewStoryFileEventListener); const cwd = process.cwd(); - initCreateNewStoryChannel(mockChannel, { - configDir: path.join(cwd, '.storybook'), - presets: { - apply: (val: string) => { - if (val === 'framework') { - return Promise.resolve('@storybook/nextjs'); - } - if (val === 'stories') { - return Promise.resolve(['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)']); - } + initCreateNewStoryChannel( + mockChannel, + { + configDir: path.join(cwd, '.storybook'), + presets: { + apply: (val: string) => { + if (val === 'framework') { + return Promise.resolve('@storybook/nextjs'); + } + if (val === 'stories') { + return Promise.resolve(['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)']); + } + }, }, - }, - } as any); + } as any, + { disableTelemetry: true } + ); mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { id: 'components-page--default', @@ -96,19 +100,23 @@ describe('createNewStoryChannel', () => { throw new Error('Failed to write file'); }); - initCreateNewStoryChannel(mockChannel, { - configDir: path.join(cwd, '.storybook'), - presets: { - apply: (val: string) => { - if (val === 'framework') { - return Promise.resolve('@storybook/nextjs'); - } - if (val === 'stories') { - return Promise.resolve(['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)']); - } + initCreateNewStoryChannel( + mockChannel, + { + configDir: path.join(cwd, '.storybook'), + presets: { + apply: (val: string) => { + if (val === 'framework') { + return Promise.resolve('@storybook/nextjs'); + } + if (val === 'stories') { + return Promise.resolve(['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)']); + } + }, }, - }, - } as any); + } as any, + { disableTelemetry: true } + ); mockChannel.emit(CREATE_NEW_STORYFILE_REQUEST, { id: 'components-page--default', diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index 4b61b53d5b2a..a729f734dd93 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -1,5 +1,6 @@ -import type { Options } from '@storybook/types'; +import type { CoreConfig, Options } from '@storybook/types'; import type { Channel } from '@storybook/channels'; +import { telemetry } from '@storybook/telemetry'; import type { CreateNewStoryErrorPayload, CreateNewStoryRequestPayload, @@ -17,7 +18,11 @@ import { getNewStoryFile } from '../utils/get-new-story-file'; import { getStoryId } from '../utils/get-story-id'; import path from 'node:path'; -export function initCreateNewStoryChannel(channel: Channel, options: Options) { +export function initCreateNewStoryChannel( + channel: Channel, + options: Options, + coreOptions: CoreConfig +) { /** * Listens for events to create a new storyfile */ @@ -44,6 +49,15 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { }, error: `A story file already exists at ${relativeStoryFilePath}`, } satisfies ResponseData); + + if (!coreOptions.disableTelemetry) { + telemetry('create-new-story-file', { + success: false, + error: 'STORY_FILE_EXISTS', + }); + } + + return; } await fs.writeFile(storyFilePath, storyFileContent, 'utf-8'); @@ -58,12 +72,25 @@ export function initCreateNewStoryChannel(channel: Channel, options: Options) { }, error: null, } satisfies ResponseData); + + if (!coreOptions.disableTelemetry) { + telemetry('create-new-story-file', { + success: true, + }); + } } catch (e: any) { channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { success: false, id: data.id, error: e?.message, } satisfies ResponseData); + + if (!coreOptions.disableTelemetry) { + await telemetry('create-new-story-file', { + success: false, + error: e, + }); + } } } ); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.test.ts b/code/lib/core-server/src/server-channel/file-search-channel.test.ts index 092445194219..d12af10ca261 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.test.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.test.ts @@ -49,7 +49,7 @@ describe('file-search-channel', () => { const mockOptions = {}; const data = { searchQuery: 'es-module' }; - initFileSearchChannel(mockChannel, mockOptions as any); + initFileSearchChannel(mockChannel, mockOptions as any, { disableTelemetry: true }); mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, { @@ -114,7 +114,7 @@ describe('file-search-channel', () => { const mockOptions = {}; const data = { searchQuery: 'no-file-for-search-query' }; - initFileSearchChannel(mockChannel, mockOptions as any); + initFileSearchChannel(mockChannel, mockOptions as any, { disableTelemetry: true }); mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); mockChannel.emit(FILE_COMPONENT_SEARCH_REQUEST, { @@ -148,7 +148,7 @@ describe('file-search-channel', () => { const mockOptions = {}; const data = { searchQuery: 'commonjs' }; - initFileSearchChannel(mockChannel, mockOptions as any); + initFileSearchChannel(mockChannel, mockOptions as any, { disableTelemetry: true }); mockChannel.addListener(FILE_COMPONENT_SEARCH_RESPONSE, searchResultChannelListener); diff --git a/code/lib/core-server/src/server-channel/file-search-channel.ts b/code/lib/core-server/src/server-channel/file-search-channel.ts index e0d92c24ad72..58e94fdfcc77 100644 --- a/code/lib/core-server/src/server-channel/file-search-channel.ts +++ b/code/lib/core-server/src/server-channel/file-search-channel.ts @@ -1,4 +1,4 @@ -import type { Options, SupportedRenderers } from '@storybook/types'; +import type { CoreConfig, Options, SupportedRenderers } from '@storybook/types'; import type { Channel } from '@storybook/channels'; import { extractProperRendererNameFromFramework, @@ -21,8 +21,13 @@ import { FILE_COMPONENT_SEARCH_RESPONSE, } from '@storybook/core-events'; import { doesStoryFileExist, getStoryMetadata } from '../utils/get-new-story-file'; +import { telemetry } from '@storybook/telemetry'; -export function initFileSearchChannel(channel: Channel, options: Options) { +export async function initFileSearchChannel( + channel: Channel, + options: Options, + coreOptions: CoreConfig +) { /** * Listens for a search query event and searches for files in the project */ @@ -69,6 +74,13 @@ export function initFileSearchChannel(channel: Channel, options: Options) { storyFileExists, }; } catch (e) { + if (!coreOptions.disableTelemetry) { + telemetry('create-new-story-file-search', { + success: false, + error: `Could not parse file: ${e}`, + }); + } + return { filepath: file, storyFileExists: false, @@ -77,6 +89,15 @@ export function initFileSearchChannel(channel: Channel, options: Options) { } }); + if (!coreOptions.disableTelemetry) { + telemetry('create-new-story-file-search', { + success: true, + payload: { + fileCount: entries.length, + }, + }); + } + channel.emit(FILE_COMPONENT_SEARCH_RESPONSE, { success: true, id: searchQuery, @@ -94,6 +115,13 @@ export function initFileSearchChannel(channel: Channel, options: Options) { id: searchQuery ?? '', error: `An error occurred while searching for components in the project.\n${e?.message}`, } satisfies ResponseData); + + if (!coreOptions.disableTelemetry) { + telemetry('create-new-story-file-search', { + success: false, + error: `An error occured while searching for components: ${e}`, + }); + } } } ); diff --git a/code/lib/telemetry/src/types.ts b/code/lib/telemetry/src/types.ts index 4d45b59ea21d..c6372084c2c8 100644 --- a/code/lib/telemetry/src/types.ts +++ b/code/lib/telemetry/src/types.ts @@ -17,7 +17,9 @@ export type EventType = | 'version-update' | 'core-config' | 'remove' - | 'save-story'; + | 'save-story' + | 'create-new-story-file' + | 'create-new-story-file-search'; export interface Dependency { version: string | undefined; From 1298227d45cdba3b6d5966a3ace8bad2f942a3a6 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 15:20:21 +0200 Subject: [PATCH 173/180] Fix sorting for file search --- .../src/components/sidebar/FileSearchList.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.tsx index 11dfe7cd7e9b..316704abfba6 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.tsx @@ -85,15 +85,19 @@ export const FileSearchList = memo(function FileSearchList({ const sortedSearchResults = useMemo(() => { // search results with no exports should be at the end of the list return [...(searchResults ?? [])]?.sort((a, b) => { - const isALowPriority = - a.exportedComponents === null || - a.exportedComponents?.length === 0 || - (a.storyFileExists && a.exportedComponents?.length < 2); + const isALowPriority = a.exportedComponents === null || a.exportedComponents?.length === 0; + const hasAStory = a.storyFileExists; - const isBLowPriority = - b.exportedComponents === null || - b.exportedComponents?.length === 0 || - (b.storyFileExists && b.exportedComponents?.length < 2); + const isBLowPriority = b.exportedComponents === null || b.exportedComponents?.length === 0; + const hasBStory = b.storyFileExists; + + if (hasAStory && !hasBStory) { + return -1; + } + + if (hasBStory && !hasAStory) { + return 1; + } if (isALowPriority && !isBLowPriority) { return 1; From f0d81b1ac4cc060d6c90b402fbe255dee8e2bffc Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 30 Apr 2024 17:07:41 +0200 Subject: [PATCH 174/180] change placeholder, to indicate you can use globs --- code/ui/manager/src/components/sidebar/FileSearchModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index bfc007e75c0e..c0dc3a77f08e 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -174,7 +174,7 @@ export const FileSearchModal = ({ Date: Tue, 30 Apr 2024 21:29:23 +0200 Subject: [PATCH 175/180] improve UI in dark mode --- code/ui/components/src/components/Modal/Modal.styled.tsx | 1 - code/ui/manager/src/components/sidebar/FileList.tsx | 4 ++-- .../src/components/sidebar/FileSearchList.stories.tsx | 3 +++ code/ui/manager/src/components/sidebar/FileSearchModal.tsx | 5 +++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/ui/components/src/components/Modal/Modal.styled.tsx b/code/ui/components/src/components/Modal/Modal.styled.tsx index 12a96e81b194..b60e512b74ab 100644 --- a/code/ui/components/src/components/Modal/Modal.styled.tsx +++ b/code/ui/components/src/components/Modal/Modal.styled.tsx @@ -103,7 +103,6 @@ export const Title = styled(Dialog.Title)(({ theme }) => ({ export const Description = styled(Dialog.Description)(({ theme }) => ({ margin: 0, fontSize: theme.typography.size.s2, - color: theme.color.mediumdark, })); export const Actions = styled.div({ diff --git a/code/ui/manager/src/components/sidebar/FileList.tsx b/code/ui/manager/src/components/sidebar/FileList.tsx index d56cfc096720..420d4ce5dc6e 100644 --- a/code/ui/manager/src/components/sidebar/FileList.tsx +++ b/code/ui/manager/src/components/sidebar/FileList.tsx @@ -79,12 +79,12 @@ export const FileListItemContentWrapper = styled.div<{ }), ...(error && { - background: '#F9ECEC', + background: theme.base === 'light' ? '#00000011' : '#00000033', }), '&:hover': { background: error - ? '#F9ECEC' + ? '#00000022' : theme.base === 'dark' ? 'rgba(255,255,255,.1)' : theme.color.mediumlight, diff --git a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx index 6aa590c6d34a..f2fb798d5992 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchList.stories.tsx @@ -8,6 +8,9 @@ const meta = { args: { onNewStory: fn(), }, + parameters: { + layout: 'fullscreen', + }, } satisfies Meta; export default meta; diff --git a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx index c0dc3a77f08e..40f7b4e76ba9 100644 --- a/code/ui/manager/src/components/sidebar/FileSearchModal.tsx +++ b/code/ui/manager/src/components/sidebar/FileSearchModal.tsx @@ -24,9 +24,10 @@ const ModalChild = styled.div<{ height?: number }>(({ theme, height }) => ({ overflow: 'hidden', })); -const ModalContent = styled(Modal.Content)({ +const ModalContent = styled(Modal.Content)(({ theme }) => ({ margin: 0, -}); + color: theme.base === 'dark' ? theme.color.lighter : theme.color.mediumdark, +})); const ModalInput = styled(Form.Input)(({ theme }) => ({ paddingLeft: 40, From 9b2b60fce6678e618be4987b07d8d40fd10d77ae Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 30 Apr 2024 22:11:32 +0200 Subject: [PATCH 176/180] Fix selection of story if it exists --- .../core-events/src/data/create-new-story.ts | 2 +- .../create-new-story-channel.ts | 4 +- .../src/utils/get-story-id.test.ts | 3 +- .../lib/core-server/src/utils/get-story-id.ts | 6 +- .../sidebar/CreateNewStoryFileModal.tsx | 55 ++++++++----------- 5 files changed, 33 insertions(+), 37 deletions(-) diff --git a/code/lib/core-events/src/data/create-new-story.ts b/code/lib/core-events/src/data/create-new-story.ts index 733b273d5056..8727d99f0c12 100644 --- a/code/lib/core-events/src/data/create-new-story.ts +++ b/code/lib/core-events/src/data/create-new-story.ts @@ -20,5 +20,5 @@ export interface CreateNewStoryResponsePayload { export type CreateNewStoryErrorPayload = { type: 'STORY_FILE_EXISTS'; - storyId: string; + kind: string; }; diff --git a/code/lib/core-server/src/server-channel/create-new-story-channel.ts b/code/lib/core-server/src/server-channel/create-new-story-channel.ts index a729f734dd93..18d755afbd44 100644 --- a/code/lib/core-server/src/server-channel/create-new-story-channel.ts +++ b/code/lib/core-server/src/server-channel/create-new-story-channel.ts @@ -37,7 +37,7 @@ export function initCreateNewStoryChannel( const relativeStoryFilePath = path.relative(process.cwd(), storyFilePath); - const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); + const { storyId, kind } = await getStoryId({ storyFilePath, exportedStoryName }, options); if (existsSync(storyFilePath)) { channel.emit(CREATE_NEW_STORYFILE_RESPONSE, { @@ -45,7 +45,7 @@ export function initCreateNewStoryChannel( id: data.id, payload: { type: 'STORY_FILE_EXISTS', - storyId: storyId, + kind, }, error: `A story file already exists at ${relativeStoryFilePath}`, } satisfies ResponseData); diff --git a/code/lib/core-server/src/utils/get-story-id.test.ts b/code/lib/core-server/src/utils/get-story-id.test.ts index 4fb0230bc21e..243fbed6160f 100644 --- a/code/lib/core-server/src/utils/get-story-id.test.ts +++ b/code/lib/core-server/src/utils/get-story-id.test.ts @@ -18,9 +18,10 @@ describe('getStoryId', () => { const storyFilePath = path.join(cwd, 'src', 'components', 'stories', 'Page1.stories.ts'); const exportedStoryName = 'Default'; - const storyId = await getStoryId({ storyFilePath, exportedStoryName }, options); + const { storyId, kind } = await getStoryId({ storyFilePath, exportedStoryName }, options); expect(storyId).toBe('components-stories-page1--default'); + expect(kind).toBe('components-stories-page1'); }); it('should throw an error if the storyId cannot be calculated', async () => { diff --git a/code/lib/core-server/src/utils/get-story-id.ts b/code/lib/core-server/src/utils/get-story-id.ts index b874a071479a..eb73a52ae58a 100644 --- a/code/lib/core-server/src/utils/get-story-id.ts +++ b/code/lib/core-server/src/utils/get-story-id.ts @@ -2,7 +2,7 @@ import type { Options } from '@storybook/types'; import dedent from 'ts-dedent'; import { normalizeStories, normalizeStoryPath } from '@storybook/core-common'; import path from 'path'; -import { storyNameFromExport, toId } from '@storybook/csf'; +import { sanitize, storyNameFromExport, toId } from '@storybook/csf'; import { userOrAutoTitleFromSpecifier } from '@storybook/preview-api'; import { posix } from './posix'; @@ -36,7 +36,9 @@ export async function getStoryId(data: StoryIdData, options: Options) { } const storyName = storyNameFromExport(data.exportedStoryName); + const storyId = toId(autoTitle as string, storyName); + const kind = sanitize(autoTitle); - return storyId; + return { storyId, kind }; } diff --git a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx index bfaec7e0e8e9..0e16ea234750 100644 --- a/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx +++ b/code/ui/manager/src/components/sidebar/CreateNewStoryFileModal.tsx @@ -23,12 +23,8 @@ import { SAVE_STORY_REQUEST, SAVE_STORY_RESPONSE, } from '@storybook/core-events'; -import { - RequestResponseError, - addons, - experimental_requestResponse, - useStorybookApi, -} from '@storybook/manager-api'; +import type { RequestResponseError } from '@storybook/manager-api'; +import { addons, experimental_requestResponse, useStorybookApi } from '@storybook/manager-api'; import { useDebounce } from '../../hooks/useDebounce'; import type { NewStoryPayload, SearchResult } from './FileSearchList'; @@ -76,22 +72,19 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi [api, onOpenChange] ); - const handleStoryAlreadyExists = useCallback( - (storyId: string) => { - api.addNotification({ - id: 'create-new-story-file-error', - content: { - headline: 'Story already exists', - subHeadline: `Successfully navigated to existing story`, - }, - duration: 8_000, - icon: , - }); + const handleStoryAlreadyExists = useCallback(() => { + api.addNotification({ + id: 'create-new-story-file-error', + content: { + headline: 'Story already exists', + subHeadline: `Successfully navigated to existing story`, + }, + duration: 8_000, + icon: , + }); - onOpenChange(false); - }, - [api, onOpenChange] - ); + onOpenChange(false); + }, [api, onOpenChange]); const handleFileSearch = useCallback(() => { setLoading(true); @@ -185,17 +178,17 @@ export const CreateNewStoryFileModal = ({ open, onOpenChange }: CreateNewStoryFi handleSuccessfullyCreatedStory(componentExportName); handleFileSearch(); - } catch (e: unknown) { - if (e instanceof RequestResponseError) { - const err = e as RequestResponseError; - if (err.payload.type === 'STORY_FILE_EXISTS') { - await trySelectNewStory(api.selectStory, err.payload.storyId); - handleStoryAlreadyExists(err.payload.storyId); - return; - } + } catch (e: any) { + switch (e?.payload?.type as CreateNewStoryErrorPayload['type']) { + case 'STORY_FILE_EXISTS': + const err = e as RequestResponseError; + await trySelectNewStory(api.selectStory, err.payload.kind); + handleStoryAlreadyExists(); + break; + default: + setError({ selectedItemId: selectedItemId, error: (e as any)?.message }); + break; } - - setError({ selectedItemId: selectedItemId, error: (e as any)?.message }); } }, [api?.selectStory, handleSuccessfullyCreatedStory, handleFileSearch, handleStoryAlreadyExists] From 9386252411a448164fbc28ac0c1cda333d328f19 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 1 May 2024 08:49:08 +0200 Subject: [PATCH 177/180] disable chromatic for failing interaction test story --- .../interactions/template/stories/unhandled-errors.stories.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/code/addons/interactions/template/stories/unhandled-errors.stories.ts b/code/addons/interactions/template/stories/unhandled-errors.stories.ts index fcaf0144ccd4..336c44b72f3a 100644 --- a/code/addons/interactions/template/stories/unhandled-errors.stories.ts +++ b/code/addons/interactions/template/stories/unhandled-errors.stories.ts @@ -11,6 +11,7 @@ export default { }, parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, + chromatic: { disable: true }, }, }; From 45371467c6da954b5112ada27f8bfc59e7937bfc Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 1 May 2024 08:50:04 +0200 Subject: [PATCH 178/180] disable charomatic for failing interaction test --- .../interactions/template/stories/unhandled-errors.stories.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/code/addons/interactions/template/stories/unhandled-errors.stories.ts b/code/addons/interactions/template/stories/unhandled-errors.stories.ts index fcaf0144ccd4..336c44b72f3a 100644 --- a/code/addons/interactions/template/stories/unhandled-errors.stories.ts +++ b/code/addons/interactions/template/stories/unhandled-errors.stories.ts @@ -11,6 +11,7 @@ export default { }, parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, + chromatic: { disable: true }, }, }; From 069cf670ea2bec271d6a6519b357ce351c6f9cd5 Mon Sep 17 00:00:00 2001 From: Kyle Gach Date: Wed, 1 May 2024 10:23:11 -0600 Subject: [PATCH 179/180] Fix vue snippets --- docs/get-started/vue3-webpack5.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/get-started/vue3-webpack5.md b/docs/get-started/vue3-webpack5.md index 283ba4fbe2d3..d5aa4c7913a8 100644 --- a/docs/get-started/vue3-webpack5.md +++ b/docs/get-started/vue3-webpack5.md @@ -74,9 +74,9 @@ First, install the framework: @@ -118,8 +118,8 @@ Finally, update your `.storybook/main.js|ts` to change the framework property: From 7b8d07659bc7fcf1e7c1671bc2862ceba7487d58 Mon Sep 17 00:00:00 2001 From: Kyle Gach Date: Wed, 1 May 2024 10:25:44 -0600 Subject: [PATCH 180/180] Fix typo in playwright portable stories snippet --- docs/api/portable-stories-playwright.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/portable-stories-playwright.md b/docs/api/portable-stories-playwright.md index d043ca7abd59..6c1f2764bb34 100644 --- a/docs/api/portable-stories-playwright.md +++ b/docs/api/portable-stories-playwright.md @@ -219,7 +219,7 @@ If your stories behave differently based on [globals](../essentials/toolbars-and ```tsx // Button.portable.ts -import { test } from 'vitest'; +import { test } from 'playwright'; import { render } from '@testing-library/react'; import { composeStory } from '@storybook/react';