storybook-addon-remix-react-router
Version:
Use Remix React Router in your stories. (Formerly storybook-addon-react-router-v6)
1 lines • 18.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants.ts","../src/features/panel/hooks/useAddonVersions.ts","../src/features/panel/components/InformationBanner.tsx","../src/features/panel/components/PanelContent.tsx","../src/features/panel/components/InspectorContainer.tsx","../src/features/panel/components/RouterEventDisplayWrapper.tsx","../src/features/panel/components/ThemedInspector.tsx","../src/features/panel/components/Panel.tsx","../src/features/panel/components/PanelTitle.tsx","../src/manager.tsx"],"names":["ADDON_ID","PANEL_ID","PARAM_KEY","EVENTS","useAddonVersions","currentVersion","setCurrentVersion","useState","latestVersion","setLatestVersion","useEffect","abortController","b","json","getAddonVersion","v","newVersionAvailable","compareVersions","InformationBanner","styled","InspectorContainer","RouterEventDisplayWrapper","ThemedInspector","withTheme","theme","props","React","ObjectInspector","PatchedScrollArea","ScrollArea","PanelContent","routerEvents","onClear","Fragment","Wrapper","event","humanReadableEventNames","ActionBar","children","title","Panel","navigationEvents","setNavigationEvents","latestAddonVersion","addonUpdateAvailable","pushEvent","prev","useChannel","STORY_CHANGED","clear","AddonPanel","PanelTitle","api","useContext","ManagerContext","badgeCount","setBadgeCount","incrementBadgeCount","previous","clearBadgeCount","suffixes","addons","types","viewMode","active"],"mappings":"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","file":"manager.cjs","sourcesContent":["export const ADDON_ID = 'storybook/react-router-v6';\nexport const PANEL_ID = `${ADDON_ID}/panel`;\nexport const PARAM_KEY = `reactRouter`;\n\nexport const EVENTS = {\n CLEAR: `${ADDON_ID}/clear`,\n NAVIGATION: `${ADDON_ID}/navigation`,\n STORY_LOADED: `${ADDON_ID}/story-loaded`,\n ROUTE_MATCHES: `${ADDON_ID}/route-matches`,\n ACTION_INVOKED: `${ADDON_ID}/action_invoked`,\n ACTION_SETTLED: `${ADDON_ID}/action_settled`,\n LOADER_INVOKED: `${ADDON_ID}/loader_invoked`,\n LOADER_SETTLED: `${ADDON_ID}/loader_settled`,\n} as const;\n","import { compareVersions } from 'compare-versions';\nimport { useEffect, useState } from 'react';\n\nexport function useAddonVersions() {\n const [currentVersion, setCurrentVersion] = useState<string>();\n const [latestVersion, setLatestVersion] = useState<string>();\n\n useEffect(() => {\n const abortController = new AbortController();\n fetch(`https://registry.npmjs.org/storybook-addon-remix-react-router/latest`, { signal: abortController.signal })\n .then((b) => b.json())\n .then((json) => setLatestVersion(json.version))\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n .catch(() => {});\n\n return () => abortController.abort();\n }, []);\n\n useEffect(() => {\n getAddonVersion().then((v) => setCurrentVersion(v));\n }, []);\n\n const newVersionAvailable =\n !latestVersion || !currentVersion ? undefined : compareVersions(latestVersion, currentVersion) === 1;\n\n return {\n currentAddonVersion: currentVersion,\n latestAddonVersion: latestVersion,\n addonUpdateAvailable: newVersionAvailable,\n };\n}\n\nasync function getAddonVersion() {\n try {\n const packageJson = await import('../../../../package.json', {\n with: {\n type: 'json',\n },\n });\n\n return packageJson.version;\n } catch (error) {\n const packageJson = await import('../../../../package.json', {\n assert: {\n type: 'json',\n },\n });\n\n return packageJson.version;\n }\n}\n","import { styled } from 'storybook/theming';\n\nexport const InformationBanner = styled.p`\n background: #ffebba;\n padding: 5px;\n margin-top: 0;\n`;\n","import { ActionBar, ScrollArea } from 'storybook/internal/components';\nimport { styled, StyledComponent } from 'storybook/theming';\nimport React, { Fragment, PropsWithChildren, ReactNode } from 'react';\nimport { EVENTS } from '../../../constants';\nimport { FCC } from '../../../fixes';\nimport { RouterEvent, RouterEvents } from '../types';\nimport { InspectorContainer } from './InspectorContainer';\nimport { RouterEventDisplayWrapper } from './RouterEventDisplayWrapper';\nimport { ThemedInspector } from './ThemedInspector';\n\nexport type PanelContentProps = {\n routerEvents: Array<RouterEvent>;\n onClear: () => void;\n};\n\nexport type ScrollAreaProps = PropsWithChildren<{\n horizontal?: boolean;\n vertical?: boolean;\n className?: string;\n title: string;\n}>;\nconst PatchedScrollArea = ScrollArea as FCC<ScrollAreaProps>;\n\nexport const PanelContent: FCC<PanelContentProps> = ({ routerEvents, onClear }) => {\n return (\n <Fragment>\n <Wrapper title=\"reactRouterLogger\">\n {routerEvents.map((event, i) => {\n return (\n <RouterEventDisplayWrapper key={i}>\n <InspectorContainer>\n <ThemedInspector\n name={humanReadableEventNames[event.type]}\n data={event.data}\n showNonenumerable={false}\n sortObjectKeys={false}\n expandPaths={[\n '$.routeParams',\n '$.searchParams',\n '$.routeMatches.*',\n '$.routeMatches.*.*',\n '$.matches',\n '$.matches.*',\n '$.matches.*.*',\n ]}\n />\n </InspectorContainer>\n </RouterEventDisplayWrapper>\n );\n })}\n </Wrapper>\n\n <ActionBar actionItems={[{ title: 'Clear', onClick: onClear }]} />\n </Fragment>\n );\n};\n\nexport const humanReadableEventNames: Record<RouterEvents[keyof RouterEvents], string> = {\n [EVENTS.NAVIGATION]: 'Navigate',\n [EVENTS.STORY_LOADED]: 'Story rendered',\n [EVENTS.ROUTE_MATCHES]: 'New route matches',\n [EVENTS.ACTION_INVOKED]: 'Action invoked',\n [EVENTS.ACTION_SETTLED]: 'Action settled',\n [EVENTS.LOADER_INVOKED]: 'Loader invoked',\n [EVENTS.LOADER_SETTLED]: 'Loader settled',\n};\n\nexport const Wrapper: StyledComponent<{ children: ReactNode } & ScrollAreaProps> = styled(\n ({ children, title }: ScrollAreaProps) => (\n <PatchedScrollArea horizontal vertical title={title}>\n {children}\n </PatchedScrollArea>\n )\n)({\n margin: 0,\n padding: '10px 5px 20px',\n});\nWrapper.displayName = 'Wrapper';\n","import { styled, StyledComponent } from 'storybook/theming';\nimport { ReactNode } from 'react';\n\nexport const InspectorContainer: StyledComponent<{ children: ReactNode }> = styled.div({\n flex: 1,\n padding: '0 0 0 5px',\n});\n","import { styled, StyledComponent } from 'storybook/theming';\nimport { ReactNode } from 'react';\n\nexport const RouterEventDisplayWrapper: StyledComponent<{ children: ReactNode }> = styled.div({\n display: 'flex',\n padding: 0,\n borderLeft: '5px solid transparent',\n borderBottom: '1px solid transparent',\n transition: 'all 0.1s',\n alignItems: 'flex-start',\n whiteSpace: 'pre',\n});\n","import React from 'react';\nimport type { Theme } from 'storybook/theming';\nimport { withTheme } from 'storybook/theming';\nimport { ObjectInspector } from 'react-inspector';\n\ninterface InspectorProps {\n theme: Theme;\n sortObjectKeys?: boolean;\n showNonenumerable?: boolean;\n name: any;\n data: any;\n depth?: number;\n expandPaths?: string | string[];\n}\n\nexport const ThemedInspector = withTheme(({ theme, ...props }: InspectorProps) => (\n <ObjectInspector theme={theme.addonActionsTheme || 'chromeLight'} {...props} />\n));\n","import { AddonPanel } from 'storybook/internal/components';\nimport { STORY_CHANGED } from 'storybook/internal/core-events';\nimport { API, useChannel } from 'storybook/manager-api';\nimport React, { useState } from 'react';\nimport { EVENTS } from '../../../constants';\nimport { useAddonVersions } from '../hooks/useAddonVersions';\nimport { RouterEvent } from '../types';\nimport { InformationBanner } from './InformationBanner';\nimport { PanelContent } from './PanelContent';\n\ninterface PanelProps {\n active: boolean;\n api: API;\n}\n\nexport const Panel: React.FC<PanelProps> = (props) => {\n const [navigationEvents, setNavigationEvents] = useState<RouterEvent[]>([]);\n const { latestAddonVersion, addonUpdateAvailable } = useAddonVersions();\n\n const pushEvent = (event: RouterEvent) => {\n setNavigationEvents((prev) => [...prev, event]);\n };\n\n useChannel({\n [EVENTS.ROUTE_MATCHES]: pushEvent,\n [EVENTS.NAVIGATION]: pushEvent,\n [EVENTS.STORY_LOADED]: pushEvent,\n [EVENTS.ACTION_INVOKED]: pushEvent,\n [EVENTS.ACTION_SETTLED]: pushEvent,\n [EVENTS.LOADER_INVOKED]: pushEvent,\n [EVENTS.LOADER_SETTLED]: pushEvent,\n [STORY_CHANGED]: () => setNavigationEvents([]),\n });\n\n const clear = () => {\n props.api.emit(EVENTS.CLEAR);\n setNavigationEvents([]);\n };\n\n return (\n <AddonPanel {...props}>\n <>\n {addonUpdateAvailable && (\n <InformationBanner>\n Version {latestAddonVersion} is now available !{' '}\n <a\n href={`https://github.com/JesusTheHun/storybook-addon-remix-react-router/releases/tag/v${latestAddonVersion}`}\n >\n Changelog\n </a>\n .\n </InformationBanner>\n )}\n <PanelContent routerEvents={navigationEvents} onClear={clear} />\n </>\n </AddonPanel>\n );\n};\n","import { STORY_CHANGED } from 'storybook/internal/core-events';\nimport { ManagerContext } from 'storybook/manager-api';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { EVENTS } from '../../../constants';\nimport { useAddonVersions } from '../hooks/useAddonVersions';\n\nexport function PanelTitle() {\n const { api } = useContext(ManagerContext);\n const { addonUpdateAvailable } = useAddonVersions();\n\n const [badgeCount, setBadgeCount] = useState(0);\n const incrementBadgeCount = () => setBadgeCount((previous) => previous + 1);\n const clearBadgeCount = () => setBadgeCount(0);\n\n useEffect(() => {\n api.on(STORY_CHANGED, clearBadgeCount);\n api.on(EVENTS.ROUTE_MATCHES, incrementBadgeCount);\n api.on(EVENTS.NAVIGATION, incrementBadgeCount);\n api.on(EVENTS.ACTION_INVOKED, incrementBadgeCount);\n api.on(EVENTS.ACTION_SETTLED, incrementBadgeCount);\n api.on(EVENTS.LOADER_INVOKED, incrementBadgeCount);\n api.on(EVENTS.LOADER_SETTLED, incrementBadgeCount);\n api.on(EVENTS.CLEAR, clearBadgeCount);\n\n return () => {\n api.off(STORY_CHANGED, clearBadgeCount);\n api.off(EVENTS.ROUTE_MATCHES, incrementBadgeCount);\n api.off(EVENTS.NAVIGATION, incrementBadgeCount);\n api.off(EVENTS.ACTION_INVOKED, incrementBadgeCount);\n api.off(EVENTS.ACTION_SETTLED, incrementBadgeCount);\n api.off(EVENTS.LOADER_INVOKED, incrementBadgeCount);\n api.off(EVENTS.LOADER_SETTLED, incrementBadgeCount);\n api.off(EVENTS.CLEAR, clearBadgeCount);\n };\n }, [api]);\n\n const suffixes: string[] = [];\n\n if (addonUpdateAvailable) suffixes.push('⚡️');\n if (badgeCount) suffixes.push(`(${badgeCount})`);\n\n return <>React Router {suffixes.join(' ')}</>;\n}\n","import { addons, types } from 'storybook/manager-api';\nimport React from 'react';\n\nimport { ADDON_ID, PANEL_ID, PARAM_KEY } from './constants';\nimport { Panel } from './features/panel/components/Panel';\nimport { PanelTitle } from './features/panel/components/PanelTitle';\n\naddons.register(ADDON_ID, (api) => {\n addons.add(PANEL_ID, {\n type: types.PANEL,\n paramKey: PARAM_KEY,\n title: <PanelTitle />,\n match: ({ viewMode }) => viewMode === 'story',\n render: ({ active }) => <Panel active={active || false} api={api} key={ADDON_ID} />,\n });\n});\n"]}