{"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, StyledComponent } from '@storybook/theming';\n\nexport const InformationBanner: StyledComponent<NonNullable<unknown>> = styled.p`\n  background: #ffebba;\n  padding: 5px;\n  margin-top: 0;\n`;\n","import { ActionBar, ScrollArea } from '@storybook/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/components';\nimport { STORY_CHANGED } from '@storybook/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      {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    </AddonPanel>\n  );\n};\n","import { STORY_CHANGED } from '@storybook/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"]}