@real-router/core 0.38.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/cjs/Router-B-Pev7K2.d.ts +46 -0
- package/dist/cjs/RouterValidator-mx2Zooya.d.ts +136 -0
- package/dist/cjs/api.d.ts +2 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/index.d-y2b-8_3Y.d.ts +236 -0
- package/dist/cjs/index.d.ts +7 -24
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metafile-cjs.json +1 -1
- package/dist/cjs/utils.d.ts +6 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/validation.d.ts +184 -0
- package/dist/cjs/validation.js +1 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/Router-B-Pev7K2.d.mts +46 -0
- package/dist/esm/RouterValidator-mx2Zooya.d.mts +136 -0
- package/dist/esm/api.d.mts +2 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/chunk-5QXFUUDL.mjs +1 -0
- package/dist/esm/chunk-5QXFUUDL.mjs.map +1 -0
- package/dist/esm/chunk-HHIXK5UM.mjs +1 -0
- package/dist/esm/chunk-HHIXK5UM.mjs.map +1 -0
- package/dist/esm/chunk-QUUNDESP.mjs +1 -0
- package/dist/esm/chunk-QUUNDESP.mjs.map +1 -0
- package/dist/esm/chunk-RA5VYM7M.mjs +1 -0
- package/dist/esm/chunk-RA5VYM7M.mjs.map +1 -0
- package/dist/esm/index.d-y2b-8_3Y.d.mts +236 -0
- package/dist/esm/index.d.mts +7 -24
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/metafile-esm.json +1 -1
- package/dist/esm/utils.d.mts +6 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/esm/validation.d.mts +184 -0
- package/dist/esm/validation.mjs +1 -0
- package/dist/esm/validation.mjs.map +1 -0
- package/package.json +18 -5
- package/src/Router.ts +73 -99
- package/src/api/cloneRouter.ts +1 -30
- package/src/api/getDependenciesApi.ts +45 -86
- package/src/api/getLifecycleApi.ts +24 -19
- package/src/api/getPluginApi.ts +20 -28
- package/src/api/getRoutesApi.ts +49 -106
- package/src/constants.ts +0 -30
- package/src/guards.ts +46 -0
- package/src/helpers.ts +0 -17
- package/src/index.ts +4 -0
- package/src/internals.ts +6 -5
- package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +2 -2
- package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -25
- package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +4 -26
- package/src/namespaces/OptionsNamespace/constants.ts +0 -20
- package/src/namespaces/OptionsNamespace/index.ts +1 -5
- package/src/namespaces/OptionsNamespace/validators.ts +6 -245
- package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +18 -59
- package/src/namespaces/PluginsNamespace/constants.ts +3 -6
- package/src/namespaces/PluginsNamespace/validators.ts +2 -57
- package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +27 -84
- package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -16
- package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -12
- package/src/namespaces/RoutesNamespace/constants.ts +0 -8
- package/src/namespaces/RoutesNamespace/forwardChain.ts +34 -0
- package/src/namespaces/RoutesNamespace/index.ts +1 -1
- package/src/namespaces/RoutesNamespace/routeGuards.ts +62 -0
- package/src/namespaces/RoutesNamespace/routesStore.ts +7 -51
- package/src/namespaces/StateNamespace/StateNamespace.ts +0 -33
- package/src/namespaces/StateNamespace/helpers.ts +1 -1
- package/src/namespaces/index.ts +0 -3
- package/src/typeGuards.ts +1 -15
- package/src/types/RouterValidator.ts +155 -0
- package/src/utils/getStaticPaths.ts +50 -0
- package/src/utils/index.ts +4 -0
- package/src/validation.ts +12 -0
- package/src/wiring/RouterWiringBuilder.ts +32 -9
- package/dist/cjs/index.d-DDimDpYc.d.ts +0 -165
- package/dist/esm/chunk-CG7TKDP3.mjs +0 -1
- package/dist/esm/chunk-CG7TKDP3.mjs.map +0 -1
- package/dist/esm/index.d-DDimDpYc.d.mts +0 -165
- package/src/namespaces/DependenciesNamespace/validators.ts +0 -103
- package/src/namespaces/EventBusNamespace/validators.ts +0 -36
- package/src/namespaces/NavigationNamespace/validators.ts +0 -47
- package/src/namespaces/RouteLifecycleNamespace/validators.ts +0 -65
- package/src/namespaces/RoutesNamespace/forwardToValidation.ts +0 -408
- package/src/namespaces/RoutesNamespace/validators.ts +0 -566
- package/src/namespaces/StateNamespace/validators.ts +0 -46
package/dist/esm/api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/helpers.ts","../../src/namespaces/EventBusNamespace/validators.ts","../../src/namespaces/StateNamespace/validators.ts","../../src/api/getPluginApi.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"names":["logger"],"mappings":"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","file":"api.mjs","sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","// packages/core/src/namespaces/EventBusNamespace/validators.ts\n\n/**\n * Static validation functions for EventBusNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { validEventNames } from \"../../constants\";\n\nimport type { EventMethodMap } from \"../../types\";\nimport type { EventName, Plugin } from \"@real-router/types\";\n\n/**\n * Validates event name is one of the known event names.\n */\nexport function validateEventName(eventName: unknown): void {\n if (!validEventNames.has(eventName as EventName)) {\n throw new Error(`Invalid event name: ${String(eventName)}`);\n }\n}\n\n/**\n * Validates addEventListener arguments (event name + callback).\n */\nexport function validateListenerArgs<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n): void {\n validateEventName(eventName);\n\n if (typeof cb !== \"function\") {\n throw new TypeError(\n `Expected callback to be a function for event ${eventName}`,\n );\n }\n}\n","// packages/core/src/namespaces/StateNamespace/validators.ts\n\n/**\n * Static validation functions for StateNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { isString, isParams, getTypeDescription } from \"type-guards\";\n\n/**\n * Validates makeState arguments.\n */\nexport function validateMakeStateArgs(\n name: unknown,\n params: unknown,\n path: unknown,\n forceId: unknown,\n): void {\n // Validate name is a string\n if (!isString(name)) {\n throw new TypeError(\n `[router.makeState] Invalid name: ${getTypeDescription(name)}. Expected string.`,\n );\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.makeState] Invalid params: ${getTypeDescription(params)}. Expected plain object.`,\n );\n }\n\n // Validate path if provided\n if (path !== undefined && !isString(path)) {\n throw new TypeError(\n `[router.makeState] Invalid path: ${getTypeDescription(path)}. Expected string.`,\n );\n }\n\n // Validate forceId if provided\n if (forceId !== undefined && typeof forceId !== \"number\") {\n throw new TypeError(\n `[router.makeState] Invalid forceId: ${getTypeDescription(forceId)}. Expected number.`,\n );\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { validateListenerArgs } from \"../namespaces/EventBusNamespace/validators\";\nimport {\n validateMatchPathArgs,\n validateSetRootPathArgs,\n validateStateBuilderArgs,\n} from \"../namespaces/RoutesNamespace/validators\";\nimport { validateMakeStateArgs } from \"../namespaces/StateNamespace/validators\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type { DefaultDependencies, Params, Router } from \"@real-router/types\";\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const ctx = getInternals(router);\n\n return {\n makeState: (name, params, path, meta, forceId) => {\n if (!ctx.noValidate) {\n validateMakeStateArgs(name, params, path, forceId);\n }\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n forceId,\n );\n },\n buildState: (routeName, routeParams) => {\n if (!ctx.noValidate) {\n validateStateBuilderArgs(routeName, routeParams, \"buildState\");\n }\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n if (!ctx.noValidate) {\n validateStateBuilderArgs(routeName, routeParams, \"forwardState\");\n }\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n if (!ctx.noValidate) {\n validateMatchPathArgs(path);\n }\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateSetRootPathArgs(rootPath);\n }\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateListenerArgs(eventName, cb);\n }\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n if (!ctx.noValidate) {\n validateStateBuilderArgs(name, params, \"buildNavigationState\");\n }\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n };\n}\n","import { logger } from \"@real-router/logger\";\nimport { validateRouteName } from \"type-guards\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\nimport {\n clearConfigEntries,\n removeFromDefinitions,\n sanitizeRoute,\n} from \"../namespaces/RoutesNamespace/helpers\";\nimport {\n clearRouteData,\n refreshForwardMap,\n registerAllRouteHandlers,\n} from \"../namespaces/RoutesNamespace/routesStore\";\nimport {\n throwIfInternalRoute,\n throwIfInternalRouteInArray,\n validateAddRouteArgs,\n validateClearRoutes,\n validateParentOption,\n validateRemoveRoute,\n validateRemoveRouteArgs,\n validateUpdateRoute,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes,\n} from \"../namespaces/RoutesNamespace/validators\";\n\nimport type { RoutesApi } from \"./types\";\nimport type { RouterInternals } from \"../internals\";\nimport type { RouteLifecycleNamespace, RouteConfig } from \"../namespaces\";\nimport type { RoutesStore } from \"../namespaces/RoutesNamespace\";\nimport type { GuardFnFactory, Route } from \"../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n Router,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Recursively finds a route definition by its full dotted name.\n */\nfunction findDefinition(\n definitions: RouteDefinition[],\n fullName: string,\n parentPrefix = \"\",\n): RouteDefinition | undefined {\n for (const def of definitions) {\n const currentFullName = parentPrefix\n ? `${parentPrefix}.${def.name}`\n : def.name;\n\n if (currentFullName === fullName) {\n return def;\n }\n\n if (def.children && fullName.startsWith(`${currentFullName}.`)) {\n return findDefinition(def.children, fullName, currentFullName);\n }\n }\n\n /* v8 ignore next -- @preserve: defensive return, callers validate route exists before calling */\n return undefined;\n}\n\n/**\n * Clears all config entries and lifecycle handlers for a removed route\n * (and all its descendants).\n */\nfunction clearRouteConfigurations<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeName: string,\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n lifecycleNamespace: RouteLifecycleNamespace<Dependencies>,\n): void {\n const shouldClear = (n: string): boolean =>\n n === routeName || n.startsWith(`${routeName}.`);\n\n clearConfigEntries(config.decoders, shouldClear);\n clearConfigEntries(config.encoders, shouldClear);\n clearConfigEntries(config.defaultParams, shouldClear);\n clearConfigEntries(config.forwardMap, shouldClear);\n clearConfigEntries(config.forwardFnMap, shouldClear);\n clearConfigEntries(routeCustomFields, shouldClear);\n\n // Clear forwardMap entries pointing TO the deleted route (or its descendants)\n clearConfigEntries(config.forwardMap, (key) =>\n shouldClear(config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n lifecycleNamespace.getFactories();\n\n for (const n of Object.keys(canActivateFactories)) {\n if (shouldClear(n)) {\n lifecycleNamespace.clearCanActivate(n);\n }\n }\n\n for (const n of Object.keys(canDeactivateFactories)) {\n if (shouldClear(n)) {\n lifecycleNamespace.clearCanDeactivate(n);\n }\n }\n}\n\n/**\n * Updates forwardTo for a route in config and returns the refreshed resolved\n * forward map (REPLACE semantics — caller must call ctx.setResolvedForwardMap).\n */\nfunction updateForwardTo<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n config: RouteConfig,\n noValidate: boolean,\n refreshForwardMapFn: (\n config: RouteConfig,\n noValidate: boolean,\n ) => Record<string, string>,\n): Record<string, string> {\n if (forwardTo === null) {\n delete config.forwardMap[name];\n delete config.forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete config.forwardFnMap[name];\n config.forwardMap[name] = forwardTo;\n } else {\n delete config.forwardMap[name];\n config.forwardFnMap[name] = forwardTo;\n }\n\n return refreshForwardMapFn(config, noValidate);\n}\n\n/**\n * Builds a full Route object from a bare RouteDefinition by re-attaching\n * config entries and lifecycle factories.\n *\n * RECURSIVE — call with the factories tuple obtained ONCE from\n * `lifecycleNamespace.getFactories()` and pass it through to children.\n */\nfunction enrichRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeDef: RouteDefinition,\n routeName: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n const forwardToFn = config.forwardFnMap[routeName];\n const forwardToStr = config.forwardMap[routeName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (routeName in config.defaultParams) {\n route.defaultParams = config.defaultParams[routeName];\n }\n\n if (routeName in config.decoders) {\n route.decodeParams = config.decoders[routeName];\n }\n\n if (routeName in config.encoders) {\n route.encodeParams = config.encoders[routeName];\n }\n\n const [canDeactivateFactories, canActivateFactories] = factories;\n\n if (routeName in canActivateFactories) {\n route.canActivate = canActivateFactories[routeName];\n }\n\n if (routeName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[routeName];\n }\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n enrichRoute(child, `${routeName}.${child.name}`, config, factories),\n );\n }\n\n return route;\n}\n\n// ============================================================================\n// CRUD operations\n// ============================================================================\n\n/**\n * Adds one or more routes to the router.\n * Input already validated by facade.\n */\nfunction addRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n noValidate: boolean,\n routes: Route<Dependencies>[],\n parentName?: string,\n): void {\n if (parentName) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parentDef = findDefinition(store.definitions, parentName)!;\n\n parentDef.children ??= [];\n\n for (const route of routes) {\n parentDef.children.push(sanitizeRoute(route));\n }\n } else {\n for (const route of routes) {\n store.definitions.push(sanitizeRoute(route));\n }\n }\n\n registerAllRouteHandlers(\n routes,\n store.config,\n store.routeCustomFields,\n store.pendingCanActivate,\n store.pendingCanDeactivate,\n store.depsStore,\n parentName ?? \"\",\n );\n\n store.treeOperations.commitTreeChanges(store, noValidate);\n}\n\n/**\n * Atomically replaces all routes with a new set.\n * Follows RFC 6-step semantics for HMR support.\n */\nfunction replaceRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n noValidate: boolean,\n routes: Route<Dependencies>[],\n ctx: RouterInternals<Dependencies>,\n currentPath: string | undefined,\n): void {\n // Step 2: Clear route data (WITHOUT tree rebuild)\n clearRouteData(store);\n\n // Step 3: Clear definition lifecycle handlers (preserve external guards)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearDefinitionGuards();\n\n // Step 4: Register new routes\n for (const route of routes) {\n store.definitions.push(sanitizeRoute(route));\n }\n\n registerAllRouteHandlers(\n routes,\n store.config,\n store.routeCustomFields,\n store.pendingCanActivate,\n store.pendingCanDeactivate,\n store.depsStore,\n \"\",\n );\n\n // Step 5: One tree rebuild\n store.treeOperations.commitTreeChanges(store, noValidate);\n\n // Step 6: Revalidate state\n if (currentPath !== undefined) {\n const revalidated = ctx.matchPath(currentPath, ctx.getOptions());\n\n if (revalidated) {\n ctx.setState(revalidated);\n } else {\n ctx.clearState();\n }\n }\n}\n\n/**\n * Removes a route and all its children.\n *\n * @returns true if removed, false if not found\n */\nfunction removeRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n noValidate: boolean,\n name: string,\n): boolean {\n const wasRemoved = removeFromDefinitions(store.definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n clearRouteConfigurations(\n name,\n store.config,\n store.routeCustomFields,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n store.lifecycleNamespace!,\n );\n\n store.treeOperations.commitTreeChanges(store, noValidate);\n\n return true;\n}\n\n/**\n * Updates a route's configuration in place.\n */\nfunction updateRouteConfig<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n noValidate: boolean,\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n): void {\n if (updates.forwardTo !== undefined) {\n store.resolvedForwardMap = updateForwardTo(\n name,\n updates.forwardTo,\n store.config,\n noValidate,\n refreshForwardMap,\n );\n }\n\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete store.config.defaultParams[name];\n } else {\n store.config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete store.config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n store.config.decoders[name] = (params: Params): Params =>\n (decoder(params) as Params | undefined) ?? params;\n }\n }\n\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete store.config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n store.config.encoders[name] = (params: Params): Params =>\n (encoder(params) as Params | undefined) ?? params;\n }\n }\n}\n\n/**\n * Gets a route by name with all its configuration.\n */\nfunction getRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n): Route<Dependencies> | undefined {\n const segments = store.matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- segments is non-empty (checked above)\n const targetNode = segments.at(-1)! as RouteTree;\n const definition = store.treeOperations.nodeToDefinition(targetNode);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const factories = store.lifecycleNamespace!.getFactories();\n\n return enrichRoute(definition, name, store.config, factories);\n}\n\n// ============================================================================\n// API factory\n// ============================================================================\n\nexport function getRoutesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): RoutesApi<Dependencies> {\n const ctx = getInternals(router);\n\n const store = ctx.routeGetStore();\n const noValidate = ctx.noValidate;\n\n return {\n add: (routes, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n if (!ctx.noValidate) {\n if (parentName !== undefined) {\n validateParentOption(parentName);\n }\n\n throwIfInternalRouteInArray(routeArray, \"addRoute\");\n validateAddRouteArgs(routeArray);\n\n store.treeOperations.validateRoutes(\n routeArray,\n store.tree,\n store.config.forwardMap,\n parentName,\n );\n }\n\n addRoutes(store, noValidate, routeArray, parentName);\n },\n\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateRemoveRouteArgs(name);\n throwIfInternalRoute(name, \"removeRoute\");\n }\n\n const canRemove = validateRemoveRoute(\n name,\n ctx.getStateName(),\n ctx.isTransitioning(),\n );\n\n if (!canRemove) {\n return;\n }\n\n const wasRemoved = removeRoute(store, noValidate, name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n }\n },\n\n update: (name, updates) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateUpdateRouteBasicArgs(name, updates);\n throwIfInternalRoute(name, \"updateRoute\");\n }\n\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n if (!ctx.noValidate) {\n validateUpdateRoutePropertyTypes(\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n );\n }\n\n /* v8 ignore next 6 -- @preserve: race condition guard, mirrors Router.updateRoute() same-path guard tested via Router.ts unit tests */\n if (ctx.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n if (!ctx.noValidate) {\n validateUpdateRoute(\n name,\n forwardTo,\n (n) => store.matcher.hasRoute(n),\n store.matcher,\n store.config,\n );\n }\n\n updateRouteConfig(store, noValidate, name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n if (canActivate !== undefined) {\n if (canActivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanActivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanActivate(\n name,\n canActivate,\n noValidate,\n true,\n );\n }\n }\n\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanDeactivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanDeactivate(\n name,\n canDeactivate,\n noValidate,\n true,\n );\n }\n }\n },\n\n clear: () => {\n throwIfDisposed(ctx.isDisposed);\n\n const canClear = validateClearRoutes(ctx.isTransitioning());\n\n /* v8 ignore next 3 -- @preserve: race condition guard, mirrors Router.clearRoutes() same-path guard tested via validateClearRoutes unit tests */\n if (!canClear) {\n return;\n }\n\n store.treeOperations.resetStore(store);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearAll();\n ctx.clearState();\n },\n\n has: (name) => {\n if (!ctx.noValidate) {\n validateRouteName(name, \"hasRoute\");\n }\n\n return store.matcher.hasRoute(name);\n },\n\n get: (name) => {\n if (!ctx.noValidate) {\n validateRouteName(name, \"getRoute\");\n }\n\n return getRoute(store, name);\n },\n\n replace: (routes) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n\n const canReplace = validateClearRoutes(ctx.isTransitioning());\n\n if (!canReplace) {\n return;\n }\n\n if (!ctx.noValidate) {\n throwIfInternalRouteInArray(routeArray, \"replaceRoutes\");\n validateAddRouteArgs(routeArray);\n store.treeOperations.validateRoutes(routeArray);\n }\n\n const currentPath = router.getState()?.path;\n\n replaceRoutes(store, noValidate, routeArray, ctx, currentPath);\n },\n };\n}\n","import { logger } from \"@real-router/logger\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { computeThresholds } from \"../helpers\";\nimport { getInternals } from \"../internals\";\nimport {\n validateDependenciesObject,\n validateDependencyExists,\n validateDependencyLimit,\n validateDependencyName,\n validateSetDependencyArgs,\n} from \"../namespaces/DependenciesNamespace/validators\";\n\nimport type { DependenciesApi } from \"./types\";\nimport type { DependenciesStore } from \"../namespaces\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n// =============================================================================\n// Module-private CRUD functions\n// =============================================================================\n\nfunction checkDependencyCount(\n store: DependenciesStore,\n methodName: string,\n): void {\n const maxDependencies = store.limits.maxDependencies;\n\n if (maxDependencies === 0) {\n return;\n }\n\n const currentCount = Object.keys(store.dependencies).length;\n\n const { warn, error } = computeThresholds(maxDependencies);\n\n if (currentCount === warn) {\n logger.warn(\n `router.${methodName}`,\n `${warn} dependencies registered. ` + `Consider if all are necessary.`,\n );\n } else if (currentCount === error) {\n logger.error(\n `router.${methodName}`,\n `${error} dependencies registered! ` +\n `This indicates architectural problems. ` +\n `Hard limit at ${maxDependencies}.`,\n );\n } else if (currentCount >= maxDependencies) {\n throw new Error(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${currentCount}. This is likely a bug in your code. ` +\n `If you genuinely need more dependencies, your architecture needs refactoring.`,\n );\n }\n}\n\nfunction setDependency(\n store: DependenciesStore,\n dependencyName: string,\n dependencyValue: unknown,\n): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(store.dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n checkDependencyCount(store, \"setDependency\");\n } else {\n const oldValue = (store.dependencies as Record<string, unknown>)[\n dependencyName\n ];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN = Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n logger.warn(\n \"router.setDependency\",\n \"Router dependency already exists and is being overwritten:\",\n dependencyName,\n );\n }\n }\n\n (store.dependencies as Record<string, unknown>)[dependencyName] =\n dependencyValue;\n\n return true;\n}\n\nfunction setMultipleDependencies(\n store: DependenciesStore,\n deps: Record<string, unknown>,\n): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(store.dependencies, key)) {\n overwrittenKeys.push(key);\n }\n\n (store.dependencies as Record<string, unknown>)[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n logger.warn(\n \"router.setDependencies\",\n \"Overwritten:\",\n overwrittenKeys.join(\", \"),\n );\n }\n}\n\n// =============================================================================\n// Public API factory\n// =============================================================================\n\nexport function getDependenciesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): DependenciesApi<Dependencies> {\n const ctx = getInternals(router);\n\n return {\n get: (name) => {\n if (!ctx.noValidate) {\n validateDependencyName(name, \"getDependency\");\n }\n\n const store = ctx.dependenciesGetStore();\n const value = (store.dependencies as Record<string, unknown>)[\n name as string\n ];\n\n if (!ctx.noValidate) {\n validateDependencyExists(value, name as string);\n }\n\n return value as Dependencies[typeof name];\n },\n getAll: () => ({ ...ctx.dependenciesGetStore().dependencies }),\n set: (name, value) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateSetDependencyArgs(name);\n }\n\n setDependency(ctx.dependenciesGetStore(), name as string, value);\n },\n setAll: (deps) => {\n throwIfDisposed(ctx.isDisposed);\n\n const store = ctx.dependenciesGetStore();\n\n if (!ctx.noValidate) {\n validateDependenciesObject(deps, \"setDependencies\");\n validateDependencyLimit(\n Object.keys(store.dependencies).length,\n Object.keys(deps).length,\n \"setDependencies\",\n store.limits.maxDependencies,\n );\n }\n\n setMultipleDependencies(store, deps as Record<string, unknown>);\n },\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateDependencyName(name, \"removeDependency\");\n }\n\n const store = ctx.dependenciesGetStore();\n\n if (!Object.hasOwn(store.dependencies, name as string)) {\n logger.warn(\n `router.removeDependency`,\n `Attempted to remove non-existent dependency: \"${getTypeDescription(name)}\"`,\n );\n }\n\n delete (store.dependencies as Record<string, unknown>)[name as string];\n },\n reset: () => {\n throwIfDisposed(ctx.isDisposed);\n const store = ctx.dependenciesGetStore();\n\n store.dependencies = Object.create(null) as Partial<Dependencies>;\n },\n has: (name) => {\n if (!ctx.noValidate) {\n validateDependencyName(name, \"hasDependency\");\n }\n\n return Object.hasOwn(\n ctx.dependenciesGetStore().dependencies,\n name as string,\n );\n },\n };\n}\n","import { validateRouteName } from \"type-guards\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\nimport { validateHandler } from \"../namespaces/RouteLifecycleNamespace/validators\";\n\nimport type { LifecycleApi } from \"./types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function getLifecycleApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): LifecycleApi<Dependencies> {\n const ctx = getInternals(router);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const lifecycleNamespace = ctx.routeGetStore().lifecycleNamespace!;\n\n return {\n addActivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateRouteName(name, \"addActivateGuard\");\n validateHandler(handler, \"addActivateGuard\");\n }\n\n lifecycleNamespace.addCanActivate(name, handler, ctx.noValidate);\n },\n\n addDeactivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateRouteName(name, \"addDeactivateGuard\");\n validateHandler(handler, \"addDeactivateGuard\");\n }\n\n lifecycleNamespace.addCanDeactivate(name, handler, ctx.noValidate);\n },\n\n removeActivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateRouteName(name, \"removeActivateGuard\");\n }\n\n lifecycleNamespace.clearCanActivate(name);\n },\n\n removeDeactivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n if (!ctx.noValidate) {\n validateRouteName(name, \"removeDeactivateGuard\");\n }\n\n lifecycleNamespace.clearCanDeactivate(name);\n },\n };\n}\n","import { routeTreeToDefinitions } from \"route-tree\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { Router as RouterClass } from \"../Router\";\nimport { RouterError } from \"../RouterError\";\nimport { getLifecycleApi } from \"./getLifecycleApi\";\n\nimport type { Route } from \"../types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nfunction validateCloneArgs(dependencies: unknown): void {\n if (dependencies === undefined) {\n return;\n }\n\n if (\n !(\n dependencies &&\n typeof dependencies === \"object\" &&\n dependencies.constructor === Object\n )\n ) {\n throw new TypeError(\n `[cloneRouter] Invalid dependencies: expected plain object or undefined, received ${getTypeDescription(dependencies)}`,\n );\n }\n\n for (const key in dependencies) {\n if (Object.getOwnPropertyDescriptor(dependencies, key)?.get) {\n throw new TypeError(\n `[cloneRouter] Getters not allowed in dependencies: \"${key}\"`,\n );\n }\n }\n}\n\nexport function cloneRouter<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n dependencies?: Dependencies,\n): RouterClass<Dependencies> {\n const ctx = getInternals(router);\n\n if (ctx.isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n\n if (!ctx.noValidate) {\n validateCloneArgs(dependencies);\n }\n\n // Get source store directly\n const sourceStore = ctx.routeGetStore();\n const routes = routeTreeToDefinitions(sourceStore.tree);\n const routeConfig = sourceStore.config;\n const resolvedForwardMap = sourceStore.resolvedForwardMap;\n const routeCustomFields = sourceStore.routeCustomFields;\n\n const options = ctx.cloneOptions();\n const sourceDeps = ctx.cloneDependencies();\n const [canDeactivateFactories, canActivateFactories] =\n ctx.getLifecycleFactories();\n const pluginFactories = ctx.getPluginFactories();\n\n const mergedDeps = {\n ...sourceDeps,\n ...dependencies,\n } as Dependencies;\n\n const newRouter = new RouterClass<Dependencies>(\n routes as Route<Dependencies>[],\n options,\n mergedDeps,\n );\n\n const lifecycle = getLifecycleApi(newRouter);\n\n for (const [name, handler] of Object.entries(canDeactivateFactories)) {\n lifecycle.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(canActivateFactories)) {\n lifecycle.addActivateGuard(name, handler);\n }\n\n if (pluginFactories.length > 0) {\n newRouter.usePlugin(...pluginFactories);\n }\n\n const newCtx = getInternals(newRouter);\n const newStore = newCtx.routeGetStore();\n\n // Apply cloned config directly to new store\n Object.assign(newStore.config.decoders, routeConfig.decoders);\n Object.assign(newStore.config.encoders, routeConfig.encoders);\n Object.assign(newStore.config.defaultParams, routeConfig.defaultParams);\n Object.assign(newStore.config.forwardMap, routeConfig.forwardMap);\n Object.assign(newStore.config.forwardFnMap, routeConfig.forwardFnMap);\n Object.assign(newStore.resolvedForwardMap, resolvedForwardMap);\n Object.assign(newStore.routeCustomFields, routeCustomFields);\n\n return newRouter;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/namespaces/RoutesNamespace/routeGuards.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"names":["logger"],"mappings":"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","file":"api.mjs","sourcesContent":["import { logger } from \"@real-router/logger\";\n\n/**\n * Validates removeRoute constraints.\n * Returns false if removal should be blocked (route is active).\n * Logs warnings for edge cases.\n *\n * @param name - Route name to remove\n * @param currentStateName - Current active route name (or undefined)\n * @param isNavigating - Whether navigation is in progress\n * @returns true if removal can proceed, false if blocked\n */\nexport function validateRemoveRoute(\n name: string,\n currentStateName: string | undefined,\n isNavigating: boolean,\n): boolean {\n if (currentStateName) {\n const isExactMatch = currentStateName === name;\n const isParentOfCurrent = currentStateName.startsWith(`${name}.`);\n\n if (isExactMatch || isParentOfCurrent) {\n const suffix = isExactMatch ? \"\" : ` (current: \"${currentStateName}\")`;\n\n logger.warn(\n \"router.removeRoute\",\n `Cannot remove route \"${name}\" — it is currently active${suffix}. Navigate away first.`,\n );\n\n return false;\n }\n }\n\n if (isNavigating) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" removed while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n return true;\n}\n\n/**\n * Validates clearRoutes operation.\n * Returns false if operation should be blocked (navigation in progress).\n *\n * @param isNavigating - Whether navigation is in progress\n * @returns true if clearRoutes can proceed, false if blocked\n */\nexport function validateClearRoutes(isNavigating: boolean): boolean {\n if (isNavigating) {\n logger.error(\n \"router.clearRoutes\",\n \"Cannot clear routes while navigation is in progress. Wait for navigation to complete.\",\n );\n\n return false;\n }\n\n return true;\n}\n","import { logger } from \"@real-router/logger\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { guardRouteStructure } from \"../guards\";\nimport { getInternals } from \"../internals\";\nimport {\n clearConfigEntries,\n removeFromDefinitions,\n sanitizeRoute,\n} from \"../namespaces/RoutesNamespace/helpers\";\nimport {\n validateClearRoutes,\n validateRemoveRoute,\n} from \"../namespaces/RoutesNamespace/routeGuards\";\nimport {\n clearRouteData,\n refreshForwardMap,\n registerAllRouteHandlers,\n} from \"../namespaces/RoutesNamespace/routesStore\";\n\nimport type { RoutesApi } from \"./types\";\nimport type { RouterInternals } from \"../internals\";\nimport type { RouteLifecycleNamespace, RouteConfig } from \"../namespaces\";\nimport type { RoutesStore } from \"../namespaces/RoutesNamespace\";\nimport type { GuardFnFactory, Route } from \"../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n Router,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Recursively finds a route definition by its full dotted name.\n */\nfunction findDefinition(\n definitions: RouteDefinition[],\n fullName: string,\n parentPrefix = \"\",\n): RouteDefinition | undefined {\n for (const def of definitions) {\n const currentFullName = parentPrefix\n ? `${parentPrefix}.${def.name}`\n : def.name;\n\n if (currentFullName === fullName) {\n return def;\n }\n\n if (def.children && fullName.startsWith(`${currentFullName}.`)) {\n return findDefinition(def.children, fullName, currentFullName);\n }\n }\n\n /* v8 ignore next -- @preserve: defensive return, callers validate route exists before calling */\n return undefined;\n}\n\n/**\n * Clears all config entries and lifecycle handlers for a removed route\n * (and all its descendants).\n */\nfunction clearRouteConfigurations<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeName: string,\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n lifecycleNamespace: RouteLifecycleNamespace<Dependencies>,\n): void {\n const shouldClear = (name: string): boolean =>\n name === routeName || name.startsWith(`${routeName}.`);\n\n clearConfigEntries(config.decoders, shouldClear);\n clearConfigEntries(config.encoders, shouldClear);\n clearConfigEntries(config.defaultParams, shouldClear);\n clearConfigEntries(config.forwardMap, shouldClear);\n clearConfigEntries(config.forwardFnMap, shouldClear);\n clearConfigEntries(routeCustomFields, shouldClear);\n\n // Clear forwardMap entries pointing TO the deleted route (or its descendants)\n clearConfigEntries(config.forwardMap, (key) =>\n shouldClear(config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n lifecycleNamespace.getFactories();\n\n for (const name of Object.keys(canActivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanActivate(name);\n }\n }\n\n for (const name of Object.keys(canDeactivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanDeactivate(name);\n }\n }\n}\n\n/**\n * Updates forwardTo for a route in config and returns the refreshed resolved\n * forward map (REPLACE semantics — caller must call ctx.setResolvedForwardMap).\n */\nfunction updateForwardTo<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n config: RouteConfig,\n refreshForwardMapFn: (config: RouteConfig) => Record<string, string>,\n): Record<string, string> {\n if (forwardTo === null) {\n delete config.forwardMap[name];\n delete config.forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete config.forwardFnMap[name];\n config.forwardMap[name] = forwardTo;\n } else {\n delete config.forwardMap[name];\n config.forwardFnMap[name] = forwardTo;\n }\n\n return refreshForwardMapFn(config);\n}\n\n/**\n * Builds a full Route object from a bare RouteDefinition by re-attaching\n * config entries and lifecycle factories.\n *\n * RECURSIVE — call with the factories tuple obtained ONCE from\n * `lifecycleNamespace.getFactories()` and pass it through to children.\n */\nfunction enrichRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeDef: RouteDefinition,\n routeName: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n const forwardToFn = config.forwardFnMap[routeName];\n const forwardToStr = config.forwardMap[routeName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (routeName in config.defaultParams) {\n route.defaultParams = config.defaultParams[routeName];\n }\n\n if (routeName in config.decoders) {\n route.decodeParams = config.decoders[routeName];\n }\n\n if (routeName in config.encoders) {\n route.encodeParams = config.encoders[routeName];\n }\n\n const [canDeactivateFactories, canActivateFactories] = factories;\n\n if (routeName in canActivateFactories) {\n route.canActivate = canActivateFactories[routeName];\n }\n\n if (routeName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[routeName];\n }\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n enrichRoute(child, `${routeName}.${child.name}`, config, factories),\n );\n }\n\n return route;\n}\n\n// ============================================================================\n// CRUD operations\n// ============================================================================\n\n/**\n * Adds one or more routes to the router.\n * Input already validated by facade.\n */\nfunction addRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n parentName?: string,\n): void {\n if (parentName) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parentDef = findDefinition(store.definitions, parentName)!;\n\n parentDef.children ??= [];\n\n for (const route of routes) {\n parentDef.children.push(sanitizeRoute(route));\n }\n } else {\n for (const route of routes) {\n store.definitions.push(sanitizeRoute(route));\n }\n }\n\n registerAllRouteHandlers(\n routes,\n store.config,\n store.routeCustomFields,\n store.pendingCanActivate,\n store.pendingCanDeactivate,\n store.depsStore,\n parentName ?? \"\",\n );\n\n store.treeOperations.commitTreeChanges(store);\n}\n\n/**\n * Atomically replaces all routes with a new set.\n * Follows RFC 6-step semantics for HMR support.\n */\nfunction replaceRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n ctx: RouterInternals<Dependencies>,\n currentPath: string | undefined,\n): void {\n // Step 2: Clear route data (WITHOUT tree rebuild)\n clearRouteData(store);\n\n // Step 3: Clear definition lifecycle handlers (preserve external guards)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearDefinitionGuards();\n\n // Step 4: Register new routes\n for (const route of routes) {\n store.definitions.push(sanitizeRoute(route));\n }\n\n registerAllRouteHandlers(\n routes,\n store.config,\n store.routeCustomFields,\n store.pendingCanActivate,\n store.pendingCanDeactivate,\n store.depsStore,\n \"\",\n );\n\n // Step 5: One tree rebuild\n store.treeOperations.commitTreeChanges(store);\n\n // Step 6: Revalidate state\n if (currentPath !== undefined) {\n const revalidated = ctx.matchPath(currentPath, ctx.getOptions());\n\n if (revalidated) {\n ctx.setState(revalidated);\n } else {\n ctx.clearState();\n }\n }\n}\n\n/**\n * Removes a route and all its children.\n *\n * @returns true if removed, false if not found\n */\nfunction removeRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>, name: string): boolean {\n const wasRemoved = removeFromDefinitions(store.definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n clearRouteConfigurations(\n name,\n store.config,\n store.routeCustomFields,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n store.lifecycleNamespace!,\n );\n\n store.treeOperations.commitTreeChanges(store);\n\n return true;\n}\n\n/**\n * Updates a route's configuration in place.\n */\nfunction updateRouteConfig<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n): void {\n if (updates.forwardTo !== undefined) {\n store.resolvedForwardMap = updateForwardTo(\n name,\n updates.forwardTo,\n store.config,\n (config) => refreshForwardMap(config),\n );\n }\n\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete store.config.defaultParams[name];\n } else {\n store.config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete store.config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n store.config.decoders[name] = (params: Params): Params =>\n (decoder(params) as Params | undefined) ?? params;\n }\n }\n\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete store.config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n store.config.encoders[name] = (params: Params): Params =>\n (encoder(params) as Params | undefined) ?? params;\n }\n }\n}\n\n/**\n * Gets a route by name with all its configuration.\n */\nfunction getRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n): Route<Dependencies> | undefined {\n const segments = store.matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- segments is non-empty (checked above)\n const targetNode = segments.at(-1)! as RouteTree;\n const definition = store.treeOperations.nodeToDefinition(targetNode);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const factories = store.lifecycleNamespace!.getFactories();\n\n return enrichRoute(definition, name, store.config, factories);\n}\n\n// ============================================================================\n// API factory\n// ============================================================================\n\nexport function getRoutesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): RoutesApi<Dependencies> {\n const ctx = getInternals(router);\n\n const store = ctx.routeGetStore();\n\n return {\n add: (routes, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n guardRouteStructure(routeArray, ctx.validator);\n\n if (parentName !== undefined) {\n ctx.validator?.routes.validateParentOption(parentName, store.tree);\n }\n\n ctx.validator?.routes.throwIfInternalRouteInArray(routeArray, \"addRoute\");\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n addRoutes(store, routeArray, parentName);\n },\n\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRemoveRouteArgs(name);\n ctx.validator?.routes.throwIfInternalRoute(name, \"removeRoute\");\n\n const canRemove = validateRemoveRoute(\n name,\n ctx.getStateName(),\n ctx.isTransitioning(),\n );\n\n if (!canRemove) {\n return;\n }\n\n const wasRemoved = removeRoute(store, name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n }\n },\n\n update: (name, updates) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateUpdateRouteBasicArgs(name, updates);\n ctx.validator?.routes.throwIfInternalRoute(name, \"updateRoute\");\n\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n ctx.validator?.routes.validateUpdateRoutePropertyTypes(name, updates);\n\n /* v8 ignore next 6 -- @preserve: race condition guard, mirrors Router.updateRoute() same-path guard tested via Router.ts unit tests */\n if (ctx.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n ctx.validator?.routes.validateUpdateRoute(name, updates, store);\n\n updateRouteConfig(store, name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n if (canActivate !== undefined) {\n if (canActivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanActivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanActivate(name, canActivate, true);\n }\n }\n\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanDeactivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanDeactivate(name, canDeactivate, true);\n }\n }\n },\n\n clear: () => {\n throwIfDisposed(ctx.isDisposed);\n\n const canClear = validateClearRoutes(ctx.isTransitioning());\n\n /* v8 ignore next 3 -- @preserve: race condition guard, mirrors Router.clearRoutes() same-path guard tested via validateClearRoutes unit tests */\n if (!canClear) {\n return;\n }\n\n store.treeOperations.resetStore(store);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearAll();\n ctx.clearState();\n },\n\n has: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"hasRoute\");\n\n return store.matcher.hasRoute(name);\n },\n\n get: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"getRoute\");\n\n return getRoute(store, name);\n },\n\n replace: (routes) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n\n const canReplace = validateClearRoutes(ctx.isTransitioning());\n\n if (!canReplace) {\n return;\n }\n\n guardRouteStructure(routeArray, ctx.validator);\n\n ctx.validator?.routes.throwIfInternalRouteInArray(\n routeArray,\n \"replaceRoutes\",\n );\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n const currentPath = router.getState()?.path;\n\n replaceRoutes(store, routeArray, ctx, currentPath);\n },\n };\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { DependenciesApi } from \"./types\";\nimport type { DependenciesStore } from \"../namespaces\";\nimport type { RouterValidator } from \"../types/RouterValidator\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n// =============================================================================\n// Module-private CRUD functions\n// =============================================================================\n\nfunction setDependency(\n store: DependenciesStore,\n dependencyName: string,\n dependencyValue: unknown,\n validator?: RouterValidator | null,\n): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(store.dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n validator?.dependencies.validateDependencyCount(store, \"setDependency\");\n } else {\n const oldValue = (store.dependencies as Record<string, unknown>)[\n dependencyName\n ];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN = Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n validator?.dependencies.warnOverwrite(dependencyName, \"setDependency\");\n }\n }\n\n (store.dependencies as Record<string, unknown>)[dependencyName] =\n dependencyValue;\n\n return true;\n}\n\nfunction setMultipleDependencies(\n store: DependenciesStore,\n deps: Record<string, unknown>,\n validator?: RouterValidator | null,\n): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(store.dependencies, key)) {\n overwrittenKeys.push(key);\n } else {\n validator?.dependencies.validateDependencyCount(\n store,\n \"setDependencies\",\n );\n }\n\n (store.dependencies as Record<string, unknown>)[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n validator?.dependencies.warnBatchOverwrite(\n overwrittenKeys,\n \"setDependencies\",\n );\n }\n}\n\n// =============================================================================\n// Public API factory\n// =============================================================================\n\nexport function getDependenciesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): DependenciesApi<Dependencies> {\n const ctx = getInternals(router);\n\n return {\n get: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"getDependency\");\n\n const store = ctx.dependenciesGetStore();\n const value = (store.dependencies as Record<string, unknown>)[\n name as string\n ];\n\n ctx.validator?.dependencies.validateDependencyExists(\n name as string,\n store,\n );\n\n return value as Dependencies[typeof name];\n },\n getAll: () => ({ ...ctx.dependenciesGetStore().dependencies }),\n set: (name, value) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateSetDependencyArgs(\n name,\n value,\n \"setDependency\",\n );\n\n setDependency(\n ctx.dependenciesGetStore(),\n name as string,\n value,\n ctx.validator,\n );\n },\n setAll: (deps) => {\n throwIfDisposed(ctx.isDisposed);\n\n const store = ctx.dependenciesGetStore();\n\n ctx.validator?.dependencies.validateDependenciesObject(\n deps,\n \"setDependencies\",\n );\n ctx.validator?.dependencies.validateDependencyLimit(store, store.limits);\n\n setMultipleDependencies(\n store,\n deps as Record<string, unknown>,\n ctx.validator,\n );\n },\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateDependencyName(\n name,\n \"removeDependency\",\n );\n\n const store = ctx.dependenciesGetStore();\n\n if (!Object.hasOwn(store.dependencies, name as string)) {\n ctx.validator?.dependencies.warnRemoveNonExistent(name);\n }\n\n delete (store.dependencies as Record<string, unknown>)[name as string];\n },\n reset: () => {\n throwIfDisposed(ctx.isDisposed);\n const store = ctx.dependenciesGetStore();\n\n store.dependencies = Object.create(null) as Partial<Dependencies>;\n },\n has: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"hasDependency\");\n\n return Object.hasOwn(\n ctx.dependenciesGetStore().dependencies,\n name as string,\n );\n },\n };\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { LifecycleApi } from \"./types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function getLifecycleApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): LifecycleApi<Dependencies> {\n const ctx = getInternals(router);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const lifecycleNamespace = ctx.routeGetStore().lifecycleNamespace!;\n\n return {\n addActivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addActivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addActivateGuard\");\n\n const activateCount = lifecycleNamespace.getHandlerCount(\"activate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n activateCount,\n ctx.dependenciesGetStore().limits,\n \"canActivate\",\n );\n\n lifecycleNamespace.addCanActivate(name, handler);\n },\n\n addDeactivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addDeactivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addDeactivateGuard\");\n\n const deactivateCount = lifecycleNamespace.getHandlerCount(\"deactivate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n deactivateCount,\n ctx.dependenciesGetStore().limits,\n \"canDeactivate\",\n );\n\n lifecycleNamespace.addCanDeactivate(name, handler);\n },\n\n removeActivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeActivateGuard\");\n\n lifecycleNamespace.clearCanActivate(name);\n },\n\n removeDeactivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeDeactivateGuard\");\n\n lifecycleNamespace.clearCanDeactivate(name);\n },\n };\n}\n","import { routeTreeToDefinitions } from \"route-tree\";\n\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { Router as RouterClass } from \"../Router\";\nimport { RouterError } from \"../RouterError\";\nimport { getLifecycleApi } from \"./getLifecycleApi\";\n\nimport type { Route } from \"../types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function cloneRouter<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n dependencies?: Dependencies,\n): RouterClass<Dependencies> {\n const ctx = getInternals(router);\n\n if (ctx.isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n\n ctx.validator?.dependencies.validateCloneArgs(dependencies);\n\n // Get source store directly\n const sourceStore = ctx.routeGetStore();\n const routes = routeTreeToDefinitions(sourceStore.tree);\n const routeConfig = sourceStore.config;\n const resolvedForwardMap = sourceStore.resolvedForwardMap;\n const routeCustomFields = sourceStore.routeCustomFields;\n\n const options = ctx.cloneOptions();\n const sourceDeps = ctx.cloneDependencies();\n const [canDeactivateFactories, canActivateFactories] =\n ctx.getLifecycleFactories();\n const pluginFactories = ctx.getPluginFactories();\n\n const mergedDeps = {\n ...sourceDeps,\n ...dependencies,\n } as Dependencies;\n\n const newRouter = new RouterClass<Dependencies>(\n routes as Route<Dependencies>[],\n options,\n mergedDeps,\n );\n\n const lifecycle = getLifecycleApi(newRouter);\n\n for (const [name, handler] of Object.entries(canDeactivateFactories)) {\n lifecycle.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(canActivateFactories)) {\n lifecycle.addActivateGuard(name, handler);\n }\n\n if (pluginFactories.length > 0) {\n newRouter.usePlugin(...pluginFactories);\n }\n\n const newCtx = getInternals(newRouter);\n const newStore = newCtx.routeGetStore();\n\n // Apply cloned config directly to new store\n Object.assign(newStore.config.decoders, routeConfig.decoders);\n Object.assign(newStore.config.encoders, routeConfig.encoders);\n Object.assign(newStore.config.defaultParams, routeConfig.defaultParams);\n Object.assign(newStore.config.forwardMap, routeConfig.forwardMap);\n Object.assign(newStore.config.forwardFnMap, routeConfig.forwardFnMap);\n Object.assign(newStore.resolvedForwardMap, resolvedForwardMap);\n Object.assign(newStore.routeCustomFields, routeCustomFields);\n\n return newRouter;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.freeze({ROUTER_NOT_STARTED:"NOT_STARTED",NO_START_PATH_OR_STATE:"NO_START_PATH_OR_STATE",ROUTER_ALREADY_STARTED:"ALREADY_STARTED",ROUTE_NOT_FOUND:"ROUTE_NOT_FOUND",SAME_STATES:"SAME_STATES",CANNOT_DEACTIVATE:"CANNOT_DEACTIVATE",CANNOT_ACTIVATE:"CANNOT_ACTIVATE",TRANSITION_ERR:"TRANSITION_ERR",TRANSITION_CANCELLED:"CANCELLED",ROUTER_DISPOSED:"DISPOSED",PLUGIN_CONFLICT:"PLUGIN_CONFLICT"}),t="@@router/UNKNOWN_ROUTE",r={UNKNOWN_ROUTE:t},s={ROUTER_START:"onStart",ROUTER_STOP:"onStop",TRANSITION_START:"onTransitionStart",TRANSITION_CANCEL:"onTransitionCancel",TRANSITION_SUCCESS:"onTransitionSuccess",TRANSITION_ERROR:"onTransitionError"},n={ROUTER_START:"$start",ROUTER_STOP:"$stop",TRANSITION_START:"$$start",TRANSITION_CANCEL:"$$cancel",TRANSITION_SUCCESS:"$$success",TRANSITION_ERROR:"$$error"},o={maxDependencies:100,maxPlugins:50,maxListeners:1e4,warnListeners:1e3,maxEventDepth:5,maxLifecycleHandlers:200},i=Object.freeze({}),T=new WeakSet;function a(e){if(null!==e&&"object"==typeof e&&!Object.isFrozen(e))if(Object.freeze(e),Array.isArray(e))for(const t of e)a(t);else for(const t in e)a(e[t])}function c(e){return e?(T.has(e)||(a(e),T.add(e)),e):e}function O(e={}){return{...o,...e}}var E=new Set(Object.values(e)),A=new Set(["code","segment","path","redirect"]),R=new Set(["setCode","setErrorInstance","setAdditionalFields","hasField","getField","toJSON"]),S=class extends Error{segment;path;redirect;code;constructor(e,{message:t,segment:r,path:s,redirect:n,...o}={}){super(t??e),this.code=e,this.segment=r,this.path=s,this.redirect=n?function(e){if(!e)return e;if(null===(t=e)||"object"!=typeof t||"string"!=typeof t.name||"string"!=typeof t.path||"object"!=typeof t.params||null===t.params)throw new TypeError("[deepFreezeState] Expected valid State object, got: "+typeof e);var t;const r=structuredClone(e),s=new WeakSet;return function e(t){if(null===t||"object"!=typeof t)return;if(s.has(t))return;s.add(t),Object.freeze(t);const r=Array.isArray(t)?t:Object.values(t);for(const t of r)e(t)}(r),r}(n):void 0;for(const[e,t]of Object.entries(o)){if(A.has(e))throw new TypeError(`[RouterError] Cannot set reserved property "${e}"`);R.has(e)||(this[e]=t)}}setCode(e){this.code=e,E.has(this.message)&&(this.message=e)}setErrorInstance(e){if(!e)throw new TypeError("[RouterError.setErrorInstance] err parameter is required and must be an Error instance");this.message=e.message,this.cause=e.cause,this.stack=e.stack??""}setAdditionalFields(e){for(const[t,r]of Object.entries(e)){if(A.has(t))throw new TypeError(`[RouterError.setAdditionalFields] Cannot set reserved property "${t}"`);R.has(t)||(this[t]=r)}}hasField(e){return e in this}getField(e){return this[e]}toJSON(){const e={code:this.code,message:this.message};void 0!==this.segment&&(e.segment=this.segment),void 0!==this.path&&(e.path=this.path),void 0!==this.redirect&&(e.redirect=this.redirect);const t=new Set(["code","message","segment","path","redirect","stack"]);for(const r in this)Object.hasOwn(this,r)&&!t.has(r)&&(e[r]=this[r]);return e}};export{o as DEFAULT_LIMITS,i as EMPTY_PARAMS,S as RouterError,t as UNKNOWN_ROUTE,r as constants,O as createLimits,e as errorCodes,n as events,c as freezeStateInPlace,s as plugins};//# sourceMappingURL=chunk-5QXFUUDL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/constants.ts","../../src/helpers.ts","../../src/RouterError.ts"],"names":[],"mappings":"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","file":"chunk-5QXFUUDL.mjs","sourcesContent":["// packages/core/src/constants.ts\n\nimport type {\n EventToNameMap,\n EventToPluginMap,\n ErrorCodeToValueMap,\n ErrorCodeKeys,\n ErrorCodeValues,\n} from \"@real-router/types\";\n\nexport type ConstantsKeys = \"UNKNOWN_ROUTE\";\n\nexport type Constants = Record<ConstantsKeys, string>;\n\n// =============================================================================\n// Error Codes (migrated from router-error)\n// =============================================================================\n\nexport type ErrorCodes = Record<ErrorCodeKeys, ErrorCodeValues>;\n\n/**\n * Error codes for router operations.\n * Used to identify specific failure scenarios in navigation and lifecycle.\n * Frozen to prevent accidental modifications.\n */\nexport const errorCodes: ErrorCodeToValueMap = Object.freeze({\n ROUTER_NOT_STARTED: \"NOT_STARTED\", // navigate() called before start()\n NO_START_PATH_OR_STATE: \"NO_START_PATH_OR_STATE\", // start() without initial route\n ROUTER_ALREADY_STARTED: \"ALREADY_STARTED\", // start() called twice\n ROUTE_NOT_FOUND: \"ROUTE_NOT_FOUND\", // Navigation to non-existent route\n SAME_STATES: \"SAME_STATES\", // Navigate to current route without reload\n CANNOT_DEACTIVATE: \"CANNOT_DEACTIVATE\", // canDeactivate guard blocked navigation\n CANNOT_ACTIVATE: \"CANNOT_ACTIVATE\", // canActivate guard blocked navigation\n TRANSITION_ERR: \"TRANSITION_ERR\", // Generic transition failure\n TRANSITION_CANCELLED: \"CANCELLED\", // Navigation cancelled by user or new navigation\n ROUTER_DISPOSED: \"DISPOSED\", // Router has been disposed\n PLUGIN_CONFLICT: \"PLUGIN_CONFLICT\", // Plugin tried to extend router with already-existing property\n});\n\n/**\n * General router constants.\n * Special route names and identifiers.\n */\nexport const UNKNOWN_ROUTE = \"@@router/UNKNOWN_ROUTE\";\n\nexport const constants: Constants = {\n UNKNOWN_ROUTE,\n};\n\n/**\n * Plugin method names.\n * Maps to methods that plugins can implement to hook into router lifecycle.\n */\nexport const plugins: EventToPluginMap = {\n ROUTER_START: \"onStart\", // Plugin method called when router starts\n ROUTER_STOP: \"onStop\", // Plugin method called when router stops\n TRANSITION_START: \"onTransitionStart\", // Plugin method called when navigation begins\n TRANSITION_CANCEL: \"onTransitionCancel\", // Plugin method called when navigation cancelled\n TRANSITION_SUCCESS: \"onTransitionSuccess\", // Plugin method called when navigation succeeds\n TRANSITION_ERROR: \"onTransitionError\", // Plugin method called when navigation fails\n};\n\n/**\n * Event names for router event system.\n * Used with addEventListener/removeEventListener for reactive subscriptions.\n */\nexport const events: EventToNameMap = {\n ROUTER_START: \"$start\", // Emitted when router.start() succeeds\n ROUTER_STOP: \"$stop\", // Emitted when router.stop() is called\n TRANSITION_START: \"$$start\", // Emitted when navigation begins\n TRANSITION_CANCEL: \"$$cancel\", // Emitted when navigation is cancelled\n TRANSITION_SUCCESS: \"$$success\", // Emitted when navigation completes successfully\n TRANSITION_ERROR: \"$$error\", // Emitted when navigation fails\n};\n\nexport const DEFAULT_LIMITS = {\n maxDependencies: 100,\n maxPlugins: 50,\n maxListeners: 10_000,\n warnListeners: 1000,\n maxEventDepth: 5,\n maxLifecycleHandlers: 200,\n} as const;\n\nexport const EMPTY_PARAMS: Readonly<Record<string, never>> = Object.freeze({});\n","// packages/core/src/helpers.ts\n\nimport { DEFAULT_LIMITS } from \"./constants\";\n\nimport type { Limits } from \"./types\";\nimport type { State, LimitsConfig } from \"@real-router/types\";\n\n// =============================================================================\n// State Helpers\n// =============================================================================\n\n/**\n * Structural type guard for State object.\n * Only checks required fields exist with correct types.\n * Does NOT validate params serializability (allows circular refs).\n *\n * Use `isState` from type-guards for full validation (serializable params).\n * Use this for internal operations like deepFreezeState that handle any object structure.\n *\n * @param value - Value to check\n * @returns true if value has State structure\n * @internal\n */\nfunction isStateStructural(value: unknown): value is State {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n typeof obj.name === \"string\" &&\n typeof obj.path === \"string\" &&\n typeof obj.params === \"object\" &&\n obj.params !== null\n );\n}\n\n/**\n * Deep freezes State object to prevent mutations.\n * Creates a deep clone first, then recursively freezes the clone and all nested objects.\n * Uses simple recursive freezing after cloning (no need for WeakSet since clone has no circular refs).\n *\n * @param state - The State object to freeze\n * @returns A frozen deep clone of the state\n * @throws {TypeError} If state is not a valid State object\n *\n * @example\n * const state = { name: 'home', params: {}, path: '/' };\n * const frozen = deepFreezeState(state);\n * // frozen.params is now immutable\n * // original state is unchanged\n */\nexport function deepFreezeState<T extends State>(state: T): T {\n // Early return for null/undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Validate State structure (structural check, allows circular refs)\n if (!isStateStructural(state)) {\n throw new TypeError(\n `[deepFreezeState] Expected valid State object, got: ${typeof state}`,\n );\n }\n\n // Create a deep clone to avoid mutating the original\n // structuredClone preserves circular references, so we need to track visited objects\n const clonedState = structuredClone(state);\n\n // WeakSet to track visited objects (prevent infinite recursion with circular refs)\n const visited = new WeakSet<object>();\n\n // Recursive freeze function with circular reference protection\n function freezeClonedRecursive(obj: unknown): void {\n // Skip primitives, null, undefined\n // Note: typeof undefined === \"undefined\" !== \"object\", so checking undefined is redundant\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already visited objects (circular reference protection)\n if (visited.has(obj)) {\n return;\n }\n\n // Mark as visited\n visited.add(obj);\n\n // Freeze the object/array itself\n Object.freeze(obj);\n\n // Get all values to freeze recursively\n const values = Array.isArray(obj) ? obj : Object.values(obj);\n\n // Recursively freeze nested values\n for (const value of values) {\n freezeClonedRecursive(value);\n }\n }\n\n // Freeze the entire cloned state tree\n freezeClonedRecursive(clonedState);\n\n return clonedState;\n}\n\n// WeakSet to track already frozen root objects for O(1) re-freeze check\nconst frozenRoots = new WeakSet<object>();\n\n// Module-scope recursive freeze function - better JIT optimization, no allocation per call\nfunction freezeRecursive(obj: unknown): void {\n // Skip primitives, null\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already frozen objects (handles potential shared refs)\n if (Object.isFrozen(obj)) {\n return;\n }\n\n // Freeze the object/array\n Object.freeze(obj);\n\n // Iterate without Object.values() allocation\n if (Array.isArray(obj)) {\n for (const item of obj) {\n freezeRecursive(item);\n }\n } else {\n for (const key in obj) {\n freezeRecursive((obj as Record<string, unknown>)[key]);\n }\n }\n}\n\n/**\n * Freezes State object in-place without cloning.\n * Optimized for hot paths where state is known to be a fresh object.\n *\n * IMPORTANT: Only use this when you know the state is a fresh object\n * that hasn't been exposed to external code yet (e.g., from makeState()).\n *\n * @param state - The State object to freeze (must be a fresh object)\n * @returns The same state object, now frozen\n * @internal\n */\nexport function freezeStateInPlace<T extends State>(state: T): T {\n // Early return for null/undefined - state from makeState() is never null\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Fast path: already processed root object - O(1) check\n if (frozenRoots.has(state)) {\n return state;\n }\n\n // Freeze the entire state tree\n freezeRecursive(state);\n\n // Mark root as processed for future calls\n frozenRoots.add(state);\n\n return state;\n}\n\n/**\n * Merges user limits with defaults.\n * Returns frozen object for immutability.\n */\nexport function createLimits(userLimits: Partial<LimitsConfig> = {}): Limits {\n return { ...DEFAULT_LIMITS, ...userLimits };\n}\n","// packages/core/src/RouterError.ts\n\nimport { errorCodes } from \"./constants\";\nimport { deepFreezeState } from \"./helpers\";\n\nimport type { State } from \"@real-router/types\";\n\n// Pre-compute Set of error code values for O(1) lookup in setCode()\n// This avoids creating array and doing linear search on every setCode() call\nconst errorCodeValues = new Set(Object.values(errorCodes));\n\n// Reserved built-in properties - throw error if user tries to set these\nconst reservedProperties = new Set([\"code\", \"segment\", \"path\", \"redirect\"]);\n\n// Reserved method names - silently ignore attempts to overwrite these\nconst reservedMethods = new Set([\n \"setCode\",\n \"setErrorInstance\",\n \"setAdditionalFields\",\n \"hasField\",\n \"getField\",\n \"toJSON\",\n]);\n\nexport class RouterError extends Error {\n [key: string]: unknown;\n\n // Using public properties to ensure structural compatibility\n // with RouterError interface in core-types\n readonly segment: string | undefined;\n readonly path: string | undefined;\n readonly redirect: State | undefined;\n\n // Note: code appears to be writable but setCode() should be used\n // to properly update both code and message together\n code: string;\n\n /**\n * Creates a new RouterError instance.\n *\n * The options object accepts built-in fields (message, segment, path, redirect)\n * and any additional custom fields, which will all be attached to the error instance.\n *\n * @param code - The error code (e.g., \"ROUTE_NOT_FOUND\", \"CANNOT_ACTIVATE\")\n * @param options - Optional configuration object\n * @param options.message - Custom error message (defaults to code if not provided)\n * @param options.segment - The route segment where the error occurred\n * @param options.path - The full path where the error occurred\n * @param options.redirect - Optional redirect state for navigation errors\n *\n * @example\n * ```typescript\n * // Basic error\n * const err1 = new RouterError(\"ROUTE_NOT_FOUND\");\n *\n * // Error with custom message\n * const err2 = new RouterError(\"ERR\", { message: \"Something went wrong\" });\n *\n * // Error with context and custom fields\n * const err3 = new RouterError(\"CANNOT_ACTIVATE\", {\n * message: \"Insufficient permissions\",\n * segment: \"admin\",\n * path: \"/admin/users\",\n * userId: \"123\" // custom field\n * });\n *\n * // Error with redirect\n * const err4 = new RouterError(\"TRANSITION_ERR\", {\n * redirect: { name: \"home\", path: \"/\", params: {} }\n * });\n * ```\n */\n constructor(\n code: string,\n {\n message,\n segment,\n path,\n redirect,\n ...rest\n }: {\n [key: string]: unknown;\n message?: string | undefined;\n segment?: string | undefined;\n path?: string | undefined;\n redirect?: State | undefined;\n } = {},\n ) {\n super(message ?? code);\n\n this.code = code;\n this.segment = segment;\n this.path = path;\n // Deep freeze redirect to prevent mutations (creates a frozen clone)\n this.redirect = redirect ? deepFreezeState(redirect) : undefined;\n\n // Assign custom fields, checking reserved properties and filtering out reserved method names\n // Issue #39: Throw for reserved properties to match setAdditionalFields behavior\n for (const [key, value] of Object.entries(rest)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Updates the error code and conditionally updates the message.\n *\n * If the current message is one of the standard error code values\n * (e.g., \"ROUTE_NOT_FOUND\", \"SAME_STATES\"), it will be replaced with the new code.\n * This allows keeping error messages in sync with codes when using standard error codes.\n *\n * If the message is custom (not a standard error code), it will be preserved.\n *\n * @param newCode - The new error code to set\n *\n * @example\n * // Message follows code (standard error code as message)\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", { message: \"ROUTE_NOT_FOUND\" });\n * err.setCode(\"CUSTOM_ERROR\"); // message becomes \"CUSTOM_ERROR\"\n *\n * @example\n * // Custom message is preserved\n * const err = new RouterError(\"ERR\", { message: \"Custom error message\" });\n * err.setCode(\"NEW_CODE\"); // message stays \"Custom error message\"\n */\n setCode(newCode: string): void {\n this.code = newCode;\n\n // Only update message if it's a standard error code value (not a custom message)\n if (errorCodeValues.has(this.message)) {\n this.message = newCode;\n }\n }\n\n /**\n * Copies properties from another Error instance to this RouterError.\n *\n * This method updates the message, cause, and stack trace from the provided error.\n * Useful for wrapping native errors while preserving error context.\n *\n * @param err - The Error instance to copy properties from\n * @throws {TypeError} If err is null or undefined\n *\n * @example\n * ```typescript\n * const routerErr = new RouterError(\"TRANSITION_ERR\");\n * try {\n * // some operation that might fail\n * } catch (nativeErr) {\n * routerErr.setErrorInstance(nativeErr);\n * throw routerErr;\n * }\n * ```\n */\n setErrorInstance(err: Error): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!err) {\n throw new TypeError(\n \"[RouterError.setErrorInstance] err parameter is required and must be an Error instance\",\n );\n }\n\n this.message = err.message;\n this.cause = err.cause;\n this.stack = err.stack ?? \"\";\n }\n\n /**\n * Adds custom fields to the error object.\n *\n * This method allows attaching arbitrary data to the error for debugging or logging purposes.\n * All fields become accessible as properties on the error instance and are included in JSON serialization.\n *\n * Reserved method names (setCode, setErrorInstance, setAdditionalFields, hasField, getField, toJSON)\n * are automatically filtered out to prevent accidental overwriting of class methods.\n *\n * @param fields - Object containing custom fields to add to the error\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"CANNOT_ACTIVATE\");\n * err.setAdditionalFields({\n * userId: \"123\",\n * attemptedRoute: \"/admin\",\n * reason: \"insufficient permissions\"\n * });\n *\n * console.log(err.userId); // \"123\"\n * console.log(JSON.stringify(err)); // includes all custom fields\n * ```\n */\n setAdditionalFields(fields: Record<string, unknown>): void {\n // Assign fields, throwing for reserved properties, silently ignoring methods\n for (const [key, value] of Object.entries(fields)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError.setAdditionalFields] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Checks if a custom field exists on the error object.\n *\n * This method checks for both custom fields added via setAdditionalFields()\n * and built-in fields (code, message, segment, etc.).\n *\n * @param key - The field name to check\n * @returns `true` if the field exists, `false` otherwise\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\", { segment: \"users\" });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * err.hasField(\"userId\"); // true\n * err.hasField(\"segment\"); // true\n * err.hasField(\"unknown\"); // false\n * ```\n */\n hasField(key: string): boolean {\n return key in this;\n }\n\n /**\n * Retrieves a custom field value from the error object.\n *\n * This method can access both custom fields and built-in fields.\n * Returns `undefined` if the field doesn't exist.\n *\n * @param key - The field name to retrieve\n * @returns The field value, or `undefined` if it doesn't exist\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\");\n * err.setAdditionalFields({ userId: \"123\", role: \"admin\" });\n *\n * err.getField(\"userId\"); // \"123\"\n * err.getField(\"role\"); // \"admin\"\n * err.getField(\"code\"); // \"ERR\" (built-in field)\n * err.getField(\"unknown\"); // undefined\n * ```\n */\n getField(key: string): unknown {\n return this[key];\n }\n\n /**\n * Serializes the error to a JSON-compatible object.\n *\n * This method is automatically called by JSON.stringify() and includes:\n * - Built-in fields: code, message, segment (if set), path (if set), redirect (if set)\n * - All custom fields added via setAdditionalFields() or constructor\n * - Excludes: stack trace (for security/cleanliness)\n *\n * @returns A plain object representation of the error, suitable for JSON serialization\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", {\n * message: \"Route not found\",\n * path: \"/admin/users/123\"\n * });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * JSON.stringify(err);\n * // {\n * // \"code\": \"ROUTE_NOT_FOUND\",\n * // \"message\": \"Route not found\",\n * // \"path\": \"/admin/users/123\",\n * // \"userId\": \"123\"\n * // }\n * ```\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n code: this.code,\n message: this.message,\n };\n\n if (this.segment !== undefined) {\n result.segment = this.segment;\n }\n if (this.path !== undefined) {\n result.path = this.path;\n }\n if (this.redirect !== undefined) {\n result.redirect = this.redirect;\n }\n\n // add all public fields\n // Using Set.has() for O(1) lookup instead of Array.includes() O(n)\n // Overall complexity: O(n) instead of O(n*m)\n const excludeKeys = new Set([\n \"code\",\n \"message\",\n \"segment\",\n \"path\",\n \"redirect\",\n \"stack\",\n ]);\n\n for (const key in this) {\n if (Object.hasOwn(this, key) && !excludeKeys.has(key)) {\n result[key] = this[key];\n }\n }\n\n return result;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{RouterError as t,errorCodes as e}from"./chunk-5QXFUUDL.mjs";import{getInternals as a}from"./chunk-QUUNDESP.mjs";function r(a){if(a())throw new t(e.ROUTER_DISPOSED)}function o(o){const s=a(o);return{makeState:(t,e,a,r,o)=>(s.validator?.state.validateMakeStateArgs(t,e,a,o),s.makeState(t,e,a,r?.params,o)),buildState:(t,e)=>{s.validator?.routes.validateStateBuilderArgs(t,e,"buildState");const{name:a,params:r}=s.forwardState(t,e);return s.buildStateResolved(a,r)},forwardState:(t,e)=>(s.validator?.routes.validateStateBuilderArgs(t,e,"forwardState"),s.forwardState(t,e)),matchPath:t=>(s.validator?.routes.validateMatchPathArgs(t),s.matchPath(t,s.getOptions())),setRootPath:t=>{r(s.isDisposed),s.validator?.routes.validateSetRootPathArgs(t),s.setRootPath(t)},getRootPath:s.getRootPath,addEventListener:(t,e)=>(r(s.isDisposed),s.validator?.eventBus.validateListenerArgs(t,e),s.addEventListener(t,e)),buildNavigationState:(t,e={})=>{s.validator?.routes.validateStateBuilderArgs(t,e,"buildNavigationState");const{name:a,params:r}=s.forwardState(t,e),o=s.buildStateResolved(a,r);if(o)return s.makeState(o.name,o.params,s.buildPath(o.name,o.params),o.meta)},getOptions:s.getOptions,getTree:s.getTree,addInterceptor:(t,e)=>{r(s.isDisposed),s.validator?.plugins.validateAddInterceptorArgs(t,e);let a=s.interceptors.get(t);return a||(a=[],s.interceptors.set(t,a)),a.push(e),()=>{const t=a.indexOf(e);-1!==t&&a.splice(t,1)}},getRouteConfig:t=>{const e=s.routeGetStore();if(e.matcher.hasRoute(t))return e.routeCustomFields[t]},extendRouter:a=>{r(s.isDisposed);const i=Object.keys(a);for(const a of i)if(a in o)throw new t(e.PLUGIN_CONFLICT,{message:`Cannot extend router: property "${a}" already exists`});for(const t of i)o[t]=a[t];const n={keys:i};s.routerExtensions.push(n);let d=!1;return()=>{if(d)return;d=!0;for(const t of n.keys)delete o[t];const t=s.routerExtensions.indexOf(n);-1!==t&&s.routerExtensions.splice(t,1)}}}}export{o as getPluginApi,r as throwIfDisposed};//# sourceMappingURL=chunk-HHIXK5UM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/helpers.ts","../../src/api/getPluginApi.ts"],"names":[],"mappings":"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","file":"chunk-HHIXK5UM.mjs","sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type { DefaultDependencies, Params, Router } from \"@real-router/types\";\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const ctx = getInternals(router);\n\n return {\n makeState: (name, params, path, meta, forceId) => {\n ctx.validator?.state.validateMakeStateArgs(name, params, path, forceId);\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n forceId,\n );\n },\n buildState: (routeName, routeParams) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n ctx.validator?.routes.validateMatchPathArgs(path);\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateSetRootPathArgs(rootPath);\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.eventBus.validateListenerArgs(eventName, cb);\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.validator?.plugins.validateAddInterceptorArgs(method, fn);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=new WeakMap;function t(t){const r=n.get(t);if(!r)throw new TypeError("[real-router] Invalid router instance — not found in internals registry");return r}function r(t,r){n.set(t,r)}function e(n,t,r){let e=t;for(const t of n){const n=e;e=(...r)=>t(n,...r)}return e(...r)}function o(n,t,r){return(...o)=>{const u=r.get(n);return u&&0!==u.length?e(u,t,o):t(...o)}}function u(n,t,r){return(o,u)=>{const c=r.get(n);return c&&0!==c.length?e(c,t,[o,u]):t(o,u)}}export{o as createInterceptable,u as createInterceptable2,t as getInternals,r as registerInternals};//# sourceMappingURL=chunk-QUUNDESP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/internals.ts"],"names":[],"mappings":";AAgGA,IAAM,SAAA,uBAAgB,OAAA,EAAsC;AAErD,SAAS,aACd,MAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAEhC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,SAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,iBAAA,CACd,QACA,GAAA,EACM;AACN,EAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAC3B;AAGA,SAAS,uBAAA,CACP,YAAA,EACA,QAAA,EACA,IAAA,EACG;AACH,EAAA,IAAI,KAAA,GAAQ,QAAA;AAEZ,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,IAAA,GAAO,KAAA;AAEb,IAAA,KAAA,GAAQ,CAAA,GAAI,SAAA,KAAqB,WAAA,CAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,KAAA,CAAM,GAAG,IAAI,CAAA;AACtB;AAEO,SAAS,mBAAA,CACd,IAAA,EACA,QAAA,EACA,YAAA,EAIG;AACH,EAAA,QAAQ,IAAI,IAAA,KAAgB;AAC1B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAEnC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,uBAAA,CAAwB,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAAA,EACtD,CAAA;AACF;AAEO,SAAS,oBAAA,CACd,IAAA,EACA,QAAA,EACA,YAAA,EAImB;AACnB,EAAA,OAAO,CAAC,MAAS,IAAA,KAAY;AAC3B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAEnC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,wBAAwB,KAAA,EAAO,QAAA,EAAU,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EAC9D,CAAA;AACF","file":"chunk-QUUNDESP.mjs","sourcesContent":["import type { DependenciesStore } from \"./namespaces/DependenciesNamespace\";\nimport type { RoutesStore } from \"./namespaces/RoutesNamespace\";\nimport type { Router as RouterClass } from \"./Router\";\nimport type { EventMethodMap, GuardFnFactory, PluginFactory } from \"./types\";\nimport type { RouterValidator } from \"./types/RouterValidator\";\nimport type {\n DefaultDependencies,\n EventName,\n Options,\n Params,\n Plugin,\n Router as RouterInterface,\n RouteTreeState,\n SimpleState,\n State,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { RouteTree } from \"route-tree\";\n\nexport interface RouterInternals<\n D extends DefaultDependencies = DefaultDependencies,\n> {\n readonly makeState: <P extends Params = Params, MP extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: Record<string, Record<string, \"url\" | \"query\">>,\n forceId?: number,\n ) => State<P, MP>;\n\n readonly forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => SimpleState<P>;\n\n readonly buildStateResolved: (\n resolvedName: string,\n resolvedParams: Params,\n ) => RouteTreeState | undefined;\n\n readonly matchPath: <P extends Params = Params, MP extends Params = Params>(\n path: string,\n options?: Options,\n ) => State<P, MP> | undefined;\n\n readonly getOptions: () => Options;\n\n readonly addEventListener: <E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ) => Unsubscribe;\n\n readonly buildPath: (route: string, params?: Params) => string;\n\n readonly start: (path: string) => Promise<State>;\n\n /* eslint-disable @typescript-eslint/no-explicit-any -- heterogeneous map: stores different InterceptorFn<M> types under different keys */\n readonly interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n readonly setRootPath: (rootPath: string) => void;\n readonly getRootPath: () => string;\n\n readonly getTree: () => RouteTree;\n\n readonly isDisposed: () => boolean;\n\n validator: RouterValidator | null;\n\n // Dependencies (issue #172)\n readonly dependenciesGetStore: () => DependenciesStore<D>;\n\n // Clone support (issue #173)\n readonly cloneOptions: () => Options;\n readonly cloneDependencies: () => Record<string, unknown>;\n readonly getLifecycleFactories: () => [\n Record<string, GuardFnFactory<D>>,\n Record<string, GuardFnFactory<D>>,\n ];\n readonly getPluginFactories: () => PluginFactory<D>[];\n\n // Consolidated route data store (issue #174 Phase 2)\n readonly routeGetStore: () => RoutesStore<D>;\n\n // Cross-namespace state (issue #174)\n readonly getStateName: () => string | undefined;\n readonly isTransitioning: () => boolean;\n readonly clearState: () => void;\n readonly setState: (state: State) => void;\n readonly routerExtensions: { keys: string[] }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- existential type: stores RouterInternals for all Dependencies types\nconst internals = new WeakMap<object, RouterInternals<any>>();\n\nexport function getInternals<D extends DefaultDependencies>(\n router: RouterInterface<D>,\n): RouterInternals<D> {\n const ctx = internals.get(router);\n\n if (!ctx) {\n throw new TypeError(\n \"[real-router] Invalid router instance — not found in internals registry\",\n );\n }\n\n return ctx as RouterInternals<D>;\n}\n\nexport function registerInternals<D extends DefaultDependencies>(\n router: RouterClass<D>,\n ctx: RouterInternals<D>,\n): void {\n internals.set(router, ctx);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument -- internal chain execution: type safety enforced at public API boundary (PluginApi.addInterceptor) */\nfunction executeInterceptorChain<T>(\n interceptors: ((next: (...args: any[]) => any, ...args: any[]) => any)[],\n original: (...args: any[]) => T,\n args: any[],\n): T {\n let chain = original as (...args: any[]) => any;\n\n for (const interceptor of interceptors) {\n const prev = chain;\n\n chain = (...chainArgs: any[]) => interceptor(prev, ...chainArgs);\n }\n\n return chain(...args) as T;\n}\n\nexport function createInterceptable<T extends (...args: any[]) => any>(\n name: string,\n original: T,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): T {\n return ((...args: any[]) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(...args);\n }\n\n return executeInterceptorChain(chain, original, args);\n }) as T;\n}\n\nexport function createInterceptable2<A, B, R>(\n name: string,\n original: (a: A, b: B) => R,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): (a: A, b: B) => R {\n return (arg1: A, arg2: B) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(arg1, arg2);\n }\n\n return executeInterceptorChain(chain, original, [arg1, arg2]);\n };\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{plugins as t,events as e,RouterError as n,errorCodes as i,constants as s,createLimits as r,EMPTY_PARAMS as a,DEFAULT_LIMITS as o,freezeStateInPlace as c}from"./chunk-5QXFUUDL.mjs";import{registerInternals as u,createInterceptable as l,createInterceptable2 as h,getInternals as d}from"./chunk-QUUNDESP.mjs";import{logger as f}from"@real-router/logger";import{FSM as p}from"@real-router/fsm";function m(t,e,n=100){const i=new Set,s=[t];let r=t;for(;e[r];){const t=e[r];if(i.has(t)){const e=s.indexOf(t),n=[...s.slice(e),t];throw new Error(`Circular forwardTo: ${n.join(" → ")}`)}if(i.add(r),s.push(t),r=t,s.length>n)throw new Error(`forwardTo chain exceeds maximum depth (${n}): ${s.join(" → ")}`)}return r}var g={maxListeners:0,warnListeners:0,maxEventDepth:0},v=class extends Error{},S=class{#t=new Map;#e=null;#n=g;#i;#s;constructor(t){t?.limits&&(this.#n=t.limits),this.#i=t?.onListenerError??null,this.#s=t?.onListenerWarn??null}static validateCallback(t,e){if("function"!=typeof t)throw new TypeError(`Expected callback to be a function for event ${e}`)}setLimits(t){this.#n=t}on(t,e){const n=this.#r(t);if(n.has(e))throw new Error(`Duplicate listener for "${t}"`);const{maxListeners:i,warnListeners:s}=this.#n;if(0!==s&&n.size===s&&this.#s?.(t,s),0!==i&&n.size>=i)throw new Error(`Listener limit (${i}) reached for "${t}"`);return n.add(e),()=>{this.off(t,e)}}off(t,e){this.#t.get(t)?.delete(e)}emit(t,e,n,i,s){const r=this.#t.get(t);if(!r||0===r.size)return;const a=arguments.length-1;0!==this.#n.maxEventDepth?this.#a(r,t,a,e,n,i,s):this.#o(r,t,a,e,n,i,s)}clearAll(){this.#t.clear(),this.#e=null}listenerCount(t){return this.#t.get(t)?.size??0}#o(t,e,n,i,s,r,a){if(1===t.size){const[o]=t;try{this.#c(o,n,i,s,r,a)}catch(t){this.#i?.(e,t)}return}const o=[...t];for(const t of o)try{this.#c(t,n,i,s,r,a)}catch(t){this.#i?.(e,t)}}#c(t,e,n,i,s,r){switch(e){case 0:t();break;case 1:t(n);break;case 2:t(n,i);break;case 3:t(n,i,s);break;default:t(n,i,s,r)}}#a(t,e,n,i,s,r,a){this.#e??=new Map;const o=this.#e,c=o.get(e)??0;if(c>=this.#n.maxEventDepth)throw new v(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${e}`);try{o.set(e,c+1);const u=1===t.size?t:[...t];for(const t of u)try{this.#c(t,n,i,s,r,a)}catch(t){if(t instanceof v)throw t;this.#i?.(e,t)}}finally{o.set(e,o.get(e)-1)}}#r(t){const e=this.#t.get(t);if(e)return e;const n=new Set;return this.#t.set(t,n),n}},y="IDLE",T="STARTING",w="READY",b="TRANSITIONING",N="DISPOSED",P="START",A="STARTED",O="NAVIGATE",E="COMPLETE",R="FAIL",C="CANCEL",D="STOP",F="DISPOSE",j={initial:y,context:null,transitions:{[y]:{[P]:T,[F]:N},[T]:{[A]:w,[R]:y},[w]:{[O]:b,[R]:w,[D]:y},[b]:{[O]:b,[E]:w,[C]:w,[R]:w},[N]:{}}};function L(t,e){for(const n of t){if(null===n||"object"!=typeof n||Array.isArray(n))throw new TypeError("route must be a non-array object");e?.routes.guardRouteCallbacks(n),e?.routes.guardNoAsyncCallbacks(n);const t=n.children;t&&L(t,e)}}var I={defaultRoute:"",defaultParams:{},trailingSlash:"preserve",queryParamsMode:"loose",queryParams:{arrayFormat:"none",booleanFormat:"none",nullFormat:"default"},urlParamsEncoding:"default",allowNotFound:!0,rewritePathOnMatch:!0};function M(t){Object.freeze(t);for(const e of Object.keys(t)){const n=t[e];n&&"object"==typeof n&&n.constructor===Object&&M(n)}return t}function U(t,e){return"function"==typeof t?t(e):t}var $=class{#u;constructor(t={}){this.#u=M({...I,...t})}static validateOptionsIsObject(t){!function(t){if(!t||"object"!=typeof t||Array.isArray(t))throw new TypeError("[router.constructor] options must be a plain object")}(t)}get(){return this.#u}};function B(t,e){return t===e||!(!Array.isArray(t)||!Array.isArray(e))&&t.length===e.length&&t.every((t,n)=>B(t,e[n]))}var _=class{#l=0;#h=void 0;#d=void 0;#f;#p=new Map;get(){return this.#h}set(t){this.#d=this.#h,this.#h=t?c(t):void 0}getPrevious(){return this.#d}reset(){this.#h=void 0,this.#d=void 0,this.#p.clear(),this.#l=0}setDependencies(t){this.#f=t}makeState(t,e,n,i,s,r){const o=i?{id:s??++this.#l,params:i}:void 0,u=this.#f.getDefaultParams();let l;l=Object.hasOwn(u,t)?{...u[t],...e}:e&&e!==a?{...e}:a;const h={name:t,params:l,path:n??this.#f.buildPath(t,e),meta:o};return r?h:c(h)}areStatesEqual(t,e,n=!0){if(!t||!e)return!!t==!!e;if(t.name!==e.name)return!1;if(n){const n=t.meta?.params??e.meta?.params;return(n?function(t){const e=[];for(const n in t){const i=t[n];for(const t in i)"url"===i[t]&&e.push(t)}return e}(n):this.#m(t.name)).every(n=>B(t.params[n],e.params[n]))}const i=Object.keys(t.params),s=Object.keys(e.params);return i.length===s.length&&i.every(n=>n in e.params&&B(t.params[n],e.params[n]))}#m(t){const e=this.#p.get(t);if(void 0!==e)return e;const n=this.#f.getUrlParams(t);return this.#p.set(t,n),n}},k={[t.ROUTER_START]:e.ROUTER_START,[t.ROUTER_STOP]:e.ROUTER_STOP,[t.TRANSITION_SUCCESS]:e.TRANSITION_SUCCESS,[t.TRANSITION_START]:e.TRANSITION_START,[t.TRANSITION_ERROR]:e.TRANSITION_ERROR,[t.TRANSITION_CANCEL]:e.TRANSITION_CANCEL},x=Object.keys(k),z="router.usePlugin",q=class t{#g=new Set;#v=new Set;#f;#S=o;#y=null;static validatePlugin(t){!function(t){if(!t||"object"!=typeof t||Array.isArray(t))throw new TypeError("[router.usePlugin] Plugin factory must return an object, got "+typeof t);if("function"==typeof t.then)throw new TypeError("[router.usePlugin] Async plugin factories are not supported. Factory returned a Promise instead of a plugin object.")}(t)}static validateNoDuplicatePlugins(t,e){for(const n of t)if(e(n))throw new Error("[router.usePlugin] Plugin factory already registered. To re-register, first unsubscribe the existing plugin.")}setDependencies(t){this.#f=t}setLimits(t){this.#S=t,this.#S}setValidatorGetter(t){this.#y=t}count(){return this.#g.size}use(...t){if(this.#y?.()?.plugins.validateCountThresholds(this.#g.size+t.length),1===t.length){const e=t[0],n=this.#T(e);this.#g.add(e);let i=!1;const s=()=>{if(!i){i=!0,this.#g.delete(e),this.#v.delete(s);try{n()}catch(t){f.error(z,"Error during cleanup:",t)}}};return this.#v.add(s),s}const e=this.#w(t),n=[];try{for(const t of e){const e=this.#T(t);n.push({factory:t,cleanup:e})}}catch(t){for(const{cleanup:t}of n)try{t()}catch(t){f.error(z,"Cleanup error:",t)}throw t}for(const{factory:t}of n)this.#g.add(t);let i=!1;const s=()=>{if(!i){i=!0,this.#v.delete(s);for(const{factory:t}of n)this.#g.delete(t);for(const{cleanup:t}of n)try{t()}catch(t){f.error(z,"Error during cleanup:",t)}}};return this.#v.add(s),s}getAll(){return[...this.#g]}has(t){return this.#g.has(t)}disposeAll(){for(const t of this.#v)t();this.#g.clear(),this.#v.clear()}#w(t){const e=new Set;for(const n of t)e.has(n)?this.#y?.()?.plugins.warnBatchDuplicates(t):e.add(n);return e}#T(e){const n=this.#f.compileFactory(e);t.validatePlugin(n),this.#y?.()?.plugins.validatePluginKeys(n),Object.freeze(n);const i=[];for(const t of x)t in n&&("function"==typeof n[t]?(i.push(this.#f.addEventListener(k[t],n[t])),"onStart"===t&&this.#f.canNavigate()&&this.#y?.()?.plugins.warnPluginAfterStart(t)):this.#y?.()?.plugins.warnPluginMethodType(t));return()=>{for(const t of i)t();"function"==typeof n.teardown&&n.teardown()}}},G=class{#b=new Map;#N=new Map;#P=new Map;#A=new Map;#O=[this.#P,this.#A];#E=new Set;#R=new Set;#C=new Set;#f;#S=o;#y=null;setDependencies(t){this.#f=t}setLimits(t){this.#S=t,this.#S}setValidatorGetter(t){this.#y=t}getHandlerCount(t){return"activate"===t?this.#N.size:this.#b.size}addCanActivate(t,e,n=!1){n?this.#R.add(t):this.#R.delete(t);const i=this.#N.has(t);this.#D("activate",t,e,this.#N,this.#A,"canActivate",i)}addCanDeactivate(t,e,n=!1){n?this.#C.add(t):this.#C.delete(t);const i=this.#b.has(t);this.#D("deactivate",t,e,this.#b,this.#P,"canDeactivate",i)}clearCanActivate(t){this.#N.delete(t),this.#A.delete(t),this.#R.delete(t)}clearCanDeactivate(t){this.#b.delete(t),this.#P.delete(t),this.#C.delete(t)}clearAll(){this.#N.clear(),this.#A.clear(),this.#b.clear(),this.#P.clear(),this.#R.clear(),this.#C.clear()}clearDefinitionGuards(){for(const t of this.#R)this.#N.delete(t),this.#A.delete(t);for(const t of this.#C)this.#b.delete(t),this.#P.delete(t);this.#R.clear(),this.#C.clear()}getFactories(){const t={},e={};for(const[e,n]of this.#b)t[e]=n;for(const[t,n]of this.#N)e[t]=n;return[t,e]}getFunctions(){return this.#O}canNavigateTo(t,e,n,i){for(const e of t)if(!this.#F(this.#P,e,n,i,"canNavigateTo"))return!1;for(const t of e)if(!this.#F(this.#A,t,n,i,"canNavigateTo"))return!1;return!0}#D(t,e,n,i,s,r,a){a?this.#y?.()?.lifecycle.warnOverwrite(e,t,r):this.#y?.()?.lifecycle.validateCountThresholds(i.size+1,r);const o="boolean"==typeof n?function(t){const e=()=>t;return()=>e}(n):n;i.set(e,o),this.#E.add(e);try{const t=this.#f.compileFactory(o);if("function"!=typeof t)throw new TypeError(`[router.${r}] Factory must return a function, got ${typeof t}`);s.set(e,t)}catch(t){throw i.delete(e),t}finally{this.#E.delete(e)}}#F(t,e,n,i,s){const r=t.get(e);if(!r)return!0;try{const t=r(n,i);return"boolean"==typeof t?t:(this.#y?.()?.lifecycle.warnAsyncGuardSync(e,s),!1)}catch{return!1}}};function W(){return{decoders:Object.create(null),encoders:Object.create(null),defaultParams:Object.create(null),forwardMap:Object.create(null),forwardFnMap:Object.create(null)}}function Q(t){const e={name:t.name,path:t.path};return t.children&&(e.children=t.children.map(t=>Q(t))),e}function V(t,e,n=""){for(let i=0;i<t.length;i++){const s=t[i],r=n?`${n}.${s.name}`:s.name;if(r===e)return t.splice(i,1),!0;if(s.children&&e.startsWith(`${r}.`)&&V(s.children,e,r))return!0}return!1}function K(t,e){for(const n of Object.keys(t))e(n)&&delete t[n]}function H(t){return`(${t.replaceAll(/(^<|>$)/g,"")})`}var J=/([:*])([^/?<]+)(<[^>]+>)?(\?)?/g,Y=/([:*][^/?<]+(?:<[^>]+>)?)\?(?=\/|$)/g,X=/\?(.+)$/,Z=/[^\w!$'()*+,.:;|~-]/gu,tt=/[^\w!$'()*+,.:;|~-]/u,et={default:t=>tt.test(t)?t.replaceAll(Z,t=>encodeURIComponent(t)):t,uri:encodeURI,uriComponent:encodeURIComponent,none:t=>t},nt={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:t=>t};function it(){return{staticChildren:Object.create(null),paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function st(t){return t.length>1&&t.endsWith("/")?t.slice(0,-1):t}function rt(t){const e={};if(0===t.length)return e;const n=t.split("&");for(const t of n){const n=t.indexOf("=");-1===n?e[t]="":e[t.slice(0,n)]=t.slice(n+1)}return e}function at(t){const e=[];for(const n of Object.keys(t)){const i=t[n],s=encodeURIComponent(n);e.push(""===i?s:`${s}=${encodeURIComponent(String(i))}`)}return e.join("&")}function ot(t){return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function ct(t){let e=0;for(;e<t.length;)if("%"===t[e]){if(e+2>=t.length)return!1;const n=t.codePointAt(e+1)??0,i=t.codePointAt(e+2)??0;if(!ot(n)||!ot(i))return!1;e+=3}else e++;return!0}var ut=/<[^>]*>/g;function lt(t,e,n,i,s){const r=""===e.fullName;r||i.push(e);const a=e.absolute,o=e.paramMeta.pathPattern,c=a&&o.startsWith("~")?o.slice(1):o,u=(a?c:o).replaceAll(ut,""),l=a?u:(d=u,""===(h=n)?d:""===d?h:h+d);var h,d;let f=s;r||(f=function(t,e,n,i,s,r){const a=(g=i,st(n)===st(g)),o=Object.freeze([...s]),c=function(t){const e={};for(const n of t)e[n.fullName]=n.paramTypeMap;return Object.freeze(e)}(o),u=st(n),l=function(t,e){const n=[];t.length>0&&n.push(...t);for(const t of e)t.paramMeta.queryParams.length>0&&n.push(...t.paramMeta.queryParams);return n}(t.rootQueryParams,s),h=function(t){const e=new Map;for(const n of t)for(const[t,i]of n.paramMeta.constraintPatterns)e.set(t,i);return e}(s),d=a?st(i):u,{buildStaticParts:f,buildParamSlots:p}=function(t,e,n){const i=new Set,s=new Set;for(const t of e){for(const e of t.paramMeta.urlParams)i.add(e);for(const e of t.paramMeta.spatParams)s.add(e)}if(0===i.size)return{buildStaticParts:[t],buildParamSlots:[]};const r=[],a=[],o=/[:*]([\w]+)(?:<[^>]*>)?(\?)?/gu;let c,u=0;for(;null!==(c=o.exec(t));){const e=c[1],i="?"===c[2];r.push(t.slice(u,c.index));const o=s.has(e);a.push({paramName:e,isOptional:i,encoder:o?t=>{const e=et[n],i=t.split("/");let s=e(i[0]);for(let t=1;t<i.length;t++)s+=`/${e(i[t])}`;return s}:et[n]}),u=c.index+c[0].length}return r.push(t.slice(u)),{buildStaticParts:r,buildParamSlots:a}}(d,a?s.slice(0,-1):s,t.options.urlParamsEncoding),m={name:e.fullName,parent:r,depth:s.length-1,matchSegments:o,meta:c,declaredQueryParams:l,declaredQueryParamsSet:new Set(l),hasTrailingSlash:n.length>1&&n.endsWith("/"),constraintPatterns:h,hasConstraints:h.size>0,buildStaticParts:f,buildParamSlots:p,buildParamNamesSet:new Set(p.map(t=>t.paramName))};var g;return t.routesByName.set(e.fullName,m),t.segmentsByName.set(e.fullName,o),t.metaByName.set(e.fullName,c),a?function(t,e,n){var i,s;i=e,(function(t,e,n){const i=st(n);if("/"===i||""===i)return e;let s=e,r=1;const a=i.length;for(;r<=a;){const e=i.indexOf("/",r),n=-1===e?a:e;if(n<=r)break;s=dt(t,s,i.slice(r,n)),r=n+1}return s}(s=t,s.root,n)).slashChildRoute=i;const r=st(n),a=t.options.caseSensitive?r:r.toLowerCase();t.staticCache.has(a)&&t.staticCache.set(a,e)}(t,m,i):function(t,e,n,i,s){if(function(t,e,n){const i=st(n);"/"!==i?ht(t,t.root,i,1,e):t.root.route=e}(t,e,n),0===s.paramMeta.urlParams.length){const n=t.options.caseSensitive?i:i.toLowerCase();t.staticCache.set(n,e)}}(t,m,n,u,e),m}(t,e,l,a?"":n,i,s));for(const n of e.children.values())lt(t,n,l,i,f);r||i.pop()}function ht(t,e,n,i,s){const r=n.length;for(;i<=r;){const a=n.indexOf("/",i),o=-1===a?r:a,c=n.slice(i,o);if(c.endsWith("?")){const i=c.slice(1).replaceAll(ut,"").replace(/\?$/,"");return e.paramChild??={node:it(),name:i},ht(t,e.paramChild.node,n,o+1,s),void(o>=r?e.route??=s:ht(t,e,n,o+1,s))}e=dt(t,e,c),i=o+1}e.route=s}function dt(t,e,n){if(n.startsWith("*")){const t=n.slice(1);return e.splatChild??={node:it(),name:t},e.splatChild.node}if(n.startsWith(":")){const t=n.slice(1).replaceAll(ut,"").replace(/\?$/,"");return e.paramChild??={node:it(),name:t},e.paramChild.node}const i=t.options.caseSensitive?n:n.toLowerCase();return i in e.staticChildren||(e.staticChildren[i]=it()),e.staticChildren[i]}var ft=/[\u0080-\uFFFF]/,pt=class{get options(){return this.#t}#t;#e=it();#s=new Map;#r=new Map;#n=new Map;#a=new Map;#i="";#j=[];constructor(t){this.#t={caseSensitive:t?.caseSensitive??!0,strictTrailingSlash:t?.strictTrailingSlash??!1,strictQueryParams:t?.strictQueryParams??!1,urlParamsEncoding:t?.urlParamsEncoding??"default",parseQueryString:t?.parseQueryString??rt,buildQueryString:t?.buildQueryString??at}}registerTree(t){this.#j=t.paramMeta.queryParams,lt({root:this.#e,options:this.#t,routesByName:this.#s,segmentsByName:this.#r,metaByName:this.#n,staticCache:this.#a,rootQueryParams:this.#j},t,"",[],null)}match(t){const e=this.#c(t);if(!e)return;const[n,i,s]=e,r=this.#t.caseSensitive?i:i.toLowerCase(),a=this.#a.get(r);if(a){if(this.#t.strictTrailingSlash&&!this.#o(n,a))return;return this.#L(a,{},s)}const o={},c=this.#I(i,o);return!c||this.#t.strictTrailingSlash&&!this.#o(n,c)||c.hasConstraints&&!this.#M(o,c)||!this.#U(o)?void 0:this.#L(c,o,s)}buildPath(t,e,n){const i=this.#s.get(t);if(!i)throw new Error(`[SegmentMatcher.buildPath] '${t}' is not defined`);i.hasConstraints&&e&&this.#$(i,t,e);const s=this.#B(i,e),r=this.#_(s,n?.trailingSlash),a=this.#k(i,e,n?.queryParamsMode);return r+(a?`?${a}`:"")}getSegmentsByName(t){return this.#r.get(t)}getMetaByName(t){return this.#n.get(t)}hasRoute(t){return this.#s.has(t)}setRootPath(t){this.#i=t}#$(t,e,n){for(const[i,s]of t.constraintPatterns){const t=n[i];if(null!=t){const n="object"==typeof t?JSON.stringify(t):String(t);if(!s.pattern.test(n))throw new Error(`[SegmentMatcher.buildPath] '${e}' — param '${i}' value '${n}' does not match constraint '${s.constraint}'`)}}}#B(t,e){const n=t.buildStaticParts,i=t.buildParamSlots;if(0===i.length)return this.#i+n[0];let s=this.#i+n[0];for(const[t,r]of i.entries()){const i=e?.[r.paramName];if(null==i){if(!r.isOptional)throw new Error(`[SegmentMatcher.buildPath] Missing required param '${r.paramName}'`);s.length>1&&s.endsWith("/")&&(s=s.slice(0,-1)),s+=n[t+1];continue}const a="object"==typeof i?JSON.stringify(i):String(i);s+=r.encoder(a)+n[t+1]}return s}#_(t,e){return"always"!==e||t.endsWith("/")?"never"===e&&"/"!==t&&t.endsWith("/")?t.slice(0,-1):t:`${t}/`}#k(t,e,n){if(!e)return"";const i={};let s=!1;for(const n of t.declaredQueryParams)n in e&&(i[n]=e[n],s=!0);if("loose"===n)for(const n in e)!Object.hasOwn(e,n)||t.declaredQueryParamsSet.has(n)||t.buildParamNamesSet.has(n)||(i[n]=e[n],s=!0);return s?this.#t.buildQueryString(i):""}#c(t){if(""===t&&(t="/"),!t.startsWith("/"))return;const e=t.indexOf("#");if(-1!==e&&(t=t.slice(0,e)),ft.test(t))return;if(this.#i.length>0){if(!t.startsWith(this.#i))return;t=t.slice(this.#i.length)||"/"}const n=t.indexOf("?"),i=-1===n?t:t.slice(0,n),s=-1===n?void 0:t.slice(n+1);return i.includes("//")?void 0:[i,st(i),s]}#L(t,e,n){if(void 0!==n){const i=this.#t.parseQueryString(n);if(this.#t.strictQueryParams){const e=t.declaredQueryParamsSet;for(const t of Object.keys(i))if(!e.has(t))return}for(const t of Object.keys(i))e[t]=i[t]}return{segments:t.matchSegments,params:e,meta:t.meta}}#o(t,e){return(t.length>1&&t.endsWith("/"))===e.hasTrailingSlash}#I(t,e){return 1===t.length?this.#e.slashChildRoute??this.#e.route:this.#x(this.#e,t,1,e)}#x(t,e,n,i){let s=t;const r=e.length;for(;n<=r;){const t=e.indexOf("/",n),a=-1===t?r:t,o=e.slice(n,a),c=this.#t.caseSensitive?o:o.toLowerCase();let u;if(c in s.staticChildren)u=s.staticChildren[c];else{if(!s.paramChild){if(s.splatChild){const t={},r=this.#x(s.splatChild.node,e,n,t);return r?(Object.assign(i,t),r):(i[s.splatChild.name]=e.slice(n),s.splatChild.node.route)}return}u=s.paramChild.node,i[s.paramChild.name]=o}s=u,n=a+1}return s.slashChildRoute??s.route}#U(t){const e=this.#t.urlParamsEncoding;if("none"===e)return!0;const n=nt[e];for(const e in t){const i=t[e];if(i.includes("%")){if(!ct(i))return!1;t[e]=n(i)}}return!0}#M(t,e){for(const[n,i]of e.constraintPatterns)if(!i.pattern.test(t[n]))return!1;return!0}},mt=t=>{const e=t.indexOf("%"),n=t.indexOf("+");if(-1===e&&-1===n)return t;const i=-1===n?t:t.split("+").join(" ");return-1===e?i:decodeURIComponent(i)},gt=t=>{const e=typeof t;if("string"!==e&&"number"!==e&&"boolean"!==e)throw new TypeError(`[search-params] Array element must be a string, number, or boolean — received ${"object"===e&&null===t?"null":e}`);return encodeURIComponent(t)},vt={none:{encodeArray:(t,e)=>e.map(e=>`${t}=${gt(e)}`).join("&")},brackets:{encodeArray:(t,e)=>e.map(e=>`${t}[]=${gt(e)}`).join("&")},index:{encodeArray:(t,e)=>e.map((e,n)=>`${t}[${n}]=${gt(e)}`).join("&")},comma:{encodeArray:(t,e)=>`${t}=${e.map(t=>gt(t)).join(",")}`}},St={none:{encode:(t,e)=>`${t}=${e}`,decodeUndefined:()=>null,decodeRaw:()=>null,decodeValue:t=>t},string:{encode:(t,e)=>`${t}=${e}`,decodeUndefined:()=>null,decodeRaw:t=>"true"===t||"false"!==t&&null,decodeValue:t=>t},"empty-true":{encode:(t,e)=>e?t:`${t}=false`,decodeUndefined:()=>!0,decodeRaw:()=>null,decodeValue:t=>t}},yt={default:{encode:t=>t},hidden:{encode:()=>""}},Tt=(t,e,n)=>({boolean:St[e],null:yt[n],array:vt[t]}),wt={arrayFormat:"none",booleanFormat:"none",nullFormat:"default",strategies:{boolean:St.none,null:yt.default,array:vt.none}},bt=t=>{if(!t||void 0===t.arrayFormat&&void 0===t.booleanFormat&&void 0===t.nullFormat)return wt;const e=t.arrayFormat??"none",n=t.booleanFormat??"none",i=t.nullFormat??"default";return{arrayFormat:e,booleanFormat:n,nullFormat:i,strategies:Tt(e,n,i)}},Nt=t=>encodeURIComponent(t),Pt=(t,e,n)=>{const i=Nt(t);switch(typeof e){case"string":case"number":default:return`${i}=${Nt(e)}`;case"boolean":return n.strategies.boolean.encode(i,e);case"object":return null===e?n.strategies.null.encode(i):Array.isArray(e)?n.strategies.array.encodeArray(i,e):`${i}=${Nt(e)}`}};function At(t,e,n,i,s){const r=t.indexOf("=",e),a=-1!==r&&r<n,o=t.slice(e,a?r:n),{name:c,hasBrackets:u}=function(t){const e=t.indexOf("[");return-1===e?{name:t,hasBrackets:!1}:{name:t.slice(0,e),hasBrackets:!0}}(o);var l,h,d,f,p;!function(t,e,n,i){const s=t[e];void 0===s?t[e]=i?[n]:n:Array.isArray(s)?s.push(n):t[e]=[s,n]}(i,mt(c),(l=t,h=r,d=n,f=a,p=s,p?((t,e)=>{if(void 0===t)return e.boolean.decodeUndefined();const n=e.boolean.decodeRaw(t);if(null!==n)return n;const i=mt(t);return e.boolean.decodeValue(i)})(f?l.slice(h+1,d):void 0,p):f?mt(l.slice(h+1,d)):null),u)}function Ot(t,e){const n=t.path,i=n.startsWith("~"),s=i?n.slice(1):n,r={name:t.name,path:s,absolute:i,children:[],parent:e,nonAbsoluteChildren:[],fullName:""};if(t.children)for(const e of t.children){const t=Ot(e,r);r.children.push(t)}return r}function Et(t,e){return t.endsWith("/")&&e.startsWith("/")?t+e.slice(1):t+e}function Rt(t){const e=new Map;for(const n of t)e.set(n.name,n);return e}function Ct(t,e,n){const i=function(t){const e=[],n=[],i=[],s={},r=new Map,a=t.replaceAll(Y,"$1"),o=X.exec(a);if(null!==o){const e=o[1].split("&");for(const t of e){const e=t.trim();e.length>0&&(n.push(e),s[e]="query")}t=t.slice(0,o.index)}let c;for(;null!==(c=J.exec(t));){const t=c[2],n=c[3];if("*"===c[1])i.push(t),e.push(t),s[t]="url";else if(e.push(t),s[t]="url",n){const e=`^${H(n)}$`;r.set(t,{pattern:new RegExp(e),constraint:n})}}return{urlParams:e,queryParams:n,spatParams:i,paramTypeMap:s,constraintPatterns:r,pathPattern:t}}(t.path),s=function(t){const e={};for(const n of t.urlParams)e[n]="url";for(const n of t.queryParams)e[n]="query";return e}(i),r={name:t.name,path:t.path,absolute:t.absolute,parent:e,children:void 0,paramMeta:i,nonAbsoluteChildren:void 0,fullName:"",staticPath:null,paramTypeMap:s};var a;r.fullName=(a=r,a.parent?.name?`${a.parent.fullName}.${a.name}`:a.name);const{childrenMap:o,nonAbsoluteChildren:c}=function(t,e,n){const i=[],s=[];for(const r of t){const t=Ct(r,e,n);i.push(t),t.absolute||s.push(t)}return{childrenMap:Rt(i),nonAbsoluteChildren:s}}(t.children,r,n);return r.children=o,r.nonAbsoluteChildren=c,r.staticPath=function(t){if(!t.path)return null;const{urlParams:e,queryParams:n,spatParams:i}=t.paramMeta;if(e.length>0||n.length>0||i.length>0)return null;const s=[];let r=t.parent;for(;r?.path;)s.unshift(r),r=r.parent;let a="";for(const t of s){const{urlParams:e,queryParams:n,spatParams:i}=t.paramMeta;if(e.length>0||n.length>0||i.length>0)return null;a=t.absolute?t.path:Et(a,t.path)}return t.absolute?t.path:Et(a,t.path)}(r),n&&(Object.freeze(c),Object.freeze(s),Object.freeze(r.children),Object.freeze(r)),r}function Dt(t,e,n,i){return function(t,e){const n=[];return{add(t){return n.push(t),this},addMany(t){return n.push(...t),this},build:i=>function(t,e=!0){return Ct(t,null,e)}(function(t,e,n){const i=Ot({name:t,path:e},null);for(const t of n){const e=Ot(t,i);i.children.push(e)}return i}(t,e,n),!i?.skipFreeze)}}(t,e).addMany(n).build(i)}function Ft(t){const e={name:t.name,path:t.absolute?`~${t.path}`:t.path};return t.children.size>0&&(e.children=[...t.children.values()].map(t=>Ft(t))),e}function jt(t){return[...t.children.values()].map(t=>Ft(t))}function Lt(t){const e=t?.queryParams;return new pt({...void 0===t?.caseSensitive?void 0:{caseSensitive:t.caseSensitive},...void 0===t?.strictTrailingSlash?void 0:{strictTrailingSlash:t.strictTrailingSlash},...void 0===t?.strictQueryParams?void 0:{strictQueryParams:t.strictQueryParams},...void 0===t?.urlParamsEncoding?void 0:{urlParamsEncoding:t.urlParamsEncoding},parseQueryString:t=>((t,e)=>{const n=(t=>{const e=t.indexOf("?");return-1===e?t:t.slice(e+1)})(t);if(""===n||"?"===n)return{};if(!e)return function(t){const e={};return function(t,e){let n=0;const i=t.length;for(;n<i;){let s=t.indexOf("&",n);-1===s&&(s=i),At(t,n,s,e),n=s+1}}(t,e),e}(n);const i=bt(e),s={};let r=0;const a=n.length;for(;r<a;){let t=n.indexOf("&",r);-1===t&&(t=a),At(n,r,t,s,i.strategies),r=t+1}return s})(t,e),buildQueryString:t=>((t,e)=>{const n=Object.keys(t);if(0===n.length)return"";const i=bt(e),s=[];for(const e of n){const n=t[e];if(void 0===n)continue;const r=Pt(e,n,i);r&&s.push(r)}return s.join("&")})(t,e)})}function It(t,e,n){const i=Dt("",e,t),s=Lt(n);return s.registerTree(i),{tree:i,matcher:s}}function Mt(t){const e=It(t.definitions,t.rootPath,t.matcherOptions);t.tree=e.tree,t.matcher=e.matcher,t.resolvedForwardMap=_t(t.config)}function Ut(t){const e=It(t.definitions,t.rootPath,t.matcherOptions);t.tree=e.tree,t.matcher=e.matcher}function $t(t){Bt(t),Ut(t)}function Bt(t){t.definitions.length=0,Object.assign(t.config,W()),t.resolvedForwardMap=Object.create(null),t.routeCustomFields=Object.create(null)}function _t(t){const e=Object.create(null);for(const n of Object.keys(t.forwardMap))e[n]=m(n,t.forwardMap);return e}function kt(t,e,n,i,s,r,a){const o=new Set(["name","path","children","canActivate","canDeactivate","forwardTo","encodeParams","decodeParams","defaultParams"]),c=Object.fromEntries(Object.entries(t).filter(([t])=>!o.has(t)));Object.keys(c).length>0&&(i[e]=c),t.canActivate&&(a?a.addActivateGuard(e,t.canActivate):s.set(e,t.canActivate)),t.canDeactivate&&(a?a.addDeactivateGuard(e,t.canDeactivate):r.set(e,t.canDeactivate)),t.forwardTo&&function(t,e,n){if(t.canActivate&&f.warn("real-router",`Route "${e}" has both forwardTo and canActivate. canActivate will be ignored because forwardTo creates a redirect (industry standard). Move canActivate to the target route "${"string"==typeof t.forwardTo?t.forwardTo:"[dynamic]"}".`),t.canDeactivate&&f.warn("real-router",`Route "${e}" has both forwardTo and canDeactivate. canDeactivate will be ignored because forwardTo creates a redirect (industry standard). Move canDeactivate to the target route "${"string"==typeof t.forwardTo?t.forwardTo:"[dynamic]"}".`),"function"==typeof t.forwardTo){const n="AsyncFunction"===t.forwardTo.constructor.name,i=t.forwardTo.toString().includes("__awaiter");if(n||i)throw new TypeError(`forwardTo callback cannot be async for route "${e}". Async functions break matchPath/buildPath.`)}"string"==typeof t.forwardTo?n.forwardMap[e]=t.forwardTo:n.forwardFnMap[e]=t.forwardTo}(t,e,n),t.decodeParams&&(n.decoders[e]=e=>t.decodeParams?.(e)??e),t.encodeParams&&(n.encoders[e]=e=>t.encodeParams?.(e)??e),t.defaultParams&&(n.defaultParams[e]=t.defaultParams)}function xt(t,e,n,i,s,r,a=""){for(const o of t){const t=a?`${a}.${o.name}`:o.name;kt(o,t,e,n,i,s,r),o.children&&xt(o.children,e,n,i,s,r,t)}}var zt=".",qt=[];function Gt(t){const e=[];for(let n=t.length-1;n>=0;n--)e.push(t[n]);return e}function Wt(t){const e=typeof t;return"string"===e||"number"===e||"boolean"===e}function Qt(t,e,n){const i=e.meta?.params[t];if(!i||"object"!=typeof i)return!0;for(const t of Object.keys(i)){const i=e.params[t],s=n.params[t];if(Wt(i)&&Wt(s)&&String(i)!==String(s))return!1}return!0}Object.freeze(qt);var Vt,Kt,Ht=new Map;function Jt(t){const e=Ht.get(t);if(e)return e;const n=function(t){if(!t)return[""];const e=t.indexOf(zt);if(-1===e)return[t];const n=t.indexOf(zt,e+1);if(-1===n)return[t.slice(0,e),t];const i=t.indexOf(zt,n+1);if(-1===i)return[t.slice(0,e),t.slice(0,n),t];return-1===t.indexOf(zt,i+1)?[t.slice(0,e),t.slice(0,n),t.slice(0,i),t]:function(t){const e=t.split(zt),n=e.length,i=[e[0]];let s=e[0].length;for(let r=1;r<n-1;r++)s+=1+e[r].length,i.push(t.slice(0,s));return i.push(t),i}(t)}(t);return Object.freeze(n),Ht.set(t,n),n}var Yt,Xt,Zt=null,te=null;function ee(t,e){if(!e)return{intersection:"",toActivate:Jt(t.name),toDeactivate:qt};if(void 0===t.meta?.params&&void 0===e.meta?.params)return{intersection:"",toActivate:Jt(t.name),toDeactivate:Gt(Jt(e.name))};const n=Jt(t.name),i=Jt(e.name),s=function(t,e,n,i,s){for(let r=0;r<s;r++){const s=n[r];if(s!==i[r])return r;if(!Qt(s,t,e))return r}return s}(t,e,n,i,Math.min(i.length,n.length));let r;if(s>=i.length)r=qt;else if(0===s&&1===i.length)r=i;else{r=[];for(let t=i.length-1;t>=s;t--)r.push(i[t])}const a=0===s?n:n.slice(s);return{intersection:s>0?i[s-1]:"",toDeactivate:r,toActivate:a}}function ne(t,e,n){if(n)return ee(t,e);if(null!==Zt&&t===Vt&&e===Kt)return Zt;if(null!==te&&t===Yt&&e===Xt)return te;const i=ee(t,e);return Yt=Vt,Xt=Kt,te=Zt,Vt=t,Kt=e,Zt=i,i}function ie(t,e){var n;return{name:e??(n=t.segments,n.at(-1)?.fullName??""),params:t.params,meta:t.meta}}var se=class{#z;#q;get#f(){return this.#z.depsStore}constructor(t=[],e){this.#z=function(t,e){const n=[],i=W(),s=Object.create(null),r=new Map,a=new Map;for(const e of t)n.push(Q(e));const{tree:o,matcher:c}=It(n,"",e);return xt(t,i,s,r,a,void 0,""),{definitions:n,config:i,tree:o,matcher:c,resolvedForwardMap:_t(i),routeCustomFields:s,rootPath:"",matcherOptions:e,depsStore:void 0,lifecycleNamespace:void 0,pendingCanActivate:r,pendingCanDeactivate:a,treeOperations:{commitTreeChanges:Mt,resetStore:$t,nodeToDefinition:Ft}}}(t,e)}static shouldUpdateNode(t){return(e,n)=>{if(!e||"object"!=typeof e||!("name"in e))throw new TypeError("[router.shouldUpdateNode] toState must be valid State object");if(e.transition?.reload)return!0;if(""===t&&!n)return!0;const{intersection:i,toActivate:s,toDeactivate:r}=ne(e,n);return t===i||!!s.includes(t)||r.includes(t)}}setDependencies(t){this.#z.depsStore=t;for(const[e,n]of this.#z.pendingCanActivate)t.addActivateGuard(e,n);this.#z.pendingCanActivate.clear();for(const[e,n]of this.#z.pendingCanDeactivate)t.addDeactivateGuard(e,n);this.#z.pendingCanDeactivate.clear()}setLifecycleNamespace(t){this.#z.lifecycleNamespace=t}setRootPath(t){this.#z.rootPath=t,Ut(this.#z)}hasRoute(t){return this.#z.matcher.hasRoute(t)}clearRoutes(){$t(this.#z)}buildPath(t,e,n){if(t===s.UNKNOWN_ROUTE)return"string"==typeof e?.path?e.path:"";const i=Object.hasOwn(this.#z.config.defaultParams,t)?{...this.#z.config.defaultParams[t],...e}:e??{},r="function"==typeof this.#z.config.encoders[t]?this.#z.config.encoders[t]({...i}):i;return this.#z.matcher.buildPath(t,r,this.#G(n))}matchPath(t,e){const n=e,i=this.#z.matcher.match(t);if(!i)return;const s=ie(i),{name:r,params:a,meta:o}=s,c="function"==typeof this.#z.config.decoders[r]?this.#z.config.decoders[r](a):a,{name:u,params:l}=this.#f.forwardState(r,c);let h=t;if(n.rewritePathOnMatch){const t="function"==typeof this.#z.config.encoders[u]?this.#z.config.encoders[u]({...l}):l,e=n.trailingSlash;h=this.#z.matcher.buildPath(u,t,{trailingSlash:"never"===e||"always"===e?e:void 0,queryParamsMode:n.queryParamsMode})}return this.#f.makeState(u,l,h,o)}forwardState(t,e){if(Object.hasOwn(this.#z.config.forwardFnMap,t)){const n=this.#W(t,e),i=this.#z.config.forwardFnMap[t],s=this.#Q(t,i,e);return{name:s,params:this.#W(s,n)}}const n=this.#z.resolvedForwardMap[t]??t;if(n!==t&&Object.hasOwn(this.#z.config.forwardFnMap,n)){const i=this.#W(t,e),s=this.#z.config.forwardFnMap[n],r=this.#Q(n,s,e);return{name:r,params:this.#W(r,i)}}if(n!==t){const i=this.#W(t,e);return{name:n,params:this.#W(n,i)}}return{name:t,params:this.#W(t,e)}}buildStateResolved(t,e){const n=this.#z.matcher.getSegmentsByName(t);if(n)return ie({segments:n,params:e,meta:this.#z.matcher.getMetaByName(t)},t)}isActiveRoute(t,e={},n=!1,i=!0){const s=this.#f.getState();if(!s)return!1;const r=s.name;if(r!==t&&!r.startsWith(`${t}.`)&&!t.startsWith(`${r}.`))return!1;const a=this.#z.config.defaultParams[t];if(n||r===t){const n=a?{...a,...e}:e;return this.#f.areStatesEqual({name:t,params:n,path:""},s,i)}const o=s.params;return!!function(t,e){for(const n in t)if(t[n]!==e[n])return!1;return!0}(e,o)&&(!a||function(t,e,n){for(const i in t)if(!(i in n)&&t[i]!==e[i])return!1;return!0}(a,o,e))}getMetaForState(t){return this.#z.matcher.hasRoute(t)?this.#z.matcher.getMetaByName(t):void 0}getUrlParams(t){const e=this.#z.matcher.getSegmentsByName(t);return e?function(t){const e=[];for(const n of t)for(const t of n.paramMeta.urlParams)e.push(t);return e}(e):[]}getStore(){return this.#z}#W(t,e){return Object.hasOwn(this.#z.config.defaultParams,t)?{...this.#z.config.defaultParams[t],...e}:e}#G(t){if(this.#q)return this.#q;const e=t?.trailingSlash;return this.#q=Object.freeze({trailingSlash:"never"===e||"always"===e?e:void 0,queryParamsMode:t?.queryParamsMode}),this.#q}#Q(t,e,n){const i=new Set([t]);let s=e(this.#f.getDependency,n),r=0;if("string"!=typeof s)throw new TypeError("forwardTo callback must return a string, got "+typeof s);for(;r<100;){if(void 0===this.#z.matcher.getSegmentsByName(s))throw new Error(`Route "${s}" does not exist`);if(i.has(s)){const t=[...i,s].join(" → ");throw new Error(`Circular forwardTo detected: ${t}`)}if(i.add(s),Object.hasOwn(this.#z.config.forwardFnMap,s)){s=(0,this.#z.config.forwardFnMap[s])(this.#f.getDependency,n),r++;continue}const t=this.#z.config.forwardMap[s];if(void 0===t)return s;s=t,r++}throw new Error("forwardTo exceeds maximum depth of 100")}},re=new n(i.ROUTER_NOT_STARTED),ae=new n(i.ROUTE_NOT_FOUND),oe=new n(i.SAME_STATES),ce=Promise.reject(re),ue=Promise.reject(ae),le=Promise.reject(oe);function he(t,e){const{toState:r,fromState:a,opts:o,toDeactivate:u,toActivate:l,intersection:h}=e;if(r.name!==s.UNKNOWN_ROUTE&&!t.hasRoute(r.name)){const e=new n(i.ROUTE_NOT_FOUND,{routeName:r.name});throw t.sendTransitionFail(r,a,e),e}if(a)for(const n of u)!l.includes(n)&&e.canDeactivateFunctions.has(n)&&t.clearCanDeactivate(n);r.transition=function(t,e,n,i,s){const r={phase:"activating",reason:"success",segments:{deactivated:n,activated:i,intersection:s}};return void 0!==t?.name&&(r.from=t.name),void 0!==e.reload&&(r.reload=e.reload),void 0!==e.redirected&&(r.redirected=e.redirected),r}(a,o,u,l,h);const d=c(r);t.setState(d);const f=void 0===o.signal?o:function({signal:t,...e}){return e}(o);return t.sendTransitionDone(d,a,f),d}function de(t,e,n,s){e.code!==i.TRANSITION_CANCELLED&&e.code!==i.ROUTE_NOT_FOUND&&t.sendTransitionFail(n,s,e)}function fe(t,e,s){if(t instanceof DOMException&&"AbortError"===t.name)throw new n(i.TRANSITION_CANCELLED);!function(t,e,i){if(t instanceof n)throw t.setCode(e),t;throw new n(e,function(t,e){const n={segment:e};if(t instanceof Error)return{...n,message:t.message,stack:t.stack,..."cause"in t&&void 0!==t.cause&&{cause:t.cause}};if(t&&"object"==typeof t){const e={};for(const[n,i]of Object.entries(t))pe.has(n)||(e[n]=i);return{...n,...e}}return n}(t,i))}(t,e,s)}ce.catch(()=>{}),ue.catch(()=>{}),le.catch(()=>{});var pe=new Set(["code","segment","path","redirect"]);async function me(t,e,i){let s;try{s=await t}catch(t){return void fe(t,e,i)}if(!s)throw new n(e,{segment:i})}async function ge(t,e,s,r,a,o,c,u,l,h){await me(l,s,h);for(let l=u;l<e.length;l++){if(!c())throw new n(i.TRANSITION_CANCELLED);const u=e[l],h=t.get(u);if(!h)continue;let d=!1;try{d=h(r,a,o)}catch(t){fe(t,s,u)}if(d instanceof Promise)await me(d,s,u);else if(!d)throw new n(s,{segment:u})}}function ve(t,e,s,r,a,o,c){for(const[u,l]of e.entries()){if(!c())throw new n(i.TRANSITION_CANCELLED);const h=t.get(l);if(!h)continue;let d=!1;try{d=h(r,a,o)}catch(t){fe(t,s,l)}if(d instanceof Promise)return ge(t,e,s,r,a,o,c,u+1,d,l);if(!d)throw new n(s,{segment:l})}}var Se=[s.UNKNOWN_ROUTE];Object.freeze(Se);var ye={replace:!0};Object.freeze(ye);var Te=class{lastSyncResolved=!1;lastSyncRejected=!1;#f;#V=null;#K=0;setDependencies(t){this.#f=t}navigate(t,e,r){this.lastSyncResolved=!1;const a=this.#f;if(!a.canNavigate())return this.lastSyncRejected=!0,ce;let o,c,u=!1,l=null;try{if(o=a.buildNavigateState(t,e),!o)return a.emitTransitionError(void 0,a.getState(),ae),this.lastSyncRejected=!0,ue;if(c=a.getState(),r=function(t,e){return e?.name!==s.UNKNOWN_ROUTE||t.replace?t:{...t,replace:!0}}(r,c),function(t,e,n,i){return!!t&&!e.reload&&!e.force&&i(t,n,!1)}(c,r,o,a.areStatesEqual))return a.emitTransitionError(o,c,oe),this.lastSyncRejected=!0,le;if(this.#H(),r.signal?.aborted)throw new n(i.TRANSITION_CANCELLED,{reason:r.signal.reason});const h=++this.#K;if(a.startTransition(o,c),u=!0,this.#K!==h)throw new n(i.TRANSITION_CANCELLED);const[d,f]=a.getLifecycleFunctions(),p=o.name===s.UNKNOWN_ROUTE,{toDeactivate:m,toActivate:g,intersection:v}=ne(o,c,r.reload),S=c&&!r.forceDeactivate&&m.length>0,y=!p&&g.length>0;if(d.size>0||f.size>0){l=new AbortController,this.#V=l;const t=()=>this.#K===h&&a.isActive(),e=function(t,e,s,r,a,o,c,u,l,h){if(a){const a=ve(t,s,i.CANNOT_DEACTIVATE,c,u,l,h);if(void 0!==a)return async function(t,e,s,r,a,o,c,u){if(await t,!u())throw new n(i.TRANSITION_CANCELLED);if(r){const t=ve(e,s,i.CANNOT_ACTIVATE,a,o,c,u);if(void 0!==t&&await t,!u())throw new n(i.TRANSITION_CANCELLED)}}(a,e,r,o,c,u,l,h)}if(!h())throw new n(i.TRANSITION_CANCELLED);if(o)return ve(e,r,i.CANNOT_ACTIVATE,c,u,l,h)}(d,f,m,g,!!S,y,o,c,l.signal,t);if(void 0!==e)return this.#J(e,{toState:o,fromState:c,opts:r,toDeactivate:m,toActivate:g,intersection:v,canDeactivateFunctions:d},l,h);if(!t())throw new n(i.TRANSITION_CANCELLED);this.#Y(l)}return this.lastSyncResolved=!0,Promise.resolve(he(a,{toState:o,fromState:c,opts:r,toDeactivate:m,toActivate:g,intersection:v,canDeactivateFunctions:d}))}catch(t){return this.#X(t,l,u,o,c),Promise.reject(t)}}navigateToDefault(t){const e=this.#f;if(!e.getOptions().defaultRoute)return Promise.reject(new n(i.ROUTE_NOT_FOUND,{routeName:"defaultRoute not configured"}));const{route:s,params:r}=e.resolveDefault();return s?this.navigate(s,r,t):Promise.reject(new n(i.ROUTE_NOT_FOUND,{routeName:"defaultRoute resolved to empty"}))}navigateToNotFound(t){this.#H();const e=this.#f.getState(),n=e?Jt(e.name).toReversed():[];Object.freeze(n);const i={deactivated:n,activated:Se,intersection:""};Object.freeze(i);const r={phase:"activating",...e&&{from:e.name},reason:"success",segments:i};Object.freeze(r);const a={name:s.UNKNOWN_ROUTE,params:{},path:t,transition:r};return Object.freeze(a),this.#f.setState(a),this.#f.emitTransitionSuccess(a,e,ye),a}abortCurrentNavigation(){this.#V?.abort(new n(i.TRANSITION_CANCELLED)),this.#V=null}async#J(t,e,s,r){const a=this.#f,o=()=>this.#K===r&&!s.signal.aborted&&a.isActive();try{if(e.opts.signal){if(e.opts.signal.aborted)throw new n(i.TRANSITION_CANCELLED,{reason:e.opts.signal.reason});e.opts.signal.addEventListener("abort",()=>{s.abort(e.opts.signal?.reason)},{once:!0,signal:s.signal})}if(await t,!o())throw new n(i.TRANSITION_CANCELLED);return he(a,e)}catch(t){throw de(a,t,e.toState,e.fromState),t}finally{this.#Y(s)}}#X(t,e,n,i,s){e&&this.#Y(e),n&&i&&de(this.#f,t,i,s)}#Y(t){t.abort(),this.#V===t&&(this.#V=null)}#H(){this.#f.isTransitioning()&&(f.warn("router.navigate","Concurrent navigation detected on shared router instance. For SSR, use cloneRouter() to create isolated instance per request."),this.#V?.abort(new n(i.TRANSITION_CANCELLED)),this.#f.cancelNavigation())}},we={replace:!0};Object.freeze(we);var be=class{#f;setDependencies(t){this.#f=t}async start(t){const e=this.#f,s=e.getOptions(),r=e.matchPath(t);if(!r&&!s.allowNotFound){const s=new n(i.ROUTE_NOT_FOUND,{path:t});throw e.emitTransitionError(void 0,void 0,s),s}return e.completeStart(),r?e.navigate(r.name,r.params,we):e.navigateToNotFound(t)}stop(){this.#f.clearState()}},Ne=class{#Z;#tt;#et;#nt;#it;#st;constructor(t){this.#Z=t.routerFSM,this.#tt=t.emitter,this.#et=void 0,this.#rt()}static validateSubscribeListener(t){if("function"!=typeof t)throw new TypeError("[router.subscribe] Expected a function. For Observable pattern use @real-router/rx package")}emitRouterStart(){this.#tt.emit(e.ROUTER_START)}emitRouterStop(){this.#tt.emit(e.ROUTER_STOP)}emitTransitionStart(t,n){this.#tt.emit(e.TRANSITION_START,t,n)}emitTransitionSuccess(t,n,i){this.#tt.emit(e.TRANSITION_SUCCESS,t,n,i)}emitTransitionError(t,n,i){this.#tt.emit(e.TRANSITION_ERROR,t,n,i)}emitTransitionCancel(t,n){this.#tt.emit(e.TRANSITION_CANCEL,t,n)}sendStart(){this.#Z.send(P)}sendStop(){this.#Z.send(D)}sendDispose(){this.#Z.send(F)}sendStarted(){this.#Z.send(A)}sendNavigate(t,e){this.#et=t,this.#Z.forceState(b),this.emitTransitionStart(t,e)}sendComplete(t,e,n={}){this.#Z.forceState(w),this.emitTransitionSuccess(t,e,n),this.#et===t&&(this.#et=void 0)}sendFail(t,e,n){const i=this.#et;this.#nt=t,this.#it=e,this.#st=n,this.#Z.send(R),this.#et===i&&(this.#et=void 0)}sendFailSafe(t,e,n){this.isReady()?this.sendFail(t,e,n):this.emitTransitionError(t,e,n)}sendCancel(t,e){const n=this.#et;this.#nt=t,this.#it=e,this.#Z.send(C),this.#et===n&&(this.#et=void 0)}canBeginTransition(){return this.#Z.canSend(O)}canStart(){return this.#Z.canSend(P)}canCancel(){return this.#Z.canSend(C)}isActive(){const t=this.#Z.getState();return t!==y&&t!==N}isDisposed(){return this.#Z.getState()===N}isTransitioning(){return this.#Z.getState()===b}isReady(){return this.#Z.getState()===w}getCurrentToState(){return this.#et}addEventListener(t,e){return this.#tt.on(t,e)}subscribe(t){return this.#tt.on(e.TRANSITION_SUCCESS,(e,n)=>{t({route:e,previousRoute:n})})}clearAll(){this.#tt.clearAll()}setLimits(t){this.#tt.setLimits(t)}sendCancelIfTransitioning(t){this.canCancel()&&this.sendCancel(this.#et,t)}#at(){this.emitTransitionError(this.#nt,this.#it,this.#st)}#rt(){const t=this.#Z;t.on(T,A,()=>{this.emitRouterStart()}),t.on(w,D,()=>{this.emitRouterStop()}),t.on(b,C,()=>{const t=this.#nt;void 0!==t&&this.emitTransitionCancel(t,this.#it)}),t.on(T,R,()=>{this.#at()}),t.on(w,R,()=>{this.#at()}),t.on(b,R,()=>{this.#at()})}},Pe=new n(i.ROUTER_ALREADY_STARTED),Ae=new Set(["all","warn-error","error-only"]);var Oe=class{router;options;limits;dependenciesStore;state;routes;routeLifecycle;plugins;navigation;lifecycle;eventBus;constructor(t){this.router=t.router,this.options=t.options,this.limits=t.limits,this.dependenciesStore=t.dependenciesStore,this.state=t.state,this.routes=t.routes,this.routeLifecycle=t.routeLifecycle,this.plugins=t.plugins,this.navigation=t.navigation,this.lifecycle=t.lifecycle,this.eventBus=t.eventBus}wireLimits(){this.dependenciesStore.limits=this.limits,this.plugins.setLimits(this.limits),this.eventBus.setLimits({maxListeners:this.limits.maxListeners,warnListeners:this.limits.warnListeners,maxEventDepth:this.limits.maxEventDepth}),this.routeLifecycle.setLimits(this.limits)}wireRouteLifecycleDeps(){const t={compileFactory:this.createCompileFactory()};this.routeLifecycle.setDependencies(t),this.routeLifecycle.setValidatorGetter(()=>{try{return d(this.router).validator}catch{return null}})}wireRoutesDeps(){this.routes.setDependencies({addActivateGuard:(t,e)=>{this.routeLifecycle.addCanActivate(t,e,!0)},addDeactivateGuard:(t,e)=>{this.routeLifecycle.addCanDeactivate(t,e,!0)},makeState:(t,e,n,i)=>this.state.makeState(t,e,n,i),getState:()=>this.state.get(),areStatesEqual:(t,e,n)=>this.state.areStatesEqual(t,e,n),getDependency:t=>this.dependenciesStore.dependencies[t],forwardState:(t,e)=>{const n=d(this.router);return n.validator?.routes.validateStateBuilderArgs(t,e,"forwardState"),n.forwardState(t,e)}}),this.routes.setLifecycleNamespace(this.routeLifecycle)}wirePluginsDeps(){const t={addEventListener:(t,e)=>this.eventBus.addEventListener(t,e),canNavigate:()=>this.eventBus.canBeginTransition(),compileFactory:this.createCompileFactory()};this.plugins.setDependencies(t),this.plugins.setValidatorGetter(()=>{try{return d(this.router).validator}catch{return null}})}wireNavigationDeps(){this.navigation.setDependencies({getOptions:()=>this.options.get(),hasRoute:t=>this.routes.hasRoute(t),getState:()=>this.state.get(),setState:t=>{this.state.set(t)},buildNavigateState:(t,e)=>{const n=d(this.router);n.validator?.routes.validateStateBuilderArgs(t,e,"navigate");const{name:i,params:s}=n.forwardState(t,e),r=this.routes.getMetaForState(i);if(void 0===r)return;const a=n.buildPath(i,s);return this.state.makeState(i,s,a,r,void 0,!0)},areStatesEqual:(t,e,n)=>this.state.areStatesEqual(t,e,n),resolveDefault:()=>{const t=this.options.get();return{route:U(t.defaultRoute,t=>this.dependenciesStore.dependencies[t]),params:U(t.defaultParams,t=>this.dependenciesStore.dependencies[t])}},startTransition:(t,e)=>{this.eventBus.sendNavigate(t,e)},cancelNavigation:()=>{const t=this.eventBus.getCurrentToState();void 0!==t&&this.eventBus.sendCancel(t,this.state.get())},sendTransitionDone:(t,e,n)=>{this.eventBus.sendComplete(t,e,n)},sendTransitionFail:(t,e,n)=>{this.eventBus.sendFail(t,e,n)},emitTransitionError:(t,e,n)=>{this.eventBus.sendFailSafe(t,e,n)},emitTransitionSuccess:(t,e,n)=>{this.eventBus.emitTransitionSuccess(t,e,n)},canNavigate:()=>this.eventBus.canBeginTransition(),getLifecycleFunctions:()=>this.routeLifecycle.getFunctions(),isActive:()=>this.router.isActive(),isTransitioning:()=>this.eventBus.isTransitioning(),clearCanDeactivate:t=>{this.routeLifecycle.clearCanDeactivate(t)}})}wireLifecycleDeps(){this.lifecycle.setDependencies({getOptions:()=>this.options.get(),navigate:(t,e,n)=>this.navigation.navigate(t,e,n),navigateToNotFound:t=>this.navigation.navigateToNotFound(t),clearState:()=>{this.state.set(void 0)},matchPath:t=>this.routes.matchPath(t,this.options.get()),completeStart:()=>{this.eventBus.sendStarted()},emitTransitionError:(t,e,n)=>{this.eventBus.sendFail(t,e,n)}})}wireStateDeps(){this.state.setDependencies({getDefaultParams:()=>this.routes.getStore().config.defaultParams,buildPath:(t,e)=>d(this.router).buildPath(t,e),getUrlParams:t=>this.routes.getUrlParams(t)})}createCompileFactory(){const{router:t,dependenciesStore:e}=this;return n=>n(t,t=>e.dependencies[t])}},Ee=Object.freeze({}),Re=class t{#u;#S;#ot;#ct;#ut;#lt;#g;#ht;#dt;#ft;constructor(t=[],e={},n={}){e.logger&&function(t){if("object"!=typeof t||null===t)throw new TypeError("Logger config must be an object");const e=t;for(const t of Object.keys(e))if("level"!==t&&"callback"!==t)throw new TypeError(`Unknown logger config property: "${t}"`);if("level"in e&&void 0!==e.level&&("string"!=typeof(n=e.level)||!Ae.has(n)))throw new TypeError(`Invalid logger level: ${function(t){return"string"==typeof t?`"${t}"`:"object"==typeof t?JSON.stringify(t):String(t)}(e.level)}. Expected: "all" | "warn-error" | "error-only"`);var n;if("callback"in e&&void 0!==e.callback&&"function"!=typeof e.callback)throw new TypeError("Logger callback must be a function, got "+typeof e.callback);return!0}(e.logger)&&(f.configure(e.logger),delete e.logger),$.validateOptionsIsObject(e),function(t){if(!t||"object"!=typeof t||t.constructor!==Object)throw new TypeError("dependencies must be a plain object");for(const e in t)if(Object.getOwnPropertyDescriptor(t,e)?.get)throw new TypeError(`dependencies cannot contain getters: "${e}"`)}(n),t.length>0&&L(t),this.#u=new $(e),this.#S=r(e.limits),this.#ot=function(t={}){const e=Object.create(null);for(const n in t)void 0!==t[n]&&(e[n]=t[n]);return{dependencies:e,limits:o}}(n),this.#ct=new _,this.#ut=new se(t,function(t){return{strictTrailingSlash:"strict"===t.trailingSlash,strictQueryParams:"strict"===t.queryParamsMode,urlParamsEncoding:t.urlParamsEncoding,queryParams:t.queryParams}}(this.#u.get())),this.#lt=new G,this.#g=new q,this.#ht=new Te,this.#dt=new be;const i=new p(j),s=new S({onListenerError:(t,e)=>{f.error("Router",`Error in listener for ${t}:`,e)},onListenerWarn:(t,e)=>{f.warn("router.addEventListener",`Event "${t}" has ${e} listeners — possible memory leak`)}});var c;this.#ft=new Ne({routerFSM:i,emitter:s}),(c=new Oe({router:this,options:this.#u,limits:this.#S,dependenciesStore:this.#ot,state:this.#ct,routes:this.#ut,routeLifecycle:this.#lt,plugins:this.#g,navigation:this.#ht,lifecycle:this.#dt,eventBus:this.#ft})).wireLimits(),c.wireRouteLifecycleDeps(),c.wireRoutesDeps(),c.wirePluginsDeps(),c.wireNavigationDeps(),c.wireLifecycleDeps(),c.wireStateDeps();const d=new Map;u(this,{makeState:(t,e,n,i,s)=>this.#ct.makeState(t,e,n,i,s),forwardState:h("forwardState",(t,e)=>this.#ut.forwardState(t,e),d),buildStateResolved:(t,e)=>this.#ut.buildStateResolved(t,e),matchPath:(t,e)=>this.#ut.matchPath(t,e),getOptions:()=>this.#u.get(),addEventListener:(t,e)=>this.#ft.addEventListener(t,e),buildPath:h("buildPath",(t,e)=>this.#ut.buildPath(t,e??a,this.#u.get()),d),start:l("start",t=>this.#dt.start(t),d),interceptors:d,setRootPath:t=>{this.#ut.setRootPath(t)},getRootPath:()=>this.#ut.getStore().rootPath,getTree:()=>this.#ut.getStore().tree,isDisposed:()=>this.#ft.isDisposed(),validator:null,dependenciesGetStore:()=>this.#ot,cloneOptions:()=>({...this.#u.get()}),cloneDependencies:()=>({...this.#ot.dependencies}),getLifecycleFactories:()=>this.#lt.getFactories(),getPluginFactories:()=>this.#g.getAll(),routeGetStore:()=>this.#ut.getStore(),getStateName:()=>this.#ct.get()?.name,isTransitioning:()=>this.#ft.isTransitioning(),clearState:()=>{this.#ct.set(void 0)},setState:t=>{this.#ct.set(t)},routerExtensions:[]}),this.isActiveRoute=this.isActiveRoute.bind(this),this.buildPath=this.buildPath.bind(this),this.getState=this.getState.bind(this),this.getPreviousState=this.getPreviousState.bind(this),this.areStatesEqual=this.areStatesEqual.bind(this),this.shouldUpdateNode=this.shouldUpdateNode.bind(this),this.isActive=this.isActive.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.dispose=this.dispose.bind(this),this.canNavigateTo=this.canNavigateTo.bind(this),this.usePlugin=this.usePlugin.bind(this),this.navigate=this.navigate.bind(this),this.navigateToDefault=this.navigateToDefault.bind(this),this.navigateToNotFound=this.navigateToNotFound.bind(this),this.subscribe=this.subscribe.bind(this)}isActiveRoute(t,e,n,i){return d(this).validator?.routes.validateIsActiveRouteArgs(t,e,n,i),d(this).validator?.routes.validateRouteName(t,"isActiveRoute"),""===t?(f.warn("real-router",'isActiveRoute("") called with empty string. Root node is not considered a parent of any route.'),!1):this.#ut.isActiveRoute(t,e,n,i)}buildPath(t,e){const n=d(this);return n.validator?.routes.validateBuildPathArgs(t),n.validator?.navigation.validateParams(e,"buildPath"),n.buildPath(t,e)}getState(){return this.#ct.get()}getPreviousState(){return this.#ct.getPrevious()}areStatesEqual(t,e,n=!0){return d(this).validator?.state.validateAreStatesEqualArgs(t,e,n),this.#ct.areStatesEqual(t,e,n)}shouldUpdateNode(t){return d(this).validator?.routes.validateShouldUpdateNodeArgs(t),se.shouldUpdateNode(t)}isActive(){return this.#ft.isActive()}start(e){if(!this.#ft.canStart())return Promise.reject(Pe);d(this).validator?.navigation.validateStartArgs(e),this.#ft.sendStart();const n=d(this).start(e).catch(t=>{throw this.#ft.isReady()&&(this.#dt.stop(),this.#ft.sendStop()),t});return t.#pt(n),n}stop(){return this.#ht.abortCurrentNavigation(),this.#ft.sendCancelIfTransitioning(this.#ct.get()),this.#ft.isReady()||this.#ft.isTransitioning()?(this.#dt.stop(),this.#ft.sendStop(),this):this}dispose(){if(this.#ft.isDisposed())return;this.#ht.abortCurrentNavigation(),this.#ft.sendCancelIfTransitioning(this.#ct.get()),(this.#ft.isReady()||this.#ft.isTransitioning())&&(this.#dt.stop(),this.#ft.sendStop()),this.#ft.sendDispose(),this.#ft.clearAll(),this.#g.disposeAll();const t=d(this);for(const e of t.routerExtensions)for(const t of e.keys)delete this[t];t.routerExtensions.length=0,this.#ut.clearRoutes(),this.#lt.clearAll(),this.#ct.reset(),this.#ot.dependencies=Object.create(null),this.#mt()}canNavigateTo(t,e){const n=d(this);if(n.validator?.routes.validateRouteName(t,"canNavigateTo"),n.validator?.navigation.validateParams(e,"canNavigateTo"),!this.#ut.hasRoute(t))return!1;const{name:i,params:s}=n.forwardState(t,e??{}),r=this.#ct.makeState(i,s),a=this.#ct.get(),{toDeactivate:o,toActivate:c}=ne(r,a);return this.#lt.canNavigateTo(o,c,r,a)}usePlugin(...t){const e=t.filter(Boolean);if(0===e.length)return()=>{};const n=d(this);n.validator?.plugins.validatePluginLimit(this.#g.count(),this.#S);for(const t of e)n.validator?.plugins.validateNoDuplicatePlugins(t,this.#g.getAll());return this.#g.use(...e)}subscribe(t){return Ne.validateSubscribeListener(t),this.#ft.subscribe(t)}navigate(e,n,i){const s=d(this);s.validator?.navigation.validateNavigateArgs(e),s.validator?.navigation.validateParams(n,"navigate");const r=i??Ee;s.validator?.navigation.validateNavigationOptions(r,"navigate");const o=this.#ht.navigate(e,n??a,r);return this.#ht.lastSyncResolved?this.#ht.lastSyncResolved=!1:this.#ht.lastSyncRejected?this.#ht.lastSyncRejected=!1:t.#pt(o),o}navigateToDefault(e){const n=d(this);n.validator?.navigation.validateNavigateToDefaultArgs(e);const i=e??Ee;n.validator?.navigation.validateNavigationOptions(i,"navigateToDefault");const s=this.#ht.navigateToDefault(i);return this.#ht.lastSyncResolved?this.#ht.lastSyncResolved=!1:this.#ht.lastSyncRejected?this.#ht.lastSyncRejected=!1:t.#pt(s),s}navigateToNotFound(t){if(!this.#ft.isActive())throw new n(i.ROUTER_NOT_STARTED);if(void 0!==t&&"string"!=typeof t)throw new TypeError("[router.navigateToNotFound] path must be a string, got "+typeof t);const e=t??this.#ct.get().path;return this.#ht.navigateToNotFound(e)}static#gt=t=>{t instanceof n&&(t.code===i.SAME_STATES||t.code===i.TRANSITION_CANCELLED||t.code===i.ROUTER_NOT_STARTED||t.code===i.ROUTE_NOT_FOUND)||f.error("router.navigate","Unexpected navigation error",t)};static#pt(e){e.catch(t.#gt)}#mt(){this.navigate=Ce,this.navigateToDefault=Ce,this.navigateToNotFound=Ce,this.start=Ce,this.stop=Ce,this.usePlugin=Ce,this.subscribe=Ce,this.canNavigateTo=Ce}};function Ce(){throw new n(i.ROUTER_DISPOSED)}export{Re as Router,K as clearConfigEntries,Bt as clearRouteData,jt as f,L as guardRouteStructure,_t as refreshForwardMap,xt as registerAllRouteHandlers,V as removeFromDefinitions,m as resolveForwardChain,Q as sanitizeRoute};//# sourceMappingURL=chunk-RA5VYM7M.mjs.map
|