@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
1 lines • 21.5 kB
Source Map (JSON)
{"version":3,"file":"bespunky-angular-zen-router-x-navigation.mjs","sources":["../../../../libs/angular-zen/router-x/navigation/src/lib/_navigation-x.symbols.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/navigation-x.injector.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/_utils/_string-utils.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/route-composer/_utils.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/navigation-x.providers.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/route-composer/router-composer.ts","../../../../libs/angular-zen/router-x/navigation/src/lib/navigation-x.route-creator.ts","../../../../libs/angular-zen/router-x/navigation/src/bespunky-angular-zen-router-x-navigation.ts"],"sourcesContent":["export const _RouteComposer_ = Symbol('RouteComposer');\nexport const _NavigatorXToken_ = Symbol('NavigatorXToken');\n","import { inject } from '@angular/core';\nimport { _NavigatorXToken_ } from './_navigation-x.symbols';\nimport type { AutoNavigateRouteMethods } from './types/auto-navigator-methods.types';\nimport type { WithNavigationX, ReadonlyRoute, WithRouteComposer, DeepReadonlyRouteChildren } from './types/composable-routes.types';\nimport type { routeConfigFor } from './navigation-x.route-creator';\nimport type { provideRouterX, provideRoutesX } from './navigation-x.providers';\n\n/**\n * Injects the auto-generated strongly-typed navigation service for the specified route tree.\n * \n * For this to work, the route must be previously generated using {@link routeConfigFor `routeConfigFor`}, and provided into Angular using\n * either {@link provideRouterX `provideRouterX`} or {@link provideRoutesX `provideRoutesX`}.\n *\n * To change the default composed name of a specific auto-generated navigation method, go to the corresponding\n * route config and add the `friendlyName` propertyName.\n * \n * @export\n * @template Route \n * @template Entity \n * @template Root \n * @template FullPath \n * @template ComposerName \n * @param {(Route & WithRouteComposer<Entity, FullPath, ComposerName> & WithNavigationX<Route, Entity, Root>)} route \n * @return {AutoNavigateRouteMethods<Route, Entity, Root>} \n */\nexport function useNavigationX<\n Route extends ReadonlyRoute<string, string, DeepReadonlyRouteChildren>,\n Entity,\n Root extends string,\n FullPath extends string,\n ComposerName extends string\n>(route: Route & WithRouteComposer<Entity, FullPath, ComposerName> & WithNavigationX<Route, Entity, Root>): AutoNavigateRouteMethods<Route, Entity, Root>\n{\n return inject(route[ _NavigatorXToken_ ]);\n}\n","export function touchFirstLetter([ firstLetter, ...rest ]: string, touch: (first: string) => string): string\n{\n return firstLetter ? touch(firstLetter) + rest.join('') : '';\n}\n\nexport function firstUpper(value: string): string\n{\n return touchFirstLetter(value, first => first.toUpperCase());\n}\n","import { RouteComposer } from './router-composer';\nimport { firstUpper } from '../_utils/_string-utils';\nimport { _RouteComposer_ } from '../_navigation-x.symbols';\n\nimport type { ReadonlyRoute, WithRouteComposer } from '../types/composable-routes.types';\nimport type { RouteArgument } from '../types/route-paths.types';\n\n// TODO: Warn if multiple composers with the same name were found\nexport function collectRouteComposersByAutoNavigatorName(route: WithRouteComposer<unknown, string, string> & ReadonlyRoute<string, string, any>): Map<string, RouteComposer<unknown, string, string>>\n{\n const composer = route[ _RouteComposer_ ];\n const autoNavigatorName = `to${ firstUpper(composer.name) }`;\n\n const childComposers = collectArrayRouteComposersByAutoNavigatioName(route.children);\n\n return new Map([\n [ autoNavigatorName, composer ],\n ...(childComposers ?? [])\n ]);\n}\n\nfunction collectArrayRouteComposersByAutoNavigatioName(routes: (WithRouteComposer<unknown, string, string> & ReadonlyRoute<string, string, any>)[]): Map<string, RouteComposer<unknown, string, string>>\n{\n return routes?.map(collectRouteComposersByAutoNavigatorName)\n .reduce((allNestedComposers, childComposers) => new Map([ ...allNestedComposers, ...childComposers ]), new Map());\n}\n\nexport function extractArgsFromPath<Path extends string>(path: Path): RouteArgument<Path>[]\n{\n return path\n .split('/')\n .filter(segment => segment.startsWith(':')) as RouteArgument<Path>[];\n}","import { FactoryProvider, Provider } from '@angular/core';\nimport { provideRouter, provideRoutes, Router } from '@angular/router';\nimport type { NoHead } from '@bespunky/typescript-utils';\n\nimport { collectRouteComposersByAutoNavigatorName } from './route-composer/_utils';\nimport { _NavigatorXToken_ } from './_navigation-x.symbols';\nimport type { RouteComposer } from './route-composer/router-composer';\nimport type { NavigationXRoute, WithNavigationX, ReadonlyRoute, WithRouteComposer } from './types/composable-routes.types';\n\nfunction attemptToProduceAutoNavigationFunctionFor(router: Router, composer?: RouteComposer<unknown, string, string>): ((entity: unknown) => Promise<boolean>) | undefined\n{\n if (!composer) return undefined;\n\n if (composer.hasArgs)\n {\n const compose = composer.compose.bind(composer) as (entity: unknown) => string;\n \n return (entity: unknown) => router.navigateByUrl(compose(entity));\n }\n\n return () => router.navigateByUrl(composer.compose());\n}\n\nfunction createNavigationXFactoryProvider(route: ReadonlyRoute<string, string, any> & WithRouteComposer<any, string, string> & WithNavigationX<any, any, string>): FactoryProvider\n{\n return {\n provide: route[ _NavigatorXToken_ ],\n deps: [Router],\n useFactory: (router: Router) => \n { \n const composers = collectRouteComposersByAutoNavigatorName(route);\n \n return new Proxy({}, {\n get: (_, propertyName: string) =>\n attemptToProduceAutoNavigationFunctionFor(router, composers.get(propertyName)),\n \n has: (_, propertyName: string) => composers.has(propertyName)\n });\n }\n };\n}\n\nfunction provideNavigatorsFor(...routes: NavigationXRoute<any>[]): FactoryProvider[]\n{\n if (!routes?.length) throw `No routes were provided.`;\n\n return routes.map(createNavigationXFactoryProvider);\n}\n\n\n/**\n * Wraps Angular's `provideRouter` function and adds providers for the navigation-x module.\n *\n * @export\n * @param {NavigationXRoute<any>[]} routes The Angular routes config tree to initialize navigation-x for.\n * @param {...NoHead<Parameters<typeof provideRouter>>} features Addtional features to pass into Angular's `provideRouter` function.\n * @return {Provider[]} The providers returned by `provideRouter`, along with other providers needed for navigation-x to work.\n */\nexport function provideRouterX(routes: NavigationXRoute<any>[], ...features: NoHead<Parameters<typeof provideRouter>>): Provider[]\n{\n return [\n ...provideRouter(routes, ...features),\n ...provideNavigatorsFor(...routes)\n ];\n}\n\n/**\n * Wraps Angular's `provideRoutes` function and adds providers for the navigation-x module.\n *\n * @export\n * @param {...NavigationXRoute<any>[]} routes The Angular routes config tree to initialize navigation-x for.\n * @return {Provider[]} The providers returned by `provideRoutes`, along with other providers needed for navigation-x to work.\n */\nexport function provideRoutesX(...routes: NavigationXRoute<any>[]): Provider[]\n{\n return [\n ...provideRoutes(routes),\n ...provideNavigatorsFor(routes)\n ];\n}\n\n\n","import { extractArgsFromPath } from './_utils';\nimport type { RouteComposerComposeMethod, EntityRouteArgs } from '../types/route-composer.types';\nimport type { RouteArgument } from '../types/route-paths.types';\n\nexport class RouteComposer<Entity, FullPath extends string, Name extends string> {\n public readonly args: RouteArgument<FullPath>[];\n public readonly hasArgs: boolean;\n public readonly compose: RouteComposerComposeMethod<Entity, FullPath>;\n\n constructor(public readonly path: FullPath, public readonly name: Name)\n {\n this.args = extractArgsFromPath(path);\n this.hasArgs = this.args.length > 0;\n this.compose = (this.hasArgs ? this.routePathWithArgs.bind(this) : this.routePath.bind(this)) as RouteComposerComposeMethod<Entity, FullPath>;\n }\n\n private routePathWithArgs(entity: EntityRouteArgs<Entity, FullPath>): string\n {\n return this.args.reduce(\n (route: string, arg: string) =>\n {\n const argName = arg.substring(1) as keyof EntityRouteArgs<Entity, FullPath>;\n\n const value = entity[ argName ];\n const formattedValue = value instanceof Date ? value.toUTCString() : String(value);\n\n return route.replace(arg, formattedValue);\n },\n this.path\n );\n }\n\n private routePath(): FullPath { return this.path; }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { Join, NoTail } from '@bespunky/typescript-utils';\n\nimport { RouteComposer } from './route-composer/router-composer';\nimport { firstUpper } from './_utils/_string-utils';\nimport { _NavigatorXToken_, _RouteComposer_ } from './_navigation-x.symbols';\n\nimport type { AutoNavigateRouteMethods } from './types/auto-navigator-methods.types';\nimport type { ComposableRoute, ComposableRoutesArray, DeepReadonlyRouteChildren, ReadonlyRoute, WithNavigationX } from './types/composable-routes.types';\nimport type { GeneratedRouteComposerName, RouteComposerName } from './types/route-composer.types';\nimport type { CombinedPath, RouteSegments } from './types/route-paths.types';\n\nexport const autoNavigatorNameSeparator = '';\n\nfunction generateRouteComposerName<Path extends string>(path: Path): GeneratedRouteComposerName<Path>\n{\n return path\n .replace(/\\/:/g, '/')\n .split('/')\n .map(firstUpper)\n .join(autoNavigatorNameSeparator) as GeneratedRouteComposerName<Path>;\n}\n\ninterface RouteConfigurator<Entity>\n{\n /**\n * Generates a strongly-typed navigation-x route.\n * Pass the result to either `provideRouterX()` or `provideRoutesX()` and you'll be able to call `useNavigationX()`\n * with the route tree you specified.\n *\n * ❕ Remember to pass the route config `as const`.\n * \n * @template Segment The strong-typed path property of the route segment.\n * @template FriendlyName The strong-typed friendly name for the route segment. Taken from the `friendlyName` proeprty.\n * @template Children The strong-typed children of the route segment.\n * @param {ReadonlyRoute<Segment, FriendlyName, Children>} route The route config to strong-type. Remember to pass it in use `as const`.\n * @return \n */\n route: <\n Segment extends string,\n FriendlyName extends string,\n Children extends DeepReadonlyRouteChildren | undefined\n >(route: ReadonlyRoute<Segment, FriendlyName, Children>) =>\n ComposableRoute<typeof route, Entity, ''> & WithNavigationX<typeof route, Entity, ''>;\n \n /**\n * Generates a strongly-typed navigation-x route with a predefined path prefix.\n * Pass the result to either `provideRouterX()` or `provideRoutesX()` and you'll be able to call `useNavigationX()`\n * with the route tree you specified.\n *\n * ❕ Remember to pass the route config `as const`.\n * \n * @template Segment The strong-typed path property of the route segment.\n * @template FriendlyName The strong-typed friendly name for the route segment. Taken from the `friendlyName` proeprty.\n * @template Children The strong-typed children of the route segment.\n * @template Root The strong-typed url prefix for all routes in the tree.\n * @param {ReadonlyRoute<Segment, FriendlyName, Children>} route The route config to strong-type. Remember to pass it in use `as const`.\n * @param {Root} root The url prefix all routes in this config tree start from.\n * @return \n */\n prefixedRoute: <\n Segment extends string,\n FriendlyName extends string,\n Children extends DeepReadonlyRouteChildren | undefined,\n Root extends string\n >(route: ReadonlyRoute<Segment, FriendlyName, Children>, root: Root) => \n ComposableRoute<typeof route, Entity, Root> & WithNavigationX<typeof route, Entity, Join<NoTail<RouteSegments<Root>> & string[], '/'>>;\n}\n\n/**\n * Creates a strongly-typed configurator for Angular routes.\n * \n * Call this with an entity, then generate a strongly typed Angular route config tree using one of the\n * configurator's functions.\n * \n * Store the generated route somewhere and use `provideRouterX()` or `provideRoutesX()` to tell Angular about it.\n *\n * @export\n * @template Entity The entity (or data structure) route arguments should match with.\n * @return {RouteConfigurator<Entity>} An object which allows generating strongly typed routes.\n */\nexport function routeConfigFor<Entity>(): RouteConfigurator<Entity>\n{\n function combinePath<Root extends string, Segment extends string>(root: Root, segment?: Segment)\n {\n return (segment ? `${ root }/${ segment }` : root) as CombinedPath<Root, Segment>;\n }\n\n function prefixedRouteCore<\n Segment extends string,\n FriendlyName extends string,\n Children extends DeepReadonlyRouteChildren | undefined,\n Root extends string\n >(route: ReadonlyRoute<Segment, FriendlyName, Children>, root: Root)//: ComposableRoute<typeof route, Entity, CombinedPath<Root, Segment>>\n {\n const path = combinePath(root, route.path) as CombinedPath<Root, Segment>;\n const composerName = (route.friendlyName ?? generateRouteComposerName(path)) as RouteComposerName<FriendlyName, CombinedPath<Root, Segment>>;\n\n const composer = new RouteComposer<Entity, CombinedPath<Root, Segment>, RouteComposerName<FriendlyName, CombinedPath<Root, Segment>>>(path, composerName);\n const children = route.children?.map(child => prefixedRoute(child, path)) as\n ComposableRoutesArray<Children, Entity, CombinedPath<Root, Segment>> | undefined;\n\n return {\n ...route,\n children,\n [_RouteComposer_]: composer\n } as const;\n }\n\n function prefixedRoute<\n Segment extends string,\n FriendlyName extends string,\n Children extends DeepReadonlyRouteChildren | undefined,\n Root extends string\n >(route: ReadonlyRoute<Segment, FriendlyName, Children>, root: Root)//: ComposableRootRoute<ComposableRoute<typeof route, Entity, CombinedPath<Root, Segment>>>\n {\n return {\n ...prefixedRouteCore(route, root),\n [ _NavigatorXToken_ ]: new InjectionToken<AutoNavigateRouteMethods<typeof route, Entity, Root>>(`_ROUTER_X_NAVIGATION__${ route.path }`)\n } as const;\n }\n\n function route<\n Segment extends string,\n FriendlyName extends string,\n Children extends DeepReadonlyRouteChildren | undefined\n >(route: ReadonlyRoute<Segment, FriendlyName, Children>)//: ComposableRootRoute<ComposableRoute<typeof route, Entity, CombinedPath<'', Segment>>>\n {\n // When the `root` arg was optional with a default value of `''`, TS appended `${string}` (e.g. `${string}/theaters/:theaterId`)\n // to the route template for some reason, which breaks the arg extraction later on.\n // Passing `''` manually however, leaves the template as is should be (e.g. `/theaters/:theaterId`) and allows the string template to be interpreted well.\n // `route()` and `prefixedRoute()` were seperated to allow the developer to call `route()` without providing `''`.\n // The `prefixedRoute()` is exposed to the world as it might be usefull in the future (e.g. lazy loaded routes? maybe...?)\n return prefixedRoute(route, '');\n }\n\n return {\n route,\n prefixedRoute\n } as RouteConfigurator<Entity>;\n}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}