UNPKG

ngx-route-manager

Version:
1 lines 14.9 kB
{"version":3,"file":"ngx-route-manager.mjs","sources":["../../../projects/ngx-route-manager/src/lib/functions/listenForRouteChange.ts","../../../projects/ngx-route-manager/src/app.module.ts","../../../projects/ngx-route-manager/src/lib/functions/createUrlFunction.ts","../../../projects/ngx-route-manager/src/lib/models/ngx-param.ts","../../../projects/ngx-route-manager/src/lib/functions/convertUrlTo.ts","../../../projects/ngx-route-manager/src/lib/models/ngx-route.ts","../../../projects/ngx-route-manager/src/lib/functions/convertUrlToSegment.ts","../../../projects/ngx-route-manager/src/lib/functions/generate-path.ts","../../../projects/ngx-route-manager/src/public-api.ts","../../../projects/ngx-route-manager/src/ngx-route-manager.ts"],"sourcesContent":["import { Router, ActivatedRoute, NavigationEnd } from \"@angular/router\";\r\nimport { filter } from \"rxjs\";\r\nimport { signal } from \"@angular/core\";\r\n\r\nexport const internalSignalRoute = signal<ActivatedRoute | undefined>(undefined);\r\n\r\n// Factory function to initialize the service\r\nexport function listenForRouteChange(router: Router, route: ActivatedRoute) {\r\n return () => {\r\n internalSignalRoute.set(route);\r\n const subscription = router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n ).subscribe(() => {\r\n // Traverse to the most deeply activated route\r\n let route = router.routerState.root;\r\n while (route.firstChild) {\r\n route = route.firstChild;\r\n }\r\n internalSignalRoute.set(route);\r\n });\r\n\r\n return () => subscription.unsubscribe();\r\n };\r\n}","import { NgModule, ModuleWithProviders, InjectionToken, APP_INITIALIZER } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { listenForRouteChange } from './lib/functions/listenForRouteChange';\r\n\r\nexport const NGX_ROUTE_MANAGER_CONFIG = new InjectionToken<any>('NGX_ROUTE_MANAGER_CONFIG');\r\n\r\n@NgModule({})\r\nexport class NgxRouteManagerModule {\r\n static forRoot(config: any): ModuleWithProviders<NgxRouteManagerModule> {\r\n return {\r\n ngModule: NgxRouteManagerModule,\r\n providers: [\r\n {\r\n provide: NGX_ROUTE_MANAGER_CONFIG,\r\n useValue: config\r\n },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: listenForRouteChange,\r\n deps: [Router, ActivatedRoute],\r\n multi: true\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n","\r\n// type ExtractParams<T extends string> =\r\n// T extends `${infer _Start}:${infer Param}/${infer Rest}` ?\r\n// Param | ExtractParams<Rest> :\r\n// T extends `${infer _Start}:${infer Param}` ?\r\n// Param :\r\n// string;\r\n\r\n// // export type ParamsToFunction<T extends string> =\r\n// // ExtractParams<T> extends infer U extends string ?\r\n// // U extends string ?\r\n// // (args: Record<U, string>) => string :\r\n// // string :\r\n// // string;\r\n\r\n// export type ParamsToFunction<T extends string> =\r\n// ExtractParams<T> extends never ? // No parameters detected\r\n// () => string :\r\n// ExtractParams<T> extends infer U extends string ? // Parameters detected\r\n// (args: Record<U, string>) => string :\r\n// never;\r\n\r\n// export function createUrlFunction<T extends string>(template: T): ParamsToFunction<T> {\r\n// return ((args: Record<string, string>) => {\r\n// return template.replace(/:([a-zA-Z]+)/g, (_, key) => {\r\n// if (!args) throw new Error(\"No arguments provided\");\r\n// return args[key];\r\n// });\r\n// }) as ParamsToFunction<T>;\r\n// }\r\n\r\ntype ExtractParams<T extends string> = T extends `${infer _Start}:${infer Param}/${infer Rest}`\r\n ? Param | ExtractParams<Rest>\r\n : T extends `${infer _Start}:${infer Param}`\r\n ? Param\r\n : never;\r\n\r\ntype HasParams<T extends string> = ExtractParams<T> extends never ? false : true;\r\n\r\nexport type ParamsToFunction<T extends string> = HasParams<T> extends true\r\n ? (args: Record<ExtractParams<T>, string>) => string\r\n : () => string;\r\n\r\nexport function createUrlFunction<T extends string>(template: T): ParamsToFunction<T> {\r\n return ((args?: Record<string, string>) => {\r\n if (args === undefined && template.includes(':')) {\r\n throw new Error('Arguments are required for this template');\r\n }\r\n if (args !== undefined && !template.includes(':')) {\r\n throw new Error('This template does not accept any arguments');\r\n }\r\n return template.replace(/:([a-zA-Z]+)/g, (_, key) => {\r\n return args?.[key] ?? '';\r\n });\r\n }) as ParamsToFunction<T>;\r\n}\r\n","import { filter, map, of } from \"rxjs\";\r\nimport { computed } from \"@angular/core\";\r\nimport { internalSignalRoute } from \"../functions/listenForRouteChange\";\r\n\r\nexport class NgxParam {\r\n\r\n /**\r\n * Name of the param\r\n */\r\n private readonly _name: string = '';\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Returns the current snapshoot of the value in the url route\r\n */\r\n readonly snapshotValue = computed(() => {\r\n if (!internalSignalRoute()) { return '' }\r\n else {\r\n return internalSignalRoute()?.snapshot.paramMap.get(this.name) || ''\r\n }\r\n })\r\n\r\n /**\r\n * Listens for change on param in the route\r\n */\r\n readonly listenForValue = computed(() => {\r\n if (!internalSignalRoute()) { \r\n console.log(internalSignalRoute());\r\n return of('') \r\n }\r\n else {\r\n return internalSignalRoute()?.paramMap\r\n .pipe(\r\n filter(paramMap => paramMap.has(this.name)),\r\n map(paramMap => paramMap.get(this.name) || '')\r\n )\r\n }\r\n })\r\n\r\n constructor(name: string) {\r\n this._name = name;\r\n }\r\n}\r\n","import { NgxParam } from \"../models/ngx-param\";\r\n\r\n\r\nexport type RouteParams<T extends string> = {\r\n [K in ExtractRouteParams<T>]: NgxParam;\r\n};\r\n\r\nexport type ExtractRouteParams<T extends string> =\r\n T extends `${infer _}:${infer Param}/${infer Rest}`\r\n ? Param | ExtractRouteParams<Rest>\r\n : T extends `${infer _}:${infer Param}`\r\n ? Param\r\n : never;\r\n\r\nexport function urlToNgxParam<T extends string>(route: T): RouteParams<T> {\r\n const segments = route.split('/');\r\n const params: any = {};\r\n\r\n segments.forEach(segment => {\r\n if (segment.startsWith(':')) {\r\n const param = segment.slice(1);\r\n\r\n if (!/^[A-Za-z]+$/.test(param)) { throw new Error(`${param} must contain only alphabets in ${route}`) }\r\n\r\n params[param] = new NgxParam(param);\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n","import { RouteParams } from \"../functions/convertUrlTo\";\r\nimport { ExtractStaticSegments, SegmentObject } from \"../functions/convertUrlToSegment\";\r\nimport { ParamsToFunction } from \"../functions/createUrlFunction\";\r\n\r\nexport class NgxRoute<T extends string> {\r\n /**\r\n * The url path\r\n */\r\n readonly path: string = '';\r\n\r\n /**\r\n * Function to generate the url, requiring the right params\r\n */\r\n readonly fn: ParamsToFunction<T> = {} as ParamsToFunction<T>;\r\n\r\n /**\r\n * Stores all the params as\r\n */\r\n private _params: RouteParams<T> = {} as RouteParams<T>\r\n\r\n \r\n /**\r\n * Stores all the segments as\r\n */\r\n private _segments: SegmentObject<ExtractStaticSegments<T>> = {} as SegmentObject<ExtractStaticSegments<T>>\r\n\r\n constructor(path: string, fn: ParamsToFunction<T>, params: RouteParams<T>, segments: SegmentObject<ExtractStaticSegments<T>>) {\r\n this.path = path;\r\n this.fn = fn;\r\n this._params = params;\r\n this._segments = segments;\r\n }\r\n\r\n /**\r\n * All params store as an object\r\n */\r\n get params(): RouteParams<T>\r\n {\r\n return this._params\r\n }\r\n\r\n /**\r\n * All segments store as an object\r\n */\r\n get segments(): SegmentObject<ExtractStaticSegments<T>>\r\n {\r\n return this._segments\r\n }\r\n}\r\n","\r\n// Type to extract static segments from a URL pattern\r\nexport type ExtractStaticSegments<T extends string> = T extends `${infer First}/${infer Rest}`\r\n ? First extends `:${string}`\r\n ? ExtractStaticSegments<Rest>\r\n : First | ExtractStaticSegments<Rest>\r\n : T extends `:${string}`\r\n ? never\r\n : T;\r\n\r\n// Type to create an object type from union of strings\r\nexport type SegmentObject<T extends string> = {\r\n [K in T]: K;\r\n};\r\n\r\n\r\n/**\r\n * Extracts static segments from a URL pattern and returns them as a typed object\r\n * Types are automatically inferred from the URL pattern\r\n * @param url - The URL pattern to parse\r\n * @returns Object with extracted segments with automatic type inference\r\n */\r\nexport function urlToSegments<T extends string>(url: T): SegmentObject<ExtractStaticSegments<T>> {\r\n // Remove leading and trailing slashes\r\n const cleanUrl = url.replace(/^\\/+|\\/+$/g, '');\r\n \r\n // Split the URL into segments\r\n const segments = cleanUrl.split('/');\r\n \r\n // Initialize result object\r\n const result = {} as SegmentObject<ExtractStaticSegments<T>>;\r\n \r\n // Process each segment\r\n segments.forEach(segment => {\r\n // Skip dynamic segments (those starting with ':')\r\n if (segment.startsWith(':') || segment.trim().length == 0) {\r\n return;\r\n }\r\n\r\n if (!/^[a-zA-Z][a-zA-Z0-9-_]*$/.test(segment)) { throw new Error(`Segment '${segment}' must start with a letter and contain only letters, numbers, hyphens, or underscores in ${url}`) }\r\n \r\n // Add valid segments to result object\r\n (result as any)[segment] = segment;\r\n });\r\n \r\n return result;\r\n}","import { createUrlFunction } from \"./createUrlFunction\";\r\nimport { urlToNgxParam } from \"./convertUrlTo\";\r\nimport { NgxRoute } from \"../models/ngx-route\";\r\nimport { urlToSegments } from \"./convertUrlToSegment\";\r\n\r\nexport function generateNgxRoute<T extends string>(urlPattern?: T): NgxRoute<T> {\r\n const pattern = urlPattern ? urlPattern : '';\r\n const ngxRoute = new NgxRoute(pattern, createUrlFunction(pattern), urlToNgxParam(pattern), urlToSegments(pattern))\r\n return ngxRoute;\r\n}\r\n","/*\r\n * Public API Surface of ngx-route-manager\r\n */\r\n\r\nexport { NgxRouteManagerModule } from './app.module';\r\nexport { generateNgxRoute } from './lib/functions/generate-path';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}