{
  "version": 3,
  "sources": ["../src/router.tsx"],
  "sourcesContent": ["import RouteRecognizer from 'route-recognizer';\nimport { createBrowserHistory } from 'history';\nimport {\n\tcreateContext,\n\tuseContext,\n\tuseSyncExternalStore,\n\tuseMemo,\n\tuseState,\n\tuseEffect,\n} from '@wordpress/element';\nimport {\n\taddQueryArgs,\n\tgetQueryArgs,\n\tgetPath,\n\tbuildQueryString,\n} from '@wordpress/url';\nimport { useEvent, usePrevious } from '@wordpress/compose';\nimport type { ReactNode } from 'react';\n\nconst history = createBrowserHistory();\ninterface Route {\n\tname: string;\n\tpath: string;\n\tareas: Record< string, ReactNode >;\n\twidths: Record< string, number >;\n}\n\ntype LocationWithQuery = Location & {\n\tquery?: Record< string, any >;\n};\n\ninterface Match {\n\tname: string;\n\tpath: string;\n\tareas: Record< string, ReactNode >;\n\twidths: Record< string, number >;\n\tquery?: Record< string, any >;\n\tparams?: Record< string, any >;\n}\n\nexport type BeforeNavigate = ( arg: {\n\tpath: string;\n\tquery: Record< string, any >;\n} ) => {\n\tpath: string;\n\tquery: Record< string, any >;\n};\n\ninterface Config {\n\tpathArg: string;\n\tbeforeNavigate?: BeforeNavigate;\n}\n\nexport interface NavigationOptions {\n\ttransition?: string;\n\tstate?: Record< string, any >;\n\treplace?: boolean;\n}\n\nconst RoutesContext = createContext< Match | null >( null );\nRoutesContext.displayName = 'RoutesContext';\n\nexport const ConfigContext = createContext< Config >( { pathArg: 'p' } );\nConfigContext.displayName = 'ConfigContext';\n\nconst locationMemo = new WeakMap();\nfunction getLocationWithQuery() {\n\tconst location = history.location;\n\tlet locationWithQuery = locationMemo.get( location );\n\tif ( ! locationWithQuery ) {\n\t\tlocationWithQuery = {\n\t\t\t...location,\n\t\t\tquery: Object.fromEntries( new URLSearchParams( location.search ) ),\n\t\t};\n\t\tlocationMemo.set( location, locationWithQuery );\n\t}\n\treturn locationWithQuery;\n}\n\nexport function useLocation() {\n\tconst context = useContext( RoutesContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useLocation must be used within a RouterProvider' );\n\t}\n\treturn context;\n}\n\nexport function useHistory() {\n\tconst { pathArg, beforeNavigate } = useContext( ConfigContext );\n\n\tconst navigate = useEvent(\n\t\tasync ( rawPath: string, options: NavigationOptions = {} ) => {\n\t\t\tconst query = getQueryArgs( rawPath );\n\t\t\tconst path = getPath( 'http://domain.com/' + rawPath ) ?? '';\n\t\t\tconst performPush = () => {\n\t\t\t\tconst result = beforeNavigate\n\t\t\t\t\t? beforeNavigate( { path, query } )\n\t\t\t\t\t: { path, query };\n\t\t\t\treturn history[ options.replace ? 'replace' : 'push' ](\n\t\t\t\t\t{\n\t\t\t\t\t\tsearch: buildQueryString( {\n\t\t\t\t\t\t\t[ pathArg ]: result.path,\n\t\t\t\t\t\t\t...result.query,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t},\n\t\t\t\t\toptions.state\n\t\t\t\t);\n\t\t\t};\n\n\t\t\t/*\n\t\t\t * Skip transition in mobile, otherwise it crashes the browser.\n\t\t\t * See: https://github.com/WordPress/gutenberg/pull/63002.\n\t\t\t */\n\t\t\tconst isMediumOrBigger =\n\t\t\t\twindow.matchMedia( '(min-width: 782px)' ).matches;\n\t\t\tif (\n\t\t\t\t! isMediumOrBigger ||\n\t\t\t\t! document.startViewTransition ||\n\t\t\t\t! options.transition\n\t\t\t) {\n\t\t\t\tperformPush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait new Promise< void >( ( resolve ) => {\n\t\t\t\tconst classname = options.transition ?? '';\n\t\t\t\tdocument.documentElement.classList.add( classname );\n\t\t\t\tconst transition = document.startViewTransition( () =>\n\t\t\t\t\tperformPush()\n\t\t\t\t);\n\t\t\t\ttransition.finished.finally( () => {\n\t\t\t\t\tdocument.documentElement.classList.remove( classname );\n\t\t\t\t\tresolve();\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\t);\n\n\treturn useMemo(\n\t\t() => ( {\n\t\t\tnavigate,\n\t\t\tback: history.back,\n\t\t\tinvalidate: () => {\n\t\t\t\thistory.replace( {\n\t\t\t\t\tsearch: history.location.search,\n\t\t\t\t} );\n\t\t\t},\n\t\t} ),\n\t\t[ navigate ]\n\t);\n}\n\nexport default function useMatch(\n\tlocation: LocationWithQuery,\n\tmatcher: RouteRecognizer,\n\tpathArg: string,\n\tmatchResolverArgs: Record< string, any >\n): Match | undefined {\n\tconst { query: rawQuery = {} } = location;\n\tconst [ resolvedMatch, setMatch ] = useState< Match | undefined >();\n\n\tuseEffect( () => {\n\t\tconst { [ pathArg ]: path = '/', ...query } = rawQuery;\n\t\tconst ret = matcher.recognize( path )?.[ 0 ];\n\t\tasync function resolveMatch( result: any ) {\n\t\t\tconst matchedRoute = result.handler as Route;\n\t\t\tconst resolveFunctions = async (\n\t\t\t\trecord: Record< string, any > = {}\n\t\t\t) => {\n\t\t\t\tconst entries = await Promise.all(\n\t\t\t\t\tObject.entries( record ).map( async ( [ key, value ] ) => {\n\t\t\t\t\t\tif ( typeof value === 'function' ) {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\tawait value( {\n\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\tparams: result.params,\n\t\t\t\t\t\t\t\t\t...matchResolverArgs,\n\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [ key, value ];\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t\treturn Object.fromEntries( entries );\n\t\t\t};\n\t\t\tconst [ resolvedAreas, resolvedWidths ] = await Promise.all( [\n\t\t\t\tresolveFunctions( matchedRoute.areas ),\n\t\t\t\tresolveFunctions( matchedRoute.widths ),\n\t\t\t] );\n\t\t\tsetMatch( {\n\t\t\t\tname: matchedRoute.name,\n\t\t\t\tareas: resolvedAreas,\n\t\t\t\twidths: resolvedWidths,\n\t\t\t\tparams: result.params,\n\t\t\t\tquery,\n\t\t\t\tpath: addQueryArgs( path, query ),\n\t\t\t} );\n\t\t}\n\n\t\tif ( ! ret ) {\n\t\t\tsetMatch( {\n\t\t\t\tname: '404',\n\t\t\t\tpath: addQueryArgs( path, query ),\n\t\t\t\tareas: {},\n\t\t\t\twidths: {},\n\t\t\t\tquery,\n\t\t\t\tparams: {},\n\t\t\t} );\n\t\t} else {\n\t\t\tresolveMatch( ret );\n\t\t}\n\n\t\treturn () => setMatch( undefined );\n\t}, [ matcher, rawQuery, pathArg, matchResolverArgs ] );\n\n\treturn resolvedMatch;\n}\n\nexport function RouterProvider( {\n\troutes,\n\tpathArg,\n\tbeforeNavigate,\n\tchildren,\n\tmatchResolverArgs,\n}: {\n\troutes: Route[];\n\tpathArg: string;\n\tbeforeNavigate?: BeforeNavigate;\n\tchildren: React.ReactNode;\n\tmatchResolverArgs: Record< string, any >;\n} ) {\n\tconst location = useSyncExternalStore(\n\t\thistory.listen,\n\t\tgetLocationWithQuery,\n\t\tgetLocationWithQuery\n\t);\n\tconst matcher = useMemo( () => {\n\t\tconst ret = new RouteRecognizer();\n\t\t( routes ?? [] ).forEach( ( route ) => {\n\t\t\tret.add( [ { path: route.path, handler: route } ], {\n\t\t\t\tas: route.name,\n\t\t\t} );\n\t\t} );\n\t\treturn ret;\n\t}, [ routes ] );\n\tconst match = useMatch( location, matcher, pathArg, matchResolverArgs );\n\tconst previousMatch = usePrevious( match );\n\tconst config = useMemo(\n\t\t() => ( { beforeNavigate, pathArg } ),\n\t\t[ beforeNavigate, pathArg ]\n\t);\n\tconst renderedMatch = match || previousMatch;\n\n\tif ( ! renderedMatch ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ConfigContext.Provider value={ config }>\n\t\t\t<RoutesContext.Provider value={ renderedMatch }>\n\t\t\t\t{ children }\n\t\t\t</RoutesContext.Provider>\n\t\t</ConfigContext.Provider>\n\t);\n}\n"],
  "mappings": "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",
  "names": ["RouteRecognizer"]
}
