{"version":3,"file":"ngx-foresight.mjs","sources":["../../../projects/ngx-foresight/src/lib/prefetch-registry.service.ts","../../../projects/ngx-foresight/src/lib/foresightjs.directive.ts","../../../projects/ngx-foresight/src/lib/utils/find-path.ts","../../../projects/ngx-foresight/src/lib/foresightjsStrategy.ts","../../../projects/ngx-foresight/src/public-api.ts","../../../projects/ngx-foresight/src/ngx-foresight.ts"],"sourcesContent":["import {\n  Router,\n  UrlTree,\n  Params,\n  UrlSegmentGroup,\n  UrlSegment,\n  PRIMARY_OUTLET,\n} from '@angular/router';\nimport { Injectable } from '@angular/core';\n\n// Using a global registry so we can keep it populated across lazy-loaded\n// modules with different parent injectors which create instance of the registry.\nconst globalRegistry: UrlTree[] = [];\n\n@Injectable({ providedIn: 'root' })\nexport class PrefetchRegistry {\n  private trees: UrlTree[] = globalRegistry;\n  constructor(private router: Router) {}\n\n  add(tree: UrlTree) {\n    this.trees.push(tree);\n  }\n\n  shouldPrefetch(url: string) {\n    const tree = this.router.parseUrl(url);\n    return this.trees.some(containsTree.bind(null, tree));\n  }\n}\n\nfunction containsQueryParams(container: Params, containee: Params): boolean {\n  // TODO: This does not handle array params correctly.\n  return (\n    Object.keys(containee).length <= Object.keys(container).length &&\n    Object.keys(containee).every((key) => containee[key] === container[key])\n  );\n}\n\nexport function containsTree(containee: UrlTree, container: UrlTree): boolean {\n  return (\n    containsQueryParams(container.queryParams, containee.queryParams) &&\n    containsSegmentGroup(\n      container.root,\n      containee.root,\n      containee.root.segments\n    )\n  );\n}\n\nfunction containsSegmentGroup(\n  container: UrlSegmentGroup,\n  containee: UrlSegmentGroup,\n  containeePaths: UrlSegment[]\n): boolean {\n  if (container.segments.length > containeePaths.length) {\n    const current = container.segments.slice(0, containeePaths.length);\n    if (!equalPath(current, containeePaths)) return false;\n    if (containee.hasChildren()) return false;\n    return true;\n  } else if (container.segments.length === containeePaths.length) {\n    if (!equalPath(container.segments, containeePaths)) return false;\n    if (!containee.hasChildren()) return true;\n\n    for (const c in containee.children) {\n      if (!container.children[c]) break;\n      if (\n        containsSegmentGroup(\n          container.children[c],\n          containee.children[c],\n          containee.children[c].segments\n        )\n      )\n        return true;\n    }\n    return false;\n  } else {\n    const current = containeePaths.slice(0, container.segments.length);\n    const next = containeePaths.slice(container.segments.length);\n    if (!equalPath(container.segments, current)) return false;\n    if (!container.children[PRIMARY_OUTLET]) return false;\n    return containsSegmentGroup(\n      container.children[PRIMARY_OUTLET],\n      containee,\n      next\n    );\n  }\n}\n\nexport function equalPath(as: UrlSegment[], bs: UrlSegment[]): boolean {\n  if (as.length !== bs.length) return false;\n  return as.every(\n    (a, i) =>\n      a.path === bs[i].path ||\n      a.path.startsWith(':') ||\n      bs[i].path.startsWith(':')\n  );\n}\n","import { Directive, ElementRef, inject, Input } from '@angular/core';\nimport { Router, RouterPreloader } from '@angular/router';\nimport { ForesightManager } from 'js.foresight';\nimport { PrefetchRegistry } from './prefetch-registry.service';\n\n@Directive({\n  selector: '[foresightjs],[registerForesight]',\n  standalone: true,\n})\nexport class ForesightjsDirective {\n  router = inject(Router);\n  registry = inject(PrefetchRegistry);\n  preloader = inject(RouterPreloader);\n  @Input() routerLink: string = '';\n  @Input() href: string = '';\n  @Input('registerForesight') name: string | undefined = undefined;\n\n  private unregisterRef: () => void = () => {};\n\n  constructor(private elementRef: ElementRef) {}\n\n  ngOnInit() {\n    const { unregister } = ForesightManager.instance.register({\n      element: this.elementRef.nativeElement,\n      name: this.name,\n      callback: () => {\n        if (!this.routerLink && !this.href) {\n          return;\n        }\n        const tree = this.router.parseUrl(this.routerLink || this.href);\n        this.registry.add(tree);\n        this.preloader.preload().subscribe(() => void 0);\n      },\n    });\n    this.unregisterRef = unregister;\n  }\n\n  ngOnDestroy() {\n    this.unregisterRef();\n  }\n}\n","import { PRIMARY_OUTLET, Route } from '@angular/router';\n\nexport const findPath = (config: Route[], route: Route): string => {\n  config = config.slice();\n  const parent = new Map<Route, Route>();\n  const visited = new Set<Route>();\n  while (config.length) {\n    const el = config.shift();\n    if (!el) {\n      continue;\n    }\n    visited.add(el);\n    if (el === route) break;\n    let children = el.children || [];\n    const current = (el as any)._loadedRoutes || [];\n    for (const route of current) {\n      if (route && route.children) {\n        children = children.concat(route.children);\n      }\n    }\n    children.forEach((r: Route) => {\n      if (visited.has(r)) return;\n      parent.set(r, el);\n      config.push(r);\n    });\n  }\n  let path = '';\n  let current: Route | undefined = route;\n\n  while (current) {\n    if (isPrimaryRoute(current)) {\n      path = `/${current.path}${path}`;\n    } else {\n      path = `/(${current.outlet}:${current.path}${path})`;\n    }\n    current = parent.get(current);\n  }\n\n  // For routes with empty paths (the resulted string will look like `///section/sub-section`)\n  return path.replace(/[\\/]+/, '/');\n};\n\nfunction isPrimaryRoute(route: Route) {\n  return route.outlet === PRIMARY_OUTLET || !route.outlet;\n}\n","import { Injectable } from '@angular/core';\nimport { PreloadingStrategy, Route, Router } from '@angular/router';\nimport { EMPTY } from 'rxjs';\nimport { findPath } from './utils/find-path';\nimport { PrefetchRegistry } from './prefetch-registry.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ForesightjsStrategy implements PreloadingStrategy {\n  loading = new Set<Route>();\n\n  constructor(private registry: PrefetchRegistry, private router: Router) {}\n\n  preload(route: Route, load: Function) {\n    if (this.loading.has(route)) {\n      // Don't preload the same route twice\n      return EMPTY;\n    }\n\n    // Prevent from preloading\n    if (route.data && route.data['preload'] === false) {\n      return EMPTY;\n    }\n    const fullPath = findPath(this.router.config, route);\n    if (this.registry.shouldPrefetch(fullPath)) {\n      this.loading.add(route);\n      return load();\n    }\n\n    return EMPTY;\n  }\n}\n","/*\n * Public API Surface of ngx-foresight\n */\n\nexport * from './lib/foresightjs.directive';\nexport * from './lib/foresightjsStrategy';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PrefetchRegistry","i2"],"mappings":"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"}