UNPKG

@mmstack/router-core

Version:

Core utilities and Signal-based primitives for enhancing development with `@angular/router`. This library provides helpers for common routing tasks, reactive integration with router state, and intelligent module preloading.

1 lines 180 kB
{"version":3,"file":"mmstack-router-core.mjs","sources":["../tmp-esm2022/lib/breadcrumb/breadcrumb-config.js","../tmp-esm2022/lib/url.js","../tmp-esm2022/lib/util/leaf.store.js","../tmp-esm2022/lib/breadcrumb/breadcrumb.js","../tmp-esm2022/lib/breadcrumb/breadcrumb-store.js","../tmp-esm2022/lib/util/create-route-predicate.js","../tmp-esm2022/lib/util/find-path.js","../tmp-esm2022/lib/util/snapshot-path.js","../tmp-esm2022/lib/breadcrumb/breadcrumb-resolver.js","../tmp-esm2022/lib/preloading/preload-requester.js","../tmp-esm2022/lib/preloading/preload-strategy.js","../tmp-esm2022/lib/link.js","../tmp-esm2022/lib/query-param.js","../tmp-esm2022/lib/title/title-config.js","../tmp-esm2022/lib/title/title-store.js","../tmp-esm2022/mmstack-router-core.js"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\n/**\n * @internal\n */\nconst token = new InjectionToken('MMSTACK_BREADCRUMB_CONFIG');\n/**\n * Provides configuration for the breadcrumb system.\n * @param config - A partial `BreadcrumbConfig` object with the desired settings. *\n * @see BreadcrumbConfig\n * @example\n * ```typescript\n * // In your app.module.ts or a standalone component's providers:\n * // import { provideBreadcrumbConfig } from './breadcrumb.config'; // Adjust path\n * // import { ResolvedLeafRoute } from './breadcrumb.type'; // Adjust path\n *\n * // const customLabelStrategy: GenerateBreadcrumbFn = () => {\n * // return (leaf: ResolvedLeafRoute): string => {\n * // // Example: Prioritize a 'navTitle' data property\n * // if (leaf.route.data?.['navTitle']) {\n * // return leaf.route.data['navTitle'];\n * // }\n * // // Fallback to a default mechanism\n * // return leaf.route.title || leaf.segment.resolved || 'Unnamed';\n * // };\n * // };\n *\n * export const appConfig = [\n * // ...rest\n * provideBreadcrumbConfig({\n * generation: customLabelStrategy, // or 'manual' to disable auto-generation\n * }),\n * ]\n * ```\n */\nexport function provideBreadcrumbConfig(config) {\n return {\n provide: token,\n useValue: {\n ...config,\n },\n };\n}\n/**\n * @internal\n */\nexport function injectBreadcrumbConfig() {\n return (inject(token, {\n optional: true,\n }) ?? {});\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9yb3V0ZXIvY29yZS9zcmMvbGliL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFxQ3ZEOztHQUVHO0FBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFjLENBQW1CLDJCQUEyQixDQUFDLENBQUM7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsTUFBaUM7SUFDdkUsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFO1lBQ1IsR0FBRyxNQUFNO1NBQ1Y7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLENBQ0wsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNaLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRMZWFmUm91dGUgfSBmcm9tICcuLi91dGlsJztcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGN1c3RvbSBsYWJlbCBnZW5lcmF0aW9uIGZ1bmN0aW9uLlxyXG4gKiBUaGUgb3V0ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgcm9vdCBpbmplY3Rpb24gY29udGV4dFxyXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBgUmVzb2x2ZWRMZWFmUm91dGVgIGFuZCBwcm9kdWNlcyBhIHN0cmluZyBsYWJlbCBmb3IgdGhlIGJyZWFkY3J1bWIuXHJcbiAqIEFzIHRoZSBpbm5lciBmdW5jdGlvbiBpcyB3cmFwcGVkIGluIGEgY29tcHV0ZWQsIGNoYW5nZXMgdG8gc2lnbmFscyBjYWxsZWQgd2l0aGluIGl0IHdpbGwgdXBkYXRlIHRoZSBicmVhZGNydW1iIGxhYmVsIHJlYWN0aXZlbHkuXHJcbiAqL1xyXG50eXBlIEdlbmVyYXRlQnJlYWRjcnVtYkZuID0gKCkgPT4gKGxlYWY6IFJlc29sdmVkTGVhZlJvdXRlKSA9PiBzdHJpbmc7XHJcblxyXG4vKipcclxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYnJlYWRjcnVtYiBzeXN0ZW0uXHJcbiAqIFVzZSBgcHJvdmlkZUJyZWFkY3J1bWJDb25maWdgIHRvIHN1cHBseSB0aGVzZSBvcHRpb25zIHRvIHlvdXIgYXBwbGljYXRpb24uXHJcbiAqL1xyXG5cclxuZXhwb3J0IHR5cGUgQnJlYWRjcnVtYkNvbmZpZyA9IHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGhvdyBicmVhZGNydW1iIGxhYmVscyBhcmUgZ2VuZXJhdGVkLlxyXG4gICAqIC0gSWYgc2V0IHRvIGAnbWFudWFsJ2AsIGJyZWFkY3J1bWJzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgbWFudWFsbHkgcmVnaXN0ZXJlZFxyXG4gICAqIHZpYSBgY3JlYXRlQnJlYWRjcnVtYmAuIEF1dG9tYXRpYyBnZW5lcmF0aW9uIGJhc2VkIG9uIHJvdXRlcyBpcyBkaXNhYmxlZC5cclxuICAgKiAtIEFsdGVybmF0aXZlbHkgcHJvdmlkZSBhIGN1c3RvbSBsYWJlbCBnZW5lcmF0aW9uIGZ1bmN0aW9uXHJcbiAgICogSWYgbGVmdCB1bmRlZmluZWQsIHRoZSBzeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGxhYmVscyBiYXNlZCBvbiB0aGUgcm91dGUncyB0aXRsZSwgZGF0YSwgb3IgcGF0aC5cclxuICAgKiBAc2VlIEdlbmVyYXRlQnJlYWRjcnVtYkZuXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogLy8gRm9yIGN1c3RvbSBsYWJlbCBnZW5lcmF0aW9uOlxyXG4gICAqIC8vIGNvbnN0IG15Q3VzdG9tTGFiZWxHZW5lcmF0b3IgPSAoKSA9PiAobGVhZjogUmVzb2x2ZWRMZWFmUm91dGUpID0+IHtcclxuICAgKiAvLyAgIHJldHVybiBsZWFmLnJvdXRlLmRhdGE/LlsnY3VzdG9tVGl0bGUnXSB8fCBsZWFmLnJvdXRlLnJvdXRlQ29uZmlnPy5wYXRoIHx8ICdEZWZhdWx0JztcclxuICAgKiAvLyB9O1xyXG4gICAqIC8vXHJcbiAgICogLy8gY29uZmlnOiB7IGdlbmVyYXRpb246IG15Q3VzdG9tTGFiZWxHZW5lcmF0b3IgfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGdlbmVyYXRpb24/OiAnbWFudWFsJyB8IEdlbmVyYXRlQnJlYWRjcnVtYkZuO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY29uc3QgdG9rZW4gPSBuZXcgSW5qZWN0aW9uVG9rZW48QnJlYWRjcnVtYkNvbmZpZz4oJ01NU1RBQ0tfQlJFQURDUlVNQl9DT05GSUcnKTtcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBjb25maWd1cmF0aW9uIGZvciB0aGUgYnJlYWRjcnVtYiBzeXN0ZW0uXHJcbiAqIEBwYXJhbSBjb25maWcgLSBBIHBhcnRpYWwgYEJyZWFkY3J1bWJDb25maWdgIG9iamVjdCB3aXRoIHRoZSBkZXNpcmVkIHNldHRpbmdzLiAqXHJcbiAqIEBzZWUgQnJlYWRjcnVtYkNvbmZpZ1xyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIC8vIEluIHlvdXIgYXBwLm1vZHVsZS50cyBvciBhIHN0YW5kYWxvbmUgY29tcG9uZW50J3MgcHJvdmlkZXJzOlxyXG4gKiAvLyBpbXBvcnQgeyBwcm92aWRlQnJlYWRjcnVtYkNvbmZpZyB9IGZyb20gJy4vYnJlYWRjcnVtYi5jb25maWcnOyAvLyBBZGp1c3QgcGF0aFxyXG4gKiAvLyBpbXBvcnQgeyBSZXNvbHZlZExlYWZSb3V0ZSB9IGZyb20gJy4vYnJlYWRjcnVtYi50eXBlJzsgLy8gQWRqdXN0IHBhdGhcclxuICpcclxuICogLy8gY29uc3QgY3VzdG9tTGFiZWxTdHJhdGVneTogR2VuZXJhdGVCcmVhZGNydW1iRm4gPSAoKSA9PiB7XHJcbiAqIC8vICAgcmV0dXJuIChsZWFmOiBSZXNvbHZlZExlYWZSb3V0ZSk6IHN0cmluZyA9PiB7XHJcbiAqIC8vICAgICAvLyBFeGFtcGxlOiBQcmlvcml0aXplIGEgJ25hdlRpdGxlJyBkYXRhIHByb3BlcnR5XHJcbiAqIC8vICAgICBpZiAobGVhZi5yb3V0ZS5kYXRhPy5bJ25hdlRpdGxlJ10pIHtcclxuICogLy8gICAgICAgcmV0dXJuIGxlYWYucm91dGUuZGF0YVsnbmF2VGl0bGUnXTtcclxuICogLy8gICAgIH1cclxuICogLy8gICAgIC8vIEZhbGxiYWNrIHRvIGEgZGVmYXVsdCBtZWNoYW5pc21cclxuICogLy8gICAgIHJldHVybiBsZWFmLnJvdXRlLnRpdGxlIHx8IGxlYWYuc2VnbWVudC5yZXNvbHZlZCB8fCAnVW5uYW1lZCc7XHJcbiAqIC8vICAgfTtcclxuICogLy8gfTtcclxuICpcclxuICogZXhwb3J0IGNvbnN0IGFwcENvbmZpZyA9IFtcclxuICogIC8vIC4uLnJlc3RcclxuICogIHByb3ZpZGVCcmVhZGNydW1iQ29uZmlnKHtcclxuICogICBnZW5lcmF0aW9uOiBjdXN0b21MYWJlbFN0cmF0ZWd5LCAvLyBvciAnbWFudWFsJyB0byBkaXNhYmxlIGF1dG8tZ2VuZXJhdGlvblxyXG4gKiAgfSksXHJcbiAqIF1cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUJyZWFkY3J1bWJDb25maWcoY29uZmlnOiBQYXJ0aWFsPEJyZWFkY3J1bWJDb25maWc+KSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHByb3ZpZGU6IHRva2VuLFxyXG4gICAgdXNlVmFsdWU6IHtcclxuICAgICAgLi4uY29uZmlnLFxyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0QnJlYWRjcnVtYkNvbmZpZygpOiBCcmVhZGNydW1iQ29uZmlnIHtcclxuICByZXR1cm4gKFxyXG4gICAgaW5qZWN0KHRva2VuLCB7XHJcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxyXG4gICAgfSkgPz8ge31cclxuICApO1xyXG59XHJcbiJdfQ==","import { inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { EventType, Router, } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\n/**\n * Type guard to check if a Router Event is a NavigationEnd event.\n * @internal\n */\nfunction isNavigationEnd(e) {\n return 'type' in e && e.type === EventType.NavigationEnd;\n}\n/**\n * Creates a Signal that tracks the current router URL.\n *\n * The signal emits the URL string reflecting the router state *after* redirects\n * have completed for each successful navigation. It initializes with the router's\n * current URL state.\n *\n * @returns {Signal<string>} A Signal emitting the `urlAfterRedirects` upon successful navigation.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { url } from '@mmstack/router-core'; // Adjust import path\n *\n * @Component({\n * selector: 'app-root',\n * template: `Current URL: {{ currentUrl() }}`\n * })\n * export class AppComponent {\n * currentUrl = url();\n *\n * constructor() {\n * effect(() => {\n * console.log('Navigation ended. New URL:', this.currentUrl());\n * // e.g., track page view with analytics\n * });\n * }\n * }\n * ```\n */\nexport function url() {\n const router = inject(Router);\n return toSignal(router.events.pipe(filter(isNavigationEnd), map((e) => e.urlAfterRedirects)), {\n initialValue: router.url,\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL2NvcmUvc3JjL2xpYi91cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUVMLFNBQVMsRUFFVCxNQUFNLEdBQ1AsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLENBQVE7SUFDL0IsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLGFBQWEsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBTSxVQUFVLEdBQUc7SUFDakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlCLE9BQU8sUUFBUSxDQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNoQixNQUFNLENBQUMsZUFBZSxDQUFDLEVBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQ2hDLEVBQ0Q7UUFDRSxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUc7S0FDekIsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgdHlwZSBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7XHJcbiAgdHlwZSBFdmVudCxcclxuICBFdmVudFR5cGUsXHJcbiAgdHlwZSBOYXZpZ2F0aW9uRW5kLFxyXG4gIFJvdXRlcixcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgUm91dGVyIEV2ZW50IGlzIGEgTmF2aWdhdGlvbkVuZCBldmVudC5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBpc05hdmlnYXRpb25FbmQoZTogRXZlbnQpOiBlIGlzIE5hdmlnYXRpb25FbmQge1xyXG4gIHJldHVybiAndHlwZScgaW4gZSAmJiBlLnR5cGUgPT09IEV2ZW50VHlwZS5OYXZpZ2F0aW9uRW5kO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIFNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgY3VycmVudCByb3V0ZXIgVVJMLlxyXG4gKlxyXG4gKiBUaGUgc2lnbmFsIGVtaXRzIHRoZSBVUkwgc3RyaW5nIHJlZmxlY3RpbmcgdGhlIHJvdXRlciBzdGF0ZSAqYWZ0ZXIqIHJlZGlyZWN0c1xyXG4gKiBoYXZlIGNvbXBsZXRlZCBmb3IgZWFjaCBzdWNjZXNzZnVsIG5hdmlnYXRpb24uIEl0IGluaXRpYWxpemVzIHdpdGggdGhlIHJvdXRlcidzXHJcbiAqIGN1cnJlbnQgVVJMIHN0YXRlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7U2lnbmFsPHN0cmluZz59IEEgU2lnbmFsIGVtaXR0aW5nIHRoZSBgdXJsQWZ0ZXJSZWRpcmVjdHNgIHVwb24gc3VjY2Vzc2Z1bCBuYXZpZ2F0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBpbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4gKiBpbXBvcnQgeyB1cmwgfSBmcm9tICdAbW1zdGFjay9yb3V0ZXItY29yZSc7IC8vIEFkanVzdCBpbXBvcnQgcGF0aFxyXG4gKlxyXG4gKiBAQ29tcG9uZW50KHtcclxuICogc2VsZWN0b3I6ICdhcHAtcm9vdCcsXHJcbiAqIHRlbXBsYXRlOiBgQ3VycmVudCBVUkw6IHt7IGN1cnJlbnRVcmwoKSB9fWBcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XHJcbiAqIGN1cnJlbnRVcmwgPSB1cmwoKTtcclxuICpcclxuICogY29uc3RydWN0b3IoKSB7XHJcbiAqIGVmZmVjdCgoKSA9PiB7XHJcbiAqIGNvbnNvbGUubG9nKCdOYXZpZ2F0aW9uIGVuZGVkLiBOZXcgVVJMOicsIHRoaXMuY3VycmVudFVybCgpKTtcclxuICogLy8gZS5nLiwgdHJhY2sgcGFnZSB2aWV3IHdpdGggYW5hbHl0aWNzXHJcbiAqIH0pO1xyXG4gKiB9XHJcbiAqIH1cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXJsKCk6IFNpZ25hbDxzdHJpbmc+IHtcclxuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcbiAgcmV0dXJuIHRvU2lnbmFsKFxyXG4gICAgcm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICBmaWx0ZXIoaXNOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgbWFwKChlKSA9PiBlLnVybEFmdGVyUmVkaXJlY3RzKSxcclxuICAgICksXHJcbiAgICB7XHJcbiAgICAgIGluaXRpYWxWYWx1ZTogcm91dGVyLnVybCxcclxuICAgIH0sXHJcbiAgKTtcclxufVxyXG4iXX0=","import { computed, inject, Injectable } from '@angular/core';\nimport { Router, } from '@angular/router';\nimport { url } from '../url';\nimport * as i0 from \"@angular/core\";\nfunction leafRoutes() {\n const router = inject(Router);\n const getLeafRoutes = (snapshot) => {\n const routes = [];\n let route = snapshot.root;\n const processed = new Set();\n while (route) {\n const allSegments = route.pathFromRoot.flatMap((snap) => snap.routeConfig?.path ?? []);\n const segments = allSegments.filter(Boolean);\n const path = router.serializeUrl(router.parseUrl(segments.join('/')));\n if (processed.has(path)) {\n route = route.firstChild;\n continue;\n }\n processed.add(path);\n const parts = route.pathFromRoot\n .flatMap((snap) => snap.url ?? [])\n .map((u) => u.path)\n .filter(Boolean);\n const link = router.serializeUrl(router.parseUrl(parts.join('/')));\n routes.push({\n route,\n segment: {\n path: segments.at(-1) ?? '',\n resolved: parts.at(-1) ?? '',\n },\n path,\n link,\n });\n route = route.firstChild;\n }\n return routes;\n };\n const currentUrl = url();\n const leafRoutes = computed(() => {\n currentUrl();\n return getLeafRoutes(router.routerState.snapshot);\n }, ...(ngDevMode ? [{ debugName: \"leafRoutes\" }] : []));\n return leafRoutes;\n}\nexport class RouteLeafStore {\n leaves = leafRoutes();\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: RouteLeafStore, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: RouteLeafStore, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\nexport function injectLeafRoutes() {\n const store = inject(RouteLeafStore);\n return store.leaves;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZi5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3JvdXRlci9jb3JlL3NyYy9saWIvdXRpbC9sZWFmLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBRUwsTUFBTSxHQUVQLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7QUFlN0IsU0FBUyxVQUFVO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixNQUFNLGFBQWEsR0FBRyxDQUNwQixRQUE2QixFQUNSLEVBQUU7UUFDdkIsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLEtBQUssR0FBa0MsUUFBUSxDQUFDLElBQUksQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXBDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDNUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FDdkMsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRFLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDekIsU0FBUztZQUNYLENBQUM7WUFDRCxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXBCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxZQUFZO2lCQUM3QixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO2lCQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVuQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkUsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixLQUFLO2dCQUNMLE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzNCLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtpQkFDN0I7Z0JBQ0QsSUFBSTtnQkFDSixJQUFJO2FBQ0wsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDM0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBRXpCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsVUFBVSxFQUFFLENBQUM7UUFDYixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUMsc0RBQUMsQ0FBQztJQUVILE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFLRCxNQUFNLE9BQU8sY0FBYztJQUNoQixNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUM7dUdBRHBCLGNBQWM7MkdBQWQsY0FBYyxjQUZiLE1BQU07OzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQUtELE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgSW5qZWN0YWJsZSwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICBSb3V0ZXIsXHJcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB1cmwgfSBmcm9tICcuLi91cmwnO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRMZWFmUm91dGUgPSB7XHJcbiAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XHJcbiAgc2VnbWVudDoge1xyXG4gICAgcGF0aDogc3RyaW5nO1xyXG4gICAgcmVzb2x2ZWQ6IHN0cmluZztcclxuICB9O1xyXG4gIHBhdGg6IHN0cmluZztcclxuICBsaW5rOiBzdHJpbmc7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBsZWFmUm91dGVzKCk6IFNpZ25hbDxSZXNvbHZlZExlYWZSb3V0ZVtdPiB7XHJcbiAgY29uc3Qgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcblxyXG4gIGNvbnN0IGdldExlYWZSb3V0ZXMgPSAoXHJcbiAgICBzbmFwc2hvdDogUm91dGVyU3RhdGVTbmFwc2hvdCxcclxuICApOiBSZXNvbHZlZExlYWZSb3V0ZVtdID0+IHtcclxuICAgIGNvbnN0IHJvdXRlczogUmVzb2x2ZWRMZWFmUm91dGVbXSA9IFtdO1xyXG4gICAgbGV0IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCA9IHNuYXBzaG90LnJvb3Q7XHJcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgICB3aGlsZSAocm91dGUpIHtcclxuICAgICAgY29uc3QgYWxsU2VnbWVudHMgPSByb3V0ZS5wYXRoRnJvbVJvb3QuZmxhdE1hcChcclxuICAgICAgICAoc25hcCkgPT4gc25hcC5yb3V0ZUNvbmZpZz8ucGF0aCA/PyBbXSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gYWxsU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgICAgY29uc3QgcGF0aCA9IHJvdXRlci5zZXJpYWxpemVVcmwocm91dGVyLnBhcnNlVXJsKHNlZ21lbnRzLmpvaW4oJy8nKSkpO1xyXG5cclxuICAgICAgaWYgKHByb2Nlc3NlZC5oYXMocGF0aCkpIHtcclxuICAgICAgICByb3V0ZSA9IHJvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgcHJvY2Vzc2VkLmFkZChwYXRoKTtcclxuXHJcbiAgICAgIGNvbnN0IHBhcnRzID0gcm91dGUucGF0aEZyb21Sb290XHJcbiAgICAgICAgLmZsYXRNYXAoKHNuYXApID0+IHNuYXAudXJsID8/IFtdKVxyXG4gICAgICAgIC5tYXAoKHUpID0+IHUucGF0aClcclxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgICAgY29uc3QgbGluayA9IHJvdXRlci5zZXJpYWxpemVVcmwocm91dGVyLnBhcnNlVXJsKHBhcnRzLmpvaW4oJy8nKSkpO1xyXG5cclxuICAgICAgcm91dGVzLnB1c2goe1xyXG4gICAgICAgIHJvdXRlLFxyXG4gICAgICAgIHNlZ21lbnQ6IHtcclxuICAgICAgICAgIHBhdGg6IHNlZ21lbnRzLmF0KC0xKSA/PyAnJyxcclxuICAgICAgICAgIHJlc29sdmVkOiBwYXJ0cy5hdCgtMSkgPz8gJycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwYXRoLFxyXG4gICAgICAgIGxpbmssXHJcbiAgICAgIH0pO1xyXG4gICAgICByb3V0ZSA9IHJvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvdXRlcztcclxuICB9O1xyXG5cclxuICBjb25zdCBjdXJyZW50VXJsID0gdXJsKCk7XHJcblxyXG4gIGNvbnN0IGxlYWZSb3V0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjdXJyZW50VXJsKCk7XHJcbiAgICByZXR1cm4gZ2V0TGVhZlJvdXRlcyhyb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gbGVhZlJvdXRlcztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvdXRlTGVhZlN0b3JlIHtcclxuICByZWFkb25seSBsZWF2ZXMgPSBsZWFmUm91dGVzKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RMZWFmUm91dGVzKCkge1xyXG4gIGNvbnN0IHN0b3JlID0gaW5qZWN0KFJvdXRlTGVhZlN0b3JlKTtcclxuICByZXR1cm4gc3RvcmUubGVhdmVzO1xyXG59XHJcbiJdfQ==","/**\n * @internal\n */\nconst INTERNAL_BREADCRUMB_SYMBOL = Symbol.for('MMSTACK_INTERNAL_BREADCRUMB');\n/**\n * @internal\n */\nexport function getBreadcrumbInternals(breadcrumb) {\n return breadcrumb[INTERNAL_BREADCRUMB_SYMBOL];\n}\n/**\n * @internal\n */\nexport function createInternalBreadcrumb(bc, active, registered = true) {\n return {\n ...bc,\n [INTERNAL_BREADCRUMB_SYMBOL]: {\n active,\n registered,\n },\n };\n}\n/**\n * @internal\n */\nexport function isInternalBreadcrumb(breadcrumb) {\n return !!breadcrumb[INTERNAL_BREADCRUMB_SYMBOL];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3JvdXRlci9jb3JlL3NyYy9saWIvYnJlYWRjcnVtYi9icmVhZGNydW1iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThCQTs7R0FFRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBWTdFOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFVBQThCO0lBQ25FLE9BQVEsVUFBaUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsRUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLFVBQVUsR0FBRyxJQUFJO0lBRWpCLE9BQU87UUFDTCxHQUFHLEVBQUU7UUFDTCxDQUFDLDBCQUEwQixDQUFDLEVBQUU7WUFDNUIsTUFBTTtZQUNOLFVBQVU7U0FDWDtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFVBQTJDO0lBRTNDLE9BQU8sQ0FBQyxDQUFFLFVBQWlDLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgc2luZ2xlIGJyZWFkY3J1bWIgaXRlbSB3aXRoaW4gdGhlIG5hdmlnYXRpb24gcGF0aC5cclxuICogQWxsIGR5bmFtaWMgcHJvcGVydGllcyBhcmUgcmVwcmVzZW50ZWQgYXMgQW5ndWxhciBTaWduYWxzIHRvIGVuYWJsZSByZWFjdGl2aXR5LlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQnJlYWRjcnVtYiA9IHtcclxuICAvKipcclxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYnJlYWRjcnVtYiBpdGVtLiBHZW5lcmFsbHkgdGhlIHVucmVzb2x2ZWQgcGF0aCBmb3IgZXhhbXBsZSBgL3Bvc3RzLzppZGAuXHJcbiAgICogVXNlZnVsIGZvciBgQGZvcmAgdHJhY2tpbmcgaW4gdGVtcGxhdGVzLlxyXG4gICAqL1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVGhlIHZpc2libGUgdGV4dCBmb3IgdGhlIGJyZWFkY3J1bWIgaXRlbS5cclxuICAgKiBVcGRhdGVkIHJlYWN0aXZlbHkgYXMgdGhlIHVybC9saW5rIGJhc2VkIG9uXHJcbiAgICogZWl0aGVyIGEgcHJvdmlkZWQgZGVmaW5pdGlvbiwgb3IgdGhlIGN1cnJlbnQgcm91dGUuXHJcbiAgICovXHJcbiAgbGFiZWw6IFNpZ25hbDxzdHJpbmc+O1xyXG4gIC8qKlxyXG4gICAqIEFuIGFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSBicmVhZGNydW1iIGl0ZW0uXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHNhbWUgdmFsdWUgYXMgYGxhYmVsYCBpZiBub3QgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgYXJpYUxhYmVsOiBTaWduYWw8c3RyaW5nPjtcclxuICAvKipcclxuICAgKiBUaGUgVVJMIGxpbmsgZm9yIHRoZSBicmVhZGNydW1iIGl0ZW0uXHJcbiAgICogVXBkYXRlcyBhcyB0aGUgcm91dGUgY2hhbmdlcy5cclxuICAgKi9cclxuICBsaW5rOiBTaWduYWw8c3RyaW5nPjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IElOVEVSTkFMX0JSRUFEQ1JVTUJfU1lNQk9MID0gU3ltYm9sLmZvcignTU1TVEFDS19JTlRFUk5BTF9CUkVBRENSVU1CJyk7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBJbnRlcm5hbEJyZWFkY3J1bWIgPSBCcmVhZGNydW1iICYge1xyXG4gIFtJTlRFUk5BTF9CUkVBRENSVU1CX1NZTUJPTF06IHtcclxuICAgIGFjdGl2ZTogU2lnbmFsPGJvb2xlYW4+O1xyXG4gICAgcmVnaXN0ZXJlZDogYm9vbGVhbjtcclxuICB9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyZWFkY3J1bWJJbnRlcm5hbHMoYnJlYWRjcnVtYjogSW50ZXJuYWxCcmVhZGNydW1iKSB7XHJcbiAgcmV0dXJuIChicmVhZGNydW1iIGFzIEludGVybmFsQnJlYWRjcnVtYilbSU5URVJOQUxfQlJFQURDUlVNQl9TWU1CT0xdO1xyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxCcmVhZGNydW1iKFxyXG4gIGJjOiBCcmVhZGNydW1iLFxyXG4gIGFjdGl2ZTogU2lnbmFsPGJvb2xlYW4+LFxyXG4gIHJlZ2lzdGVyZWQgPSB0cnVlLFxyXG4pOiBJbnRlcm5hbEJyZWFkY3J1bWIge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5iYyxcclxuICAgIFtJTlRFUk5BTF9CUkVBRENSVU1CX1NZTUJPTF06IHtcclxuICAgICAgYWN0aXZlLFxyXG4gICAgICByZWdpc3RlcmVkLFxyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcm5hbEJyZWFkY3J1bWIoXHJcbiAgYnJlYWRjcnVtYjogQnJlYWRjcnVtYiB8IEludGVybmFsQnJlYWRjcnVtYixcclxuKTogYnJlYWRjcnVtYiBpcyBJbnRlcm5hbEJyZWFkY3J1bWIge1xyXG4gIHJldHVybiAhIShicmVhZGNydW1iIGFzIEludGVybmFsQnJlYWRjcnVtYilbSU5URVJOQUxfQlJFQURDUlVNQl9TWU1CT0xdO1xyXG59XHJcbiJdfQ==","import { computed, inject, Injectable } from '@angular/core';\nimport { mapArray, mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes } from '../util/leaf.store';\nimport { createInternalBreadcrumb, getBreadcrumbInternals, isInternalBreadcrumb, } from './breadcrumb';\nimport { injectBreadcrumbConfig } from './breadcrumb-config';\nimport * as i0 from \"@angular/core\";\nfunction uppercaseFirst(str) {\n const lcs = str.toLowerCase();\n return lcs.charAt(0).toUpperCase() + lcs.slice(1);\n}\nfunction removeMatrixAndQueryParams(path) {\n const [cleanPath] = path.split(';');\n return cleanPath.split('?')[0];\n}\nfunction parsePathSegment(pathSegment) {\n return pathSegment\n .split('/')\n .flatMap((part) => part.split('.'))\n .flatMap((part) => part.split('-'))\n .map((part) => uppercaseFirst(removeMatrixAndQueryParams(part)))\n .join(' ');\n}\nfunction generateLabel(leaf) {\n const title = leaf.route.title ?? leaf.route.data?.['title'];\n if (title && typeof title === 'string')\n return title;\n if (leaf.segment.path.includes(':'))\n return leaf.segment.resolved;\n return parsePathSegment(leaf.segment.path);\n}\nfunction autoGenerateBreadcrumb(id, leaf, autoGenerateFn) {\n const label = computed(() => autoGenerateFn()(leaf()), ...(ngDevMode ? [{ debugName: \"label\" }] : []));\n return createInternalBreadcrumb({\n id,\n label,\n ariaLabel: label,\n link: computed(() => leaf().link),\n }, computed(() => leaf().route.data?.['skipBreadcrumb'] !== true &&\n id !== '' &&\n id !== '/' &&\n leaf().segment.path !== '' &&\n leaf().segment.path !== '/' &&\n !leaf().segment.path.endsWith('/') &&\n !!label()));\n}\nfunction injectGenerateLabelFn() {\n const { generation } = injectBreadcrumbConfig();\n if (typeof generation !== 'function')\n return computed(() => generateLabel);\n const provided = generation();\n return computed(() => provided);\n}\nfunction injectIsManual() {\n return injectBreadcrumbConfig().generation === 'manual';\n}\nfunction exposeActiveSignal(crumbSignal, manual) {\n const active = manual\n ? computed(() => {\n const crumb = crumbSignal();\n return (isInternalBreadcrumb(crumb) &&\n getBreadcrumbInternals(crumb).registered &&\n getBreadcrumbInternals(crumb).active());\n })\n : computed(() => {\n const crumb = crumbSignal();\n if (!isInternalBreadcrumb(crumb))\n return true;\n return getBreadcrumbInternals(crumb).active();\n });\n const sig = crumbSignal;\n sig.active = active;\n return sig;\n}\nexport class BreadcrumbStore {\n map = mutable(new Map());\n isManual = injectIsManual();\n autoGenerateLabelFn = injectGenerateLabelFn();\n leafRoutes = injectLeafRoutes();\n all = mapArray(this.leafRoutes, (leaf) => {\n const stableId = computed(() => leaf().path, ...(ngDevMode ? [{ debugName: \"stableId\" }] : []));\n return exposeActiveSignal(computed(() => {\n const id = stableId();\n const found = this.map().get(id);\n if (!found)\n return autoGenerateBreadcrumb(id, leaf, this.autoGenerateLabelFn);\n if (!id.includes(':'))\n return found;\n return {\n ...found,\n link: computed(() => leaf().link),\n };\n }, {\n equal: (a, b) => a.id === b.id,\n }), this.isManual);\n }, {\n equal: (a, b) => a.link === b.link,\n });\n crumbs = computed(() => this.all().filter((c) => c.active()), ...(ngDevMode ? [{ debugName: \"crumbs\" }] : []));\n unwrapped = computed(() => this.crumbs().map((c) => c()), ...(ngDevMode ? [{ debugName: \"unwrapped\" }] : []));\n register(breadcrumb) {\n this.map.inline((m) => m.set(breadcrumb.id, breadcrumb));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: BreadcrumbStore, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.1\", ngImport: i0, type: BreadcrumbStore, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n/**\n * Injects and provides access to a reactive list of breadcrumbs.\n *\n * The breadcrumbs are ordered and reflect the current active navigation path.\n * @see Breadcrumb\n * @returns `Signal<Breadcrumb[]>`\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'app-breadcrumbs',\n * template: `\n * <nav aria-label=\"breadcrumb\">\n * <ol>\n * @for (crumb of breadcrumbs(); track crumb.id) {\n * <li>\n * <a [href]=\"crumb.link()\" [attr.aria-label]=\"crumb.ariaLabel()\">{{ crumb.label() }}</a>\n * </li>\n * }\n * </ol>\n * </nav>\n * `\n * })\n * export class MyBreadcrumbsComponent {\n * breadcrumbs = injectBreadcrumbs();\n * }\n * ```\n */\nexport function injectBreadcrumbs() {\n const store = inject(BreadcrumbStore);\n return store.unwrapped;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3JvdXRlci9jb3JlL3NyYy9saWIvYnJlYWRjcnVtYi9icmVhZGNydW1iLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUV0QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRTdELFNBQVMsY0FBYyxDQUFDLEdBQVc7SUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLElBQVk7SUFDOUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFdBQW1CO0lBQzNDLE9BQU8sV0FBVztTQUNmLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxD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Q25COztBQW9ERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgbWFwQXJyYXksIG11dGFibGUgfSBmcm9tICdAbW1zdGFjay9wcmltaXRpdmVzJztcclxuaW1wb3J0IHsgaW5qZWN0TGVhZlJvdXRlcywgUmVzb2x2ZWRMZWFmUm91dGUgfSBmcm9tICcuLi91dGlsL2xlYWYuc3RvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEJyZWFkY3J1bWIsXHJcbiAgY3JlYXRlSW50ZXJuYWxCcmVhZGNydW1iLFxyXG4gIGdldEJyZWFkY3J1bWJJbnRlcm5hbHMsXHJcbiAgSW50ZXJuYWxCcmVhZGNydW1iLFxyXG4gIGlzSW50ZXJuYWxCcmVhZGNydW1iLFxyXG59IGZyb20gJy4vYnJlYWRjcnVtYic7XHJcbmltcG9ydCB7IGluamVjdEJyZWFkY3J1bWJDb25maWcgfSBmcm9tICcuL2JyZWFkY3J1bWItY29uZmlnJztcclxuXHJcbmZ1bmN0aW9uIHVwcGVyY2FzZUZpcnN0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBsY3MgPSBzdHIudG9Mb3dlckNhc2UoKTtcclxuICByZXR1cm4gbGNzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGNzLnNsaWNlKDEpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVNYXRyaXhBbmRRdWVyeVBhcmFtcyhwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IFtjbGVhblBhdGhdID0gcGF0aC5zcGxpdCgnOycpO1xyXG4gIHJldHVybiBjbGVhblBhdGguc3BsaXQoJz8nKVswXTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VQYXRoU2VnbWVudChwYXRoU2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gcGF0aFNlZ21lbnRcclxuICAgIC5zcGxpdCgnLycpXHJcbiAgICAuZmxhdE1hcCgocGFydCkgPT4gcGFydC5zcGxpdCgnLicpKVxyXG4gICAgLmZsYXRNYXAoKHBhcnQpID0+IHBhcnQuc3BsaXQoJy0nKSlcclxuICAgIC5tYXAoKHBhcnQpID0+IHVwcGVyY2FzZUZpcnN0KHJlbW92ZU1hdHJpeEFuZFF1ZXJ5UGFyYW1zKHBhcnQpKSlcclxuICAgIC5qb2luKCcgJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlTGFiZWwobGVhZjogUmVzb2x2ZWRMZWFmUm91dGUpOiBzdHJpbmcge1xyXG4gIGNvbnN0IHRpdGxlID0gbGVhZi5yb3V0ZS50aXRsZSA/PyBsZWFmLnJvdXRlLmRhdGE/LlsndGl0bGUnXTtcclxuXHJcbiAgaWYgKHRpdGxlICYmIHR5cGVvZiB0aXRsZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aXRsZTtcclxuICBpZiAobGVhZi5zZWdtZW50LnBhdGguaW5jbHVkZXMoJzonKSkgcmV0dXJuIGxlYWYuc2VnbWVudC5yZXNvbHZlZDtcclxuXHJcbiAgcmV0dXJuIHBhcnNlUGF0aFNlZ21lbnQobGVhZi5zZWdtZW50LnBhdGgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhdXRvR2VuZXJhdGVCcmVhZGNydW1iKFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgbGVhZjogU2lnbmFsPFJlc29sdmVkTGVhZlJvdXRlPixcclxuICBhdXRvR2VuZXJhdGVGbjogU2lnbmFsPChsZWFmOiBSZXNvbHZlZExlYWZSb3V0ZSkgPT4gc3RyaW5nPixcclxuKTogQnJlYWRjcnVtYiB7XHJcbiAgY29uc3QgbGFiZWwgPSBjb21wdXRlZCgoKSA9PiBhdXRvR2VuZXJhdGVGbigpKGxlYWYoKSkpO1xyXG5cclxuICByZXR1cm4gY3JlYXRlSW50ZXJuYWxCcmVhZGNydW1iKFxyXG4gICAge1xyXG4gICAgICBpZCxcclxuICAgICAgbGFiZWwsXHJcbiAgICAgIGFyaWFMYWJlbDogbGFiZWwsXHJcbiAgICAgIGxpbms6IGNvbXB1dGVkKCgpID0+IGxlYWYoKS5saW5rKSxcclxuICAgIH0sXHJcbiAgICBjb21wdXRlZChcclxuICAgICAgKCkgPT5cclxuICAgICAgICBsZWFmKCkucm91dGUuZGF0YT8uWydza2lwQnJlYWRjcnVtYiddICE9PSB0cnVlICYmXHJcbiAgICAgICAgaWQgIT09ICcnICYmXHJcbiAgICAgICAgaWQgIT09ICcvJyAmJlxyXG4gICAgICAgIGxlYWYoKS5zZWdtZW50LnBhdGggIT09ICcnICYmXHJcbiAgICAgICAgbGVhZigpLnNlZ21lbnQucGF0aCAhPT0gJy8nICYmXHJcbiAgICAgICAgIWxlYWYoKS5zZWdtZW50LnBhdGguZW5kc1dpdGgoJy8nKSAmJlxyXG4gICAgICAgICEhbGFiZWwoKSxcclxuICAgICksXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5qZWN0R2VuZXJhdGVMYWJlbEZuKCkge1xyXG4gIGNvbnN0IHsgZ2VuZXJhdGlvbiB9ID0gaW5qZWN0QnJlYWRjcnVtYkNvbmZpZygpO1xyXG5cclxuICBpZiAodHlwZW9mIGdlbmVyYXRpb24gIT09ICdmdW5jdGlvbicpIHJldHVybiBjb21wdXRlZCgoKSA9PiBnZW5lcmF0ZUxhYmVsKTtcclxuXHJcbiAgY29uc3QgcHJvdmlkZWQgPSBnZW5lcmF0aW9uKCk7XHJcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHByb3ZpZGVkKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5qZWN0SXNNYW51YWwoKSB7XHJcbiAgcmV0dXJuIGluamVjdEJyZWFkY3J1bWJDb25maWcoKS5nZW5lcmF0aW9uID09PSAnbWFudWFsJztcclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3NlQWN0aXZlU2lnbmFsKFxyXG4gIGNydW1iU2lnbmFsOiBTaWduYWw8QnJlYWRjcnVtYj4sXHJcbiAgbWFudWFsOiBib29sZWFuLFxyXG4pOiBTaWduYWw8QnJlYWRjcnVtYj4gJiB7XHJcbiAgYWN0aXZlOiBTaWduYWw8Ym9vbGVhbj47XHJcbn0ge1xyXG4gIGNvbnN0IGFjdGl2ZSA9IG1hbnVhbFxyXG4gICAgPyBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3J1bWIgPSBjcnVtYlNpZ25hbCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgaXNJbnRlcm5hbEJyZWFkY3J1bWIoY3J1bWIpICYmXHJcbiAgICAgICAgICBnZXRCcmVhZGNydW1iSW50ZXJuYWxzKGNydW1iKS5yZWdpc3RlcmVkICYmXHJcbiAgICAgICAgICBnZXRCcmVhZGNydW1iSW50ZXJuYWxzKGNydW1iKS5hY3RpdmUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICA6IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgICBjb25zdCBjcnVtYiA9IGNydW1iU2lnbmFsKCk7XHJcbiAgICAgICAgaWYgKCFpc0ludGVybmFsQnJlYWRjcnVtYihjcnVtYikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBnZXRCcmVhZGNydW1iSW50ZXJuYWxzKGNydW1iKS5hY3RpdmUoKTtcclxuICAgICAgfSk7XHJcblxyXG4gIGNvbnN0IHNpZyA9IGNydW1iU2lnbmFsIGFzIFNpZ25hbDxCcmVhZGNydW1iPiAmIHtcclxuICAgIGFjdGl2ZTogU2lnbmFsPGJvb2xlYW4+O1xyXG4gIH07XHJcblxyXG4gIHNpZy5hY3RpdmUgPSBhY3RpdmU7XHJcblxyXG4gIHJldHVybiBzaWc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1iU3RvcmUge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbXV0YWJsZTxNYXA8c3RyaW5nLCBJbnRlcm5hbEJyZWFkY3J1bWI+PihuZXcgTWFwKCkpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNNYW51YWwgPSBpbmplY3RJc01hbnVhbCgpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b0dlbmVyYXRlTGFiZWxGbiA9IGluamVjdEdlbmVyYXRlTGFiZWxGbigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZlJvdXRlcyA9IGluamVjdExlYWZSb3V0ZXMoKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGwgPSBtYXBBcnJheShcclxuICAgIHRoaXMubGVhZlJvdXRlcyxcclxuICAgIChsZWFmKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0YWJsZUlkID0gY29tcHV0ZWQoKCkgPT4gbGVhZigpLnBhdGgpO1xyXG5cclxuICAgICAgcmV0dXJuIGV4cG9zZUFjdGl2ZVNpZ25hbChcclxuICAgICAgICBjb21wdXRlZChcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSBzdGFibGVJZCgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLm1hcCgpLmdldChpZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWZvdW5kKVxyXG4gICAgICAgICAgICAgIHJldHVybiBhdXRvR2VuZXJhdGVCcmVhZGNydW1iKGlkLCBsZWFmLCB0aGlzLmF1dG9HZW5lcmF0ZUxhYmVsRm4pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpZC5pbmNsdWRlcygnOicpKSByZXR1cm4gZm91bmQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLmZvdW5kLFxyXG4gICAgICAgICAgICAgIGxpbms6IGNvbXB1dGVkKCgpID0+IGxlYWYoKS5saW5rKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGVxdWFsOiAoYSwgYikgPT4gYS5pZCA9PT0gYi5pZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0aGlzLmlzTWFudWFsLFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZXF1YWw6IChhLCBiKSA9PiBhLmxpbmsgPT09IGIubGluayxcclxuICAgIH0sXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcnVtYnMgPSBjb21wdXRlZCgoKTogU2lnbmFsPEJyZWFkY3J1bWI+W10gPT5cclxuICAgIHRoaXMuYWxsKCkuZmlsdGVyKChjKSA9PiBjLmFjdGl2ZSgpKSxcclxuICApO1xyXG5cclxuICByZWFkb25seSB1bndyYXBwZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNydW1icygpLm1hcCgoYykgPT4gYygpKSk7XHJcblxyXG4gIHJlZ2lzdGVyKGJyZWFkY3J1bWI6IEludGVybmFsQnJlYWRjcnVtYikge1xyXG4gICAgdGhpcy5tYXAuaW5saW5lKChtKSA9PiBtLnNldChicmVhZGNydW1iLmlkLCBicmVhZGNydW1iKSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogSW5qZWN0cyBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgcmVhY3RpdmUgbGlzdCBvZiBicmVhZGNydW1icy5cclxuICpcclxuICogVGhlIGJyZWFkY3J1bWJzIGFyZSBvcmRlcmVkIGFuZCByZWZsZWN0IHRoZSBjdXJyZW50IGFjdGl2ZSBuYXZpZ2F0aW9uIHBhdGguXHJcbiAqIEBzZWUgQnJlYWRjcnVtYlxyXG4gKiBAcmV0dXJucyBgU2lnbmFsPEJyZWFkY3J1bWJbXT5gXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogQENvbXBvbmVudCh7XHJcbiAqIHNlbGVjdG9yOiAnYXBwLWJyZWFkY3J1bWJzJyxcclxuICogdGVtcGxhdGU6IGBcclxuICogIDxuYXYgYXJpYS1sYWJlbD1cImJyZWFkY3J1bWJcIj5cclxuICogICAgPG9sPlxyXG4gKiAgICAgIEBmb3IgKGNydW1iIG9mIGJyZWFkY3J1bWJzKCk7IHRyYWNrIGNydW1iLmlkKSB7XHJcbiAqICAgICAgICA8bGk+XHJcbiAqICAgICAgICAgIDxhIFtocmVmXT1cImNydW1iLmxpbmsoKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiY3J1bWIuYXJpYUxhYmVsKClcIj57eyBjcnVtYi5sYWJlbCgpIH19PC9hPlxyXG4gKiAgICAgICAgPC9saT5cclxuICogICAgICB9XHJcbiAqICAgIDwvb2w+XHJcbiAqICA8L25hdj5cclxuICogYFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgTXlCcmVhZGNydW1ic0NvbXBvbmVudCB7XHJcbiAqICBicmVhZGNydW1icyA9IGluamVjdEJyZWFkY3J1bWJzKCk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0QnJlYWRjcnVtYnMoKSB7XHJcbiAgY29uc3Qgc3RvcmUgPSBpbmplY3QoQnJlYWRjcnVtYlN0b3JlKTtcclxuICByZXR1cm4gc3RvcmUudW53cmFwcGVkO1xyXG59XHJcbiJdfQ==","function parsePathSegment(segmentString) {\n const parts = segmentString.split(';');\n const pathPart = parts[0];\n const matrixParams = {};\n for (let i = 1; i < parts.length; i++) {\n const [key, value = 'true'] = parts[i].split('=');\n if (key) {\n matrixParams[key] = value;\n }\n }\n return { pathPart, matrixParams };\n}\nfunction createBasePredicate(path) {\n const partPredicates = path\n .split('/')\n .filter((part) => !!part.trim())\n .map((configSegmentString) => {\n const { pathPart: configPathPart, matrixParams: configMatrixParams } = parsePathSegment(configSegmentString);\n let singlePathPartPredicate;\n if (configPathPart.startsWith(':')) {\n singlePathPartPredicate = () => true;\n }\n else {\n singlePathPartPredicate = (linkSegmentPathPart) => linkSegmentPathPart === configPathPart;\n }\n const configSegmentHasMatrixParams = Object.keys(configMatrixParams).length > 0;\n return (linkSegmentString) => {\n const { pathPart: linkPathPart, matrixParams: linkMatrixParams } = parsePathSegment(linkSegmentString);\n if (!singlePathPartPredicate(linkPathPart)) {\n return false;\n }\n if (!configSegmentHasMatrixParams) {\n return true;\n }\n return Object.entries(configMatrixParams).every(([key, value]) => Object.prototype.hasOwnProperty.call(linkMatrixParams, key) &&\n linkMatrixParams[key] === value);\n };\n });\n return (path) => {\n const linkPathOnly = path.split(/[?#]/).at(0) ?? '';\n if (!linkPathOnly && partPredicates.length > 0)\n return false;\n if (!linkPathOnly && partPredicates.length === 0)\n return true;\n const parts = linkPathOnly.split('/').filter((part) => !!part.trim());\n if (parts.length < partPredicates.length)\n return false;\n return parts.every((seg, idx) => {\n const pred = partPredicates.at(idx);\n if (!pred)\n return true;\n return pred(seg);\n });\n };\n}\nfunction singleSegmentMatches(configSegment, linkSegment) {\n if (configSegment.pathPart === ':') {\n return true;\n }\n else if (configSegment.pathPart !== linkSegment.pathPart) {\n return false;\n }\n const configMatrix = configSegment.matrixParams;\n const linkMatrix = linkSegment.matrixParams;\n for (const key in configMatrix) {\n if (!Object.prototype.hasOwnProperty.call(linkMatrix, key) ||\n linkMatrix[key] !== configMatrix[key]) {\n return false;\n }\n }\n return true;\n}\nfunction matchSegmentsRecursive(configSegments, linkSegments, configIdx, linkIdx) {\n if (configIdx === configSegments.length) {\n return linkIdx === linkSegments.length;\n }\n if (linkIdx === linkSegments.length) {\n for (let i = configIdx; i < configSegments.length; i++) {\n if (configSegments[i].pathPart !== '**') {\n return false;\n }\n }\n return true;\n }\n const currentConfigSegment = configSegments[configIdx];\n if (currentConfigSegment.pathPart === '**') {\n if (matchSegmentsRecursive(configSegments, linkSegments, configIdx + 1, linkIdx)) {\n return true;\n }\n if (linkIdx < linkSegments.length) {\n if (matchSegmentsRecursive(configSegments, linkSegments, configIdx, linkIdx + 1)) {\n return true;\n }\n }\n return false;\n }\n else {\n if (linkIdx < linkSegments.length &&\n singleSegmentMatches(currentConfigSegment, linkSegments[linkIdx])) {\n return matchSegmentsRecursive(configSegments, linkSegments, configIdx + 1, linkIdx + 1);\n }\n return false;\n }\n}\nfunction createWildcardPredicate(path) {\n const configSegments = path\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n return (linkPath) => {\n const linkPathOnly = linkPath.split(/[?#]/).at(0) ?? '';\n const linkSegments = linkPathOnly\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n return matchSegmentsRecursive(configSegments, linkSegments, 0, 0);\n };\n}\nexport function createRoutePredicate(path) {\n return path.includes('**')\n ? createWildcardPredicate(path)\n : createBasePredicate(path);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJvdXRlLXByZWRpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3JvdXRlci9jb3JlL3NyYy9saWIvdXRpbC9jcmVhdGUtcm91dGUtcHJlZGljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsZ0JBQWdCLENBQUMsYUFBcUI7SUFJN0MsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxZQUFZLEdBQTJCLEVBQUUsQ0FBQztJQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQVk7SUFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSTtTQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQy9CLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7UUFDM0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLEdBQ2xFLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFeEMsSUFBSSx1QkFBaUUsQ0FBQztRQUN0RSxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQ