@real-router/validation-plugin 0.1.1 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers.ts","../../src/validators/dependencies.ts","../../src/validators/eventBus.ts","../../src/validators/lifecycle.ts","../../src/validators/navigation.ts","../../src/validators/options.ts","../../src/validators/plugins.ts","../../src/validators/retrospective.ts","../../src/validators/forwardTo.ts","../../src/validators/routes.ts","../../src/validators/state.ts","../../src/validationPlugin.ts"],"names":["logger","warnOverwrite","coreResolveForwardChain","routeExistsInTree","l","assertNotAsync","b","collectUrlParams","resolveForwardChain"],"mappings":"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","file":"index.mjs","sourcesContent":["// packages/validation-plugin/src/helpers.ts\n\nexport function computeThresholds(limit: number): {\n warn: number;\n error: number;\n} {\n return {\n warn: Math.floor(limit * 0.2),\n error: Math.floor(limit * 0.5),\n };\n}\n","// packages/validation-plugin/src/validators/dependencies.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport { computeThresholds } from \"../helpers\";\n\nconst DEFAULT_MAX_DEPENDENCIES = 100;\n\nexport function validateDependencyName(\n name: unknown,\n methodName: string,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.${methodName}] dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\nexport function validateSetDependencyArgs(\n name: unknown,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.setDependency] dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\nexport function validateDependenciesObject(\n deps: unknown,\n methodName: string,\n): asserts deps is Record<string, unknown> {\n if (!(deps && typeof deps === \"object\" && deps.constructor === Object)) {\n throw new TypeError(\n `[router.${methodName}] Invalid argument: expected plain object, received ${getTypeDescription(deps)}`,\n );\n }\n\n for (const key in deps) {\n if (Object.getOwnPropertyDescriptor(deps, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed: \"${key}\"`,\n );\n }\n }\n}\n\nexport function validateDependencyExists(\n value: unknown,\n dependencyName: string,\n): asserts value is NonNullable<unknown> {\n if (value === undefined) {\n throw new ReferenceError(\n `[router.getDependency] dependency \"${dependencyName}\" not found`,\n );\n }\n}\n\nexport function validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies: number = DEFAULT_MAX_DEPENDENCIES,\n): void {\n if (maxDependencies === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount >= maxDependencies) {\n throw new RangeError(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${totalCount}. This is likely a bug in your code.`,\n );\n }\n}\n\nexport function validateDependencyCount(\n store: unknown,\n methodName: string,\n): void {\n const typedStore = store as {\n dependencies: Record<string, unknown>;\n limits?: { maxDependencies?: number };\n };\n const maxDependencies =\n typedStore.limits?.maxDependencies ?? DEFAULT_MAX_DEPENDENCIES;\n\n if (maxDependencies === 0) {\n return;\n }\n\n const currentCount = Object.keys(typedStore.dependencies).length;\n const { warn, error } = computeThresholds(maxDependencies);\n\n if (currentCount >= maxDependencies) {\n throw new RangeError(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). Current: ${currentCount}.`,\n );\n } else if (currentCount === error) {\n logger.error(\n `router.${methodName}`,\n `${currentCount} dependencies registered! This indicates architectural problems. Hard limit at ${maxDependencies}.`,\n );\n } else if (currentCount === warn) {\n logger.warn(\n `router.${methodName}`,\n `${currentCount} dependencies registered. Consider if all are necessary.`,\n );\n }\n}\n\nexport function 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 ${typeof dependencies}`,\n );\n }\n\n for (const key in dependencies as Record<string, unknown>) {\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 warnOverwrite(name: string, methodName: string): void {\n logger.warn(\n `router.${methodName}`,\n \"Router dependency already exists and is being overwritten:\",\n name,\n );\n}\n\nexport function warnBatchOverwrite(keys: string[], methodName: string): void {\n logger.warn(`router.${methodName}`, \"Overwritten:\", keys.join(\", \"));\n}\n\nexport function warnRemoveNonExistent(name: unknown): void {\n logger.warn(\n \"router.removeDependency\",\n `Attempted to remove non-existent dependency: \"${typeof name === \"string\" ? name : String(name)}\"`,\n );\n}\n","// packages/validation-plugin/src/validators/eventBus.ts\n\nimport type { Plugin } from \"@real-router/core\";\n\n// Local types — mirrors EventName and EventMethodMap from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ninterface EventMethodMap {\n $start: \"onStart\";\n $stop: \"onStop\";\n $$start: \"onTransitionStart\";\n $$cancel: \"onTransitionCancel\";\n $$success: \"onTransitionSuccess\";\n $$error: \"onTransitionError\";\n}\n\ntype EventName = keyof EventMethodMap;\n\n// Local set — mirrors validEventNames from @real-router/core/constants\n// (not exported from @real-router/core public API)\nconst validEventNames = new Set<EventName>([\n \"$start\",\n \"$stop\",\n \"$$start\",\n \"$$cancel\",\n \"$$success\",\n \"$$error\",\n]);\n\nexport function validateEventName(eventName: unknown): void {\n if (!validEventNames.has(eventName as EventName)) {\n throw new TypeError(\n `[router.addEventListener] Invalid event name: ${String(eventName)}. Must be one of: $start, $stop, $$start, $$cancel, $$success, $$error`,\n );\n }\n}\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 `[router.addEventListener] callback must be a function, got ${typeof cb}`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/lifecycle.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isBoolean, getTypeDescription } from \"type-guards\";\n\nimport { computeThresholds } from \"../helpers\";\n\nimport type { GuardFnFactory, DefaultDependencies } from \"@real-router/core\";\n\nconst DEFAULT_MAX_LIFECYCLE_HANDLERS = 200;\n\nexport function validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n): asserts handler is GuardFnFactory<D> | boolean {\n if (!isBoolean(handler) && typeof handler !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Handler must be a boolean or factory function, ` +\n `got ${getTypeDescription(handler)}`,\n );\n }\n}\n\nexport function validateNotRegistering(\n isRegistering: boolean,\n name: string,\n methodName: string,\n): void {\n if (isRegistering) {\n throw new Error(\n `[router.${methodName}] Cannot modify route \"${name}\" during its own registration`,\n );\n }\n}\n\nexport function validateHandlerLimit(\n currentCount: number,\n methodName: string,\n maxLifecycleHandlers: number = DEFAULT_MAX_LIFECYCLE_HANDLERS,\n): void {\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n if (currentCount >= maxLifecycleHandlers) {\n throw new RangeError(\n `[router.${methodName}] Lifecycle handler limit exceeded (${maxLifecycleHandlers}). ` +\n `This indicates too many routes with individual handlers. ` +\n `Consider using plugins for cross-cutting concerns.`,\n );\n }\n}\n\nexport function validateLifecycleCountThresholds(\n count: number,\n methodName: string,\n maxHandlers: number,\n): void {\n if (maxHandlers === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxHandlers);\n\n if (count >= error) {\n logger.error(\n `router.${methodName}`,\n `${count} lifecycle handlers registered! This is excessive. Hard limit at ${maxHandlers}.`,\n );\n } else if (count >= warn) {\n logger.warn(\n `router.${methodName}`,\n `${count} lifecycle handlers registered. Consider consolidating logic.`,\n );\n }\n}\n\nexport function warnOverwrite(\n name: string,\n type: string,\n methodName: string,\n): void {\n logger.warn(\n `router.${methodName}`,\n `Overwriting existing ${type} handler for route \"${name}\"`,\n );\n}\n\nexport function warnAsyncGuardSync(name: string, methodName: string): void {\n logger.warn(\n `router.${methodName}`,\n `Guard for \"${name}\" returned a Promise. Sync check cannot resolve async guards — returning false.`,\n );\n}\n","// packages/validation-plugin/src/validators/navigation.ts\n\nimport { getTypeDescription, isNavigationOptions, isParams } from \"type-guards\";\n\nimport type { NavigationOptions } from \"@real-router/core\";\n\nexport function validateNavigateArgs(name: unknown): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.navigate] Invalid route name: expected string, got ${getTypeDescription(name)}`,\n );\n }\n}\n\nexport function validateNavigateToDefaultArgs(opts: unknown): void {\n if (opts !== undefined && (typeof opts !== \"object\" || opts === null)) {\n throw new TypeError(\n `[router.navigateToDefault] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\nexport function validateNavigationOptions(\n opts: unknown,\n methodName: string,\n): asserts opts is NavigationOptions {\n if (!isNavigationOptions(opts)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\nexport function validateNavigateParams(\n params: unknown,\n methodName: string,\n): void {\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.${methodName}] params must be a plain object, got ${getTypeDescription(params)}`,\n );\n }\n}\n\nexport function validateStartArgs(path: unknown): void {\n // undefined is allowed — browser-plugin injects path via interceptor AFTER facade validation\n if (path !== undefined && typeof path !== \"string\") {\n throw new TypeError(\n `[router.start] path must be a string, got ${getTypeDescription(path)}.`,\n );\n }\n if (typeof path === \"string\" && path !== \"\" && !path.startsWith(\"/\")) {\n throw new TypeError(\n `[router.start] path must start with \"/\", got \"${path}\".`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/options.ts\n\nimport { isObjKey } from \"type-guards\";\n\nconst VALID_OPTION_VALUES = {\n trailingSlash: [\"strict\", \"never\", \"always\", \"preserve\"] as const,\n queryParamsMode: [\"default\", \"strict\", \"loose\"] as const,\n urlParamsEncoding: [\"default\", \"uri\", \"uriComponent\", \"none\"] as const,\n} as const;\n\nconst VALID_QUERY_PARAMS = {\n arrayFormat: [\"none\", \"brackets\", \"index\", \"comma\"] as const,\n booleanFormat: [\"none\", \"string\", \"empty-true\"] as const,\n nullFormat: [\"default\", \"hidden\"] as const,\n} as const;\n\nconst VALID_LOGGER_LEVELS = [\n \"all\",\n \"warn-error\",\n \"error-only\",\n \"none\",\n] as const;\n\nconst KNOWN_OPTIONS = new Set<string>([\n \"defaultRoute\",\n \"defaultParams\",\n \"trailingSlash\",\n \"queryParamsMode\",\n \"queryParams\",\n \"urlParamsEncoding\",\n \"allowNotFound\",\n \"rewritePathOnMatch\",\n \"logger\",\n \"limits\",\n]);\n\n// Local type - mirrors LimitsConfig from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ninterface LimitsConfig {\n maxDependencies: number;\n maxPlugins: number;\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n maxLifecycleHandlers: number;\n}\n\n// Local constant - mirrors LIMIT_BOUNDS from @real-router/core/constants\n// (not exported from @real-router/core public API)\nconst LIMIT_BOUNDS = {\n maxDependencies: { min: 0, max: 10_000 },\n maxPlugins: { min: 0, max: 1000 },\n maxListeners: { min: 0, max: 100_000 },\n warnListeners: { min: 0, max: 100_000 },\n maxEventDepth: { min: 0, max: 100 },\n maxLifecycleHandlers: { min: 0, max: 10_000 },\n} as const;\n\nexport function validateLimitValue(\n limitName: keyof LimitsConfig,\n value: unknown,\n methodName: string,\n): void {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new TypeError(\n `[router.${methodName}] limit \"${limitName}\" must be an integer, got ${String(value)}`,\n );\n }\n\n const bounds = LIMIT_BOUNDS[limitName];\n\n if (value < bounds.min || value > bounds.max) {\n throw new RangeError(\n `[router.${methodName}] limit \"${limitName}\" must be between ${bounds.min} and ${bounds.max}, got ${value}`,\n );\n }\n}\n\nexport function validateLimits(\n limits: unknown,\n methodName: string,\n): asserts limits is Partial<LimitsConfig> {\n if (!limits || typeof limits !== \"object\" || limits.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}] invalid limits: expected plain object, got ${typeof limits}`,\n );\n }\n\n for (const [key, value] of Object.entries(limits)) {\n if (!Object.hasOwn(LIMIT_BOUNDS, key)) {\n throw new TypeError(`[router.${methodName}] unknown limit: \"${key}\"`);\n }\n\n if (value === undefined) {\n continue;\n }\n\n validateLimitValue(key as keyof LimitsConfig, value, methodName);\n }\n}\n\nfunction validateStringEnum(\n value: unknown,\n optionName: string,\n validValues: readonly string[],\n methodName: string,\n): void {\n if (value === undefined) {\n return;\n }\n\n if (typeof value !== \"string\" || !validValues.includes(value)) {\n const validList = validValues.map((val) => `\"${val}\"`).join(\", \");\n const display = typeof value === \"string\" ? value : `(${typeof value})`;\n\n throw new TypeError(\n `[router.${methodName}] Invalid \"${optionName}\": \"${display}\". Must be one of: ${validList}`,\n );\n }\n}\n\nfunction validateDefaultRoute(defaultRoute: unknown, methodName: string): void {\n if (defaultRoute === undefined) {\n return;\n }\n\n if (typeof defaultRoute !== \"string\" && typeof defaultRoute !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Invalid \"defaultRoute\": expected string or function, got ${typeof defaultRoute}`,\n );\n }\n}\n\nfunction validateDefaultParams(\n defaultParams: unknown,\n methodName: string,\n): void {\n if (defaultParams === undefined) {\n return;\n }\n\n if (typeof defaultParams === \"function\") {\n return;\n }\n\n if (\n !defaultParams ||\n typeof defaultParams !== \"object\" ||\n Array.isArray(defaultParams) ||\n defaultParams.constructor !== Object\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"defaultParams\": expected plain object or function, got ${typeof defaultParams}`,\n );\n }\n}\n\nfunction validateQueryParamsOptions(\n queryParams: unknown,\n methodName: string,\n): void {\n if (queryParams === undefined) {\n return;\n }\n\n if (\n !queryParams ||\n typeof queryParams !== \"object\" ||\n Array.isArray(queryParams)\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"queryParams\": expected plain object`,\n );\n }\n\n const qp = queryParams as Record<string, unknown>;\n\n for (const key of Object.keys(qp)) {\n if (!isObjKey(key, VALID_QUERY_PARAMS)) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"queryParams.${key}\": unknown option`,\n );\n }\n\n validateStringEnum(\n qp[key],\n `queryParams.${key}`,\n VALID_QUERY_PARAMS[key],\n methodName,\n );\n }\n}\n\nfunction validateLoggerOption(loggerOpt: unknown, methodName: string): void {\n if (loggerOpt === undefined) {\n return;\n }\n\n if (!loggerOpt || typeof loggerOpt !== \"object\" || Array.isArray(loggerOpt)) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger\": expected plain object`,\n );\n }\n\n const loggerOptions = loggerOpt as Record<string, unknown>;\n\n if (\n loggerOptions.level !== undefined &&\n !VALID_LOGGER_LEVELS.includes(\n loggerOptions.level as (typeof VALID_LOGGER_LEVELS)[number],\n )\n ) {\n const validLevelList = VALID_LOGGER_LEVELS.map((val) => `\"${val}\"`).join(\n \", \",\n );\n const levelDisplay =\n typeof loggerOptions.level === \"string\"\n ? loggerOptions.level\n : `(${typeof loggerOptions.level})`;\n\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.level\": \"${levelDisplay}\". Must be one of: ${validLevelList}`,\n );\n }\n\n if (\n loggerOptions.callback !== undefined &&\n typeof loggerOptions.callback !== \"function\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.callback\": expected function`,\n );\n }\n\n if (\n loggerOptions.callbackIgnoresLevel !== undefined &&\n typeof loggerOptions.callbackIgnoresLevel !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.callbackIgnoresLevel\": expected boolean`,\n );\n }\n}\n\nexport function validateOptions(options: unknown, methodName: string): void {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: expected plain object`,\n );\n }\n\n const opts = options as Record<string, unknown>;\n\n for (const key of Object.keys(opts)) {\n if (!KNOWN_OPTIONS.has(key)) {\n throw new TypeError(`[router.${methodName}] Unknown option: \"${key}\"`);\n }\n }\n\n validateDefaultRoute(opts.defaultRoute, methodName);\n validateDefaultParams(opts.defaultParams, methodName);\n validateStringEnum(\n opts.trailingSlash,\n \"trailingSlash\",\n VALID_OPTION_VALUES.trailingSlash,\n methodName,\n );\n validateStringEnum(\n opts.queryParamsMode,\n \"queryParamsMode\",\n VALID_OPTION_VALUES.queryParamsMode,\n methodName,\n );\n validateStringEnum(\n opts.urlParamsEncoding,\n \"urlParamsEncoding\",\n VALID_OPTION_VALUES.urlParamsEncoding,\n methodName,\n );\n\n if (\n opts.allowNotFound !== undefined &&\n typeof opts.allowNotFound !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"allowNotFound\": expected boolean, got ${typeof opts.allowNotFound}`,\n );\n }\n\n if (\n opts.rewritePathOnMatch !== undefined &&\n typeof opts.rewritePathOnMatch !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"rewritePathOnMatch\": expected boolean, got ${typeof opts.rewritePathOnMatch}`,\n );\n }\n\n validateQueryParamsOptions(opts.queryParams, methodName);\n validateLoggerOption(opts.logger, methodName);\n\n if (opts.limits !== undefined) {\n validateLimits(opts.limits, methodName);\n }\n}\n","// packages/validation-plugin/src/validators/plugins.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { computeThresholds } from \"../helpers\";\n\nconst DEFAULT_MAX_PLUGINS = 50;\n\nconst LOGGER_CTX = \"router.usePlugin\";\n\nconst PLUGIN_EVENTS_MAP: Record<string, true> = {\n onStart: true,\n onStop: true,\n onTransitionStart: true,\n onTransitionSuccess: true,\n onTransitionError: true,\n onTransitionCancel: true,\n};\n\nexport function validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins: number = DEFAULT_MAX_PLUGINS,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount > maxPlugins) {\n throw new RangeError(\n `[router.usePlugin] Plugin limit exceeded (${maxPlugins}). ` +\n `Current: ${currentCount}, Attempting to add: ${newCount}. ` +\n `This indicates an architectural problem. Consider consolidating plugins.`,\n );\n }\n}\n\nexport function validateCountThresholds(\n count: number,\n maxPlugins: number,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxPlugins);\n\n if (count >= error) {\n logger.error(\n LOGGER_CTX,\n `${count} plugins registered! This is excessive. Hard limit at ${maxPlugins}.`,\n );\n } else if (count >= warn) {\n logger.warn(\n LOGGER_CTX,\n `${count} plugins registered. Consider if all are necessary.`,\n );\n }\n}\n\nexport function validatePluginKeys(plugin: unknown): void {\n for (const key in plugin as Record<string, unknown>) {\n if (!(key === \"teardown\" || key in PLUGIN_EVENTS_MAP)) {\n throw new TypeError(\n `[router.usePlugin] Unknown property '${key}'. Plugin must only contain event handlers and optional teardown.`,\n );\n }\n }\n}\n\nexport function warnBatchDuplicates(): void {\n logger.warn(\n LOGGER_CTX,\n \"Duplicate factory in batch, will be registered once\",\n );\n}\n\nexport function warnPluginMethodType(methodName: string): void {\n logger.warn(\n LOGGER_CTX,\n `Property '${methodName}' is not a function, skipping`,\n );\n}\n\nexport function warnPluginAfterStart(methodName: string): void {\n if (methodName === \"onStart\") {\n logger.warn(\n LOGGER_CTX,\n \"Router already started, onStart will not be called\",\n );\n }\n}\n\nexport function validateAddInterceptorArgs(method: unknown, fn: unknown): void {\n const validMethods = [\"start\", \"buildPath\", \"forwardState\"];\n\n if (typeof method !== \"string\" || !validMethods.includes(method)) {\n throw new TypeError(\n `[router.addInterceptor] Invalid method: \"${String(method)}\". Must be one of: ${validMethods.join(\", \")}`,\n );\n }\n if (typeof fn !== \"function\") {\n throw new TypeError(\n `[router.addInterceptor] interceptor must be a function, got ${typeof fn}`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/retrospective.ts\n\nimport { resolveForwardChain as coreResolveForwardChain } from \"@real-router/core\";\n\n/**\n * Retrospective validators — run AFTER the route tree is already built.\n * Called by the validation plugin at usePlugin() time, in a try/catch with rollback.\n *\n * The plugin is registered AFTER the constructor, so all routes are already in the store.\n * These functions receive store objects as parameters and cast internally using\n * local structural interfaces to avoid tight coupling to core internal types.\n *\n * All parameters are typed as `unknown` — cast internally as needed.\n */\n\n// =============================================================================\n// Local structural interfaces (cast-only, not imported from core internals)\n// =============================================================================\n\ninterface LocalSegmentParamMeta {\n urlParams: readonly string[];\n spatParams: readonly string[];\n}\n\ninterface LocalRouteSegment {\n paramMeta: LocalSegmentParamMeta;\n}\n\ninterface LocalRouteTree {\n children: Map<string, LocalRouteTree>;\n paramMeta: LocalSegmentParamMeta;\n}\n\ninterface LocalRouteMatcher {\n getSegmentsByName: (\n name: string,\n ) => readonly LocalRouteSegment[] | null | undefined;\n}\n\ninterface LocalRouteConfig {\n forwardMap: Record<string, string>;\n forwardFnMap: Record<string, unknown>;\n defaultParams: Record<string, unknown>;\n decoders: Record<string, unknown>;\n encoders: Record<string, unknown>;\n}\n\ninterface LocalRouteDefinition {\n name: string;\n path: string;\n children?: LocalRouteDefinition[];\n}\n\ninterface LocalRoutesStore {\n definitions: LocalRouteDefinition[];\n config: LocalRouteConfig;\n tree: LocalRouteTree;\n matcher: LocalRouteMatcher;\n}\n\ninterface LocalDependencyLimits {\n maxDependencies: number;\n maxPlugins: number;\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n maxLifecycleHandlers: number;\n}\n\n// =============================================================================\n// Private helpers\n// =============================================================================\n\nfunction assertRoutesStore(store: unknown, fnName: string): LocalRoutesStore {\n if (!store || typeof store !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store must be an object`,\n );\n }\n\n const storeRecord = store as Record<string, unknown>;\n\n if (!Array.isArray(storeRecord.definitions)) {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.definitions must be an array`,\n );\n }\n\n if (!storeRecord.config || typeof storeRecord.config !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.config must be an object`,\n );\n }\n\n if (!storeRecord.tree || typeof storeRecord.tree !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.tree must be an object`,\n );\n }\n\n return storeRecord as unknown as LocalRoutesStore;\n}\n\nfunction walkDefinitions(\n definitions: LocalRouteDefinition[],\n callback: (def: LocalRouteDefinition, fullName: string) => void,\n parentName = \"\",\n): void {\n for (const def of definitions) {\n const fullName = parentName ? `${parentName}.${def.name}` : def.name;\n\n callback(def, fullName);\n\n if (def.children) {\n walkDefinitions(def.children, callback, fullName);\n }\n }\n}\n\nfunction routeExistsInTree(tree: LocalRouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: LocalRouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Wraps core's resolveForwardChain with [validation-plugin] prefix on errors.\n * Core's version throws plain Error messages; retrospective validation\n * needs the [validation-plugin] prefix for consistency.\n */\nfunction resolveForwardChainWithPrefix(\n startRoute: string,\n forwardMap: Record<string, string>,\n): string {\n try {\n return coreResolveForwardChain(startRoute, forwardMap);\n } catch (error) {\n throw new Error(`[validation-plugin] ${(error as Error).message}`, {\n cause: error,\n });\n }\n}\n\nfunction collectUrlParams(segments: readonly LocalRouteSegment[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Asserts that a function value is not async (native or transpiled).\n * Adapted from: assertNotAsync() in RoutesNamespace/validators.ts\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(fn: Function, label: string, routeName: string): void {\n const function_ = fn as {\n constructor: { name: string };\n toString: () => string;\n };\n\n if (\n function_.constructor.name === \"AsyncFunction\" ||\n function_.toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[validation-plugin] Route \"${routeName}\" ${label} cannot be async`,\n );\n }\n}\n\n// =============================================================================\n// 1. validateExistingRoutes\n// =============================================================================\n\n/**\n * Validates the existing route tree/definitions for structural integrity.\n * Walks all route definitions, checks for duplicate names and invalid structure.\n * Adapted from: validateRoutes() in RoutesNamespace/validators.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If store shape is invalid or definitions have structural issues\n * @throws {Error} If duplicate route names are detected\n */\nexport function validateExistingRoutes(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateExistingRoutes\");\n const seenNames = new Set<string>();\n\n walkDefinitions(routesStore.definitions, (def, fullName) => {\n if (typeof def.name !== \"string\" || !def.name) {\n throw new TypeError(\n `[validation-plugin] validateExistingRoutes: route has invalid name: ${def.name}`,\n );\n }\n\n if (typeof def.path !== \"string\") {\n throw new TypeError(\n `[validation-plugin] validateExistingRoutes: route \"${fullName}\" has non-string path (${typeof def.path})`,\n );\n }\n\n if (seenNames.has(fullName)) {\n throw new Error(\n `[validation-plugin] validateExistingRoutes: duplicate route name detected: \"${fullName}\"`,\n );\n }\n\n seenNames.add(fullName);\n });\n}\n\n// =============================================================================\n// 2. validateForwardToConsistency\n// =============================================================================\n\n/**\n * Validates forwardTo consistency across all chains in the store.\n * Checks target existence, param compatibility, and circular chain detection.\n * Adapted from: validateForwardToTargets() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {Error} If any forwardTo target does not exist in the tree\n * @throws {Error} If param incompatibility is detected across a forwardTo pair\n * @throws {Error} If a circular forwardTo chain is detected\n */\nexport function validateForwardToConsistency(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateForwardToConsistency\");\n const { config, tree, matcher } = routesStore;\n\n // Check target existence and param compatibility for each static mapping\n for (const [fromRoute, targetRoute] of Object.entries(config.forwardMap)) {\n if (!routeExistsInTree(tree, targetRoute)) {\n throw new Error(\n `[validation-plugin] validateForwardToConsistency: forwardTo target \"${targetRoute}\" ` +\n `does not exist in tree (source route: \"${fromRoute}\")`,\n );\n }\n\n // Validate param compatibility: target must not require params absent in source\n const sourceSegments = matcher.getSegmentsByName(fromRoute);\n const targetSegments = matcher.getSegmentsByName(targetRoute);\n\n if (sourceSegments && targetSegments) {\n const sourceParams = collectUrlParams(sourceSegments);\n const targetParams = collectUrlParams(targetSegments);\n const missingParams = [...targetParams].filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[validation-plugin] validateForwardToConsistency: forwardTo target \"${targetRoute}\" ` +\n `requires params [${missingParams.join(\", \")}] not available in source route \"${fromRoute}\"`,\n );\n }\n }\n }\n\n // Detect cycles in the full forwardMap (catches multi-hop cycles)\n for (const fromRoute of Object.keys(config.forwardMap)) {\n resolveForwardChainWithPrefix(fromRoute, config.forwardMap);\n }\n}\n\n// =============================================================================\n// 3. validateRouteProperties\n// =============================================================================\n\n/**\n * Validates route properties for all registered routes in the store.\n * Checks decoder/encoder types, defaultParams structure, and async forwardTo callbacks.\n * Adapted from: validateRouteProperties() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If any registered decoder/encoder is not a valid sync function\n * @throws {TypeError} If any defaultParams is not a plain object\n * @throws {TypeError} If any forwardTo callback is async\n */\nexport function validateRoutePropertiesStore(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateRoutePropertiesStore\");\n const { config } = routesStore;\n\n // Validate decoders — must be non-async functions (sync required for matchPath/buildPath)\n for (const [routeName, decoder] of Object.entries(config.decoders)) {\n if (typeof decoder !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" decoder must be a function, got ${typeof decoder}`,\n );\n }\n\n assertNotAsync(decoder, \"decoder\", routeName);\n }\n\n // Validate encoders — must be non-async functions (sync required for matchPath/buildPath)\n for (const [routeName, encoder] of Object.entries(config.encoders)) {\n if (typeof encoder !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" encoder must be a function, got ${typeof encoder}`,\n );\n }\n\n assertNotAsync(encoder, \"encoder\", routeName);\n }\n\n // Validate defaultParams — must be plain objects (not null, array, or other types)\n for (const [routeName, params] of Object.entries(config.defaultParams)) {\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" defaultParams must be a plain object, got ${Array.isArray(params) ? \"array\" : typeof params}`,\n );\n }\n }\n\n // Validate forwardTo function callbacks — must be non-async functions\n for (const [routeName, callback] of Object.entries(config.forwardFnMap)) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" forwardTo callback must be a function, got ${typeof callback}`,\n );\n }\n\n assertNotAsync(callback, \"forwardTo callback\", routeName);\n }\n}\n\n// =============================================================================\n// 4. validateForwardToTargets\n// =============================================================================\n\n/**\n * Validates that all static forwardTo targets exist in the route tree.\n * This is a focused existence-only check (param compat is in validateForwardToConsistency).\n * Adapted from: validateForwardToTargets() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {Error} If any forwardTo target route does not exist in the tree\n */\nexport function validateForwardToTargetsStore(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateForwardToTargetsStore\");\n const { config, tree } = routesStore;\n\n for (const [fromRoute, targetRoute] of Object.entries(config.forwardMap)) {\n if (!routeExistsInTree(tree, targetRoute)) {\n throw new Error(\n `[validation-plugin] validateForwardToTargetsStore: forwardTo target \"${targetRoute}\" ` +\n `does not exist for route \"${fromRoute}\"`,\n );\n }\n }\n}\n\n// =============================================================================\n// 5. validateDependenciesStructure\n// =============================================================================\n\n/**\n * Validates the full structure of the dependencies store.\n * Checks that the dependencies object is valid, has no getters, and limits are well-formed.\n * Adapted from: validateDependenciesObject() in DependenciesNamespace/validators.ts\n *\n * @param deps - DependenciesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If deps is not an object\n * @throws {TypeError} If deps.dependencies is not a valid plain object (or has getters)\n * @throws {TypeError} If deps.limits is missing or has non-numeric limit values\n */\nexport function validateDependenciesStructure(deps: unknown): void {\n if (!deps || typeof deps !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps must be an object\",\n );\n }\n\n const depsRecord = deps as Record<string, unknown>;\n\n // Validate dependencies field exists and is an object\n if (!depsRecord.dependencies || typeof depsRecord.dependencies !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps.dependencies must be an object\",\n );\n }\n\n const dependencies = depsRecord.dependencies as Record<string, unknown>;\n\n // Getters can throw, return different values, or have side effects — reject them\n for (const key of Object.keys(dependencies)) {\n if (Object.getOwnPropertyDescriptor(dependencies, key)?.get) {\n throw new TypeError(\n `[validation-plugin] validateDependenciesStructure: dependency \"${key}\" must not use a getter`,\n );\n }\n }\n\n // Validate limits field exists and is an object\n if (!depsRecord.limits || typeof depsRecord.limits !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps.limits must be an object\",\n );\n }\n\n const limits = depsRecord.limits as Record<string, unknown>;\n const expectedLimitKeys: (keyof LocalDependencyLimits)[] = [\n \"maxDependencies\",\n \"maxPlugins\",\n \"maxListeners\",\n \"warnListeners\",\n \"maxEventDepth\",\n \"maxLifecycleHandlers\",\n ];\n\n for (const key of expectedLimitKeys) {\n if (typeof limits[key] !== \"number\") {\n throw new TypeError(\n `[validation-plugin] validateDependenciesStructure: deps.limits.${key} must be a number, got ${typeof limits[key]}`,\n );\n }\n }\n}\n\n// =============================================================================\n// 6. validateLimitsConsistency\n// =============================================================================\n\n/**\n * Validates that actual resource counts don't exceed configured limits.\n * Compares dependency count vs maxDependencies limit from the deps store.\n * Any route-level limit configured in options is also checked against definitions.\n * Adapted from: validateLimits() in OptionsNamespace/validators.ts\n *\n * @param options - Router options (typed as unknown to avoid core coupling)\n * @throws {RangeError} If dependency count reaches or exceeds maxDependencies limit\n * @throws {RangeError} If route count exceeds a configured maxRoutes limit in options\n */\nfunction extractConfiguredLimits(options: unknown): Record<string, unknown> {\n const opts =\n options && typeof options === \"object\"\n ? (options as Record<string, unknown>)\n : {};\n\n return opts.limits && typeof opts.limits === \"object\"\n ? (opts.limits as Record<string, unknown>)\n : {};\n}\n\nfunction checkRouteCountLimit(\n store: unknown,\n configuredLimits: Record<string, unknown>,\n): void {\n if (!store || typeof store !== \"object\") {\n return;\n }\n\n const storeRecord = store as Record<string, unknown>;\n\n if (!Array.isArray(storeRecord.definitions)) {\n return;\n }\n\n const routeCount = (storeRecord.definitions as unknown[]).length;\n const maxRoutes = configuredLimits.maxRoutes;\n\n if (\n typeof maxRoutes === \"number\" &&\n maxRoutes > 0 &&\n routeCount > maxRoutes\n ) {\n throw new RangeError(\n `[validation-plugin] validateLimitsConsistency: route count (${routeCount}) exceeds configured limit (${maxRoutes})`,\n );\n }\n}\n\nfunction checkDepCountLimit(\n deps: unknown,\n configuredLimits: Record<string, unknown>,\n): void {\n if (!deps || typeof deps !== \"object\") {\n return;\n }\n\n const depsRecord = deps as Record<string, unknown>;\n const dependencies = depsRecord.dependencies;\n const depsLimits = depsRecord.limits;\n\n if (\n !dependencies ||\n typeof dependencies !== \"object\" ||\n !depsLimits ||\n typeof depsLimits !== \"object\"\n ) {\n return;\n }\n\n const depCount = Object.keys(dependencies).length;\n const limitsRecord = depsLimits as Record<string, unknown>;\n const maxDepsFromOptions = configuredLimits.maxDependencies;\n const maxDepsFromStore = limitsRecord.maxDependencies;\n const maxDeps =\n typeof maxDepsFromOptions === \"number\"\n ? maxDepsFromOptions\n : maxDepsFromStore;\n\n if (typeof maxDeps === \"number\" && maxDeps > 0 && depCount >= maxDeps) {\n throw new RangeError(\n `[validation-plugin] validateLimitsConsistency: dependency count (${depCount}) reaches or exceeds maxDependencies limit (${maxDeps})`,\n );\n }\n}\n\nexport function validateLimitsConsistency(\n options: unknown,\n store: unknown,\n deps: unknown,\n): void {\n const configuredLimits = extractConfiguredLimits(options);\n\n checkRouteCountLimit(store, configuredLimits);\n checkDepCountLimit(deps, configuredLimits);\n}\n","// packages/validation-plugin/src/validators/forwardTo.ts\n\nimport { resolveForwardChain } from \"@real-router/core\";\nimport { getSegmentsByName } from \"route-tree\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { Route, DefaultDependencies } from \"@real-router/core\";\nimport type { RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Route Property Validation\n// ============================================================================\n\nfunction validateForwardToProperty(forwardTo: unknown, fullName: string): void {\n if (forwardTo === undefined) {\n return;\n }\n\n if (typeof forwardTo === \"function\") {\n const isNativeAsync =\n (forwardTo as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\";\n const isTranspiledAsync = forwardTo.toString().includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n}\n\nexport function validateRouteProperties<\n Dependencies extends DefaultDependencies,\n>(route: Route<Dependencies>, fullName: string): void {\n if (\n route.canActivate !== undefined &&\n typeof route.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canActivate)}`,\n );\n }\n\n if (\n route.canDeactivate !== undefined &&\n typeof route.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canDeactivate)}`,\n );\n }\n\n if (route.defaultParams !== undefined) {\n const params: unknown = route.defaultParams;\n\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[router.addRoute] defaultParams must be an object for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.defaultParams)}`,\n );\n }\n }\n\n if (route.decodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n if (route.encodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n validateForwardToProperty(route.forwardTo, fullName);\n\n if (route.children) {\n for (const child of route.children) {\n const childFullName = `${fullName}.${child.name}`;\n\n validateRouteProperties(child, childFullName);\n }\n }\n}\n\n// ============================================================================\n// ForwardTo Validation\n// ============================================================================\n\nfunction extractParamsFromPath(path: string): Set<string> {\n const params = new Set<string>();\n const paramRegex = /[*:]([A-Z_a-z]\\w*)/g;\n let match;\n\n while ((match = paramRegex.exec(path)) !== null) {\n params.add(match[1]);\n }\n\n return params;\n}\n\nfunction extractParamsFromPaths(paths: readonly string[]): Set<string> {\n const params = new Set<string>();\n\n for (const path of paths) {\n for (const param of extractParamsFromPath(path)) {\n params.add(param);\n }\n }\n\n return params;\n}\n\nfunction collectPathsToRoute<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n routeName: string,\n parentName = \"\",\n paths: string[] = [],\n): string[] {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n const currentPaths = [...paths, route.path];\n\n if (fullName === routeName) {\n return currentPaths;\n }\n\n if (route.children && routeName.startsWith(`${fullName}.`)) {\n return collectPathsToRoute(\n route.children,\n routeName,\n fullName,\n currentPaths,\n );\n }\n }\n\n /* v8 ignore next -- @preserve unreachable: callers validate existence */\n throw new Error(\n `[internal] collectPathsToRoute: route \"${routeName}\" not found`,\n );\n}\n\nfunction collectRouteNames<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Set<string> {\n const names = new Set<string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n names.add(fullName);\n\n if (route.children) {\n for (const childName of collectRouteNames(route.children, fullName)) {\n names.add(childName);\n }\n }\n }\n\n return names;\n}\n\nfunction collectForwardMappings<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Map<string, string> {\n const mappings = new Map<string, string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n if (route.forwardTo && typeof route.forwardTo === \"string\") {\n mappings.set(fullName, route.forwardTo);\n }\n\n if (route.children) {\n for (const [key, value] of collectForwardMappings(\n route.children,\n fullName,\n )) {\n mappings.set(key, value);\n }\n }\n }\n\n return mappings;\n}\n\nfunction getRequiredParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\nfunction routeExistsInTree(tree: RouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: RouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction getTargetParams<Dependencies extends DefaultDependencies>(\n targetRoute: string,\n existsInTree: boolean,\n tree: RouteTree,\n routes: readonly Route<Dependencies>[],\n): Set<string> {\n if (existsInTree) {\n /* v8 ignore next -- @preserve: ?? fallback unreachable — existsInTree guarantees non-null */\n return getRequiredParams(getSegmentsByName(tree, targetRoute) ?? []);\n }\n\n return extractParamsFromPaths(collectPathsToRoute(routes, targetRoute));\n}\n\nfunction validateSingleForward<Dependencies extends DefaultDependencies>(\n fromRoute: string,\n targetRoute: string,\n routes: readonly Route<Dependencies>[],\n batchNames: Set<string>,\n tree: RouteTree,\n): void {\n const existsInTree = routeExistsInTree(tree, targetRoute);\n const existsInBatch = batchNames.has(targetRoute);\n\n if (!existsInTree && !existsInBatch) {\n throw new ReferenceError(\n `[router.addRoute] forwardTo target \"${targetRoute}\" does not exist ` +\n `for route \"${fromRoute}\"`,\n );\n }\n\n const fromParams = extractParamsFromPaths(\n collectPathsToRoute(routes, fromRoute),\n );\n\n const toParams = getTargetParams(targetRoute, existsInTree, tree, routes);\n\n const missingParams = [...toParams].filter((param) => !fromParams.has(param));\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${fromRoute}\"`,\n );\n }\n}\n\nexport function validateForwardToTargets<\n Dependencies extends DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n existingForwardMap: Record<string, string>,\n tree: RouteTree,\n): void {\n const batchNames = collectRouteNames(routes);\n const batchForwards = collectForwardMappings(routes);\n\n const combinedForwardMap: Record<string, string> = { ...existingForwardMap };\n\n for (const [from, to] of batchForwards) {\n combinedForwardMap[from] = to;\n }\n\n for (const [fromRoute, targetRoute] of batchForwards) {\n validateSingleForward(fromRoute, targetRoute, routes, batchNames, tree);\n }\n\n for (const fromRoute of Object.keys(combinedForwardMap)) {\n resolveForwardChain(fromRoute, combinedForwardMap);\n }\n}\n","// packages/validation-plugin/src/validators/routes.ts\n\n/**\n * DX-only validator functions for RoutesNamespace.\n * Copied from packages/core/src/namespaces/RoutesNamespace/validators.ts\n * (excludes validateRemoveRoute/validateClearRoutes — those are in routeGuards.ts)\n */\n\nimport { resolveForwardChain } from \"@real-router/core\";\nimport { validateRoute } from \"route-tree\";\nimport {\n isString,\n validateRouteName,\n isParams,\n getTypeDescription,\n} from \"type-guards\";\n\nimport { validateForwardToTargets, validateRouteProperties } from \"./forwardTo\";\n\nimport type {\n Route,\n RouteConfigUpdate,\n DefaultDependencies,\n Params,\n} from \"@real-router/core\";\nimport type { Matcher, RouteTree } from \"route-tree\";\n\n// Internal constant (matches core's INTERNAL_ROUTE_PREFIX)\nconst INTERNAL_ROUTE_PREFIX = \"@@\";\n\n// Minimal local type — only the forwardMap field used by this file\n// (RouteConfig from core is not exported from @real-router/core public API)\ninterface RouteConfigLike {\n forwardMap: Record<string, string>;\n}\n\n// Local type - matches ForwardToCallback from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ntype ForwardToCallback<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> = (\n getDependency: <K extends keyof Dependencies>(name: K) => Dependencies[K],\n params: Params,\n) => string;\n\nexport function throwIfInternalRoute(name: string, methodName: string): void {\n if (name.startsWith(INTERNAL_ROUTE_PREFIX)) {\n throw new Error(\n `[router.${methodName}] Route name \"${name}\" uses the reserved \"${INTERNAL_ROUTE_PREFIX}\" prefix. Routes with this prefix are internal and cannot be modified through the public API.`,\n );\n }\n}\n\nexport function throwIfInternalRouteInArray(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\n routes: readonly Route<any>[],\n methodName: string,\n): void {\n for (const route of routes) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime safety\n if (route && typeof route === \"object\" && typeof route.name === \"string\") {\n throwIfInternalRoute(route.name, methodName);\n\n if (route.children) {\n throwIfInternalRouteInArray(route.children, methodName);\n }\n }\n }\n}\n\n/**\n * Validates removeRoute arguments.\n */\nexport function validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRouteName(name, \"removeRoute\");\n}\n\nexport function validateSetRootPathArgs(\n rootPath: unknown,\n): asserts rootPath is string {\n if (typeof rootPath !== \"string\") {\n throw new TypeError(\n `[router.setRootPath] rootPath must be a string, got ${getTypeDescription(rootPath)}`,\n );\n }\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return (\n (fn as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" || String(fn).includes(\"__awaiter\")\n );\n}\n\nexport function guardRouteCallbacks(route: unknown): void {\n const routeObj = route as { canActivate?: unknown; canDeactivate?: unknown };\n\n if (\n routeObj.canActivate !== undefined &&\n typeof routeObj.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function, got ${getTypeDescription(routeObj.canActivate)}`,\n );\n }\n\n if (\n routeObj.canDeactivate !== undefined &&\n typeof routeObj.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function, got ${getTypeDescription(routeObj.canDeactivate)}`,\n );\n }\n}\n\nexport function guardNoAsyncCallbacks(route: unknown): void {\n const routeObj = route as {\n decodeParams?: unknown;\n encodeParams?: unknown;\n forwardTo?: unknown;\n name?: unknown;\n };\n const routeName = routeObj.name;\n\n if (\n routeObj.decodeParams !== undefined &&\n isAsyncFunction(routeObj.decodeParams)\n ) {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${String(routeName)}\"`,\n );\n }\n\n if (\n routeObj.encodeParams !== undefined &&\n isAsyncFunction(routeObj.encodeParams)\n ) {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${String(routeName)}\"`,\n );\n }\n\n if (\n typeof routeObj.forwardTo === \"function\" &&\n isAsyncFunction(routeObj.forwardTo)\n ) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${String(routeName)}\"`,\n );\n }\n}\n\n/**\n * Validates addRoute arguments (route structure and properties).\n * State-dependent validation (duplicates, tree) happens in instance method.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\nexport function validateAddRouteArgs(routes: readonly Route<any>[]): void {\n for (const route of routes) {\n // First check if route is an object (before accessing route.name)\n // Runtime check for invalid types passed via `as any`\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime check\n if (route === null || typeof route !== \"object\" || Array.isArray(route)) {\n throw new TypeError(\n `[router.addRoute] Route must be an object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Validate route properties (canActivate, canDeactivate, defaultParams, async checks)\n // Note: validateRouteProperties handles children recursively\n validateRouteProperties(route, route.name);\n }\n}\n\n/**\n * Validates parent option for addRoute.\n */\nexport function validateParentOption(\n parent: unknown,\n): asserts parent is string {\n if (typeof parent !== \"string\" || parent === \"\") {\n throw new TypeError(\n `[router.addRoute] parent option must be a non-empty string, got ${getTypeDescription(parent)}`,\n );\n }\n\n // Validate parent is a valid route name format (can contain dots — it's a fullName reference)\n validateRouteName(parent, \"addRoute\");\n}\n\n/**\n * Validates isActiveRoute arguments.\n */\nexport function validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n): void {\n // Validate name - non-string throws\n if (!isString(name)) {\n throw new TypeError(\n `[router.isActiveRoute] name must be a string, got ${typeof name}`,\n );\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.isActiveRoute] params must be a plain object, got ${getTypeDescription(params)}`,\n );\n }\n\n // Validate strictEquality if provided\n if (strictEquality !== undefined && typeof strictEquality !== \"boolean\") {\n throw new TypeError(\n `[router.isActiveRoute] strictEquality must be a boolean, got ${typeof strictEquality}`,\n );\n }\n\n // Validate ignoreQueryParams if provided\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.isActiveRoute] ignoreQueryParams must be a boolean, got ${typeof ignoreQueryParams}`,\n );\n }\n}\n\n/**\n * Validates forwardState/buildState arguments.\n */\nexport function validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n): void {\n if (!isString(routeName)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeName: ${getTypeDescription(routeName)}. Expected string.`,\n );\n }\n\n if (!isParams(routeParams)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeParams: ${getTypeDescription(routeParams)}. Expected plain object.`,\n );\n }\n}\n\n/**\n * Validates updateRoute basic arguments (name and updates object structure).\n * Does NOT read property values to allow caller to cache them first.\n */\nexport function validateUpdateRouteBasicArgs<\n Dependencies extends DefaultDependencies,\n>(\n name: unknown,\n updates: unknown,\n): asserts updates is RouteConfigUpdate<Dependencies> {\n // Validate name\n validateRouteName(name, \"updateRoute\");\n\n if (name === \"\") {\n throw new ReferenceError(\n `[router.updateRoute] Invalid name: empty string. Cannot update root node.`,\n );\n }\n\n // Validate updates is not null\n\n if (updates === null) {\n throw new TypeError(\n `[router.updateRoute] updates must be an object, got null`,\n );\n }\n\n // Validate updates is an object (not array)\n if (typeof updates !== \"object\" || Array.isArray(updates)) {\n throw new TypeError(\n `[router.updateRoute] updates must be an object, got ${getTypeDescription(updates)}`,\n );\n }\n}\n\n/**\n * Asserts that a function is not async (native or transpiled).\n * Checks both constructor name and toString() for __awaiter pattern.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(value: Function, paramName: string): void {\n if (\n (value as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" ||\n (value as { toString: () => string }).toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[router.updateRoute] ${paramName} cannot be an async function`,\n );\n }\n}\n\n/**\n * Validates that a value is a non-async function, if provided.\n */\nfunction validateFunctionParam(value: unknown, paramName: string): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\n `[router.updateRoute] ${paramName} must be a function or null, got ${typeof value}`,\n );\n }\n\n assertNotAsync(value, paramName);\n}\n\n/**\n * Validates updateRoute property types using pre-cached values.\n * Called AFTER properties are cached to ensure getters are called only once.\n */\nexport function validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n): void {\n // Validate forwardTo type (existence check is done by instance method)\n if (forwardTo !== undefined && forwardTo !== null) {\n if (typeof forwardTo !== \"string\" && typeof forwardTo !== \"function\") {\n throw new TypeError(\n `[router.updateRoute] forwardTo must be a string, function, or null, got ${getTypeDescription(forwardTo)}`,\n );\n }\n\n if (typeof forwardTo === \"function\") {\n assertNotAsync(forwardTo, \"forwardTo callback\");\n }\n }\n\n // Validate defaultParams\n if (\n defaultParams !== undefined &&\n defaultParams !== null &&\n (typeof defaultParams !== \"object\" || Array.isArray(defaultParams))\n ) {\n throw new TypeError(\n `[router.updateRoute] defaultParams must be an object or null, got ${getTypeDescription(defaultParams)}`,\n );\n }\n\n validateFunctionParam(decodeParams, \"decodeParams\");\n validateFunctionParam(encodeParams, \"encodeParams\");\n}\n\n/**\n * Validates buildPath arguments.\n */\nexport function validateBuildPathArgs(route: unknown): asserts route is string {\n if (!isString(route) || route === \"\") {\n throw new TypeError(\n `[router.buildPath] route must be a non-empty string, got ${typeof route === \"string\" ? '\"\"' : typeof route}`,\n );\n }\n}\n\n/**\n * Validates matchPath arguments.\n */\nexport function validateMatchPathArgs(path: unknown): asserts path is string {\n if (!isString(path)) {\n throw new TypeError(\n `[router.matchPath] path must be a string, got ${typeof path}`,\n );\n }\n}\n\n/**\n * Validates shouldUpdateNode arguments.\n */\nexport function validateShouldUpdateNodeArgs(\n nodeName: unknown,\n): asserts nodeName is string {\n if (!isString(nodeName)) {\n throw new TypeError(\n `[router.shouldUpdateNode] nodeName must be a string, got ${typeof nodeName}`,\n );\n }\n}\n\n/**\n * Validates routes for addition to the router.\n * Checks parent existence, duplicates, and forwardTo targets/cycles.\n *\n * @param routes - Routes to validate\n * @param tree - Current route tree (optional for initial validation)\n * @param forwardMap - Current forward map for cycle detection\n * @param parentName - Optional parent route fullName for nesting via addRoute({ parent })\n */\nexport function validateRoutes<Dependencies extends DefaultDependencies>(\n routes: Route<Dependencies>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n): void {\n // Validate parent route exists in tree\n if (parentName && tree) {\n let node: RouteTree | undefined = tree;\n\n for (const segment of parentName.split(\".\")) {\n node = node.children.get(segment);\n\n if (!node) {\n throw new ReferenceError(\n `[router.addRoute] Parent route \"${parentName}\" does not exist`,\n );\n }\n }\n }\n\n // Tracking sets for duplicate detection\n const seenNames = new Set<string>();\n const seenPathsByParent = new Map<string, Set<string>>();\n\n for (const route of routes) {\n validateRoute(\n route,\n \"addRoute\",\n tree,\n parentName ?? \"\",\n seenNames,\n seenPathsByParent,\n );\n }\n\n if (tree && forwardMap) {\n validateForwardToTargets(routes, forwardMap, tree);\n }\n}\n\n// ============================================================================\n// Instance-level validators (moved from routesCrud.ts)\n// ============================================================================\n\n/**\n * Collects URL params from segments into a Set.\n */\nfunction collectUrlParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Validates that forwardTo target doesn't require params that source doesn't have.\n *\n * @param sourceName - Source route name\n * @param targetName - Target route name\n * @param matcher - Current route matcher\n */\nexport function validateForwardToParamCompatibility(\n sourceName: string,\n targetName: string,\n matcher: Matcher,\n): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sourceSegments = matcher.getSegmentsByName(\n sourceName,\n )! as readonly RouteTree[];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const targetSegments = matcher.getSegmentsByName(\n targetName,\n )! as readonly RouteTree[];\n\n // Get source URL params as a Set for O(1) lookup\n const sourceParams = collectUrlParams(sourceSegments);\n\n // Build target URL params array (inline — no separate helper needed)\n const targetParams: string[] = [];\n\n for (const segment of targetSegments) {\n for (const param of segment.paramMeta.urlParams) {\n targetParams.push(param);\n }\n }\n\n // Check if target requires params that source doesn't have\n const missingParams = targetParams.filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetName}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${sourceName}\"`,\n );\n }\n}\n\n/**\n * Validates that adding forwardTo doesn't create a cycle.\n * Creates a test map with the new entry and uses resolveForwardChain\n * to detect cycles before any mutation happens.\n *\n * @param sourceName - Source route name\n * @param targetName - Target route name\n * @param config - Current route config (forwardMap read-only in this call)\n */\nexport function validateForwardToCycle(\n sourceName: string,\n targetName: string,\n config: RouteConfigLike,\n): void {\n // Create a test map with the new entry to validate BEFORE mutation\n const testMap = {\n ...config.forwardMap,\n [sourceName]: targetName,\n };\n\n // resolveForwardChain will throw if cycle is detected or max depth exceeded\n resolveForwardChain(sourceName, testMap);\n}\n\n/**\n * Validates updateRoute instance-level constraints (route existence, forwardTo).\n *\n * @param name - Route name (already validated by static method)\n * @param forwardTo - Cached forwardTo value\n * @param hasRoute - Function to check route existence\n * @param matcher - Current route matcher\n * @param config - Current route config\n */\nexport function validateUpdateRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null | undefined,\n hasRoute: (n: string) => boolean,\n matcher: Matcher,\n config: RouteConfigLike,\n): void {\n // Validate route exists\n if (!hasRoute(name)) {\n throw new ReferenceError(\n `[router.updateRoute] route \"${name}\" does not exist`,\n );\n }\n\n // Validate forwardTo target exists and is valid (only for string forwardTo)\n if (\n forwardTo !== undefined &&\n forwardTo !== null &&\n typeof forwardTo === \"string\"\n ) {\n if (!hasRoute(forwardTo)) {\n throw new Error(\n `[router.updateRoute] forwardTo target \"${forwardTo}\" does not exist`,\n );\n }\n\n // Check forwardTo param compatibility\n validateForwardToParamCompatibility(name, forwardTo, matcher);\n\n // Check for cycle detection\n validateForwardToCycle(name, forwardTo, config);\n }\n}\n","// packages/validation-plugin/src/validators/state.ts\n\nimport { isString, isParams, getTypeDescription } from \"type-guards\";\n\nexport function validateMakeStateArgs(\n name: unknown,\n params: unknown,\n path: unknown,\n forceId: unknown,\n): void {\n if (!isString(name)) {\n throw new TypeError(\n `[router.makeState] Invalid name: ${getTypeDescription(name)}. Expected string.`,\n );\n }\n\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.makeState] Invalid params: ${getTypeDescription(params)}. Expected plain object.`,\n );\n }\n\n if (path !== undefined && !isString(path)) {\n throw new TypeError(\n `[router.makeState] Invalid path: ${getTypeDescription(path)}. Expected string.`,\n );\n }\n\n if (forceId !== undefined && typeof forceId !== \"number\") {\n throw new TypeError(\n `[router.makeState] Invalid forceId: ${getTypeDescription(forceId)}. Expected number.`,\n );\n }\n}\n","// packages/validation-plugin/src/validationPlugin.ts\n\nimport { RouterError } from \"@real-router/core\";\nimport { getInternals } from \"@real-router/core/validation\";\nimport {\n validateRouteName,\n isState,\n isBoolean,\n getTypeDescription,\n} from \"type-guards\";\n\nimport {\n validateDependencyName,\n validateSetDependencyArgs as validateSetDependencyArgsRaw,\n validateDependenciesObject,\n validateDependencyExists as validateDependencyExistsRaw,\n validateDependencyCount,\n validateCloneArgs,\n warnOverwrite as warnDepsOverwrite,\n warnBatchOverwrite,\n warnRemoveNonExistent,\n} from \"./validators/dependencies\";\nimport { validateEventName, validateListenerArgs } from \"./validators/eventBus\";\nimport {\n validateHandler,\n validateNotRegistering,\n validateHandlerLimit,\n validateLifecycleCountThresholds,\n warnOverwrite as warnLifecycleOverwrite,\n warnAsyncGuardSync,\n} from \"./validators/lifecycle\";\nimport {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigationOptions,\n validateNavigateParams,\n validateStartArgs,\n} from \"./validators/navigation\";\nimport {\n validateLimitValue,\n validateLimits,\n validateOptions,\n} from \"./validators/options\";\nimport {\n validatePluginLimit,\n validatePluginKeys,\n validateCountThresholds as validatePluginCountThresholds,\n warnBatchDuplicates,\n warnPluginMethodType,\n warnPluginAfterStart,\n validateAddInterceptorArgs,\n} from \"./validators/plugins\";\nimport {\n validateExistingRoutes,\n validateForwardToConsistency,\n validateRoutePropertiesStore,\n validateForwardToTargetsStore,\n validateDependenciesStructure,\n validateLimitsConsistency,\n} from \"./validators/retrospective\";\nimport {\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateIsActiveRouteArgs,\n validateShouldUpdateNodeArgs,\n validateStateBuilderArgs,\n validateAddRouteArgs,\n validateRoutes,\n validateRemoveRouteArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes,\n validateUpdateRoute,\n validateParentOption as validateParentOptionRaw,\n throwIfInternalRoute,\n throwIfInternalRouteInArray,\n validateSetRootPathArgs,\n guardRouteCallbacks,\n guardNoAsyncCallbacks,\n} from \"./validators/routes\";\nimport { validateMakeStateArgs } from \"./validators/state\";\n\nimport type { PluginFactory, RouterValidator } from \"@real-router/core\";\nimport type { RouterInternals } from \"@real-router/core/validation\";\n\nfunction buildValidatorObject(ctx: RouterInternals): RouterValidator {\n return {\n routes: {\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateIsActiveRouteArgs,\n validateShouldUpdateNodeArgs,\n validateStateBuilderArgs,\n\n validateAddRouteArgs(routes) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n validateAddRouteArgs(routes as any);\n },\n\n validateRoutes(routes, store) {\n const typedStore = store as {\n tree?: unknown;\n config?: { forwardMap?: Record<string, string> };\n };\n\n validateRoutes(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n routes as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n typedStore.tree as any,\n typedStore.config?.forwardMap,\n );\n },\n validateRemoveRouteArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes(_name, updates) {\n const upd = updates as Record<string, unknown>;\n\n validateUpdateRoutePropertyTypes(\n upd.forwardTo,\n upd.defaultParams,\n upd.decodeParams,\n upd.encodeParams,\n );\n },\n validateUpdateRoute(name, updates, store) {\n const typedStore = store as {\n matcher: {\n hasRoute: (routeName: string) => boolean;\n getSegmentsByName: (routeName: string) => unknown;\n };\n config: { forwardMap: Record<string, string> };\n };\n const forwardTo = (updates as Record<string, unknown>).forwardTo;\n\n validateUpdateRoute(\n name,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n forwardTo as any,\n (routeName: string) => typedStore.matcher.hasRoute(routeName),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n typedStore.matcher as any,\n typedStore.config,\n );\n },\n validateParentOption(parent, tree) {\n validateParentOptionRaw(parent as string);\n let node = tree as { children: Map<string, unknown> };\n\n for (const segment of (parent as string).split(\".\")) {\n const child = node.children.get(segment) as\n | { children: Map<string, unknown> }\n | undefined;\n\n if (!child) {\n throw new ReferenceError(\n `[router.addRoute] Parent route \"${parent as string}\" does not exist`,\n );\n }\n\n node = child;\n }\n },\n validateRouteName(name, caller) {\n validateRouteName(name, caller);\n },\n throwIfInternalRoute(name, caller) {\n throwIfInternalRoute(name as string, caller);\n },\n\n throwIfInternalRouteInArray(routes, caller) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n throwIfInternalRouteInArray(routes as any, caller);\n },\n validateExistingRoutes,\n validateForwardToConsistency,\n validateSetRootPathArgs,\n guardRouteCallbacks,\n guardNoAsyncCallbacks,\n },\n options: {\n validateLimitValue(name, value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n validateLimitValue(name as any, value, \"validate\");\n },\n validateLimits(limits) {\n validateLimits(limits, \"validate\");\n },\n validateOptions,\n },\n dependencies: {\n validateDependencyName,\n validateSetDependencyArgs(_name, _value, _caller) {\n validateSetDependencyArgsRaw(_name);\n },\n validateDependenciesObject,\n validateDependencyExists(name, store) {\n const typedStore = store as { dependencies?: Record<string, unknown> };\n const value = typedStore.dependencies?.[name];\n\n validateDependencyExistsRaw(value, name);\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n validateDependencyLimit(_store, _limits) {},\n validateDependenciesStructure,\n validateDependencyCount,\n validateCloneArgs,\n warnOverwrite: warnDepsOverwrite,\n warnBatchOverwrite,\n warnRemoveNonExistent,\n },\n plugins: {\n validatePluginLimit(count, limits) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n validatePluginLimit(count, 1, (limits as any)?.maxPlugins);\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n validateNoDuplicatePlugins(_factory, _factories) {},\n validatePluginKeys,\n validateCountThresholds(count) {\n const maxPlugins = ctx.getOptions().limits?.maxPlugins ?? 50;\n\n validatePluginCountThresholds(count, maxPlugins);\n },\n warnBatchDuplicates,\n warnPluginMethodType,\n warnPluginAfterStart,\n validateAddInterceptorArgs,\n },\n lifecycle: {\n validateHandler,\n validateNotRegistering(name, _guards, caller) {\n validateNotRegistering(false, name, caller);\n },\n validateHandlerLimit(count, limits, caller) {\n validateHandlerLimit(\n count,\n caller,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n (limits as any)?.maxLifecycleHandlers,\n );\n },\n validateCountThresholds(count, methodName) {\n const maxHandlers =\n ctx.getOptions().limits?.maxLifecycleHandlers ?? 200;\n\n validateLifecycleCountThresholds(count, methodName, maxHandlers);\n },\n warnOverwrite: warnLifecycleOverwrite,\n warnAsyncGuardSync,\n },\n navigation: {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigationOptions,\n validateParams: validateNavigateParams,\n validateStartArgs,\n },\n state: {\n validateMakeStateArgs,\n validateAreStatesEqualArgs(s1, s2, ignoreQP) {\n if (!isState(s1)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid state1: ${getTypeDescription(s1)}. Expected State object.`,\n );\n }\n if (!isState(s2)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid state2: ${getTypeDescription(s2)}. Expected State object.`,\n );\n }\n if (ignoreQP !== undefined && !isBoolean(ignoreQP)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid ignoreQueryParams: ${getTypeDescription(ignoreQP)}. Expected boolean.`,\n );\n }\n },\n },\n eventBus: {\n validateEventName,\n\n validateListenerArgs(name, cb) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n validateListenerArgs(name as any, cb as any);\n },\n },\n };\n}\n\nexport function validationPlugin(): PluginFactory {\n // eslint-disable-next-line unicorn/consistent-function-scoping\n return (router) => {\n const ctx = getInternals(router);\n\n if (router.isActive()) {\n throw new RouterError(\"VALIDATION_PLUGIN_AFTER_START\", {\n message: \"validation-plugin must be registered before router.start()\",\n });\n }\n\n // RouterInternals.validator is now mutable — direct assignment works\n ctx.validator = buildValidatorObject(ctx);\n\n try {\n const store = ctx.routeGetStore();\n const deps = ctx.dependenciesGetStore();\n const options = ctx.getOptions();\n\n validateExistingRoutes(store);\n validateForwardToConsistency(store);\n validateRoutePropertiesStore(store);\n validateForwardToTargetsStore(store);\n validateDependenciesStructure(deps);\n validateLimitsConsistency(options, store, deps);\n ctx.validator.options.validateOptions(\n options as unknown,\n \"constructor (retrospective)\",\n );\n } catch (error) {\n ctx.validator = null;\n\n throw error;\n }\n\n return {\n teardown() {\n ctx.validator = null;\n },\n };\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/helpers.ts","../../src/validators/dependencies.ts","../../src/validators/eventBus.ts","../../src/validators/lifecycle.ts","../../src/validators/navigation.ts","../../src/validators/options.ts","../../src/validators/plugins.ts","../../src/validators/retrospective.ts","../../src/validators/forwardTo.ts","../../src/validators/routes.ts","../../src/validators/state.ts","../../src/validationPlugin.ts"],"names":["logger","warnOverwrite","coreResolveForwardChain","routeExistsInTree","l","assertNotAsync","b","collectUrlParams","resolveForwardChain"],"mappings":"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","file":"index.mjs","sourcesContent":["// packages/validation-plugin/src/helpers.ts\n\nexport function computeThresholds(limit: number): {\n warn: number;\n error: number;\n} {\n return {\n warn: Math.floor(limit * 0.2),\n error: Math.floor(limit * 0.5),\n };\n}\n","// packages/validation-plugin/src/validators/dependencies.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport { computeThresholds } from \"../helpers\";\n\nconst DEFAULT_MAX_DEPENDENCIES = 100;\n\nexport function validateDependencyName(\n name: unknown,\n methodName: string,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.${methodName}] dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\nexport function validateSetDependencyArgs(\n name: unknown,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.setDependency] dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\nexport function validateDependenciesObject(\n deps: unknown,\n methodName: string,\n): asserts deps is Record<string, unknown> {\n if (!(deps && typeof deps === \"object\" && deps.constructor === Object)) {\n throw new TypeError(\n `[router.${methodName}] Invalid argument: expected plain object, received ${getTypeDescription(deps)}`,\n );\n }\n\n for (const key in deps) {\n if (Object.getOwnPropertyDescriptor(deps, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed: \"${key}\"`,\n );\n }\n }\n}\n\nexport function validateDependencyExists(\n value: unknown,\n dependencyName: string,\n): asserts value is NonNullable<unknown> {\n if (value === undefined) {\n throw new ReferenceError(\n `[router.getDependency] dependency \"${dependencyName}\" not found`,\n );\n }\n}\n\nexport function validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies: number = DEFAULT_MAX_DEPENDENCIES,\n): void {\n if (maxDependencies === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount >= maxDependencies) {\n throw new RangeError(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${totalCount}. This is likely a bug in your code.`,\n );\n }\n}\n\nexport function validateDependencyCount(\n store: unknown,\n methodName: string,\n): void {\n const typedStore = store as {\n dependencies: Record<string, unknown>;\n limits?: { maxDependencies?: number };\n };\n const maxDependencies =\n typedStore.limits?.maxDependencies ?? DEFAULT_MAX_DEPENDENCIES;\n\n if (maxDependencies === 0) {\n return;\n }\n\n const currentCount = Object.keys(typedStore.dependencies).length;\n const { warn, error } = computeThresholds(maxDependencies);\n\n if (currentCount >= maxDependencies) {\n throw new RangeError(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). Current: ${currentCount}.`,\n );\n } else if (currentCount === error) {\n logger.error(\n `router.${methodName}`,\n `${currentCount} dependencies registered! This indicates architectural problems. Hard limit at ${maxDependencies}.`,\n );\n } else if (currentCount === warn) {\n logger.warn(\n `router.${methodName}`,\n `${currentCount} dependencies registered. Consider if all are necessary.`,\n );\n }\n}\n\nexport function 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 ${typeof dependencies}`,\n );\n }\n\n for (const key in dependencies as Record<string, unknown>) {\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 warnOverwrite(name: string, methodName: string): void {\n logger.warn(\n `router.${methodName}`,\n \"Router dependency already exists and is being overwritten:\",\n name,\n );\n}\n\nexport function warnBatchOverwrite(keys: string[], methodName: string): void {\n logger.warn(`router.${methodName}`, \"Overwritten:\", keys.join(\", \"));\n}\n\nexport function warnRemoveNonExistent(name: unknown): void {\n logger.warn(\n \"router.removeDependency\",\n `Attempted to remove non-existent dependency: \"${typeof name === \"string\" ? name : String(name)}\"`,\n );\n}\n","// packages/validation-plugin/src/validators/eventBus.ts\n\nimport type { Plugin } from \"@real-router/core\";\n\n// Local types — mirrors EventName and EventMethodMap from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ninterface EventMethodMap {\n $start: \"onStart\";\n $stop: \"onStop\";\n $$start: \"onTransitionStart\";\n $$cancel: \"onTransitionCancel\";\n $$success: \"onTransitionSuccess\";\n $$error: \"onTransitionError\";\n}\n\ntype EventName = keyof EventMethodMap;\n\n// Local set — mirrors validEventNames from @real-router/core/constants\n// (not exported from @real-router/core public API)\nconst validEventNames = new Set<EventName>([\n \"$start\",\n \"$stop\",\n \"$$start\",\n \"$$cancel\",\n \"$$success\",\n \"$$error\",\n]);\n\nexport function validateEventName(eventName: unknown): void {\n if (!validEventNames.has(eventName as EventName)) {\n throw new TypeError(\n `[router.addEventListener] Invalid event name: ${String(eventName)}. Must be one of: $start, $stop, $$start, $$cancel, $$success, $$error`,\n );\n }\n}\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 `[router.addEventListener] callback must be a function, got ${typeof cb}`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/lifecycle.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isBoolean, getTypeDescription } from \"type-guards\";\n\nimport { computeThresholds } from \"../helpers\";\n\nimport type { GuardFnFactory, DefaultDependencies } from \"@real-router/core\";\n\nconst DEFAULT_MAX_LIFECYCLE_HANDLERS = 200;\n\nexport function validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n): asserts handler is GuardFnFactory<D> | boolean {\n if (!isBoolean(handler) && typeof handler !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Handler must be a boolean or factory function, ` +\n `got ${getTypeDescription(handler)}`,\n );\n }\n}\n\nexport function validateNotRegistering(\n isRegistering: boolean,\n name: string,\n methodName: string,\n): void {\n if (isRegistering) {\n throw new Error(\n `[router.${methodName}] Cannot modify route \"${name}\" during its own registration`,\n );\n }\n}\n\nexport function validateHandlerLimit(\n currentCount: number,\n methodName: string,\n maxLifecycleHandlers: number = DEFAULT_MAX_LIFECYCLE_HANDLERS,\n): void {\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n if (currentCount >= maxLifecycleHandlers) {\n throw new RangeError(\n `[router.${methodName}] Lifecycle handler limit exceeded (${maxLifecycleHandlers}). ` +\n `This indicates too many routes with individual handlers. ` +\n `Consider using plugins for cross-cutting concerns.`,\n );\n }\n}\n\nexport function validateLifecycleCountThresholds(\n count: number,\n methodName: string,\n maxHandlers: number,\n): void {\n if (maxHandlers === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxHandlers);\n\n if (count >= error) {\n logger.error(\n `router.${methodName}`,\n `${count} lifecycle handlers registered! This is excessive. Hard limit at ${maxHandlers}.`,\n );\n } else if (count >= warn) {\n logger.warn(\n `router.${methodName}`,\n `${count} lifecycle handlers registered. Consider consolidating logic.`,\n );\n }\n}\n\nexport function warnOverwrite(\n name: string,\n type: string,\n methodName: string,\n): void {\n logger.warn(\n `router.${methodName}`,\n `Overwriting existing ${type} handler for route \"${name}\"`,\n );\n}\n\nexport function warnAsyncGuardSync(name: string, methodName: string): void {\n logger.warn(\n `router.${methodName}`,\n `Guard for \"${name}\" returned a Promise. Sync check cannot resolve async guards — returning false.`,\n );\n}\n","// packages/validation-plugin/src/validators/navigation.ts\n\nimport { getTypeDescription, isNavigationOptions, isParams } from \"type-guards\";\n\nimport type { NavigationOptions } from \"@real-router/core\";\n\nexport function validateNavigateArgs(name: unknown): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.navigate] Invalid route name: expected string, got ${getTypeDescription(name)}`,\n );\n }\n}\n\nexport function validateNavigateToDefaultArgs(opts: unknown): void {\n if (opts !== undefined && (typeof opts !== \"object\" || opts === null)) {\n throw new TypeError(\n `[router.navigateToDefault] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\nexport function validateNavigationOptions(\n opts: unknown,\n methodName: string,\n): asserts opts is NavigationOptions {\n if (!isNavigationOptions(opts)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\nexport function validateNavigateParams(\n params: unknown,\n methodName: string,\n): void {\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.${methodName}] params must be a plain object, got ${getTypeDescription(params)}`,\n );\n }\n}\n\nexport function validateStartArgs(path: unknown): void {\n // undefined is allowed — browser-plugin injects path via interceptor AFTER facade validation\n if (path !== undefined && typeof path !== \"string\") {\n throw new TypeError(\n `[router.start] path must be a string, got ${getTypeDescription(path)}.`,\n );\n }\n if (typeof path === \"string\" && path !== \"\" && !path.startsWith(\"/\")) {\n throw new TypeError(\n `[router.start] path must start with \"/\", got \"${path}\".`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/options.ts\n\nimport { isObjKey } from \"type-guards\";\n\nconst VALID_OPTION_VALUES = {\n trailingSlash: [\"strict\", \"never\", \"always\", \"preserve\"] as const,\n queryParamsMode: [\"default\", \"strict\", \"loose\"] as const,\n urlParamsEncoding: [\"default\", \"uri\", \"uriComponent\", \"none\"] as const,\n} as const;\n\nconst VALID_QUERY_PARAMS = {\n arrayFormat: [\"none\", \"brackets\", \"index\", \"comma\"] as const,\n booleanFormat: [\"none\", \"string\", \"empty-true\"] as const,\n nullFormat: [\"default\", \"hidden\"] as const,\n} as const;\n\nconst VALID_LOGGER_LEVELS = [\n \"all\",\n \"warn-error\",\n \"error-only\",\n \"none\",\n] as const;\n\nconst KNOWN_OPTIONS = new Set<string>([\n \"defaultRoute\",\n \"defaultParams\",\n \"trailingSlash\",\n \"queryParamsMode\",\n \"queryParams\",\n \"urlParamsEncoding\",\n \"allowNotFound\",\n \"rewritePathOnMatch\",\n \"logger\",\n \"limits\",\n]);\n\n// Local type - mirrors LimitsConfig from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ninterface LimitsConfig {\n maxDependencies: number;\n maxPlugins: number;\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n maxLifecycleHandlers: number;\n}\n\n// Local constant - mirrors LIMIT_BOUNDS from @real-router/core/constants\n// (not exported from @real-router/core public API)\nconst LIMIT_BOUNDS = {\n maxDependencies: { min: 0, max: 10_000 },\n maxPlugins: { min: 0, max: 1000 },\n maxListeners: { min: 0, max: 100_000 },\n warnListeners: { min: 0, max: 100_000 },\n maxEventDepth: { min: 0, max: 100 },\n maxLifecycleHandlers: { min: 0, max: 10_000 },\n} as const;\n\nexport function validateLimitValue(\n limitName: keyof LimitsConfig,\n value: unknown,\n methodName: string,\n): void {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new TypeError(\n `[router.${methodName}] limit \"${limitName}\" must be an integer, got ${String(value)}`,\n );\n }\n\n const bounds = LIMIT_BOUNDS[limitName];\n\n if (value < bounds.min || value > bounds.max) {\n throw new RangeError(\n `[router.${methodName}] limit \"${limitName}\" must be between ${bounds.min} and ${bounds.max}, got ${value}`,\n );\n }\n}\n\nexport function validateLimits(\n limits: unknown,\n methodName: string,\n): asserts limits is Partial<LimitsConfig> {\n if (!limits || typeof limits !== \"object\" || limits.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}] invalid limits: expected plain object, got ${typeof limits}`,\n );\n }\n\n for (const [key, value] of Object.entries(limits)) {\n if (!Object.hasOwn(LIMIT_BOUNDS, key)) {\n throw new TypeError(`[router.${methodName}] unknown limit: \"${key}\"`);\n }\n\n if (value === undefined) {\n continue;\n }\n\n validateLimitValue(key as keyof LimitsConfig, value, methodName);\n }\n}\n\nfunction validateStringEnum(\n value: unknown,\n optionName: string,\n validValues: readonly string[],\n methodName: string,\n): void {\n if (value === undefined) {\n return;\n }\n\n if (typeof value !== \"string\" || !validValues.includes(value)) {\n const validList = validValues.map((val) => `\"${val}\"`).join(\", \");\n const display = typeof value === \"string\" ? value : `(${typeof value})`;\n\n throw new TypeError(\n `[router.${methodName}] Invalid \"${optionName}\": \"${display}\". Must be one of: ${validList}`,\n );\n }\n}\n\nfunction validateDefaultRoute(defaultRoute: unknown, methodName: string): void {\n if (defaultRoute === undefined) {\n return;\n }\n\n if (typeof defaultRoute !== \"string\" && typeof defaultRoute !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Invalid \"defaultRoute\": expected string or function, got ${typeof defaultRoute}`,\n );\n }\n}\n\nfunction validateDefaultParams(\n defaultParams: unknown,\n methodName: string,\n): void {\n if (defaultParams === undefined) {\n return;\n }\n\n if (typeof defaultParams === \"function\") {\n return;\n }\n\n if (\n !defaultParams ||\n typeof defaultParams !== \"object\" ||\n Array.isArray(defaultParams) ||\n defaultParams.constructor !== Object\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"defaultParams\": expected plain object or function, got ${typeof defaultParams}`,\n );\n }\n}\n\nfunction validateQueryParamsOptions(\n queryParams: unknown,\n methodName: string,\n): void {\n if (queryParams === undefined) {\n return;\n }\n\n if (\n !queryParams ||\n typeof queryParams !== \"object\" ||\n Array.isArray(queryParams)\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"queryParams\": expected plain object`,\n );\n }\n\n const qp = queryParams as Record<string, unknown>;\n\n for (const key of Object.keys(qp)) {\n if (!isObjKey(key, VALID_QUERY_PARAMS)) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"queryParams.${key}\": unknown option`,\n );\n }\n\n validateStringEnum(\n qp[key],\n `queryParams.${key}`,\n VALID_QUERY_PARAMS[key],\n methodName,\n );\n }\n}\n\nfunction validateLoggerOption(loggerOpt: unknown, methodName: string): void {\n if (loggerOpt === undefined) {\n return;\n }\n\n if (!loggerOpt || typeof loggerOpt !== \"object\" || Array.isArray(loggerOpt)) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger\": expected plain object`,\n );\n }\n\n const loggerOptions = loggerOpt as Record<string, unknown>;\n\n if (\n loggerOptions.level !== undefined &&\n !VALID_LOGGER_LEVELS.includes(\n loggerOptions.level as (typeof VALID_LOGGER_LEVELS)[number],\n )\n ) {\n const validLevelList = VALID_LOGGER_LEVELS.map((val) => `\"${val}\"`).join(\n \", \",\n );\n const levelDisplay =\n typeof loggerOptions.level === \"string\"\n ? loggerOptions.level\n : `(${typeof loggerOptions.level})`;\n\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.level\": \"${levelDisplay}\". Must be one of: ${validLevelList}`,\n );\n }\n\n if (\n loggerOptions.callback !== undefined &&\n typeof loggerOptions.callback !== \"function\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.callback\": expected function`,\n );\n }\n\n if (\n loggerOptions.callbackIgnoresLevel !== undefined &&\n typeof loggerOptions.callbackIgnoresLevel !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"logger.callbackIgnoresLevel\": expected boolean`,\n );\n }\n}\n\nexport function validateOptions(options: unknown, methodName: string): void {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: expected plain object`,\n );\n }\n\n const opts = options as Record<string, unknown>;\n\n for (const key of Object.keys(opts)) {\n if (!KNOWN_OPTIONS.has(key)) {\n throw new TypeError(`[router.${methodName}] Unknown option: \"${key}\"`);\n }\n }\n\n validateDefaultRoute(opts.defaultRoute, methodName);\n validateDefaultParams(opts.defaultParams, methodName);\n validateStringEnum(\n opts.trailingSlash,\n \"trailingSlash\",\n VALID_OPTION_VALUES.trailingSlash,\n methodName,\n );\n validateStringEnum(\n opts.queryParamsMode,\n \"queryParamsMode\",\n VALID_OPTION_VALUES.queryParamsMode,\n methodName,\n );\n validateStringEnum(\n opts.urlParamsEncoding,\n \"urlParamsEncoding\",\n VALID_OPTION_VALUES.urlParamsEncoding,\n methodName,\n );\n\n if (\n opts.allowNotFound !== undefined &&\n typeof opts.allowNotFound !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"allowNotFound\": expected boolean, got ${typeof opts.allowNotFound}`,\n );\n }\n\n if (\n opts.rewritePathOnMatch !== undefined &&\n typeof opts.rewritePathOnMatch !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid \"rewritePathOnMatch\": expected boolean, got ${typeof opts.rewritePathOnMatch}`,\n );\n }\n\n validateQueryParamsOptions(opts.queryParams, methodName);\n validateLoggerOption(opts.logger, methodName);\n\n if (opts.limits !== undefined) {\n validateLimits(opts.limits, methodName);\n }\n}\n","// packages/validation-plugin/src/validators/plugins.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { computeThresholds } from \"../helpers\";\n\nconst DEFAULT_MAX_PLUGINS = 50;\n\nconst LOGGER_CTX = \"router.usePlugin\";\n\nconst PLUGIN_EVENTS_MAP: Record<string, true> = {\n onStart: true,\n onStop: true,\n onTransitionStart: true,\n onTransitionSuccess: true,\n onTransitionError: true,\n onTransitionCancel: true,\n};\n\nexport function validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins: number = DEFAULT_MAX_PLUGINS,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount > maxPlugins) {\n throw new RangeError(\n `[router.usePlugin] Plugin limit exceeded (${maxPlugins}). ` +\n `Current: ${currentCount}, Attempting to add: ${newCount}. ` +\n `This indicates an architectural problem. Consider consolidating plugins.`,\n );\n }\n}\n\nexport function validateCountThresholds(\n count: number,\n maxPlugins: number,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxPlugins);\n\n if (count >= error) {\n logger.error(\n LOGGER_CTX,\n `${count} plugins registered! This is excessive. Hard limit at ${maxPlugins}.`,\n );\n } else if (count >= warn) {\n logger.warn(\n LOGGER_CTX,\n `${count} plugins registered. Consider if all are necessary.`,\n );\n }\n}\n\nexport function validatePluginKeys(plugin: unknown): void {\n for (const key in plugin as Record<string, unknown>) {\n if (!(key === \"teardown\" || key in PLUGIN_EVENTS_MAP)) {\n throw new TypeError(\n `[router.usePlugin] Unknown property '${key}'. Plugin must only contain event handlers and optional teardown.`,\n );\n }\n }\n}\n\nexport function warnBatchDuplicates(): void {\n logger.warn(\n LOGGER_CTX,\n \"Duplicate factory in batch, will be registered once\",\n );\n}\n\nexport function warnPluginMethodType(methodName: string): void {\n logger.warn(\n LOGGER_CTX,\n `Property '${methodName}' is not a function, skipping`,\n );\n}\n\nexport function warnPluginAfterStart(methodName: string): void {\n if (methodName === \"onStart\") {\n logger.warn(\n LOGGER_CTX,\n \"Router already started, onStart will not be called\",\n );\n }\n}\n\nexport function validateAddInterceptorArgs(method: unknown, fn: unknown): void {\n const validMethods = [\"start\", \"buildPath\", \"forwardState\"];\n\n if (typeof method !== \"string\" || !validMethods.includes(method)) {\n throw new TypeError(\n `[router.addInterceptor] Invalid method: \"${String(method)}\". Must be one of: ${validMethods.join(\", \")}`,\n );\n }\n if (typeof fn !== \"function\") {\n throw new TypeError(\n `[router.addInterceptor] interceptor must be a function, got ${typeof fn}`,\n );\n }\n}\n","// packages/validation-plugin/src/validators/retrospective.ts\n\nimport { resolveForwardChain as coreResolveForwardChain } from \"@real-router/core\";\n\n/**\n * Retrospective validators — run AFTER the route tree is already built.\n * Called by the validation plugin at usePlugin() time, in a try/catch with rollback.\n *\n * The plugin is registered AFTER the constructor, so all routes are already in the store.\n * These functions receive store objects as parameters and cast internally using\n * local structural interfaces to avoid tight coupling to core internal types.\n *\n * All parameters are typed as `unknown` — cast internally as needed.\n */\n\n// =============================================================================\n// Local structural interfaces (cast-only, not imported from core internals)\n// =============================================================================\n\ninterface LocalSegmentParamMeta {\n urlParams: readonly string[];\n spatParams: readonly string[];\n}\n\ninterface LocalRouteSegment {\n paramMeta: LocalSegmentParamMeta;\n}\n\ninterface LocalRouteTree {\n children: Map<string, LocalRouteTree>;\n paramMeta: LocalSegmentParamMeta;\n}\n\ninterface LocalRouteMatcher {\n getSegmentsByName: (\n name: string,\n ) => readonly LocalRouteSegment[] | null | undefined;\n}\n\ninterface LocalRouteConfig {\n forwardMap: Record<string, string>;\n forwardFnMap: Record<string, unknown>;\n defaultParams: Record<string, unknown>;\n decoders: Record<string, unknown>;\n encoders: Record<string, unknown>;\n}\n\ninterface LocalRouteDefinition {\n name: string;\n path: string;\n children?: LocalRouteDefinition[];\n}\n\ninterface LocalRoutesStore {\n definitions: LocalRouteDefinition[];\n config: LocalRouteConfig;\n tree: LocalRouteTree;\n matcher: LocalRouteMatcher;\n}\n\ninterface LocalDependencyLimits {\n maxDependencies: number;\n maxPlugins: number;\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n maxLifecycleHandlers: number;\n}\n\n// =============================================================================\n// Private helpers\n// =============================================================================\n\nfunction assertRoutesStore(store: unknown, fnName: string): LocalRoutesStore {\n if (!store || typeof store !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store must be an object`,\n );\n }\n\n const storeRecord = store as Record<string, unknown>;\n\n if (!Array.isArray(storeRecord.definitions)) {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.definitions must be an array`,\n );\n }\n\n if (!storeRecord.config || typeof storeRecord.config !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.config must be an object`,\n );\n }\n\n if (!storeRecord.tree || typeof storeRecord.tree !== \"object\") {\n throw new TypeError(\n `[validation-plugin] ${fnName}: store.tree must be an object`,\n );\n }\n\n return storeRecord as unknown as LocalRoutesStore;\n}\n\nfunction walkDefinitions(\n definitions: LocalRouteDefinition[],\n callback: (def: LocalRouteDefinition, fullName: string) => void,\n parentName = \"\",\n): void {\n for (const def of definitions) {\n const fullName = parentName ? `${parentName}.${def.name}` : def.name;\n\n callback(def, fullName);\n\n if (def.children) {\n walkDefinitions(def.children, callback, fullName);\n }\n }\n}\n\nfunction routeExistsInTree(tree: LocalRouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: LocalRouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Wraps core's resolveForwardChain with [validation-plugin] prefix on errors.\n * Core's version throws plain Error messages; retrospective validation\n * needs the [validation-plugin] prefix for consistency.\n */\nfunction resolveForwardChainWithPrefix(\n startRoute: string,\n forwardMap: Record<string, string>,\n): string {\n try {\n return coreResolveForwardChain(startRoute, forwardMap);\n } catch (error) {\n throw new Error(`[validation-plugin] ${(error as Error).message}`, {\n cause: error,\n });\n }\n}\n\nfunction collectUrlParams(segments: readonly LocalRouteSegment[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Asserts that a function value is not async (native or transpiled).\n * Adapted from: assertNotAsync() in RoutesNamespace/validators.ts\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(fn: Function, label: string, routeName: string): void {\n const function_ = fn as {\n constructor: { name: string };\n toString: () => string;\n };\n\n if (\n function_.constructor.name === \"AsyncFunction\" ||\n function_.toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[validation-plugin] Route \"${routeName}\" ${label} cannot be async`,\n );\n }\n}\n\n// =============================================================================\n// 1. validateExistingRoutes\n// =============================================================================\n\n/**\n * Validates the existing route tree/definitions for structural integrity.\n * Walks all route definitions, checks for duplicate names and invalid structure.\n * Adapted from: validateRoutes() in RoutesNamespace/validators.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If store shape is invalid or definitions have structural issues\n * @throws {Error} If duplicate route names are detected\n */\nexport function validateExistingRoutes(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateExistingRoutes\");\n const seenNames = new Set<string>();\n\n walkDefinitions(routesStore.definitions, (def, fullName) => {\n if (typeof def.name !== \"string\" || !def.name) {\n throw new TypeError(\n `[validation-plugin] validateExistingRoutes: route has invalid name: ${def.name}`,\n );\n }\n\n if (typeof def.path !== \"string\") {\n throw new TypeError(\n `[validation-plugin] validateExistingRoutes: route \"${fullName}\" has non-string path (${typeof def.path})`,\n );\n }\n\n if (seenNames.has(fullName)) {\n throw new Error(\n `[validation-plugin] validateExistingRoutes: duplicate route name detected: \"${fullName}\"`,\n );\n }\n\n seenNames.add(fullName);\n });\n}\n\n// =============================================================================\n// 2. validateForwardToConsistency\n// =============================================================================\n\n/**\n * Validates forwardTo consistency across all chains in the store.\n * Checks target existence, param compatibility, and circular chain detection.\n * Adapted from: validateForwardToTargets() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {Error} If any forwardTo target does not exist in the tree\n * @throws {Error} If param incompatibility is detected across a forwardTo pair\n * @throws {Error} If a circular forwardTo chain is detected\n */\nexport function validateForwardToConsistency(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateForwardToConsistency\");\n const { config, tree, matcher } = routesStore;\n\n // Check target existence and param compatibility for each static mapping\n for (const [fromRoute, targetRoute] of Object.entries(config.forwardMap)) {\n if (!routeExistsInTree(tree, targetRoute)) {\n throw new Error(\n `[validation-plugin] validateForwardToConsistency: forwardTo target \"${targetRoute}\" ` +\n `does not exist in tree (source route: \"${fromRoute}\")`,\n );\n }\n\n // Validate param compatibility: target must not require params absent in source\n const sourceSegments = matcher.getSegmentsByName(fromRoute);\n const targetSegments = matcher.getSegmentsByName(targetRoute);\n\n if (sourceSegments && targetSegments) {\n const sourceParams = collectUrlParams(sourceSegments);\n const targetParams = collectUrlParams(targetSegments);\n const missingParams = [...targetParams].filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[validation-plugin] validateForwardToConsistency: forwardTo target \"${targetRoute}\" ` +\n `requires params [${missingParams.join(\", \")}] not available in source route \"${fromRoute}\"`,\n );\n }\n }\n }\n\n // Detect cycles in the full forwardMap (catches multi-hop cycles)\n for (const fromRoute of Object.keys(config.forwardMap)) {\n resolveForwardChainWithPrefix(fromRoute, config.forwardMap);\n }\n}\n\n// =============================================================================\n// 3. validateRouteProperties\n// =============================================================================\n\n/**\n * Validates route properties for all registered routes in the store.\n * Checks decoder/encoder types, defaultParams structure, and async forwardTo callbacks.\n * Adapted from: validateRouteProperties() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If any registered decoder/encoder is not a valid sync function\n * @throws {TypeError} If any defaultParams is not a plain object\n * @throws {TypeError} If any forwardTo callback is async\n */\nexport function validateRoutePropertiesStore(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateRoutePropertiesStore\");\n const { config } = routesStore;\n\n // Validate decoders — must be non-async functions (sync required for matchPath/buildPath)\n for (const [routeName, decoder] of Object.entries(config.decoders)) {\n if (typeof decoder !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" decoder must be a function, got ${typeof decoder}`,\n );\n }\n\n assertNotAsync(decoder, \"decoder\", routeName);\n }\n\n // Validate encoders — must be non-async functions (sync required for matchPath/buildPath)\n for (const [routeName, encoder] of Object.entries(config.encoders)) {\n if (typeof encoder !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" encoder must be a function, got ${typeof encoder}`,\n );\n }\n\n assertNotAsync(encoder, \"encoder\", routeName);\n }\n\n // Validate defaultParams — must be plain objects (not null, array, or other types)\n for (const [routeName, params] of Object.entries(config.defaultParams)) {\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" defaultParams must be a plain object, got ${Array.isArray(params) ? \"array\" : typeof params}`,\n );\n }\n }\n\n // Validate forwardTo function callbacks — must be non-async functions\n for (const [routeName, callback] of Object.entries(config.forwardFnMap)) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\n `[validation-plugin] validateRoutePropertiesStore: route \"${routeName}\" forwardTo callback must be a function, got ${typeof callback}`,\n );\n }\n\n assertNotAsync(callback, \"forwardTo callback\", routeName);\n }\n}\n\n// =============================================================================\n// 4. validateForwardToTargets\n// =============================================================================\n\n/**\n * Validates that all static forwardTo targets exist in the route tree.\n * This is a focused existence-only check (param compat is in validateForwardToConsistency).\n * Adapted from: validateForwardToTargets() in forwardToValidation.ts\n *\n * @param store - RoutesStore instance (typed as unknown to avoid core coupling)\n * @throws {Error} If any forwardTo target route does not exist in the tree\n */\nexport function validateForwardToTargetsStore(store: unknown): void {\n const routesStore = assertRoutesStore(store, \"validateForwardToTargetsStore\");\n const { config, tree } = routesStore;\n\n for (const [fromRoute, targetRoute] of Object.entries(config.forwardMap)) {\n if (!routeExistsInTree(tree, targetRoute)) {\n throw new Error(\n `[validation-plugin] validateForwardToTargetsStore: forwardTo target \"${targetRoute}\" ` +\n `does not exist for route \"${fromRoute}\"`,\n );\n }\n }\n}\n\n// =============================================================================\n// 5. validateDependenciesStructure\n// =============================================================================\n\n/**\n * Validates the full structure of the dependencies store.\n * Checks that the dependencies object is valid, has no getters, and limits are well-formed.\n * Adapted from: validateDependenciesObject() in DependenciesNamespace/validators.ts\n *\n * @param deps - DependenciesStore instance (typed as unknown to avoid core coupling)\n * @throws {TypeError} If deps is not an object\n * @throws {TypeError} If deps.dependencies is not a valid plain object (or has getters)\n * @throws {TypeError} If deps.limits is missing or has non-numeric limit values\n */\nexport function validateDependenciesStructure(deps: unknown): void {\n if (!deps || typeof deps !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps must be an object\",\n );\n }\n\n const depsRecord = deps as Record<string, unknown>;\n\n // Validate dependencies field exists and is an object\n if (!depsRecord.dependencies || typeof depsRecord.dependencies !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps.dependencies must be an object\",\n );\n }\n\n const dependencies = depsRecord.dependencies as Record<string, unknown>;\n\n // Getters can throw, return different values, or have side effects — reject them\n for (const key of Object.keys(dependencies)) {\n if (Object.getOwnPropertyDescriptor(dependencies, key)?.get) {\n throw new TypeError(\n `[validation-plugin] validateDependenciesStructure: dependency \"${key}\" must not use a getter`,\n );\n }\n }\n\n // Validate limits field exists and is an object\n if (!depsRecord.limits || typeof depsRecord.limits !== \"object\") {\n throw new TypeError(\n \"[validation-plugin] validateDependenciesStructure: deps.limits must be an object\",\n );\n }\n\n const limits = depsRecord.limits as Record<string, unknown>;\n const expectedLimitKeys: (keyof LocalDependencyLimits)[] = [\n \"maxDependencies\",\n \"maxPlugins\",\n \"maxListeners\",\n \"warnListeners\",\n \"maxEventDepth\",\n \"maxLifecycleHandlers\",\n ];\n\n for (const key of expectedLimitKeys) {\n if (typeof limits[key] !== \"number\") {\n throw new TypeError(\n `[validation-plugin] validateDependenciesStructure: deps.limits.${key} must be a number, got ${typeof limits[key]}`,\n );\n }\n }\n}\n\n// =============================================================================\n// 6. validateLimitsConsistency\n// =============================================================================\n\n/**\n * Validates that actual resource counts don't exceed configured limits.\n * Compares dependency count vs maxDependencies limit from the deps store.\n * Any route-level limit configured in options is also checked against definitions.\n * Adapted from: validateLimits() in OptionsNamespace/validators.ts\n *\n * @param options - Router options (typed as unknown to avoid core coupling)\n * @throws {RangeError} If dependency count reaches or exceeds maxDependencies limit\n * @throws {RangeError} If route count exceeds a configured maxRoutes limit in options\n */\nfunction extractConfiguredLimits(options: unknown): Record<string, unknown> {\n const opts =\n options && typeof options === \"object\"\n ? (options as Record<string, unknown>)\n : {};\n\n return opts.limits && typeof opts.limits === \"object\"\n ? (opts.limits as Record<string, unknown>)\n : {};\n}\n\nfunction checkRouteCountLimit(\n store: unknown,\n configuredLimits: Record<string, unknown>,\n): void {\n if (!store || typeof store !== \"object\") {\n return;\n }\n\n const storeRecord = store as Record<string, unknown>;\n\n if (!Array.isArray(storeRecord.definitions)) {\n return;\n }\n\n const routeCount = (storeRecord.definitions as unknown[]).length;\n const maxRoutes = configuredLimits.maxRoutes;\n\n if (\n typeof maxRoutes === \"number\" &&\n maxRoutes > 0 &&\n routeCount > maxRoutes\n ) {\n throw new RangeError(\n `[validation-plugin] validateLimitsConsistency: route count (${routeCount}) exceeds configured limit (${maxRoutes})`,\n );\n }\n}\n\nfunction checkDepCountLimit(\n deps: unknown,\n configuredLimits: Record<string, unknown>,\n): void {\n if (!deps || typeof deps !== \"object\") {\n return;\n }\n\n const depsRecord = deps as Record<string, unknown>;\n const dependencies = depsRecord.dependencies;\n const depsLimits = depsRecord.limits;\n\n if (\n !dependencies ||\n typeof dependencies !== \"object\" ||\n !depsLimits ||\n typeof depsLimits !== \"object\"\n ) {\n return;\n }\n\n const depCount = Object.keys(dependencies).length;\n const limitsRecord = depsLimits as Record<string, unknown>;\n const maxDepsFromOptions = configuredLimits.maxDependencies;\n const maxDepsFromStore = limitsRecord.maxDependencies;\n const maxDeps =\n typeof maxDepsFromOptions === \"number\"\n ? maxDepsFromOptions\n : maxDepsFromStore;\n\n if (typeof maxDeps === \"number\" && maxDeps > 0 && depCount >= maxDeps) {\n throw new RangeError(\n `[validation-plugin] validateLimitsConsistency: dependency count (${depCount}) reaches or exceeds maxDependencies limit (${maxDeps})`,\n );\n }\n}\n\nexport function validateLimitsConsistency(\n options: unknown,\n store: unknown,\n deps: unknown,\n): void {\n const configuredLimits = extractConfiguredLimits(options);\n\n checkRouteCountLimit(store, configuredLimits);\n checkDepCountLimit(deps, configuredLimits);\n}\n","// packages/validation-plugin/src/validators/forwardTo.ts\n\nimport { resolveForwardChain } from \"@real-router/core\";\nimport { getSegmentsByName } from \"route-tree\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { Route, DefaultDependencies } from \"@real-router/core\";\nimport type { RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Route Property Validation\n// ============================================================================\n\nfunction validateForwardToProperty(forwardTo: unknown, fullName: string): void {\n if (forwardTo === undefined) {\n return;\n }\n\n if (typeof forwardTo === \"function\") {\n const isNativeAsync =\n (forwardTo as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\";\n const isTranspiledAsync = forwardTo.toString().includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n}\n\nexport function validateRouteProperties<\n Dependencies extends DefaultDependencies,\n>(route: Route<Dependencies>, fullName: string): void {\n if (\n route.canActivate !== undefined &&\n typeof route.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canActivate)}`,\n );\n }\n\n if (\n route.canDeactivate !== undefined &&\n typeof route.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canDeactivate)}`,\n );\n }\n\n if (route.defaultParams !== undefined) {\n const params: unknown = route.defaultParams;\n\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[router.addRoute] defaultParams must be an object for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.defaultParams)}`,\n );\n }\n }\n\n if (route.decodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n if (route.encodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n validateForwardToProperty(route.forwardTo, fullName);\n\n if (route.children) {\n for (const child of route.children) {\n const childFullName = `${fullName}.${child.name}`;\n\n validateRouteProperties(child, childFullName);\n }\n }\n}\n\n// ============================================================================\n// ForwardTo Validation\n// ============================================================================\n\nfunction extractParamsFromPath(path: string): Set<string> {\n const params = new Set<string>();\n const paramRegex = /[*:]([A-Z_a-z]\\w*)/g;\n let match;\n\n while ((match = paramRegex.exec(path)) !== null) {\n params.add(match[1]);\n }\n\n return params;\n}\n\nfunction extractParamsFromPaths(paths: readonly string[]): Set<string> {\n const params = new Set<string>();\n\n for (const path of paths) {\n for (const param of extractParamsFromPath(path)) {\n params.add(param);\n }\n }\n\n return params;\n}\n\nfunction collectPathsToRoute<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n routeName: string,\n parentName = \"\",\n paths: string[] = [],\n): string[] {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n const currentPaths = [...paths, route.path];\n\n if (fullName === routeName) {\n return currentPaths;\n }\n\n if (route.children && routeName.startsWith(`${fullName}.`)) {\n return collectPathsToRoute(\n route.children,\n routeName,\n fullName,\n currentPaths,\n );\n }\n }\n\n /* v8 ignore next -- @preserve unreachable: callers validate existence */\n throw new Error(\n `[internal] collectPathsToRoute: route \"${routeName}\" not found`,\n );\n}\n\nfunction collectRouteNames<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Set<string> {\n const names = new Set<string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n names.add(fullName);\n\n if (route.children) {\n for (const childName of collectRouteNames(route.children, fullName)) {\n names.add(childName);\n }\n }\n }\n\n return names;\n}\n\nfunction collectForwardMappings<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Map<string, string> {\n const mappings = new Map<string, string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n if (route.forwardTo && typeof route.forwardTo === \"string\") {\n mappings.set(fullName, route.forwardTo);\n }\n\n if (route.children) {\n for (const [key, value] of collectForwardMappings(\n route.children,\n fullName,\n )) {\n mappings.set(key, value);\n }\n }\n }\n\n return mappings;\n}\n\nfunction getRequiredParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\nfunction routeExistsInTree(tree: RouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: RouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction getTargetParams<Dependencies extends DefaultDependencies>(\n targetRoute: string,\n existsInTree: boolean,\n tree: RouteTree,\n routes: readonly Route<Dependencies>[],\n): Set<string> {\n if (existsInTree) {\n /* v8 ignore next -- @preserve: ?? fallback unreachable — existsInTree guarantees non-null */\n return getRequiredParams(getSegmentsByName(tree, targetRoute) ?? []);\n }\n\n return extractParamsFromPaths(collectPathsToRoute(routes, targetRoute));\n}\n\nfunction validateSingleForward<Dependencies extends DefaultDependencies>(\n fromRoute: string,\n targetRoute: string,\n routes: readonly Route<Dependencies>[],\n batchNames: Set<string>,\n tree: RouteTree,\n): void {\n const existsInTree = routeExistsInTree(tree, targetRoute);\n const existsInBatch = batchNames.has(targetRoute);\n\n if (!existsInTree && !existsInBatch) {\n throw new ReferenceError(\n `[router.addRoute] forwardTo target \"${targetRoute}\" does not exist ` +\n `for route \"${fromRoute}\"`,\n );\n }\n\n const fromParams = extractParamsFromPaths(\n collectPathsToRoute(routes, fromRoute),\n );\n\n const toParams = getTargetParams(targetRoute, existsInTree, tree, routes);\n\n const missingParams = [...toParams].filter((param) => !fromParams.has(param));\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${fromRoute}\"`,\n );\n }\n}\n\nexport function validateForwardToTargets<\n Dependencies extends DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n existingForwardMap: Record<string, string>,\n tree: RouteTree,\n): void {\n const batchNames = collectRouteNames(routes);\n const batchForwards = collectForwardMappings(routes);\n\n const combinedForwardMap: Record<string, string> = { ...existingForwardMap };\n\n for (const [from, to] of batchForwards) {\n combinedForwardMap[from] = to;\n }\n\n for (const [fromRoute, targetRoute] of batchForwards) {\n validateSingleForward(fromRoute, targetRoute, routes, batchNames, tree);\n }\n\n for (const fromRoute of Object.keys(combinedForwardMap)) {\n resolveForwardChain(fromRoute, combinedForwardMap);\n }\n}\n","// packages/validation-plugin/src/validators/routes.ts\n\n/**\n * DX-only validator functions for RoutesNamespace.\n * Copied from packages/core/src/namespaces/RoutesNamespace/validators.ts\n * (excludes validateRemoveRoute/validateClearRoutes — those are in routeGuards.ts)\n */\n\nimport { resolveForwardChain } from \"@real-router/core\";\nimport { validateRoute } from \"route-tree\";\nimport {\n isString,\n validateRouteName,\n isParams,\n getTypeDescription,\n} from \"type-guards\";\n\nimport { validateForwardToTargets, validateRouteProperties } from \"./forwardTo\";\n\nimport type {\n Route,\n RouteConfigUpdate,\n DefaultDependencies,\n Params,\n} from \"@real-router/core\";\nimport type { Matcher, RouteTree } from \"route-tree\";\n\n// Internal constant (matches core's INTERNAL_ROUTE_PREFIX)\nconst INTERNAL_ROUTE_PREFIX = \"@@\";\n\n// Minimal local type — only the forwardMap field used by this file\n// (RouteConfig from core is not exported from @real-router/core public API)\ninterface RouteConfigLike {\n forwardMap: Record<string, string>;\n}\n\n// Local type - matches ForwardToCallback from @real-router/types\n// (@real-router/types is not a direct dependency of this package)\ntype ForwardToCallback<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> = (\n getDependency: <K extends keyof Dependencies>(name: K) => Dependencies[K],\n params: Params,\n) => string;\n\nexport function throwIfInternalRoute(name: string, methodName: string): void {\n if (name.startsWith(INTERNAL_ROUTE_PREFIX)) {\n throw new Error(\n `[router.${methodName}] Route name \"${name}\" uses the reserved \"${INTERNAL_ROUTE_PREFIX}\" prefix. Routes with this prefix are internal and cannot be modified through the public API.`,\n );\n }\n}\n\nexport function throwIfInternalRouteInArray(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\n routes: readonly Route<any>[],\n methodName: string,\n): void {\n for (const route of routes) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime safety\n if (route && typeof route === \"object\" && typeof route.name === \"string\") {\n throwIfInternalRoute(route.name, methodName);\n\n if (route.children) {\n throwIfInternalRouteInArray(route.children, methodName);\n }\n }\n }\n}\n\n/**\n * Validates removeRoute arguments.\n */\nexport function validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRouteName(name, \"removeRoute\");\n}\n\nexport function validateSetRootPathArgs(\n rootPath: unknown,\n): asserts rootPath is string {\n if (typeof rootPath !== \"string\") {\n throw new TypeError(\n `[router.setRootPath] rootPath must be a string, got ${getTypeDescription(rootPath)}`,\n );\n }\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return (\n (fn as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" || String(fn).includes(\"__awaiter\")\n );\n}\n\nexport function guardRouteCallbacks(route: unknown): void {\n const routeObj = route as { canActivate?: unknown; canDeactivate?: unknown };\n\n if (\n routeObj.canActivate !== undefined &&\n typeof routeObj.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function, got ${getTypeDescription(routeObj.canActivate)}`,\n );\n }\n\n if (\n routeObj.canDeactivate !== undefined &&\n typeof routeObj.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function, got ${getTypeDescription(routeObj.canDeactivate)}`,\n );\n }\n}\n\nexport function guardNoAsyncCallbacks(route: unknown): void {\n const routeObj = route as {\n decodeParams?: unknown;\n encodeParams?: unknown;\n forwardTo?: unknown;\n name?: unknown;\n };\n const routeName = routeObj.name;\n\n if (\n routeObj.decodeParams !== undefined &&\n isAsyncFunction(routeObj.decodeParams)\n ) {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${String(routeName)}\"`,\n );\n }\n\n if (\n routeObj.encodeParams !== undefined &&\n isAsyncFunction(routeObj.encodeParams)\n ) {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${String(routeName)}\"`,\n );\n }\n\n if (\n typeof routeObj.forwardTo === \"function\" &&\n isAsyncFunction(routeObj.forwardTo)\n ) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${String(routeName)}\"`,\n );\n }\n}\n\n/**\n * Validates addRoute arguments (route structure and properties).\n * State-dependent validation (duplicates, tree) happens in instance method.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\nexport function validateAddRouteArgs(routes: readonly Route<any>[]): void {\n for (const route of routes) {\n // First check if route is an object (before accessing route.name)\n // Runtime check for invalid types passed via `as any`\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime check\n if (route === null || typeof route !== \"object\" || Array.isArray(route)) {\n throw new TypeError(\n `[router.addRoute] Route must be an object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Validate route properties (canActivate, canDeactivate, defaultParams, async checks)\n // Note: validateRouteProperties handles children recursively\n validateRouteProperties(route, route.name);\n }\n}\n\n/**\n * Validates parent option for addRoute.\n */\nexport function validateParentOption(\n parent: unknown,\n): asserts parent is string {\n if (typeof parent !== \"string\" || parent === \"\") {\n throw new TypeError(\n `[router.addRoute] parent option must be a non-empty string, got ${getTypeDescription(parent)}`,\n );\n }\n\n // Validate parent is a valid route name format (can contain dots — it's a fullName reference)\n validateRouteName(parent, \"addRoute\");\n}\n\n/**\n * Validates isActiveRoute arguments.\n */\nexport function validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n): void {\n // Validate name - non-string throws\n if (!isString(name)) {\n throw new TypeError(\n `[router.isActiveRoute] name must be a string, got ${typeof name}`,\n );\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.isActiveRoute] params must be a plain object, got ${getTypeDescription(params)}`,\n );\n }\n\n // Validate strictEquality if provided\n if (strictEquality !== undefined && typeof strictEquality !== \"boolean\") {\n throw new TypeError(\n `[router.isActiveRoute] strictEquality must be a boolean, got ${typeof strictEquality}`,\n );\n }\n\n // Validate ignoreQueryParams if provided\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.isActiveRoute] ignoreQueryParams must be a boolean, got ${typeof ignoreQueryParams}`,\n );\n }\n}\n\n/**\n * Validates forwardState/buildState arguments.\n */\nexport function validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n): void {\n if (!isString(routeName)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeName: ${getTypeDescription(routeName)}. Expected string.`,\n );\n }\n\n if (!isParams(routeParams)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeParams: ${getTypeDescription(routeParams)}. Expected plain object.`,\n );\n }\n}\n\n/**\n * Validates updateRoute basic arguments (name and updates object structure).\n * Does NOT read property values to allow caller to cache them first.\n */\nexport function validateUpdateRouteBasicArgs<\n Dependencies extends DefaultDependencies,\n>(\n name: unknown,\n updates: unknown,\n): asserts updates is RouteConfigUpdate<Dependencies> {\n // Validate name\n validateRouteName(name, \"updateRoute\");\n\n if (name === \"\") {\n throw new ReferenceError(\n `[router.updateRoute] Invalid name: empty string. Cannot update root node.`,\n );\n }\n\n // Validate updates is not null\n\n if (updates === null) {\n throw new TypeError(\n `[router.updateRoute] updates must be an object, got null`,\n );\n }\n\n // Validate updates is an object (not array)\n if (typeof updates !== \"object\" || Array.isArray(updates)) {\n throw new TypeError(\n `[router.updateRoute] updates must be an object, got ${getTypeDescription(updates)}`,\n );\n }\n}\n\n/**\n * Asserts that a function is not async (native or transpiled).\n * Checks both constructor name and toString() for __awaiter pattern.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(value: Function, paramName: string): void {\n if (\n (value as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" ||\n (value as { toString: () => string }).toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[router.updateRoute] ${paramName} cannot be an async function`,\n );\n }\n}\n\n/**\n * Validates that a value is a non-async function, if provided.\n */\nfunction validateFunctionParam(value: unknown, paramName: string): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\n `[router.updateRoute] ${paramName} must be a function or null, got ${typeof value}`,\n );\n }\n\n assertNotAsync(value, paramName);\n}\n\n/**\n * Validates updateRoute property types using pre-cached values.\n * Called AFTER properties are cached to ensure getters are called only once.\n */\nexport function validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n): void {\n // Validate forwardTo type (existence check is done by instance method)\n if (forwardTo !== undefined && forwardTo !== null) {\n if (typeof forwardTo !== \"string\" && typeof forwardTo !== \"function\") {\n throw new TypeError(\n `[router.updateRoute] forwardTo must be a string, function, or null, got ${getTypeDescription(forwardTo)}`,\n );\n }\n\n if (typeof forwardTo === \"function\") {\n assertNotAsync(forwardTo, \"forwardTo callback\");\n }\n }\n\n // Validate defaultParams\n if (\n defaultParams !== undefined &&\n defaultParams !== null &&\n (typeof defaultParams !== \"object\" || Array.isArray(defaultParams))\n ) {\n throw new TypeError(\n `[router.updateRoute] defaultParams must be an object or null, got ${getTypeDescription(defaultParams)}`,\n );\n }\n\n validateFunctionParam(decodeParams, \"decodeParams\");\n validateFunctionParam(encodeParams, \"encodeParams\");\n}\n\n/**\n * Validates buildPath arguments.\n */\nexport function validateBuildPathArgs(route: unknown): asserts route is string {\n if (!isString(route) || route === \"\") {\n throw new TypeError(\n `[router.buildPath] route must be a non-empty string, got ${typeof route === \"string\" ? '\"\"' : typeof route}`,\n );\n }\n}\n\n/**\n * Validates matchPath arguments.\n */\nexport function validateMatchPathArgs(path: unknown): asserts path is string {\n if (!isString(path)) {\n throw new TypeError(\n `[router.matchPath] path must be a string, got ${typeof path}`,\n );\n }\n}\n\n/**\n * Validates shouldUpdateNode arguments.\n */\nexport function validateShouldUpdateNodeArgs(\n nodeName: unknown,\n): asserts nodeName is string {\n if (!isString(nodeName)) {\n throw new TypeError(\n `[router.shouldUpdateNode] nodeName must be a string, got ${typeof nodeName}`,\n );\n }\n}\n\n/**\n * Validates routes for addition to the router.\n * Checks parent existence, duplicates, and forwardTo targets/cycles.\n *\n * @param routes - Routes to validate\n * @param tree - Current route tree (optional for initial validation)\n * @param forwardMap - Current forward map for cycle detection\n * @param parentName - Optional parent route fullName for nesting via addRoute({ parent })\n */\nexport function validateRoutes<Dependencies extends DefaultDependencies>(\n routes: Route<Dependencies>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n): void {\n // Validate parent route exists in tree\n if (parentName && tree) {\n let node: RouteTree | undefined = tree;\n\n for (const segment of parentName.split(\".\")) {\n node = node.children.get(segment);\n\n if (!node) {\n throw new ReferenceError(\n `[router.addRoute] Parent route \"${parentName}\" does not exist`,\n );\n }\n }\n }\n\n // Tracking sets for duplicate detection\n const seenNames = new Set<string>();\n const seenPathsByParent = new Map<string, Set<string>>();\n\n for (const route of routes) {\n validateRoute(\n route,\n \"addRoute\",\n tree,\n parentName ?? \"\",\n seenNames,\n seenPathsByParent,\n );\n }\n\n if (tree && forwardMap) {\n validateForwardToTargets(routes, forwardMap, tree);\n }\n}\n\n// ============================================================================\n// Instance-level validators (moved from routesCrud.ts)\n// ============================================================================\n\n/**\n * Collects URL params from segments into a Set.\n */\nfunction collectUrlParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Validates that forwardTo target doesn't require params that source doesn't have.\n *\n * @param sourceName - Source route name\n * @param targetName - Target route name\n * @param matcher - Current route matcher\n */\nexport function validateForwardToParamCompatibility(\n sourceName: string,\n targetName: string,\n matcher: Matcher,\n): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sourceSegments = matcher.getSegmentsByName(\n sourceName,\n )! as readonly RouteTree[];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const targetSegments = matcher.getSegmentsByName(\n targetName,\n )! as readonly RouteTree[];\n\n // Get source URL params as a Set for O(1) lookup\n const sourceParams = collectUrlParams(sourceSegments);\n\n // Build target URL params array (inline — no separate helper needed)\n const targetParams: string[] = [];\n\n for (const segment of targetSegments) {\n for (const param of segment.paramMeta.urlParams) {\n targetParams.push(param);\n }\n }\n\n // Check if target requires params that source doesn't have\n const missingParams = targetParams.filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetName}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${sourceName}\"`,\n );\n }\n}\n\n/**\n * Validates that adding forwardTo doesn't create a cycle.\n * Creates a test map with the new entry and uses resolveForwardChain\n * to detect cycles before any mutation happens.\n *\n * @param sourceName - Source route name\n * @param targetName - Target route name\n * @param config - Current route config (forwardMap read-only in this call)\n */\nexport function validateForwardToCycle(\n sourceName: string,\n targetName: string,\n config: RouteConfigLike,\n): void {\n // Create a test map with the new entry to validate BEFORE mutation\n const testMap = {\n ...config.forwardMap,\n [sourceName]: targetName,\n };\n\n // resolveForwardChain will throw if cycle is detected or max depth exceeded\n resolveForwardChain(sourceName, testMap);\n}\n\n/**\n * Validates updateRoute instance-level constraints (route existence, forwardTo).\n *\n * @param name - Route name (already validated by static method)\n * @param forwardTo - Cached forwardTo value\n * @param hasRoute - Function to check route existence\n * @param matcher - Current route matcher\n * @param config - Current route config\n */\nexport function validateUpdateRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null | undefined,\n hasRoute: (n: string) => boolean,\n matcher: Matcher,\n config: RouteConfigLike,\n): void {\n // Validate route exists\n if (!hasRoute(name)) {\n throw new ReferenceError(\n `[router.updateRoute] route \"${name}\" does not exist`,\n );\n }\n\n // Validate forwardTo target exists and is valid (only for string forwardTo)\n if (\n forwardTo !== undefined &&\n forwardTo !== null &&\n typeof forwardTo === \"string\"\n ) {\n if (!hasRoute(forwardTo)) {\n throw new Error(\n `[router.updateRoute] forwardTo target \"${forwardTo}\" does not exist`,\n );\n }\n\n // Check forwardTo param compatibility\n validateForwardToParamCompatibility(name, forwardTo, matcher);\n\n // Check for cycle detection\n validateForwardToCycle(name, forwardTo, config);\n }\n}\n","// packages/validation-plugin/src/validators/state.ts\n\nimport { isString, isParams, getTypeDescription } from \"type-guards\";\n\nexport function validateMakeStateArgs(\n name: unknown,\n params: unknown,\n path: unknown,\n): void {\n if (!isString(name)) {\n throw new TypeError(\n `[router.makeState] Invalid name: ${getTypeDescription(name)}. Expected string.`,\n );\n }\n\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.makeState] Invalid params: ${getTypeDescription(params)}. Expected plain object.`,\n );\n }\n\n if (path !== undefined && !isString(path)) {\n throw new TypeError(\n `[router.makeState] Invalid path: ${getTypeDescription(path)}. Expected string.`,\n );\n }\n}\n","// packages/validation-plugin/src/validationPlugin.ts\n\nimport { RouterError } from \"@real-router/core\";\nimport { getInternals } from \"@real-router/core/validation\";\nimport {\n validateRouteName,\n isState,\n isBoolean,\n getTypeDescription,\n} from \"type-guards\";\n\nimport {\n validateDependencyName,\n validateSetDependencyArgs as validateSetDependencyArgsRaw,\n validateDependenciesObject,\n validateDependencyExists as validateDependencyExistsRaw,\n validateDependencyCount,\n validateCloneArgs,\n warnOverwrite as warnDepsOverwrite,\n warnBatchOverwrite,\n warnRemoveNonExistent,\n} from \"./validators/dependencies\";\nimport { validateEventName, validateListenerArgs } from \"./validators/eventBus\";\nimport {\n validateHandler,\n validateNotRegistering,\n validateHandlerLimit,\n validateLifecycleCountThresholds,\n warnOverwrite as warnLifecycleOverwrite,\n warnAsyncGuardSync,\n} from \"./validators/lifecycle\";\nimport {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigationOptions,\n validateNavigateParams,\n validateStartArgs,\n} from \"./validators/navigation\";\nimport {\n validateLimitValue,\n validateLimits,\n validateOptions,\n} from \"./validators/options\";\nimport {\n validatePluginLimit,\n validatePluginKeys,\n validateCountThresholds as validatePluginCountThresholds,\n warnBatchDuplicates,\n warnPluginMethodType,\n warnPluginAfterStart,\n validateAddInterceptorArgs,\n} from \"./validators/plugins\";\nimport {\n validateExistingRoutes,\n validateForwardToConsistency,\n validateRoutePropertiesStore,\n validateForwardToTargetsStore,\n validateDependenciesStructure,\n validateLimitsConsistency,\n} from \"./validators/retrospective\";\nimport {\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateIsActiveRouteArgs,\n validateShouldUpdateNodeArgs,\n validateStateBuilderArgs,\n validateAddRouteArgs,\n validateRoutes,\n validateRemoveRouteArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes,\n validateUpdateRoute,\n validateParentOption as validateParentOptionRaw,\n throwIfInternalRoute,\n throwIfInternalRouteInArray,\n validateSetRootPathArgs,\n guardRouteCallbacks,\n guardNoAsyncCallbacks,\n} from \"./validators/routes\";\nimport { validateMakeStateArgs } from \"./validators/state\";\n\nimport type { PluginFactory, RouterValidator } from \"@real-router/core\";\nimport type { RouterInternals } from \"@real-router/core/validation\";\n\nfunction buildValidatorObject(ctx: RouterInternals): RouterValidator {\n return {\n routes: {\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateIsActiveRouteArgs,\n validateShouldUpdateNodeArgs,\n validateStateBuilderArgs,\n\n validateAddRouteArgs(routes) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n validateAddRouteArgs(routes as any);\n },\n\n validateRoutes(routes, store) {\n const typedStore = store as {\n tree?: unknown;\n config?: { forwardMap?: Record<string, string> };\n };\n\n validateRoutes(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n routes as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n typedStore.tree as any,\n typedStore.config?.forwardMap,\n );\n },\n validateRemoveRouteArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes(_name, updates) {\n const upd = updates as Record<string, unknown>;\n\n validateUpdateRoutePropertyTypes(\n upd.forwardTo,\n upd.defaultParams,\n upd.decodeParams,\n upd.encodeParams,\n );\n },\n validateUpdateRoute(name, updates, store) {\n const typedStore = store as {\n matcher: {\n hasRoute: (routeName: string) => boolean;\n getSegmentsByName: (routeName: string) => unknown;\n };\n config: { forwardMap: Record<string, string> };\n };\n const forwardTo = (updates as Record<string, unknown>).forwardTo;\n\n validateUpdateRoute(\n name,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n forwardTo as any,\n (routeName: string) => typedStore.matcher.hasRoute(routeName),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n typedStore.matcher as any,\n typedStore.config,\n );\n },\n validateParentOption(parent, tree) {\n validateParentOptionRaw(parent as string);\n let node = tree as { children: Map<string, unknown> };\n\n for (const segment of (parent as string).split(\".\")) {\n const child = node.children.get(segment) as\n | { children: Map<string, unknown> }\n | undefined;\n\n if (!child) {\n throw new ReferenceError(\n `[router.addRoute] Parent route \"${parent as string}\" does not exist`,\n );\n }\n\n node = child;\n }\n },\n validateRouteName(name, caller) {\n validateRouteName(name, caller);\n },\n throwIfInternalRoute(name, caller) {\n throwIfInternalRoute(name as string, caller);\n },\n\n throwIfInternalRouteInArray(routes, caller) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n throwIfInternalRouteInArray(routes as any, caller);\n },\n validateExistingRoutes,\n validateForwardToConsistency,\n validateSetRootPathArgs,\n guardRouteCallbacks,\n guardNoAsyncCallbacks,\n },\n options: {\n validateLimitValue(name, value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n validateLimitValue(name as any, value, \"validate\");\n },\n validateLimits(limits) {\n validateLimits(limits, \"validate\");\n },\n validateOptions,\n },\n dependencies: {\n validateDependencyName,\n validateSetDependencyArgs(_name, _value, _caller) {\n validateSetDependencyArgsRaw(_name);\n },\n validateDependenciesObject,\n validateDependencyExists(name, store) {\n const typedStore = store as { dependencies?: Record<string, unknown> };\n const value = typedStore.dependencies?.[name];\n\n validateDependencyExistsRaw(value, name);\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n validateDependencyLimit(_store, _limits) {},\n validateDependenciesStructure,\n validateDependencyCount,\n validateCloneArgs,\n warnOverwrite: warnDepsOverwrite,\n warnBatchOverwrite,\n warnRemoveNonExistent,\n },\n plugins: {\n validatePluginLimit(count, limits) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n validatePluginLimit(count, 1, (limits as any)?.maxPlugins);\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n validateNoDuplicatePlugins(_factory, _factories) {},\n validatePluginKeys,\n validateCountThresholds(count) {\n const maxPlugins = ctx.getOptions().limits?.maxPlugins ?? 50;\n\n validatePluginCountThresholds(count, maxPlugins);\n },\n warnBatchDuplicates,\n warnPluginMethodType,\n warnPluginAfterStart,\n validateAddInterceptorArgs,\n },\n lifecycle: {\n validateHandler,\n validateNotRegistering(name, _guards, caller) {\n validateNotRegistering(false, name, caller);\n },\n validateHandlerLimit(count, limits, caller) {\n validateHandlerLimit(\n count,\n caller,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n (limits as any)?.maxLifecycleHandlers,\n );\n },\n validateCountThresholds(count, methodName) {\n const maxHandlers =\n ctx.getOptions().limits?.maxLifecycleHandlers ?? 200;\n\n validateLifecycleCountThresholds(count, methodName, maxHandlers);\n },\n warnOverwrite: warnLifecycleOverwrite,\n warnAsyncGuardSync,\n },\n navigation: {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigationOptions,\n validateParams: validateNavigateParams,\n validateStartArgs,\n },\n state: {\n validateMakeStateArgs,\n validateAreStatesEqualArgs(s1, s2, ignoreQP) {\n if (!isState(s1)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid state1: ${getTypeDescription(s1)}. Expected State object.`,\n );\n }\n if (!isState(s2)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid state2: ${getTypeDescription(s2)}. Expected State object.`,\n );\n }\n if (ignoreQP !== undefined && !isBoolean(ignoreQP)) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid ignoreQueryParams: ${getTypeDescription(ignoreQP)}. Expected boolean.`,\n );\n }\n },\n },\n eventBus: {\n validateEventName,\n\n validateListenerArgs(name, cb) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n validateListenerArgs(name as any, cb as any);\n },\n },\n };\n}\n\nexport function validationPlugin(): PluginFactory {\n // eslint-disable-next-line unicorn/consistent-function-scoping\n return (router) => {\n const ctx = getInternals(router);\n\n if (router.isActive()) {\n throw new RouterError(\"VALIDATION_PLUGIN_AFTER_START\", {\n message: \"validation-plugin must be registered before router.start()\",\n });\n }\n\n // RouterInternals.validator is now mutable — direct assignment works\n ctx.validator = buildValidatorObject(ctx);\n\n try {\n const store = ctx.routeGetStore();\n const deps = ctx.dependenciesGetStore();\n const options = ctx.getOptions();\n\n validateExistingRoutes(store);\n validateForwardToConsistency(store);\n validateRoutePropertiesStore(store);\n validateForwardToTargetsStore(store);\n validateDependenciesStructure(deps);\n validateLimitsConsistency(options, store, deps);\n ctx.validator.options.validateOptions(\n options as unknown,\n \"constructor (retrospective)\",\n );\n } catch (error) {\n ctx.validator = null;\n\n throw error;\n }\n\n return {\n teardown() {\n ctx.validator = null;\n },\n };\n };\n}\n"]}