UNPKG

ngx-matomo-client

Version:

Matomo (fka. Piwik) client for Angular applications

1 lines 41.3 kB
{"version":3,"file":"ngx-matomo-client-router.mjs","sources":["../../../projects/ngx-matomo-client/router/configuration.ts","../../../projects/ngx-matomo-client/router/interceptor.ts","../../../projects/ngx-matomo-client/router/interceptors/route-utils.ts","../../../projects/ngx-matomo-client/router/interceptors/route-interceptor-base.ts","../../../projects/ngx-matomo-client/router/interceptors/route-data-interceptor.ts","../../../projects/ngx-matomo-client/router/errors.ts","../../../projects/ngx-matomo-client/router/page-title-providers.ts","../../../projects/ngx-matomo-client/router/page-url-provider.ts","../../../projects/ngx-matomo-client/router/matomo-router.service.ts","../../../projects/ngx-matomo-client/router/providers.ts","../../../projects/ngx-matomo-client/router/matomo-router.module.ts","../../../projects/ngx-matomo-client/router/public-api.ts","../../../projects/ngx-matomo-client/router/ngx-matomo-client-router.ts"],"sourcesContent":["import { inject, InjectionToken, Type } from '@angular/core';\nimport { NavigationEnd } from '@angular/router';\nimport {\n InternalMatomoConfiguration,\n ɵINTERNAL_MATOMO_CONFIGURATION as INTERNAL_MATOMO_CONFIGURATION,\n} from 'ngx-matomo-client/core';\nimport { MatomoRouterInterceptor, MatomoRouterInterceptorFn } from './interceptor';\n\nexport const MATOMO_ROUTER_CONFIGURATION = new InjectionToken<MatomoRouterConfiguration>(\n 'MATOMO_ROUTER_CONFIGURATION',\n);\n\nexport type ExclusionConfig = string | RegExp | (string | RegExp)[];\nexport type NavigationEndComparator = (\n previousNavigationEnd: NavigationEnd,\n currentNavigationEnd: NavigationEnd,\n) => boolean;\n\nexport interface MatomoRouterConfiguration {\n /**\n * Set whether the application base href should be included in Matomo tracked urls\n *\n * Optional, default is `true`\n */\n prependBaseHref?: boolean; // Default true or false?\n\n /**\n * Set whether the page title should be set when tracking page views\n *\n * Note that if set to `false`, Matomo is likely to still use the initial document title for all\n * tracked page views.\n *\n * Optional, default is `true`\n */\n trackPageTitle?: boolean;\n\n /**\n * Set a delay after navigation event, before the page view is tracked. This is useful to let a\n * chance to the components to update document title.\n *\n * Set it to 0 (the default) to execute tracking asynchronously without further delay\n * Set it to -1, to execute tracking synchronously (not recommended)\n *\n * Optional, default is `0` (but still asynchronous)\n */\n delay?: number;\n\n /**\n * Pass some regular expressions to exclude some urls from being tracked as page views\n *\n * Optional, default is no url excluded\n */\n exclude?: ExclusionConfig;\n\n /**\n * Custom url comparator to detect url change between Angular route navigations.\n *\n * This may be useful, because by default all `NavigationEnd` events will trigger a page track and this may happen\n * after query params change only (without url actually changing).\n *\n * You can define a custom comparator here to compare url by ignoring query params.\n *\n * Note: this is different from providing the url sent to Matomo for actual tracking. The url sent to Matomo will be\n * the full page url, including any base href, and is configured using a {@link PageUrlProvider} (see\n * `MATOMO_PAGE_URL_PROVIDER` token).\n *\n * Optional, default is to compare `NavigationEnd.urlAfterRedirects`\n *\n * Possible values:\n * - `'fullUrl'` (or undefined): default value, compare using `NavigationEnd.urlAfterRedirects`\n * - `'ignoreQueryParams'`: compare using `NavigationEnd.urlAfterRedirects` but ignoring query params\n * - `NavigationEndComparator`: compare using a custom `NavigationEndComparator` function\n */\n navigationEndComparator?: NavigationEndComparator | 'ignoreQueryParams' | 'fullUrl';\n}\n\nexport interface MatomoRouterConfigurationWithInterceptors extends MatomoRouterConfiguration {\n /**\n * Interceptors types to register.\n *\n * For more complex scenarios, it is possible to configure any interceptor by\n * providing token `MATOMO_ROUTER_INTERCEPTORS` as `multi` provider(s).\n */\n interceptors?: (Type<MatomoRouterInterceptor> | MatomoRouterInterceptorFn)[];\n}\n\nexport const DEFAULT_ROUTER_CONFIGURATION: Required<MatomoRouterConfiguration> = {\n prependBaseHref: true,\n trackPageTitle: true,\n delay: 0,\n exclude: [],\n navigationEndComparator: 'fullUrl',\n};\n\nexport type InternalGlobalConfiguration = Pick<\n InternalMatomoConfiguration,\n 'enableLinkTracking' | 'disabled'\n>;\nexport type InternalRouterConfiguration = Required<MatomoRouterConfiguration> &\n InternalGlobalConfiguration;\n\nexport const INTERNAL_ROUTER_CONFIGURATION = new InjectionToken<InternalRouterConfiguration>(\n 'INTERNAL_ROUTER_CONFIGURATION',\n);\n\nexport function createInternalRouterConfiguration(): InternalRouterConfiguration {\n const { disabled, enableLinkTracking } = inject(INTERNAL_MATOMO_CONFIGURATION);\n const routerConfig = inject(MATOMO_ROUTER_CONFIGURATION, { optional: true }) || {};\n\n return { ...DEFAULT_ROUTER_CONFIGURATION, ...routerConfig, enableLinkTracking, disabled };\n}\n","import {\n inject,\n InjectionToken,\n INJECTOR,\n Injector,\n Provider,\n runInInjectionContext,\n Type,\n} from '@angular/core';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable } from 'rxjs';\n\nexport const MATOMO_ROUTER_INTERCEPTORS = new InjectionToken<MatomoRouterInterceptor[]>(\n 'MATOMO_ROUTER_INTERCEPTORS',\n);\n\n/** Interceptor used to hook just before every page tracking */\nexport type MatomoRouterInterceptorFn = (\n event: NavigationEnd,\n) => Observable<void> | Promise<void> | void;\n\n/** Interceptor used to hook into the page tracking process */\nexport interface MatomoRouterInterceptor {\n /**\n * Called after a router event has occurred and before page view has been tracked (i.e. before `trackPageView()` has been called)\n *\n * If an Observable or a Promise is returned, the observable (first emission or completion) or promise resolution is awaited before tracking call.\n */\n beforePageTrack(event: NavigationEnd): Observable<void> | Promise<void> | void;\n}\n\n/**\n * This is not an ideal implementation, because there exist no easy way to differentiate between a class constructor and a function.\n */\nfunction isInterceptorFn(\n interceptor: Type<MatomoRouterInterceptor> | MatomoRouterInterceptorFn,\n): interceptor is MatomoRouterInterceptorFn {\n return typeof interceptor.prototype?.beforePageTrack !== 'function';\n}\n\nclass InterceptorFnAdapter implements MatomoRouterInterceptor {\n constructor(\n private readonly fn: MatomoRouterInterceptorFn,\n private readonly injector: Injector,\n ) {}\n\n beforePageTrack(event: NavigationEnd): Observable<void> | Promise<void> | void {\n return runInInjectionContext(this.injector, () => this.fn(event));\n }\n}\n\nexport function provideInterceptor(\n typeOrFn: Type<MatomoRouterInterceptor> | MatomoRouterInterceptorFn,\n): Provider {\n if (isInterceptorFn(typeOrFn)) {\n return {\n provide: MATOMO_ROUTER_INTERCEPTORS,\n multi: true,\n useFactory: () => new InterceptorFnAdapter(typeOrFn, inject(INJECTOR)),\n };\n } else {\n return {\n provide: MATOMO_ROUTER_INTERCEPTORS,\n multi: true,\n useClass: typeOrFn,\n };\n }\n}\n\nexport function provideInterceptors(\n types: (Type<MatomoRouterInterceptor> | MatomoRouterInterceptorFn)[] | undefined,\n): Provider[] {\n if (!types) {\n return [];\n }\n\n return types.map(provideInterceptor);\n}\n","import { ActivatedRouteSnapshot } from '@angular/router';\n\nfunction findChildRoute(\n route: ActivatedRouteSnapshot,\n outlet: string,\n): ActivatedRouteSnapshot | undefined {\n return route.children.find(child => child.outlet === outlet);\n}\n\nexport function getLeafRoute(\n route: ActivatedRouteSnapshot,\n outlet: string,\n): ActivatedRouteSnapshot {\n const child = findChildRoute(route, outlet);\n\n return child ? getLeafRoute(child, outlet) : route;\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { MatomoRouterInterceptor } from '../interceptor';\nimport { getLeafRoute } from './route-utils';\n\n/**\n * Simple interceptor base looking into route's data for tracking\n *\n * @see MatomoRouteDataInterceptor\n */\nexport abstract class MatomoRouteInterceptorBase<D> implements MatomoRouterInterceptor {\n protected readonly router = inject(Router);\n\n beforePageTrack(event: NavigationEnd): Observable<void> | Promise<void> | void {\n const route = this.getRoute(event);\n const data = this.extractRouteData(route);\n\n return this.processRouteData(data);\n }\n\n protected getRoute(_: NavigationEnd): ActivatedRouteSnapshot {\n return getLeafRoute(this.router.routerState.snapshot.root, PRIMARY_OUTLET);\n }\n\n protected abstract extractRouteData(route: ActivatedRouteSnapshot): D;\n\n protected abstract processRouteData(data: D): Observable<void> | Promise<void> | void;\n}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { MatomoECommerceView, MatomoTracker } from 'ngx-matomo-client/core';\nimport { Observable } from 'rxjs';\nimport { MatomoRouteInterceptorBase } from './route-interceptor-base';\n\nexport const DEFAULT_DATA_KEY = 'matomo';\n\n/** Token to define the route's data key to be looked-up by `MatomoRouteDataInterceptor` */\nexport const MATOMO_ROUTE_DATA_KEY = new InjectionToken<string>('MATOMO_ROUTE_DATA_KEY', {\n providedIn: 'root',\n factory: () => DEFAULT_DATA_KEY,\n});\n\n/** Standard properties that may be read from route data */\nexport interface MatomoRouteData {\n title?: string;\n ecommerce?: MatomoECommerceView;\n}\n\n/**\n * Simple interceptor looking at 'matomo' key of route's data for tracking.\n *\n * It is possible to extend this class or {@link MatomoRouteInterceptorBase}\n * for custom behavior (to use another data key, etc.)\n *\n * @example\n * // Using provided MatomoRouteDataInterceptor (looks into 'matomo' data key)\n * const routes: Routes = [\n * {\n * path: '/hello',\n * component: HelloComponent,\n * data: {\n * matomo: {\n * title: 'Page title',\n * } as MatomoRouteData\n * }\n * },\n * ];\n *\n * NgxMatomoRouterModule.forRoot({\n * interceptors: [MatomoRouteDataInterceptor],\n * }),\n *\n * @example\n * // Using custom 'myCustomAnalyticsKey' data key\n * const routes: Routes = [\n * {\n * path: '/hello',\n * component: HelloComponent,\n * data: {\n * myCustomAnalyticsKey: {\n * title: 'Page title',\n * } as MatomoRouteData\n * }\n * },\n * ];\n *\n * @Injectable()\n * export class MyCustomInterceptor extends MatomoRouteDataInterceptor {\n * readonly dataKey = 'myCustomAnalyticsKey';\n * }\n *\n * NgxMatomoRouterModule.forRoot({\n * interceptors: [MyCustomInterceptor],\n * }),\n *\n * @see MatomoRouteInterceptorBase\n * @see MatomoRouteData\n */\n@Injectable()\nexport class MatomoRouteDataInterceptor extends MatomoRouteInterceptorBase<\n MatomoRouteData | undefined\n> {\n protected readonly tracker = inject(MatomoTracker);\n protected readonly dataKey = inject(MATOMO_ROUTE_DATA_KEY);\n\n protected extractRouteData(route: ActivatedRouteSnapshot): MatomoRouteData | undefined {\n return route.data[this.dataKey];\n }\n\n protected processRouteData(\n data: MatomoRouteData | undefined,\n ): Observable<void> | Promise<void> | void {\n if (!data) {\n return;\n }\n\n if (data.title) {\n this.tracker.setDocumentTitle(data.title);\n }\n\n if (data.ecommerce) {\n this.tracker.setEcommerceView(data.ecommerce);\n }\n }\n}\n","export const ROUTER_ALREADY_INITIALIZED_ERROR = 'MatomoRouter has already been initialized';\n\nexport function invalidInterceptorsProviderError(): Error {\n return new Error(\n 'An invalid MATOMO_ROUTER_INTERCEPTORS provider was configured. Did you forget to set \"multi: true\" ?',\n );\n}\n","import { Injectable, InjectionToken } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable, of } from 'rxjs';\n\n/**\n * @deprecated Use an interceptor calling `setDocumentTitle()` instead\n * @see MatomoRouterInterceptor\n * @see MATOMO_ROUTER_INTERCEPTORS\n */\nexport const MATOMO_PAGE_TITLE_PROVIDER = new InjectionToken<PageTitleProvider>(\n 'MATOMO_PAGE_TITLE_PROVIDER',\n);\n\n/**\n * @deprecated Use an interceptor calling `setDocumentTitle()` instead\n * @see MatomoRouterInterceptor\n * @see MATOMO_ROUTER_INTERCEPTORS\n */\nexport interface PageTitleProvider {\n getCurrentPageTitle(event: NavigationEnd): Observable<string>;\n}\n\n@Injectable()\nexport class DefaultPageTitleProvider implements PageTitleProvider {\n constructor(private readonly title: Title) {}\n\n getCurrentPageTitle(_: NavigationEnd): Observable<string> {\n return of(this.title.getTitle());\n }\n}\n","import { APP_BASE_HREF, LocationStrategy } from '@angular/common';\nimport {\n inject,\n InjectionToken,\n INJECTOR,\n Injector,\n Provider,\n runInInjectionContext,\n Type,\n} from '@angular/core';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { INTERNAL_ROUTER_CONFIGURATION, InternalRouterConfiguration } from './configuration';\n\nexport const MATOMO_PAGE_URL_PROVIDER = new InjectionToken<PageUrlProvider>(\n 'MATOMO_PAGE_URL_PROVIDER',\n);\n\nexport function createDefaultPageUrlProvider() {\n return new DefaultPageUrlProvider(\n inject(INTERNAL_ROUTER_CONFIGURATION),\n inject(APP_BASE_HREF, { optional: true }),\n inject(LocationStrategy),\n );\n}\n\nexport interface PageUrlProvider {\n getCurrentPageUrl(event: NavigationEnd): Observable<string> | Promise<string>;\n}\n\nexport type PageUrlProviderFn = (event: NavigationEnd) => Observable<string> | Promise<string>;\n\nfunction isPageUrlProviderFn(\n type: Type<PageUrlProvider> | PageUrlProviderFn,\n): type is PageUrlProviderFn {\n return typeof type.prototype?.getCurrentPageUrl !== 'function';\n}\n\nexport class PageUrlProviderFnAdapter implements PageUrlProvider {\n constructor(\n private readonly fn: PageUrlProviderFn,\n private readonly injector: Injector,\n ) {}\n\n getCurrentPageUrl(event: NavigationEnd): Observable<string> | Promise<string> {\n return runInInjectionContext(this.injector, () => this.fn(event));\n }\n}\n\nexport function providePageUrlProvider(\n typeOrFn: Type<PageUrlProvider> | PageUrlProviderFn,\n): Provider {\n if (isPageUrlProviderFn(typeOrFn)) {\n return {\n provide: MATOMO_PAGE_URL_PROVIDER,\n useFactory: () => new PageUrlProviderFnAdapter(typeOrFn, inject(INJECTOR)),\n };\n } else {\n return {\n provide: MATOMO_PAGE_URL_PROVIDER,\n useClass: typeOrFn,\n };\n }\n}\n\nfunction trimTrailingSlash(str: string): string {\n return str.endsWith('/') ? str.slice(0, -1) : str;\n}\n\nexport class DefaultPageUrlProvider implements PageUrlProvider {\n constructor(\n private readonly config: InternalRouterConfiguration,\n private readonly baseHref: string | null,\n private readonly locationStrategy: LocationStrategy,\n ) {}\n\n getCurrentPageUrl(event: NavigationEnd): Observable<string> {\n const url = this.config.prependBaseHref\n ? this.getBaseHrefWithoutTrailingSlash() + event.urlAfterRedirects\n : event.urlAfterRedirects;\n\n return of(url);\n }\n\n private getBaseHrefWithoutTrailingSlash(): string {\n return trimTrailingSlash(this.baseHref ?? this.locationStrategy.getBaseHref() ?? '');\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';\nimport { Event, NavigationEnd, Router } from '@angular/router';\nimport { MatomoTracker, ɵrunOnce as runOnce } from 'ngx-matomo-client/core';\nimport {\n combineLatest,\n forkJoin,\n from,\n identity,\n MonoTypeOperatorFunction,\n Observable,\n of,\n} from 'rxjs';\nimport {\n concatMap,\n defaultIfEmpty,\n delay,\n distinctUntilChanged,\n filter,\n map,\n mapTo,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\nimport {\n ExclusionConfig,\n INTERNAL_ROUTER_CONFIGURATION,\n InternalRouterConfiguration,\n NavigationEndComparator,\n} from './configuration';\nimport { invalidInterceptorsProviderError, ROUTER_ALREADY_INITIALIZED_ERROR } from './errors';\nimport { MATOMO_ROUTER_INTERCEPTORS, MatomoRouterInterceptor } from './interceptor';\nimport { MATOMO_PAGE_TITLE_PROVIDER, PageTitleProvider } from './page-title-providers';\nimport { MATOMO_PAGE_URL_PROVIDER, PageUrlProvider } from './page-url-provider';\n\nfunction isNavigationEnd(event: Event): event is NavigationEnd {\n return event instanceof NavigationEnd;\n}\n\nfunction coerceRegExp(input: string | RegExp): RegExp {\n return typeof input === 'string' ? new RegExp(input) : input;\n}\n\nfunction coerceRegExpArray(input: ExclusionConfig | null | undefined): RegExp[] {\n if (!input) {\n return [];\n }\n\n return Array.isArray(input) ? input.map(coerceRegExp) : [coerceRegExp(input)];\n}\n\nfunction isNotExcluded(excludeConfig: ExclusionConfig): (event: NavigationEnd) => boolean {\n const exclusions = coerceRegExpArray(excludeConfig);\n\n return (event: NavigationEnd) => !exclusions.some(rx => event.urlAfterRedirects.match(rx));\n}\n\nfunction stripQueryParams(url: string): string {\n return url.split('?')[0];\n}\n\nfunction defaultNavigationEndComparator(urlExtractor: (event: NavigationEnd) => string) {\n return (eventA: NavigationEnd, eventB: NavigationEnd) =>\n urlExtractor(eventA) === urlExtractor(eventB);\n}\n\nfunction getNavigationEndComparator(config: InternalRouterConfiguration): NavigationEndComparator {\n switch (config.navigationEndComparator) {\n case 'fullUrl':\n return defaultNavigationEndComparator(event => event.urlAfterRedirects);\n case 'ignoreQueryParams':\n return defaultNavigationEndComparator(event => stripQueryParams(event.urlAfterRedirects));\n default:\n return config.navigationEndComparator;\n }\n}\n\n@Injectable()\nexport class MatomoRouter {\n constructor(\n private readonly router: Router,\n @Inject(PLATFORM_ID)\n private readonly platformId: object,\n @Inject(INTERNAL_ROUTER_CONFIGURATION)\n private readonly config: InternalRouterConfiguration,\n @Inject(MATOMO_PAGE_TITLE_PROVIDER)\n private readonly pageTitleProvider: PageTitleProvider,\n @Inject(MATOMO_PAGE_URL_PROVIDER)\n private readonly pageUrlProvider: PageUrlProvider,\n private readonly tracker: MatomoTracker,\n @Optional()\n @Inject(MATOMO_ROUTER_INTERCEPTORS)\n private readonly interceptors: MatomoRouterInterceptor[] | null,\n ) {\n if (interceptors && !Array.isArray(interceptors)) {\n throw invalidInterceptorsProviderError();\n }\n }\n\n /** @deprecated use {@link initialize initialize()} instead */\n init(): void {\n this.initialize();\n }\n\n readonly initialize = runOnce(() => {\n if (this.config.disabled || !isPlatformBrowser(this.platformId)) {\n // Do not set-up router if globally disabled or running on server\n return;\n }\n\n const delayOp: MonoTypeOperatorFunction<NavigationEnd> =\n this.config.delay === -1 ? identity : delay(this.config.delay);\n const navigationEndComparator = getNavigationEndComparator(this.config);\n\n this.router.events\n .pipe(\n // Take only NavigationEnd events\n filter(isNavigationEnd),\n // Filter out excluded urls\n filter(isNotExcluded(this.config.exclude)),\n // Filter out NavigationEnd events to ignore, e.g. when url does not actually change (component reload)\n distinctUntilChanged(navigationEndComparator),\n // Optionally add some delay\n delayOp,\n // Set default page title & url\n switchMap(event =>\n this.presetPageTitleAndUrl(event).pipe(map(({ pageUrl }) => ({ pageUrl, event }))),\n ),\n // Run interceptors then track page view\n concatMap(({ event, pageUrl }) =>\n this.callInterceptors(event).pipe(tap(() => this.trackPageView(pageUrl))),\n ),\n )\n .subscribe();\n }, ROUTER_ALREADY_INITIALIZED_ERROR);\n\n private callInterceptors(event: NavigationEnd): Observable<void> {\n if (this.interceptors) {\n return forkJoin(\n this.interceptors.map(interceptor => {\n const result = interceptor.beforePageTrack(event);\n const result$ = result == null ? of(undefined) : from(result);\n\n // Must not be an empty observable (otherwise forkJoin would complete without waiting others)\n return result$.pipe(take(1), defaultIfEmpty(undefined as void));\n }),\n ).pipe(mapTo(undefined), defaultIfEmpty(undefined as void));\n } else {\n return of(undefined);\n }\n }\n\n private presetPageTitleAndUrl(event: NavigationEnd): Observable<{ pageUrl: string }> {\n const title$ = this.config.trackPageTitle\n ? this.pageTitleProvider\n .getCurrentPageTitle(event)\n .pipe(tap(pageTitle => this.tracker.setDocumentTitle(pageTitle)))\n : of(undefined);\n const url$ = from(this.pageUrlProvider.getCurrentPageUrl(event)).pipe(\n tap(pageUrl => this.tracker.setCustomUrl(pageUrl)),\n );\n\n return combineLatest([title$, url$]).pipe(map(([_, pageUrl]) => ({ pageUrl })));\n }\n\n private trackPageView(pageUrl: string): void {\n this.tracker.trackPageView();\n\n if (this.config.enableLinkTracking) {\n this.tracker.enableLinkTracking(this.config.enableLinkTracking === 'enable-pseudo');\n }\n\n // Set referrer for next page view\n this.tracker.setReferrerUrl(pageUrl);\n }\n}\n","import { ENVIRONMENT_INITIALIZER, inject, Provider, Type } from '@angular/core';\nimport {\n MatomoFeature as MatomoFeature,\n MatomoFeatureKind,\n ɵcreateMatomoFeature as createMatomoFeature,\n ɵMATOMO_ROUTER_ENABLED as MATOMO_ROUTER_ENABLED,\n} from 'ngx-matomo-client/core';\nimport {\n createInternalRouterConfiguration,\n INTERNAL_ROUTER_CONFIGURATION,\n MATOMO_ROUTER_CONFIGURATION,\n MatomoRouterConfiguration,\n} from './configuration';\nimport {\n MatomoRouterInterceptor,\n MatomoRouterInterceptorFn,\n provideInterceptor,\n provideInterceptors,\n} from './interceptor';\nimport {\n MATOMO_ROUTE_DATA_KEY,\n MatomoRouteDataInterceptor,\n} from './interceptors/route-data-interceptor';\nimport { MatomoRouter } from './matomo-router.service';\nimport { DefaultPageTitleProvider, MATOMO_PAGE_TITLE_PROVIDER } from './page-title-providers';\nimport {\n createDefaultPageUrlProvider,\n MATOMO_PAGE_URL_PROVIDER,\n PageUrlProvider,\n PageUrlProviderFn,\n providePageUrlProvider,\n} from './page-url-provider';\n\n/**\n * Additional Matomo router features kind\n */\nexport const enum RouterMatomoFeatureKind {\n /** @see withRouter */\n Router = 'Router',\n /** @see withRouterInterceptors */\n RouterInterceptors = 'RouterInterceptors',\n /** @see withRouteData */\n BuiltInRouteDataInterceptor = 'BuiltInRouteDataInterceptor',\n PageUrlProvider = 'PageUrlProvider',\n}\n\n/** Enable automatic page views tracking */\nexport function withRouter(config?: MatomoRouterConfiguration): MatomoFeature {\n const providers = buildInternalRouterProviders(config);\n\n return createMatomoFeature(RouterMatomoFeatureKind.Router, providers);\n}\n\nexport function buildInternalRouterProviders(config?: MatomoRouterConfiguration): Provider[] {\n return [\n MatomoRouter,\n { provide: MATOMO_ROUTER_ENABLED, useValue: true },\n { provide: MATOMO_ROUTER_CONFIGURATION, useValue: config },\n {\n provide: INTERNAL_ROUTER_CONFIGURATION,\n useFactory: createInternalRouterConfiguration,\n },\n {\n provide: MATOMO_PAGE_URL_PROVIDER,\n useFactory: createDefaultPageUrlProvider,\n },\n {\n provide: MATOMO_PAGE_TITLE_PROVIDER,\n useClass: DefaultPageTitleProvider,\n },\n MatomoRouter,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue() {\n inject(MatomoRouter).initialize();\n },\n },\n ];\n}\n\nfunction requireRouterFeature(featureName: string) {\n return (featuresKind: MatomoFeatureKind[]) => {\n if (!featuresKind.includes(RouterMatomoFeatureKind.Router)) {\n throw new Error(\n `Matomo feature ${featureName} cannot be used without router feature! Did you forget to call withRouter()?`,\n );\n }\n };\n}\n\n/** Add some matomo router interceptors */\nexport function withRouterInterceptors(\n interceptors: (Type<MatomoRouterInterceptor> | MatomoRouterInterceptorFn)[],\n): MatomoFeature {\n return createMatomoFeature(\n RouterMatomoFeatureKind.RouterInterceptors,\n provideInterceptors(interceptors),\n requireRouterFeature('withRouterInterceptors()'),\n );\n}\n\n/**\n * Enable retrieval of tracking information from route data\n *\n * @see MatomoRouteData\n * @param key A custom key to get lookup route data - default is 'matomo'\n */\nexport function withRouteData(key?: string): MatomoFeature {\n const providers: Provider[] = [provideInterceptor(MatomoRouteDataInterceptor)];\n\n if (key) {\n providers.push({ provide: MATOMO_ROUTE_DATA_KEY, useValue: key });\n }\n\n return createMatomoFeature(\n RouterMatomoFeatureKind.BuiltInRouteDataInterceptor,\n providers,\n requireRouterFeature('withRouteData()'),\n );\n}\n\nexport function withPageUrlProvider(\n provider: Type<PageUrlProvider> | PageUrlProviderFn,\n): MatomoFeature {\n return createMatomoFeature(\n RouterMatomoFeatureKind.PageUrlProvider,\n [providePageUrlProvider(provider)],\n requireRouterFeature('withPageUrlProvider()'),\n );\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { ɵMATOMO_ROUTER_ENABLED as MATOMO_ROUTER_ENABLED } from 'ngx-matomo-client/core';\nimport { MatomoRouterConfigurationWithInterceptors } from './configuration';\nimport { provideInterceptors } from './interceptor';\nimport { buildInternalRouterProviders } from './providers';\n\n@NgModule({\n providers: [{ provide: MATOMO_ROUTER_ENABLED, useValue: true }],\n})\nexport class MatomoRouterModule {\n static forRoot(\n configWithInterceptors: MatomoRouterConfigurationWithInterceptors = {},\n ): ModuleWithProviders<MatomoRouterModule> {\n // Note: not using \"rest\" syntax here, in order to avoid any dependency on tslib (and reduce package size)\n // The only drawback of this is that MATOMO_ROUTER_CONFIGURATION will actually\n // contain a reference to provided interceptors\n return {\n ngModule: MatomoRouterModule,\n providers: [\n buildInternalRouterProviders(configWithInterceptors),\n provideInterceptors(configWithInterceptors.interceptors),\n ],\n };\n }\n}\n\n/**\n * @deprecated use MatomoRouterModule instead\n * @breaking-change 8.0.0\n */\n@NgModule({\n providers: [{ provide: MATOMO_ROUTER_ENABLED, useValue: true }],\n})\nexport class NgxMatomoRouterModule {\n static forRoot(\n configWithInterceptors: MatomoRouterConfigurationWithInterceptors = {},\n ): ModuleWithProviders<NgxMatomoRouterModule> {\n // Note: not using \"rest\" syntax here, in order to avoid any dependency on tslib (and reduce package size)\n // The only drawback of this is that MATOMO_ROUTER_CONFIGURATION will actually\n // contain a reference to provided interceptors\n return {\n ngModule: NgxMatomoRouterModule,\n providers: [\n buildInternalRouterProviders(configWithInterceptors),\n provideInterceptors(configWithInterceptors.interceptors),\n ],\n };\n }\n}\n","/*\n * Public API Surface of tracker\n */\n\nexport {\n withRouter,\n withRouterInterceptors,\n withRouteData,\n withPageUrlProvider,\n} from './providers';\nexport { MatomoRouterModule, NgxMatomoRouterModule } from './matomo-router.module';\nexport {\n MatomoRouterConfiguration,\n MATOMO_ROUTER_CONFIGURATION,\n ExclusionConfig,\n MatomoRouterConfigurationWithInterceptors,\n NavigationEndComparator,\n} from './configuration';\nexport { PageTitleProvider, MATOMO_PAGE_TITLE_PROVIDER } from './page-title-providers';\nexport {\n PageUrlProvider,\n MATOMO_PAGE_URL_PROVIDER,\n PageUrlProviderFn,\n providePageUrlProvider,\n} from './page-url-provider';\nexport {\n MatomoRouterInterceptor,\n MatomoRouterInterceptorFn,\n MATOMO_ROUTER_INTERCEPTORS,\n provideInterceptor,\n provideInterceptors,\n} from './interceptor';\nexport { MatomoRouteInterceptorBase } from './interceptors/route-interceptor-base';\nexport {\n MatomoRouteData,\n MatomoRouteDataInterceptor,\n MATOMO_ROUTE_DATA_KEY,\n} from './interceptors/route-data-interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["INTERNAL_MATOMO_CONFIGURATION","runOnce","i1","createMatomoFeature","MATOMO_ROUTER_ENABLED"],"mappings":"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"}