UNPKG

ngx-router-meta

Version:

Configure HTML meta tags in route configuration of Angular

1 lines 30.5 kB
{"version":3,"file":"ngx-router-meta.mjs","sources":["../../../projects/ngx-router-meta/src/lib/router-meta.ts","../../../projects/ngx-router-meta/src/lib/util.ts","../../../projects/ngx-router-meta/src/lib/router-meta-context.service.ts","../../../projects/ngx-router-meta/src/lib/router-meta.service.ts","../../../projects/ngx-router-meta/src/lib/router-meta.module.ts","../../../projects/ngx-router-meta/src/public-api.ts","../../../projects/ngx-router-meta/src/ngx-router-meta.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MetaDefinition } from '@angular/platform-browser';\nimport { Data, Route, Routes } from '@angular/router';\nimport {\n catchError,\n EMPTY,\n map,\n Observable,\n OperatorFunction,\n scan,\n startWith,\n switchAll,\n switchMapTo,\n} from 'rxjs';\n\nimport { Indexable, InferArray, UnionToIntersection } from './types';\n\n/**\n * Specifies identifiers of interpolations in meta strings\n */\nexport interface RouterMetaInterpolation {\n start: string;\n end: string;\n}\n\n/**\n * Configuration of {@link RouterMetaModule}\n */\nexport interface RouterMetaConfig {\n defaultMeta?: RouteMeta;\n interpolation?: RouterMetaInterpolation;\n}\n\n/**\n * Context for rendering meta tags\n */\nexport interface MetaContext extends Indexable<any> {}\n\n/**\n * Template strings for rendering meta tags\n *\n * Every key must match a tag name it's applied to\n */\nexport interface RouteMetaTemplates extends Indexable<string> {}\n\n/**\n * Meta tags of the {@link Route} with templates\n */\nexport interface RouteMeta\n extends Indexable<string | MetaDefinition | undefined> {\n _templates_?: RouteMetaTemplates;\n title?: string;\n description?: string | MetaDefinition;\n}\n\n/**\n * Describes {@link Route#data} with {@link RouteMeta}\n */\nexport interface DataWithMeta extends Data {\n meta?: RouteMeta;\n}\n\n/**\n * Describes {@link Route} with {@link DataWithMeta}\n */\nexport interface RouteWithMeta extends Route {\n data?: DataWithMeta;\n}\n\n/**\n * Describes {@link Routes} as array of {@link RouteWithMeta}\n */\nexport type RoutesWithMeta = RouteWithMeta[];\n\n/**\n * Useful helper to combine different route definitions into single one\n *\n * For example, you want to use {@link RoutesWithMeta} and some other {@link RoutesWithSomething}\n * then you can combine them like so:\n * ```ts\n * const routes: MergeRoutes<RoutesWithMeta | RoutesWithSomething>;\n * // routes[].data will be union of {meta:...} and {something:...}\n * ```\n */\nexport type MergeRoutes<T extends Routes> = UnionToIntersection<\n InferArray<T>\n>[];\n\n/** @internal */\nexport const ROUTE_META_CONFIG = new InjectionToken<RouterMetaConfig>(\n 'ROUTE_META_CONFIG',\n);\n\n/**\n * Check if {@link Route#data} contains {@link RouteMeta} object\n */\nexport function isDataWithMeta(data: Data): data is Required<DataWithMeta> {\n return !!data.meta;\n}\n\n/**\n * Allows to accumulate many context objects streams into one stream\n * while merging all context objects together\n * and running any transformation function\n */\nexport function unfoldContext<R>(\n ctx$$: Observable<Observable<MetaContext>>,\n mapFn: (ctx: MetaContext) => R,\n): OperatorFunction<any, R> {\n return (o$) =>\n o$.pipe(\n switchMapTo(\n ctx$$.pipe(\n switchAll(),\n catchError(() => EMPTY),\n map((ctx) => mapFn(ctx)),\n scan((acc, ctx) => ({ ...acc, ...ctx })), // Merge contexts\n startWith({} as R),\n ),\n ),\n );\n}\n","import { Event, NavigationEnd } from '@angular/router';\n\nexport function isNavigationEndEvent(event: Event): event is NavigationEnd {\n return event instanceof NavigationEnd;\n}\n\nexport interface SafeRegexString extends String {\n __safe: true;\n}\n\nexport function escapeRegExp(str: string): SafeRegexString {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') as any; // $& means the whole matched string\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n combineLatest,\n filter,\n isObservable,\n map,\n merge,\n Observable,\n of,\n shareReplay,\n startWith,\n Subject,\n} from 'rxjs';\n\nimport {\n MetaContext,\n RouteMetaTemplates,\n RouterMetaConfig,\n RouterMetaInterpolation,\n ROUTE_META_CONFIG,\n unfoldContext,\n} from './router-meta';\nimport { Indexable } from './types';\nimport { escapeRegExp, isNavigationEndEvent } from './util';\n\n/** @internal */\nexport interface MetaInfo {\n replace: RegExp;\n value: any;\n}\n\n/** @internal */\nexport interface ProcessedMetaContext extends Indexable<MetaInfo> {}\n\n/**\n * Service to provide context for meta tags\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class RouterMetaContextService {\n private static interpolation: RouterMetaInterpolation = {\n start: '{',\n end: '}',\n };\n\n private ctxNameCache: Indexable<RegExp> = {};\n\n private interpolation =\n this.config.interpolation || RouterMetaContextService.interpolation;\n private interpolationStart = escapeRegExp(this.interpolation.start);\n private interpolationEnd = escapeRegExp(this.interpolation.end);\n\n private navigationEnd$ = this.router.events.pipe(\n filter(isNavigationEndEvent),\n );\n\n private metaDefaultContext$$ = new Subject<Observable<MetaContext>>();\n private metaContext$$ = new Subject<Observable<MetaContext>>();\n private clearDefaultContext$ = new Subject<void>();\n private clearContext$ = new Subject<void>();\n\n private metaDefaultContext$: Observable<ProcessedMetaContext> =\n this.clearDefaultContext$.pipe(\n startWith(null),\n unfoldContext(this.metaDefaultContext$$, (ctx) =>\n this._processContext(ctx),\n ),\n );\n\n private metaContext$: Observable<ProcessedMetaContext> = merge(\n this.clearContext$,\n this.navigationEnd$, // Start fresh after every navigation\n ).pipe(\n startWith(null),\n unfoldContext(this.metaContext$$, (ctx) => this._processContext(ctx)),\n );\n\n private context$ = combineLatest(\n this.metaDefaultContext$,\n this.metaContext$,\n ).pipe(\n map(([defaultCtx, ctx]) => ({ ...defaultCtx, ...ctx })),\n shareReplay(),\n );\n\n constructor(\n @Inject(ROUTE_META_CONFIG) private config: RouterMetaConfig,\n private router: Router,\n ) {}\n\n /**\n * Provided context will be available between router navigations\n *\n * Multiple contexts will be merged together\n */\n provideDefaultContext(ctx: MetaContext | Observable<MetaContext>) {\n this.metaDefaultContext$$.next(isObservable(ctx) ? ctx : of(ctx));\n }\n\n /**\n * Provided context will be available ONLY until next router navigation\n *\n * Multiple contexts will be merged together\n *\n * If you want to persist context between navigations -\n * use {@link RouterMetaContextService#provideDefaultContext()}\n */\n provideContext(ctx: MetaContext | Observable<MetaContext>) {\n this.metaContext$$.next(isObservable(ctx) ? ctx : of(ctx));\n }\n\n /**\n * Clear default context provided by\n * {@link RouterMetaContextService#provideDefaultContext()}\n */\n clearDefaultContext() {\n this.clearDefaultContext$.next();\n }\n\n /**\n * Clear context provided by\n * {@link RouterMetaContextService#provideContext()}\n */\n clearContext() {\n this.clearContext$.next();\n }\n\n /**\n * Observable of computed context for meta tags\n */\n getContext() {\n return this.context$;\n }\n\n /** @internal */\n _templateStr(\n str?: string,\n data?: ProcessedMetaContext,\n extras?: {\n name?: string;\n templates?: RouteMetaTemplates;\n meta?: ProcessedMetaContext;\n },\n ) {\n if (!str || !data) {\n return str || '';\n }\n\n let template = str;\n let ctx = data;\n\n if (extras) {\n template =\n extras.templates && extras.name\n ? extras.templates[extras.name] || template\n : template;\n ctx = { ...this.prepareContext(extras.meta, ctx), ...ctx };\n\n // Recover lost `str` value under provided `extras.name` key in context\n if (extras.name && extras.name in ctx === false) {\n const nameCtx = this._processContext({ [extras.name]: str });\n ctx = { ...ctx, ...this.prepareContext(nameCtx, ctx) };\n }\n }\n\n return this.templateReplace(template, ctx);\n }\n\n /** @internal */\n _processContext(ctx: MetaContext): ProcessedMetaContext {\n return Object.keys(ctx).reduce(\n (acc, key) => ({\n ...acc,\n [key]: {\n replace: this.getContextReplace(key),\n value: ctx[key],\n },\n }),\n {} as ProcessedMetaContext,\n );\n }\n\n private prepareContext(\n ctx?: ProcessedMetaContext,\n data?: ProcessedMetaContext,\n ): ProcessedMetaContext | undefined {\n if (!ctx || !data) {\n return ctx;\n }\n\n return Object.keys(ctx).reduce((c, key) => {\n c[key] = {\n ...ctx[key],\n value: this.templateReplace(ctx[key].value, data),\n };\n return c;\n }, {} as ProcessedMetaContext);\n }\n\n private templateReplace(tpl: string, ctx: ProcessedMetaContext) {\n return Object.keys(ctx).reduce(\n (s, key) => s.replace(ctx[key].replace, ctx[key].value),\n tpl,\n );\n }\n\n private getContextReplace(name: string) {\n return name in this.ctxNameCache\n ? this.ctxNameCache[name]\n : (this.ctxNameCache[name] = new RegExp(\n `${this.interpolationStart}${escapeRegExp(name)}${\n this.interpolationEnd\n }`,\n 'g',\n ));\n }\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n Inject,\n Injectable,\n OnDestroy,\n Optional,\n PLATFORM_ID,\n} from '@angular/core';\nimport {\n makeStateKey,\n Meta,\n MetaDefinition,\n Title,\n TransferState,\n} from '@angular/platform-browser';\nimport { ActivatedRoute, Data, Router } from '@angular/router';\nimport {\n combineLatest,\n filter,\n map,\n Subject,\n switchMap,\n takeUntil,\n} from 'rxjs';\n\nimport {\n isDataWithMeta,\n MetaContext,\n RouteMeta,\n RouteMetaTemplates,\n RouterMetaConfig,\n ROUTE_META_CONFIG,\n} from './router-meta';\nimport {\n ProcessedMetaContext,\n RouterMetaContextService,\n} from './router-meta-context.service';\nimport { Indexable } from './types';\nimport { isNavigationEndEvent } from './util';\n\nconst TITLE_STATE = makeStateKey<string>('RouterMetaTitle');\n\n/**\n * Service responsible for updating meta tags based on router configuration\n *\n * To provide context - use {@link RouterMetaContextService}\n */\n@Injectable({ providedIn: 'root' })\nexport class RouterMetaService implements OnDestroy {\n private initialized = false;\n private metaTags: Indexable<boolean> = {};\n\n private defaultMeta = this.config.defaultMeta || {};\n\n private originalTitle = this.transferState\n ? this.transferState.get(TITLE_STATE, this.title.getTitle())\n : this.title.getTitle();\n\n private destroyed$ = new Subject<void>();\n\n private navigationEnd$ = this.router.events.pipe(\n filter(isNavigationEndEvent),\n );\n\n private routeData$ = this.navigationEnd$.pipe(\n map(() => this.router.routerState.root),\n map((route) => this.getLastRoute(route)),\n filter((route) => route.outlet === 'primary'),\n switchMap((route) => route.data),\n );\n\n constructor(\n @Inject(PLATFORM_ID) private platformId: any,\n @Inject(ROUTE_META_CONFIG) private config: RouterMetaConfig,\n private router: Router,\n private title: Title,\n private meta: Meta,\n private contextService: RouterMetaContextService,\n @Optional() private transferState?: TransferState,\n ) {}\n\n /**\n * Returns original title of index page.\n *\n * If SSR was used with {@link StateTransfer} -\n * then original title will be preserved between server and client states\n */\n getOriginalTitle() {\n return this.originalTitle;\n }\n\n /** @internal */\n ngOnDestroy(): void {\n this.destroyed$.next();\n }\n\n /** @internal */\n _setup() {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n\n if (this.transferState && isPlatformServer(this.platformId)) {\n this.transferState.set(TITLE_STATE, this.originalTitle);\n }\n\n combineLatest(this.routeData$, this.contextService.getContext())\n .pipe(takeUntil(this.destroyed$))\n .subscribe(([data, ctx]) => this.updateAllMeta(data, ctx));\n }\n\n private updateAllMeta(data: Data, ctx: ProcessedMetaContext = {}) {\n const { _templates_: defaultTemplates, ...defaultAllMeta } =\n this.defaultMeta;\n\n if (!isDataWithMeta(data)) {\n this.resetAllMeta(ctx, defaultAllMeta);\n return;\n }\n\n const { meta } = data;\n const { _templates_, ...allMeta } = meta;\n const { title, ...otherMeta } = allMeta;\n const { title: _, ...defaultOtherMeta } = defaultAllMeta;\n\n const allMetaDefaulted = { ...defaultAllMeta, ...allMeta };\n const otherMetaDefaulted = { ...defaultOtherMeta, ...otherMeta };\n const templates = {\n ...defaultTemplates,\n ..._templates_,\n } as RouteMetaTemplates;\n\n const processedMeta = this.contextService._processContext(allMetaDefaulted);\n\n this.updateTitle(title, ctx, templates, processedMeta);\n\n Object.keys(otherMetaDefaulted).forEach((name) =>\n this.updateMeta(\n name,\n otherMetaDefaulted[name],\n ctx,\n templates,\n processedMeta,\n ),\n );\n\n // Cleanup leftover meta tags\n Object.keys(this.metaTags)\n .filter((name) => name in otherMetaDefaulted === false)\n .forEach((name) => this.resetMeta(name, ctx, templates, processedMeta));\n }\n\n private resetAllMeta(ctx: ProcessedMetaContext, defaultMeta: RouteMeta) {\n const { title, ...defaultOtherMeta } = defaultMeta;\n const metaDefaulted = { ...defaultOtherMeta, ...this.metaTags };\n const meta = this.contextService._processContext(defaultMeta);\n\n this.resetTitle(ctx, this.defaultMeta._templates_, meta);\n\n Object.keys(metaDefaulted).forEach((name) =>\n this.resetMeta(name, ctx, this.defaultMeta._templates_, meta),\n );\n }\n\n private updateTitle(\n title?: string,\n ctx?: ProcessedMetaContext,\n templates?: RouteMetaTemplates,\n meta?: ProcessedMetaContext,\n ) {\n if (title) {\n this.title.setTitle(\n this.contextService._templateStr(title, ctx, {\n name: 'title',\n templates,\n meta,\n }),\n );\n } else {\n this.resetTitle(ctx, templates, meta);\n }\n }\n\n private resetTitle(\n ctx?: ProcessedMetaContext,\n templates?: RouteMetaTemplates,\n meta?: ProcessedMetaContext,\n ) {\n this.title.setTitle(\n this.contextService._templateStr(\n this.defaultMeta.title || this.originalTitle,\n ctx,\n {\n name: 'title',\n meta,\n templates,\n },\n ),\n );\n }\n\n private updateMeta(\n name: string,\n content?: string | MetaDefinition,\n ctx?: ProcessedMetaContext,\n templates?: RouteMetaTemplates,\n meta?: ProcessedMetaContext,\n ) {\n if (content) {\n const metaDef: MetaDefinition =\n typeof content === 'string' ? { name, content } : content;\n\n metaDef.content = this.contextService._templateStr(metaDef.content, ctx, {\n name,\n meta,\n templates,\n });\n\n this.meta.updateTag(metaDef);\n this.metaTags[name] = true;\n } else {\n this.resetMeta(name, ctx, templates, meta);\n }\n }\n\n private resetMeta(\n name: string,\n ctx?: MetaContext,\n templates?: RouteMetaTemplates,\n meta?: ProcessedMetaContext,\n ) {\n const defaultMeta = this.defaultMeta[name];\n\n if (defaultMeta) {\n this.updateMeta(name, defaultMeta, ctx, templates, meta);\n } else {\n this.meta.removeTag(`name=\"${name}\"`);\n delete this.metaTags[name];\n }\n }\n\n private getLastRoute(route: ActivatedRoute) {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n Optional,\n Provider,\n SkipSelf,\n} from '@angular/core';\n\nimport { RouterMetaConfig, ROUTE_META_CONFIG } from './router-meta';\nimport { RouterMetaService } from './router-meta.service';\n\nexport type ConfigProvider = Provider;\n\nexport interface RouterMetaModuleConfig {\n config?: RouterMetaConfig;\n configProvider?: ConfigProvider;\n}\n\n@NgModule({})\nexport class RouterMetaModule {\n constructor(\n @Optional() @SkipSelf() parentModule: RouterMetaModule,\n routerMetaService: RouterMetaService,\n ) {\n if (!parentModule) {\n routerMetaService._setup();\n }\n }\n\n static forRoot(\n config: RouterMetaModuleConfig = {} as any,\n ): ModuleWithProviders<RouterMetaModule> {\n return {\n ngModule: RouterMetaModule,\n providers: [\n config.configProvider || {\n provide: ROUTE_META_CONFIG,\n useValue: config.config,\n },\n ],\n };\n }\n}\n","/*\n * Public API Surface of ngx-router-meta\n */\n\nexport * from './lib/router-meta';\nexport { RouterMetaService } from './lib/router-meta.service';\nexport { RouterMetaContextService } from './lib/router-meta-context.service';\nexport * from './lib/router-meta.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.RouterMetaContextService","i1.RouterMetaService"],"mappings":"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"}