{"version":3,"file":"berglund-firebase.mjs","sources":["../../../projects/firebase/src/util/url-util.ts","../../../projects/firebase/src/core/cache/session-cache.ts","../../../projects/firebase/src/core/cache/local-storage-cache.ts","../../../projects/firebase/src/core/realtime-database/crud-api.ts","../../../projects/firebase/src/components/displays-entity.ts","../../../projects/firebase/src/core/seo/seo-model.ts","../../../projects/firebase/src/core/seo/seo.service.ts","../../../projects/firebase/src/berglund-firebase.ts"],"sourcesContent":["export function toUrl(paths: string[], withLeadingSlash?: boolean): string {\n  return [...(withLeadingSlash ? [''] : []), ...paths].join('/');\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class SessionCache<K = any, V = any> {\n  private map = new Map<K, Observable<V>>();\n\n  get(key: K, fallback: () => Observable<V>): Observable<V> {\n    const mapValue = this.map.get(key);\n\n    if (mapValue) {\n      return mapValue;\n    } else {\n      const cached$ = fallback().pipe(shareReplay(1));\n      this.map.set(key, cached$);\n      return cached$;\n    }\n  }\n\n  remove(key: K): void {\n    this.map.delete(key);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { shareReplay, tap } from 'rxjs/operators';\nimport { CacheStrategy } from './cache-model';\nimport { SessionCache } from './session-cache';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalStorageCache {\n  constructor(private sessionCache: SessionCache) {}\n\n  get<T>(\n    key: string,\n    fallbackApi: Observable<T>,\n    cacheStrategy: CacheStrategy = 'persistent'\n  ): Observable<T> {\n    return this.sessionCache.get(\n      key,\n      cacheStrategy === 'persistent'\n        ? () => this.getFromLocalStorage(key, fallbackApi)\n        : () => fallbackApi\n    );\n  }\n\n  remove(key: string): void {\n    this.sessionCache.remove(key);\n    localStorage.removeItem(key);\n  }\n\n  private getFromLocalStorage<T>(\n    key: string,\n    fallbackApi: Observable<T>\n  ): Observable<T> {\n    try {\n      return this.readLocalStorage(key, fallbackApi);\n    } catch {\n      return fallbackApi;\n    }\n  }\n\n  private readLocalStorage<T>(key: string, fallbackApi: Observable<T>) {\n    const stringFromLocalStorage = localStorage.getItem(key);\n    const fromLocalStorage = stringFromLocalStorage\n      ? (JSON.parse(stringFromLocalStorage) as T)\n      : null;\n\n    if (fromLocalStorage) {\n      return of(fromLocalStorage).pipe(shareReplay(1));\n    } else {\n      return fallbackApi.pipe(\n        tap((response) => {\n          if (response && (!Array.isArray(response) || response.length > 0)) {\n            localStorage.setItem(key, JSON.stringify(response));\n          }\n        })\n      );\n    }\n  }\n}\n","import { Injector } from '@angular/core';\r\nimport { AngularFireDatabase } from '@angular/fire/compat/database';\r\nimport firebase from 'firebase/compat/app';\r\nimport { combineLatest, from, Observable, of } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\nimport { Entity } from '../../model/entity-model';\r\nimport { Flatten } from '../../util/type-util';\r\nimport { toUrl } from '../../util/url-util';\r\nimport { CacheStrategy, LocalStorageCache } from '../cache';\r\n\r\nexport class CrudApi<T extends Entity> {\r\n  afd = this.injector.get(AngularFireDatabase);\r\n  cache = this.injector.get(LocalStorageCache);\r\n\r\n  constructor(\r\n    protected injector: Injector,\r\n    protected path: string,\r\n    protected cacheStrategy: CacheStrategy = 'persistent'\r\n  ) {}\r\n\r\n  get(id: string): Observable<T | null> {\r\n    return this.cache.get(\r\n      this.getPath(id),\r\n      this.afd.object<T>(this.getPath(id)).valueChanges(),\r\n      this.cacheStrategy\r\n    );\r\n  }\r\n\r\n  getMany(ids: string[]): Observable<T[]> {\r\n    if (ids.length === 0) {\r\n      return of([]);\r\n    }\r\n\r\n    return combineLatest(ids.map((id) => this.get(id))).pipe(\r\n      map((entities) => {\r\n        return entities.filter((entity): entity is T => entity !== null);\r\n      })\r\n    );\r\n  }\r\n\r\n  push(value: T): string {\r\n    const id = value.id || this.afd.createPushId();\r\n\r\n    void this.afd.object<T>(this.getPath(id)).set({\r\n      ...value,\r\n      id: id,\r\n    });\r\n\r\n    return id;\r\n  }\r\n\r\n  createPushId(): string {\r\n    return this.afd.createPushId();\r\n  }\r\n\r\n  getRecord(): Observable<Record<string, T> | null> {\r\n    return this.cache.get(\r\n      this.path,\r\n      this.afd.object<Record<string, T>>(this.path).valueChanges(),\r\n      this.cacheStrategy\r\n    );\r\n  }\r\n\r\n  getAll(): Observable<T[] | null> {\r\n    return this.getRecord().pipe(\r\n      map((record) => (record ? Object.values(record) : []))\r\n    );\r\n  }\r\n\r\n  getPage(\r\n    limit: number,\r\n    startAtId?: string,\r\n    queryFn?: (query: firebase.database.Query) => firebase.database.Query\r\n  ): Observable<T[]> {\r\n    return this.afd\r\n      .list<T>(this.path, (ref) => {\r\n        const query = queryFn ? queryFn(ref) : ref.orderByKey();\r\n        return startAtId === undefined\r\n          ? query.limitToLast(limit)\r\n          : query.endBefore(startAtId).limitToLast(limit);\r\n      })\r\n      .valueChanges()\r\n      .pipe(map((posts) => posts.reverse()));\r\n  }\r\n\r\n  getProperty<K1 extends keyof T>(\r\n    id: string,\r\n    property: K1\r\n  ): Observable<T[K1] | null>;\r\n  getProperty<K1 extends keyof T, K2 extends keyof T[K1]>(\r\n    id: string,\r\n    k1: K1,\r\n    k2: K2\r\n  ): Observable<T[K1][K2] | null>;\r\n  getProperty(id: string, ...properties: (keyof T)[]): any {\r\n    return this.cache.get(\r\n      this.getPropertyPath(id, ...properties),\r\n      this.afd.object(this.getPropertyPath(id, ...properties)).valueChanges(),\r\n      this.cacheStrategy\r\n    );\r\n  }\r\n\r\n  setProperty<K1 extends keyof T>(\r\n    value: T[K1],\r\n    id: string,\r\n    property: K1\r\n  ): Observable<void>;\r\n  setProperty<K1 extends keyof T, K2 extends keyof T[K1]>(\r\n    value: T[K1][K2],\r\n    id: string,\r\n    property: K1,\r\n    propertyId: K2\r\n  ): Observable<void>;\r\n  setProperty(\r\n    value: any,\r\n    id: string,\r\n    ...properties: (keyof T)[]\r\n  ): Observable<void> {\r\n    return from(\r\n      this.afd.object(this.getPropertyPath(id, ...properties)).set(value)\r\n    );\r\n  }\r\n\r\n  removeProperty<K1 extends keyof T>(\r\n    id: string,\r\n    property: K1\r\n  ): Observable<void>;\r\n  removeProperty<K1 extends keyof T, K2 extends keyof T[K1]>(\r\n    id: string,\r\n    property: K1,\r\n    propertyId: K2\r\n  ): Observable<void>;\r\n  removeProperty(id: string, ...properties: (keyof T)[]): Observable<void> {\r\n    const path = this.getPropertyPath(id, ...properties);\r\n    this.cache.remove(path);\r\n    return from(this.afd.object(path).remove());\r\n  }\r\n\r\n  pushProperty<K extends keyof T>(\r\n    value: Flatten<T[K]>,\r\n    id: string,\r\n    property: K\r\n  ): Observable<string> {\r\n    const promise: firebase.database.ThenableReference = this.afd\r\n      .list<Flatten<T[K]>>(this.getPropertyPath(id, property))\r\n      .push(value);\r\n\r\n    return from(promise).pipe(\r\n      filter(\r\n        (\r\n          reference\r\n        ): reference is firebase.database.Reference & { key: string } => {\r\n          return reference.key !== null;\r\n        }\r\n      ),\r\n      map((reference) => {\r\n        return toUrl([this.getPropertyPath(id, property), reference.key]);\r\n      })\r\n    );\r\n  }\r\n\r\n  update(id: string, entity: Partial<T>): Observable<void> {\r\n    return from(this.afd.object<T>(this.getPath(id)).update(entity));\r\n  }\r\n\r\n  set(id: string, entity: T): Observable<void> {\r\n    return from(this.afd.object<T>(this.getPath(id)).set({ ...entity, id }));\r\n  }\r\n\r\n  delete(id: string): Observable<void> {\r\n    return from(this.afd.object<T>(this.getPath(id)).remove());\r\n  }\r\n\r\n  protected getPath(id: string): string {\r\n    return toUrl([this.path, id]);\r\n  }\r\n\r\n  protected getPropertyPath(id: string, ...properties: (keyof T)[]): string {\r\n    return toUrl([this.getPath(id), ...(properties as string[])]);\r\n  }\r\n}\r\n","import { Directive, Input, OnDestroy } from '@angular/core';\nimport { Observable, race, ReplaySubject, Subject } from 'rxjs';\nimport { filter, map, pluck, switchMap } from 'rxjs/operators';\nimport { CrudApi } from '../core/realtime-database/crud-api';\nimport { Entity } from '../model/entity-model';\n\n@Directive()\nexport class DisplaysEntity<T extends Entity> implements OnDestroy {\n  @Input()\n  set id(value: string | null) {\n    if (value) {\n      this.idSub.next(value);\n    }\n  }\n  private idSub = new ReplaySubject<string>(1);\n\n  @Input()\n  set entity(value: T | null) {\n    if (value !== null) {\n      this.entitySub.next(value);\n    }\n  }\n  private entitySub = new ReplaySubject<T>(1);\n\n  entity$: Observable<T> = race(\n    this.entitySub.asObservable(),\n    this.idSub.pipe(switchMap((id) => this.apiService.get(id)))\n  ).pipe(filter((entity): entity is T => entity !== null));\n\n  id$: Observable<string> = race(\n    this.idSub.asObservable(),\n    this.entitySub.pipe(\n      map((entity) => entity.id),\n      filter((id): id is string => id !== undefined)\n    )\n  );\n\n  protected destroySub = new Subject<void>();\n\n  constructor(protected apiService: CrudApi<T>) {}\n\n  pluck<K extends keyof T>(key: K): Observable<T[K]> {\n    return this.entity$.pipe(\n      pluck(key),\n      filter((property) => property !== undefined && property !== null)\n    );\n  }\n\n  ngOnDestroy(): void {\n    this.destroySub.next();\n    this.destroySub.complete();\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface SeoTag {\n  title: string;\n  name: string;\n  description: string;\n  image: string;\n  slug?: string;\n}\n\nexport const SEO_TAG_DEFAULT = new InjectionToken<SeoTag>('SEO_TAG_DEFAULT');\nexport const SEO_URL = new InjectionToken<string>('SEO_TAG_URL');\nexport const SEO_CONTENT = new InjectionToken<string>('SEO_CONTENT');\n","import { Inject, Injectable } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { SeoTag, SEO_CONTENT, SEO_TAG_DEFAULT, SEO_URL } from './seo-model';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SeoService {\n  constructor(\n    private metaService: Meta,\n    private titleService: Title,\n    @Inject(SEO_TAG_DEFAULT) private defaultSeoTag: SeoTag,\n    @Inject(SEO_URL) private url: string,\n    @Inject(SEO_CONTENT) private content: string\n  ) {}\n\n  setTags(partialTag: Partial<SeoTag>) {\n    const tag = { ...this.defaultSeoTag, ...partialTag };\n\n    this.titleService.setTitle(tag.title);\n\n    const twitterTags = [\n      { property: 'twitter:card', content: tag.description },\n      { property: 'twitter:title', content: tag.title },\n      { property: 'twitter:description', content: tag.description },\n      { property: 'twitter:image', content: tag.image },\n    ];\n\n    const ogTags = [\n      { property: 'og:type', content: '' },\n      { property: 'og:title', content: tag.title },\n      { property: 'og:site_name', content: tag.name },\n      { property: 'og:description', content: tag.description },\n      { property: 'og:image', content: tag.image },\n      { property: 'og:url', content: this.url },\n    ];\n\n    const vanillaTags = [\n      { name: 'description', content: tag.description },\n      {\n        name: 'keywords',\n        content: this.content,\n      },\n    ];\n\n    [...twitterTags, ...ogTags, ...vanillaTags].forEach((tag) =>\n      this.metaService.updateTag(tag)\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}