{"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-react-router-v6/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/internal/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 } from 'storybook/internal/theming';\nimport React, { Fragment, PropsWithChildren } 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 = styled(({ children, title }: ScrollAreaProps) => (\n  <PatchedScrollArea horizontal vertical title={title}>\n    {children}\n  </PatchedScrollArea>\n))({\n  margin: 0,\n  padding: '10px 5px 20px',\n});\nWrapper.displayName = 'Wrapper';\n","import { styled } from 'storybook/internal/theming';\n\nexport const InspectorContainer = styled.div({\n  flex: 1,\n  padding: '0 0 0 5px',\n});\n","import { styled } from 'storybook/internal/theming';\n\nexport const RouterEventDisplayWrapper = 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/internal/theming';\nimport { withTheme } from 'storybook/internal/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-react-router-v6/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"]}