{"version":3,"file":"index.esm.mjs","sources":["../src/misc/arrayHelpers.ts","../src/misc/objectFlatten.ts","../src/misc/logger/logger-base.ts","../src/misc/logger/firestore-logger.ts","../src/misc/logger/logger.ts","../src/misc/dispatcher.ts","../src/misc/internal.models.ts","../src/misc/translate-from-firestore.ts","../src/misc/document-parser.ts","../src/misc/pathHelper.ts","../src/misc/translate-to-firestore.ts","../src/providers/database/firebase/FirebaseWrapper.ts","../src/providers/AuthProvider.ts","../src/misc/status-code-translator.ts","../src/providers/commands/Create.ts","../src/providers/commands/Delete.ts","../src/providers/commands/Delete.Soft.ts","../src/providers/commands/DeleteMany.ts","../src/providers/commands/DeleteMany.Soft.ts","../src/providers/commands/Update.ts","../src/providers/commands/UpdateMany.ts","../src/providers/database/ResourceManager.ts","../src/providers/database/FireClient.ts","../src/misc/storage-parser.ts","../src/misc/metadata-parser.ts","../src/misc/firebase-models.ts","../src/providers/lazy-loading/queryCursors.ts","../src/providers/lazy-loading/paramsToQuery.ts","../src/providers/lazy-loading/FirebaseLazyLoadingClient.ts","../src/providers/queries/GetList.ts","../src/providers/queries/GetMany.ts","../src/providers/queries/GetManyReference.ts","../src/providers/queries/GetOne.ts","../src/providers/DataProvider.ts"],"sourcesContent":["import { get, isEmpty } from 'lodash';\nimport { getFieldReferences, SearchObj } from './objectFlatten';\n\nexport function sortArray(\n  data: Array<{}>,\n  field: string,\n  dir: 'asc' | 'desc'\n): void {\n  data.sort((a: {}, b: {}) => {\n    const rawA = get(a, field);\n    const rawB = get(b, field);\n    const isAsc = dir === 'asc';\n\n    const isNumberField = Number.isFinite(rawA) && Number.isFinite(rawB);\n    if (isNumberField) {\n      return basicSort(rawA, rawB, isAsc);\n    }\n    const isStringField = typeof rawA === 'string' && typeof rawB === 'string';\n    if (isStringField) {\n      const aParsed = rawA.toLowerCase();\n      const bParsed = rawB.toLowerCase();\n      return basicSort(aParsed, bParsed, isAsc);\n    }\n    const isDateField = rawA instanceof Date && rawB instanceof Date;\n    if (isDateField) {\n      return basicSort(rawA, rawB, isAsc);\n    }\n    return basicSort(!!rawA, !!rawB, isAsc);\n  });\n}\n\nfunction basicSort(aValue: any, bValue: any, isAsc: boolean) {\n  if (aValue > bValue) {\n    return isAsc ? 1 : -1;\n  }\n  if (aValue < bValue) {\n    return isAsc ? -1 : 1;\n  }\n  return 0;\n}\n\nexport function filterArray(\n  data: Array<{}>,\n  searchFields?: { [field: string]: string | number | boolean | null }\n): Array<{}> {\n  if (!searchFields || isEmpty(searchFields)) {\n    return data;\n  }\n  const searchObjs: SearchObj[] = [];\n  Object.keys(searchFields).map((fieldName) => {\n    const fieldValue = searchFields[fieldName];\n    const getSubObjects = getFieldReferences(fieldName, fieldValue);\n    searchObjs.push(...getSubObjects);\n  });\n  const filtered = data.filter((row) =>\n    searchObjs.reduce((acc, cur) => {\n      const res = doesRowMatch(row, cur.searchField, cur.searchValue);\n      return res && acc;\n    }, true as boolean)\n  );\n  return filtered;\n}\n\nexport function doesRowMatch(\n  row: {},\n  searchField: string,\n  searchValue: any\n): boolean {\n  const searchThis = get(row, searchField);\n  const bothAreFalsey = !searchThis && !searchValue;\n  if (bothAreFalsey) {\n    return true;\n  }\n  const nothingToSearch = !searchThis;\n  if (nothingToSearch) {\n    return false;\n  }\n  const isStringSearch = typeof searchValue === 'string';\n  if (isStringSearch) {\n    return searchThis\n      .toString()\n      .toLowerCase()\n      .includes(searchValue.toLowerCase());\n  }\n  const isBooleanOrNumber =\n    typeof searchValue === 'boolean' || typeof searchValue === 'number';\n  if (isBooleanOrNumber) {\n    return searchThis === searchValue;\n  }\n  const isArraySearch = Array.isArray(searchValue);\n  if (isArraySearch) {\n    return searchValue.includes(searchThis);\n  }\n  return false;\n}\n","type SearchValues = {} | number | string | boolean | null;\ntype SearchValue = SearchValues | SearchValue[];\n\nexport interface SearchObj {\n  searchField: string;\n  searchValue: SearchValue;\n}\nexport function getFieldReferences(\n  fieldName: string,\n  value: {} | SearchValue\n): SearchObj[] {\n  const isFalsy = !value;\n  const isSimple =\n    isFalsy ||\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean';\n\n  if (isSimple) {\n    return [\n      {\n        searchField: fieldName,\n        searchValue: value as SearchValue,\n      },\n    ];\n  }\n  const tree = {} as Record<string, SearchValue>;\n  tree[fieldName] = value;\n  return objectFlatten(tree);\n}\n\nexport function objectFlatten(tree: {}): SearchObj[] {\n  var leaves: SearchObj[] = [];\n  var recursivelyWalk = (obj: any, path: string | null) => {\n    path = path || '';\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        const objVal = obj && obj[key];\n        const currentPath = !!path ? path + '.' + key : key;\n        const isWalkable =\n          typeof objVal === 'object' || objVal instanceof Array;\n        if (isWalkable) {\n          recursivelyWalk(objVal, currentPath);\n        } else {\n          leaves.push({ searchField: currentPath, searchValue: objVal });\n        }\n      }\n    }\n  };\n  recursivelyWalk(tree, null);\n  return leaves;\n}\n","type LogFn = (...args: any) => void;\n\nexport const LogNoOp: LogFn = (...args: any) => null;\n\nexport class LoggerBase {\n  constructor(private title: string, private cacheEnabledKey: string) {}\n\n  private isEnabled() {\n    return !!localStorage.getItem(this.cacheEnabledKey);\n  }\n\n  SetEnabled(isEnabled: boolean) {\n    if (isEnabled) {\n      localStorage.setItem(this.cacheEnabledKey, 'true');\n    } else {\n      localStorage.removeItem(this.cacheEnabledKey);\n    }\n  }\n\n  public get log() {\n    if (!this.isEnabled()) {\n      return LogNoOp;\n    }\n    const boundLogFn: (...args: any) => void = console.log.bind(\n      console,\n      this.title\n    );\n    return boundLogFn;\n  }\n\n  public get warn() {\n    if (!this.isEnabled()) {\n      return LogNoOp;\n    }\n    const boundLogFn: (...args: any) => void = console.warn.bind(\n      console,\n      this.title\n    );\n    return boundLogFn;\n  }\n\n  public get error() {\n    if (!this.isEnabled()) {\n      return LogNoOp;\n    }\n    const boundLogFn: (...args: any) => void = console.error.bind(\n      console,\n      this.title\n    );\n    return boundLogFn;\n  }\n}\n","import { RAFirebaseOptions } from 'providers/options';\nimport { LoggerBase, LogNoOp } from './logger-base';\n\nconst LOGGER_ENABLEDKEY = 'LOGGING_FIRESTORE_COSTS_ENABLED';\nconst logger = new LoggerBase('💸firestore-costs:', LOGGER_ENABLEDKEY);\n\nconst KEY_SINGLE = 'firecosts-single-reads';\n\nexport interface IFirestoreLogger {\n  logDocument: (count: number) => Function;\n  SetEnabled: (isEnabled: boolean) => void;\n  ResetCount: (shouldReset: boolean) => void;\n}\n\nexport function MakeFirestoreLogger(\n  options: RAFirebaseOptions\n): IFirestoreLogger {\n  function notEnabled() {\n    return !options?.lazyLoading?.enabled;\n  }\n\n  function incrementRead(incrementBy = 1) {\n    const currentCountRaw = localStorage.getItem(KEY_SINGLE) || '';\n    const currentCount = parseInt(currentCountRaw) || 0;\n    const incremented = currentCount + incrementBy;\n    localStorage.setItem(KEY_SINGLE, incremented + '');\n    return incremented;\n  }\n  function clearCache() {\n    localStorage.removeItem(KEY_SINGLE);\n  }\n  return {\n    SetEnabled(isEnabled: boolean) {\n      logger.SetEnabled(isEnabled);\n    },\n    ResetCount(shouldReset: boolean) {\n      shouldReset && clearCache();\n    },\n    logDocument(docCount: number) {\n      if (notEnabled()) {\n        return LogNoOp;\n      }\n      const count = incrementRead(docCount);\n      const suffix = `+${docCount} (session total=${count} documents read)`;\n      const boundLogFn: (...args: any) => void = logger.log.bind(\n        console,\n        suffix\n      );\n      return boundLogFn;\n    },\n  };\n}\n","import { LoggerBase } from './logger-base';\n\nconst LOGGER_ENABLEDKEY = 'LOGGING_ENABLED';\nexport const logger = new LoggerBase('🔥raf:', LOGGER_ENABLEDKEY);\n\nexport const log = logger.log;\nexport const logError = logger.error;\nexport const logWarn = logger.warn;\n","import { log } from './logger';\n\nexport type DispatchEvent =\n  | 'FILE_UPLOAD_WILL_START'\n  | 'FILE_UPLOAD_PROGRESS'\n  | 'FILE_UPLOAD_PAUSED'\n  | 'FILE_UPLOAD_RUNNING'\n  | 'FILE_UPLOAD_CANCELED'\n  | 'FILE_UPLOAD_COMPLETE'\n  | 'FILE_SAVED';\n\nexport function dispatch(\n  eventName: DispatchEvent,\n  fileName: string,\n  data?: any\n): void {\n  const eventMonitor = document.getElementById('eventMonitor');\n  if (!eventMonitor) {\n    log(\n      `eventMonitor not found to dispatch event ${eventName} for ${fileName}`\n    );\n    return;\n  }\n  const eventData = { fileName, data };\n  let event = new CustomEvent(eventName, { detail: eventData });\n  eventMonitor.dispatchEvent(event);\n}\n","export const REF_INDENTIFIER = '___REF_FULLPATH_';\n\nexport interface ParsedRefDoc {\n  ___refpath: string;\n  ___refid: string;\n}\n","import { getDownloadURL, ref } from 'firebase/storage';\nimport { has, set } from 'lodash';\nimport { IFirebaseWrapper } from 'providers/database';\nimport { FireStoreDocumentRef } from './firebase-models';\nimport { REF_INDENTIFIER } from './internal.models';\nimport { logError } from './logger';\n\nexport interface RefDocFound {\n  fieldPath: string;\n  refDocPath: string;\n}\n\nexport interface FromFirestoreResult {\n  parsedDoc: any;\n  refdocs: RefDocFound[];\n}\n\nexport function translateDocFromFirestore(obj: any) {\n  const isObject = !!obj && typeof obj === 'object';\n  const result: FromFirestoreResult = {\n    parsedDoc: {},\n    refdocs: [],\n  };\n  if (!isObject) {\n    return result;\n  }\n  Object.keys(obj).map((key) => {\n    const value = obj[key];\n    obj[key] = recusivelyCheckObjectValue(value, key, result);\n  });\n  result.parsedDoc = obj;\n  return result;\n}\n\nexport function recusivelyCheckObjectValue(\n  input: any,\n  fieldPath: string,\n  result: FromFirestoreResult\n): any {\n  const isFalsey = !input;\n  if (isFalsey) {\n    return input;\n  }\n  const isPrimitive = typeof input !== 'object';\n  if (isPrimitive) {\n    return input;\n  }\n  const isTimestamp = !!input.toDate && typeof input.toDate === 'function';\n  if (isTimestamp) {\n    return input.toDate();\n  }\n  const isArray = Array.isArray(input);\n  if (isArray) {\n    return (input as any[]).map((value, index) =>\n      recusivelyCheckObjectValue(value, `${fieldPath}.${index}`, result)\n    );\n  }\n  const isDocumentReference = isInputADocReference(input);\n  if (isDocumentReference) {\n    const documentReference = input as FireStoreDocumentRef;\n    result.refdocs.push({\n      fieldPath: fieldPath,\n      refDocPath: documentReference.path,\n    });\n    return documentReference.id;\n  }\n  const isObject = typeof input === 'object';\n  if (isObject) {\n    Object.keys(input).map((key) => {\n      const value = input[key];\n      input[key] = recusivelyCheckObjectValue(value, key, result);\n    });\n    return input;\n  }\n  return input;\n}\n\nfunction isInputADocReference(input: any): boolean {\n  const isDocumentReference =\n    typeof input.id === 'string' &&\n    typeof input.firestore === 'object' &&\n    typeof input.parent === 'object' &&\n    typeof input.path === 'string';\n  return isDocumentReference;\n}\n\nexport function applyRefDocs(doc: any, refDocs: RefDocFound[]) {\n  refDocs.map((d) => {\n    set(doc, REF_INDENTIFIER + d.fieldPath, d.refDocPath);\n  });\n  return doc;\n}\n\nexport const recursivelyMapStorageUrls = async (\n  fireWrapper: IFirebaseWrapper,\n  fieldValue: any\n): Promise<any> => {\n  const isPrimitive = !fieldValue || typeof fieldValue !== 'object';\n  if (isPrimitive) {\n    return fieldValue;\n  }\n  const isFileField = has(fieldValue, 'src');\n  if (isFileField) {\n    try {\n      const src = await getDownloadURL(\n        ref(fireWrapper.storage(), fieldValue.src)\n      );\n      return {\n        ...fieldValue,\n        src,\n      };\n    } catch (error) {\n      logError(`Error when getting download URL`, {\n        error,\n      });\n      return fieldValue;\n    }\n  }\n  const isArray = Array.isArray(fieldValue);\n  if (isArray) {\n    return Promise.all(\n      (fieldValue as any[]).map(async (value, index) => {\n        fieldValue[index] = await recursivelyMapStorageUrls(fireWrapper, value);\n      })\n    );\n  }\n  const isDocumentReference = isInputADocReference(fieldValue);\n  if (isDocumentReference) {\n    return fieldValue;\n  }\n  const isObject = !isArray && typeof fieldValue === 'object';\n  if (isObject) {\n    return Promise.all(\n      Object.keys(fieldValue).map(async (key) => {\n        const value = fieldValue[key];\n        fieldValue[key] = await recursivelyMapStorageUrls(fireWrapper, value);\n      })\n    );\n  }\n};\n","import {\n  FireStoreDocumentSnapshot,\n  FireStoreQueryDocumentSnapshot,\n} from './firebase-models';\nimport { logWarn } from './logger';\nimport * as ra from './react-admin-models';\nimport {\n  applyRefDocs,\n  translateDocFromFirestore,\n} from './translate-from-firestore';\n\nexport function parseFireStoreDocument<T extends ra.Record>(\n  doc: FireStoreQueryDocumentSnapshot | FireStoreDocumentSnapshot | undefined\n): T {\n  if (!doc) {\n    logWarn('parseFireStoreDocument: no doc', { doc });\n    return {} as T;\n  }\n  const data = doc.data();\n  const result = translateDocFromFirestore(data);\n  const dataWithRefs = applyRefDocs(result.parsedDoc, result.refdocs);\n  // React Admin requires an id field on every document,\n  // So we can just use the firestore document id\n  return { id: doc.id, ...dataWithRefs } as T;\n}\n","import path from 'path-browserify';\n\nexport function getAbsolutePath(\n  rootRef: undefined | string | (() => string),\n  relativePath: string | null\n): string {\n  if (!rootRef) {\n    return relativePath + '';\n  }\n  if (!relativePath) {\n    throw new Error(\n      'Resource name must be a string of length greater than 0 characters'\n    );\n  }\n  const rootRefValue = typeof rootRef === 'string' ? rootRef : rootRef();\n  const withSlashes = path.join('/', rootRefValue, '/', relativePath, '/');\n  const slashCount = withSlashes.split('/').length - 1;\n  if (slashCount % 2) {\n    throw new Error(`The rootRef path must point to a \"document\"\n    not a \"collection\"e.g. /collection/document/ or\n    /collection/document/collection/document/`);\n  }\n  return withSlashes.slice(1, -1);\n}\n\nexport function joinPaths(...args: string[]) {\n  return path.join(...args);\n}\n","import { REF_INDENTIFIER } from './internal.models';\n\ninterface ParsedUpload {\n  fieldDotsPath: string;\n  fieldSlashesPath: string;\n  rawFile: File | any;\n}\n\ninterface ParsedDocRef {\n  fieldDotsPath: string;\n  refPath: string;\n}\n\ninterface ParseResult {\n  parsedDoc: any;\n  uploads: ParsedUpload[];\n  refdocs: ParsedDocRef[];\n}\n\nexport function translateDocToFirestore(obj: any): ParseResult {\n  const isObject = !!obj && typeof obj === 'object';\n  const result: ParseResult = {\n    uploads: [],\n    refdocs: [],\n    parsedDoc: {},\n  };\n  if (!isObject) {\n    return result;\n  }\n  Object.keys(obj).map((key) => {\n    const value = obj[key];\n    recusivelyParseObjectValue(value, key, result);\n  });\n  result.parsedDoc = obj;\n  return result;\n}\n\nexport function recusivelyParseObjectValue(\n  input: any,\n  fieldPath: string,\n  result: ParseResult\n): any {\n  const isFalsey = !input;\n  if (isFalsey) {\n    return input;\n  }\n  const isRefField =\n    typeof fieldPath === 'string' && fieldPath.includes(REF_INDENTIFIER);\n  if (isRefField) {\n    const refDocFullPath = input as string;\n    result.refdocs.push({\n      fieldDotsPath: fieldPath,\n      refPath: refDocFullPath,\n    });\n    return;\n  }\n  const isPrimitive = typeof input !== 'object';\n  if (isPrimitive) {\n    return input;\n  }\n  const isTimestamp = !!input.toDate && typeof input.toDate === 'function';\n  if (isTimestamp) {\n    return input.toDate();\n  }\n  const isArray = Array.isArray(input);\n  if (isArray) {\n    return (input as []).map((value, index) =>\n      recusivelyParseObjectValue(value, `${fieldPath}.${index}`, result)\n    );\n  }\n  const isFileField = !!input && input.hasOwnProperty('rawFile');\n  if (isFileField) {\n    result.uploads.push({\n      fieldDotsPath: fieldPath,\n      fieldSlashesPath: fieldPath.split('.').join('/'),\n      rawFile: input.rawFile,\n    });\n    delete input.rawFile;\n    return;\n  }\n  Object.keys(input).map((key) => {\n    const value = input[key];\n    recusivelyParseObjectValue(value, `${fieldPath}.${key}`, result);\n  });\n  return input;\n}\n","import { FirebaseApp, getApp, getApps, initializeApp } from 'firebase/app';\nimport {\n  browserLocalPersistence,\n  browserSessionPersistence,\n  getAuth,\n  inMemoryPersistence,\n  onAuthStateChanged,\n  Persistence,\n  signInWithEmailAndPassword,\n  signOut,\n} from 'firebase/auth';\nimport {\n  collection,\n  doc,\n  getFirestore,\n  serverTimestamp as firestoreServerTimestamp,\n  writeBatch,\n} from 'firebase/firestore';\nimport {\n  getDownloadURL,\n  getStorage,\n  ref,\n  uploadBytesResumable,\n} from 'firebase/storage';\nimport {\n  FireApp,\n  FireAuth,\n  FireAuthUserCredentials,\n  FireStorage,\n  FireStoragePutFileResult,\n  FireStore,\n  FireStoreBatch,\n  FireStoreCollectionRef,\n  FireUploadTaskSnapshot,\n  FireUser,\n} from 'misc/firebase-models';\nimport { log } from '../../../misc';\nimport { RAFirebaseOptions } from '../../options';\nimport { IFirebaseWrapper } from './IFirebaseWrapper';\n\nexport class FirebaseWrapper implements IFirebaseWrapper {\n  private readonly _app: FireApp;\n  private readonly _firestore: FireStore;\n  private readonly _storage: FireStorage;\n  private readonly _auth: FireAuth;\n  public options: RAFirebaseOptions;\n\n  constructor(inputOptions: RAFirebaseOptions | undefined, firebaseConfig: {}) {\n    const optionsSafe = inputOptions || {};\n    this.options = optionsSafe;\n    this._app = (window as any)['_app'] = ObtainFirebaseApp(\n      firebaseConfig,\n      optionsSafe\n    );\n    this._firestore = getFirestore(this._app);\n    this._storage = getStorage(this._app);\n    this._auth = getAuth(this._app);\n  }\n  dbGetCollection(absolutePath: string): FireStoreCollectionRef {\n    return collection(this._firestore, absolutePath);\n  }\n  dbCreateBatch(): FireStoreBatch {\n    return writeBatch(this._firestore);\n  }\n  dbMakeNewId(): string {\n    return doc(collection(this._firestore, 'collections')).id;\n  }\n\n  public OnUserLogout(callBack: (u: FireUser | null) => any) {\n    this._auth.onAuthStateChanged((user) => {\n      const isLoggedOut = !user;\n      log('FirebaseWrapper.OnUserLogout', { user, isLoggedOut });\n      if (isLoggedOut) {\n        callBack(user);\n      }\n    });\n  }\n  putFile(storagePath: string, rawFile: any): FireStoragePutFileResult {\n    const task = uploadBytesResumable(ref(this._storage, storagePath), rawFile);\n    const taskResult = new Promise<FireUploadTaskSnapshot>((res, rej) =>\n      task.then(res).catch(rej)\n    );\n\n    const downloadUrl = taskResult\n      .then((t) => getDownloadURL(t.ref))\n      .then((url) => url as string);\n\n    return {\n      task,\n      taskResult,\n      downloadUrl,\n    };\n  }\n  async getStorageDownloadUrl(fieldSrc: string): Promise<string> {\n    return getDownloadURL(ref(this._storage, fieldSrc));\n  }\n  public serverTimestamp() {\n    // This line doesn't work for some reason, might be firebase sdk.\n    return firestoreServerTimestamp();\n  }\n\n  async authSetPersistence(persistenceInput: 'session' | 'local' | 'none') {\n    let persistenceResolved: Persistence;\n    switch (persistenceInput) {\n      case 'local':\n        persistenceResolved = browserLocalPersistence;\n        break;\n      case 'none':\n        persistenceResolved = inMemoryPersistence;\n        break;\n      case 'session':\n      default:\n        persistenceResolved = browserSessionPersistence;\n        break;\n    }\n\n    log('setPersistence', { persistenceInput, persistenceResolved });\n\n    return this._auth\n      .setPersistence(persistenceResolved)\n      .catch((error) => console.error(error));\n  }\n  async authSigninEmailPassword(\n    email: string,\n    password: string\n  ): Promise<FireAuthUserCredentials> {\n    const user = await signInWithEmailAndPassword(this._auth, email, password);\n    return user;\n  }\n  async authSignOut(): Promise<void> {\n    return signOut(this._auth);\n  }\n  async authGetUserLoggedIn(): Promise<FireUser> {\n    return new Promise((resolve, reject) => {\n      const auth = this._auth;\n      if (auth.currentUser) return resolve(auth.currentUser);\n      const unsubscribe = onAuthStateChanged(this._auth, (user) => {\n        unsubscribe();\n        if (user) {\n          resolve(user);\n        } else {\n          reject();\n        }\n      });\n    });\n  }\n  public async GetUserLogin(): Promise<FireUser> {\n    return this.authGetUserLoggedIn();\n  }\n\n  /** @deprecated */\n  public auth(): FireAuth {\n    return this._auth;\n  }\n  /** @deprecated */\n  public storage(): FireStorage {\n    return this._storage;\n  }\n  /** @deprecated */\n  public GetApp(): FireApp {\n    return this._app;\n  }\n  /** @deprecated */\n  public db(): FireStore {\n    return this._firestore;\n  }\n}\n\nfunction ObtainFirebaseApp(\n  firebaseConfig: {},\n  options: RAFirebaseOptions\n): FirebaseApp {\n  if (options.app) {\n    return options.app;\n  }\n  const apps = getApps();\n\n  const isInitialized = !!apps?.length;\n\n  if (isInitialized) {\n    return getApp();\n  } else {\n    return initializeApp(firebaseConfig);\n  }\n}\n","import { log, logger, logWarn, retrieveStatusTxt } from '../misc';\nimport { FireUser } from '../misc/firebase-models';\nimport {\n  AuthProvider as RaAuthProvider,\n  UserIdentity,\n} from '../misc/react-admin-models';\nimport { messageTypes } from './../misc/messageTypes';\nimport { IFirebaseWrapper } from './database';\nimport { FirebaseWrapper } from './database/firebase/FirebaseWrapper';\nimport { RAFirebaseOptions } from './options';\n\nclass AuthClient {\n  private fireWrapper: IFirebaseWrapper;\n\n  constructor(firebaseConfig: {}, optionsInput?: RAFirebaseOptions) {\n    const options = optionsInput || {};\n    log('Auth Client: initializing...', { firebaseConfig, options });\n    this.fireWrapper = new FirebaseWrapper(options, firebaseConfig);\n    options.persistence && this.setPersistence(options.persistence);\n  }\n\n  setPersistence(persistenceInput: 'session' | 'local' | 'none') {\n    return this.fireWrapper.authSetPersistence(persistenceInput);\n  }\n\n  public async HandleAuthLogin(params: { username: string; password: string }) {\n    const { username, password } = params;\n\n    if (username && password) {\n      try {\n        const user = await this.fireWrapper.authSigninEmailPassword(\n          username,\n          password\n        );\n        log('HandleAuthLogin: user sucessfully logged in', { user });\n        return user;\n      } catch (e) {\n        log('HandleAuthLogin: invalid credentials', { params });\n        throw new Error('Login error: invalid credentials');\n      }\n    } else {\n      return this.getUserLogin();\n    }\n  }\n\n  public HandleAuthLogout() {\n    return this.fireWrapper.authSignOut();\n  }\n\n  public HandleAuthError(errorHttp: messageTypes.HttpErrorType) {\n    log('HandleAuthLogin: invalid credentials', { errorHttp });\n    const status = !!errorHttp && errorHttp.status;\n    const statusTxt = retrieveStatusTxt(status);\n    if (statusTxt === 'ok') {\n      log('API is actually authenticated');\n      return Promise.resolve();\n    }\n    logWarn('Received authentication error from API');\n    return Promise.reject();\n  }\n\n  public async HandleAuthCheck(): Promise<any> {\n    return this.getUserLogin();\n  }\n\n  public getUserLogin(): Promise<FireUser> {\n    return this.fireWrapper.authGetUserLoggedIn();\n  }\n\n  public async HandleGetPermissions() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.claims;\n    } catch (e) {\n      log('HandleGetPermission: no user is logged in or tokenResult error', {\n        e,\n      });\n      return null;\n    }\n  }\n\n  public async HandleGetIdentity(): Promise<UserIdentity> {\n    try {\n      const { uid, displayName, photoURL } = await this.getUserLogin();\n      const identity: UserIdentity = {\n        id: uid,\n        fullName: `${displayName ?? ''}`,\n        avatar: `${photoURL ?? ''}`,\n      };\n      return identity;\n    } catch (e) {\n      log('HandleGetIdentity: no user is logged in', {\n        e,\n      });\n      return null as any;\n    }\n  }\n\n  public async HandleGetJWTAuthTime() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.authTime;\n    } catch (e) {\n      log('HandleGetJWTAuthTime: no user is logged in or tokenResult error', {\n        e,\n      });\n      return null;\n    }\n  }\n\n  public async HandleGetJWTExpirationTime() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.expirationTime;\n    } catch (e) {\n      log(\n        'HandleGetJWTExpirationTime: no user is logged in or tokenResult error',\n        {\n          e,\n        }\n      );\n      return null;\n    }\n  }\n\n  public async HandleGetJWTSignInProvider() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.signInProvider;\n    } catch (e) {\n      log(\n        'HandleGetJWTSignInProvider: no user is logged in or tokenResult error',\n        {\n          e,\n        }\n      );\n      return null;\n    }\n  }\n\n  public async HandleGetJWTIssuedAtTime() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.issuedAtTime;\n    } catch (e) {\n      log(\n        'HandleGetJWTIssuedAtTime: no user is logged in or tokenResult error',\n        {\n          e,\n        }\n      );\n      return null;\n    }\n  }\n\n  public async HandleGetJWTToken() {\n    try {\n      const user = await this.getUserLogin();\n      // @ts-ignore\n      const token = await user.getIdTokenResult();\n\n      return token.token;\n    } catch (e) {\n      log('HandleGetJWTToken: no user is logged in or tokenResult error', {\n        e,\n      });\n      return null;\n    }\n  }\n}\n\nexport function AuthProvider(\n  firebaseConfig: {},\n  options: RAFirebaseOptions\n): ReactAdminFirebaseAuthProvider {\n  VerifyAuthProviderArgs(firebaseConfig, options);\n  logger.SetEnabled(!!options?.logging);\n  const auth = new AuthClient(firebaseConfig, options);\n\n  const provider: ReactAdminFirebaseAuthProvider = {\n    // React Admin Interface\n    login: (params) => auth.HandleAuthLogin(params),\n    logout: () => auth.HandleAuthLogout(),\n    checkAuth: () => auth.HandleAuthCheck(),\n    checkError: (error) => auth.HandleAuthError(error),\n    getPermissions: () => auth.HandleGetPermissions(),\n    getIdentity: () => auth.HandleGetIdentity(),\n    // Custom Functions\n    getAuthUser: () => auth.getUserLogin(),\n    getJWTAuthTime: () => auth.HandleGetJWTAuthTime(),\n    getJWTExpirationTime: () => auth.HandleGetJWTExpirationTime(),\n    getJWTSignInProvider: () => auth.HandleGetJWTSignInProvider(),\n    getJWTClaims: () => auth.HandleGetPermissions(),\n    getJWTToken: () => auth.HandleGetJWTToken(),\n  };\n  return provider;\n}\n\nexport type ReactAdminFirebaseAuthProvider = RaAuthProvider & {\n  // Custom Functions\n  getAuthUser: () => Promise<FireUser>;\n  getJWTAuthTime: () => Promise<string | null>;\n  getJWTExpirationTime: () => Promise<string | null>;\n  getJWTSignInProvider: () => Promise<string | null>;\n  getJWTClaims: () => Promise<{ [key: string]: any } | null>;\n  getJWTToken: () => Promise<string | null>;\n};\n\nfunction VerifyAuthProviderArgs(\n  firebaseConfig: {},\n  options: RAFirebaseOptions\n) {\n  const hasNoApp = !options || !options.app;\n  const hasNoConfig = !firebaseConfig;\n  if (hasNoConfig && hasNoApp) {\n    throw new Error(\n      'Please pass the Firebase firebaseConfig object or options.app to the FirebaseAuthProvider'\n    );\n  }\n}\n","// From firebase SDK\n\nimport { logError } from './logger';\n\n// tslint:disable-next-line:max-line-length\n// - https://github.com/firebase/firebase-js-sdk/blob/9f109f85ad0d99f6c13e68dcb549a0b852e35a2a/packages/functions/src/api/error.ts\nexport function retrieveStatusTxt(status: number): 'ok' | 'unauthenticated' {\n  // Make sure any successful status is OK.\n  if (status >= 200 && status < 300) {\n    return 'ok';\n  }\n  switch (status) {\n    case 401: // 'unauthenticated'\n    case 403: // 'permission-denied'\n      return 'unauthenticated';\n\n    case 0: // 'internal'\n    case 400: // 'invalid-argument'\n    case 404: // 'not-found'\n    case 409: // 'aborted'\n    case 429: // 'resource-exhausted'\n    case 499: // 'cancelled'\n    case 500: // 'internal'\n    case 501: // 'unimplemented'\n    case 503: // 'unavailable'\n    case 504: // 'deadline-exceeded'\n    default:\n      // ignore\n      return 'ok';\n  }\n}\n\n// From firebase SDK\n// tslint:disable-next-line:max-line-length\n// - https://github.com/firebase/firebase-js-sdk/blob/9f109f85ad0d99f6c13e68dcb549a0b852e35a2a/packages/functions/src/api/error.ts\nexport function retrieveStatusCode(statusTxt: string): number {\n  // Make sure any successful status is OK.\n  const regexResult = /\\[code\\=([\\w-]*)/g.exec(statusTxt);\n  const status = Array.isArray(regexResult) && regexResult[1];\n  if (!status) {\n    logError('unknown StatusCode ', { statusTxt });\n  }\n  switch (status) {\n    case 'unauthenticated':\n      return 401;\n    case 'permission-denied':\n      return 403;\n    case 'internal':\n      return 0;\n    case 'invalid-argument':\n      return 400;\n    case 'not-found':\n      return 404;\n    case 'aborted':\n      return 409;\n    case 'resource-exhausted':\n      return 429;\n    case 'cancelled':\n      return 499;\n    case 'internal':\n      return 500;\n    case 'unimplemented':\n      return 501;\n    case 'unavailable':\n      return 503;\n    case 'deadline-exceeded':\n      return 504;\n    default:\n      return 200;\n  }\n}\n","import { doc, getDoc, setDoc } from 'firebase/firestore';\nimport { log } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\n\nexport async function Create<T extends ra.Record>(\n  resourceName: string,\n  params: ra.CreateParams,\n  client: FireClient\n): Promise<ra.CreateResult<T>> {\n  const { rm, fireWrapper } = client;\n  const r = await rm.TryGetResource(resourceName);\n  log('Create', { resourceName, resource: r, params });\n  const hasOverridenDocId = params.data && params.data.id;\n  log('Create', { hasOverridenDocId });\n  if (hasOverridenDocId) {\n    const overridenId = params.data.id;\n    const exists = (await getDoc(doc(r.collection, overridenId))).exists();\n    if (exists) {\n      throw new Error(\n        `the id:\"${overridenId}\" already exists, please use a unique string if overriding the 'id' field`\n      );\n    }\n\n    const createData = await client.parseDataAndUpload(\n      r,\n      overridenId,\n      params.data\n    );\n    if (!overridenId) {\n      throw new Error('id must be a valid string');\n    }\n    const createDocObj = { ...createData };\n    client.checkRemoveIdField(createDocObj, overridenId);\n    await client.addCreatedByFields(createDocObj);\n    await client.addUpdatedByFields(createDocObj);\n    const createDocObjTransformed = client.transformToDb(\n      resourceName,\n      createDocObj,\n      overridenId\n    );\n    log('Create', { docObj: createDocObj });\n    await setDoc(doc(r.collection, overridenId), createDocObjTransformed, {\n      merge: false,\n    });\n    return {\n      data: {\n        ...createDocObjTransformed,\n        id: overridenId,\n      },\n    };\n  }\n  const newId = fireWrapper.dbMakeNewId();\n  const data = await client.parseDataAndUpload(r, newId, params.data);\n  const docObj = { ...data };\n  client.checkRemoveIdField(docObj, newId);\n  await client.addCreatedByFields(docObj);\n  await client.addUpdatedByFields(docObj);\n  const docObjTransformed = client.transformToDb(resourceName, docObj, newId);\n  await setDoc(doc(r.collection, newId), docObjTransformed, { merge: false });\n  return {\n    data: {\n      ...docObjTransformed,\n      id: newId,\n    },\n  };\n}\n","import { deleteDoc, doc } from 'firebase/firestore';\nimport { log } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\nimport { DeleteSoft } from './Delete.Soft';\n\nexport async function Delete<T extends ra.Record>(\n  resourceName: string,\n  params: ra.DeleteParams,\n  client: FireClient\n): Promise<ra.DeleteResult<T>> {\n  const { rm, options } = client;\n  if (options.softDelete) {\n    return DeleteSoft(resourceName, params, client);\n  }\n  const r = await rm.TryGetResource(resourceName);\n  log('apiDelete', { resourceName, resource: r, params });\n  try {\n    const id = params.id + '';\n\n    await deleteDoc(doc(r.collection, id));\n  } catch (error) {\n    throw new Error(error as any);\n  }\n  return {\n    data: params.previousData as T,\n  };\n}\n","import { doc, updateDoc } from 'firebase/firestore';\nimport { log, logError } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database';\n\nexport async function DeleteSoft<T extends ra.Record>(\n  resourceName: string,\n  params: ra.DeleteParams,\n  client: FireClient\n): Promise<ra.DeleteResult<T>> {\n  const { rm } = client;\n  const id = params.id + '';\n  const r = await rm.TryGetResource(resourceName);\n  log('DeleteSoft', { resourceName, resource: r, params });\n  const docObj = { deleted: true };\n  await client.addUpdatedByFields(docObj);\n\n  updateDoc(doc(r.collection, id), docObj).catch((error) => {\n    logError('DeleteSoft error', { error });\n  });\n\n  return {\n    data: params.previousData as T,\n  };\n}\n","import { doc } from 'firebase/firestore';\nimport { log } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database';\nimport { DeleteManySoft } from './DeleteMany.Soft';\n\nexport async function DeleteMany(\n  resourceName: string,\n  params: ra.DeleteManyParams,\n  client: FireClient\n): Promise<ra.DeleteManyResult> {\n  const { options, rm, fireWrapper } = client;\n  if (options.softDelete) {\n    return DeleteManySoft(resourceName, params, client);\n  }\n  const r = await rm.TryGetResource(resourceName);\n  log('DeleteMany', { resourceName, resource: r, params });\n  const returnData: ra.Identifier[] = [];\n  const batch = fireWrapper.dbCreateBatch();\n  for (const id of params.ids) {\n    const idStr = id + '';\n    const docToDelete = doc(r.collection, idStr);\n    batch.delete(docToDelete);\n    returnData.push(id);\n  }\n\n  try {\n    await batch.commit();\n  } catch (error) {\n    throw new Error(error as any);\n  }\n  return { data: returnData };\n}\n","import { doc, updateDoc } from 'firebase/firestore';\nimport { log, logError } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database';\n\nexport async function DeleteManySoft(\n  resourceName: string,\n  params: ra.DeleteManyParams,\n  client: FireClient\n): Promise<ra.DeleteManyResult> {\n  const { rm } = client;\n  const r = await rm.TryGetResource(resourceName);\n  log('DeleteManySoft', { resourceName, resource: r, params });\n  const ids = params.ids;\n  const returnData = await Promise.all(\n    ids.map(async (id) => {\n      const idStr = id + '';\n      const docObj = { deleted: true };\n      await client.addUpdatedByFields(docObj);\n      updateDoc(doc(r.collection, idStr), docObj).catch((error) => {\n        logError('apiSoftDeleteMany error', { error });\n      });\n      return idStr;\n    })\n  );\n  return {\n    data: returnData,\n  };\n}\n","import { doc, updateDoc } from 'firebase/firestore';\nimport { log } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database';\n\nexport async function Update<T extends ra.Record>(\n  resourceName: string,\n  params: ra.UpdateParams,\n  client: FireClient\n): Promise<ra.UpdateResult<T>> {\n  const { rm } = client;\n  log('Update', { resourceName, params });\n  const id = params.id + '';\n  delete params.data.id;\n  const r = await rm.TryGetResource(resourceName);\n  log('Update', { resourceName, resource: r, params });\n  const data = await client.parseDataAndUpload(r, id, params.data);\n  const docObj = { ...data };\n  client.checkRemoveIdField(docObj, id);\n  await client.addUpdatedByFields(docObj);\n  const docObjTransformed = client.transformToDb(resourceName, docObj, id);\n  await updateDoc(doc(r.collection, id), docObjTransformed);\n  return {\n    data: {\n      ...data,\n      id: id,\n    },\n  };\n}\n","import { doc, updateDoc } from 'firebase/firestore';\nimport { log } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database';\n\nexport async function UpdateMany(\n  resourceName: string,\n  params: ra.UpdateManyParams,\n  client: FireClient\n): Promise<ra.UpdateManyResult> {\n  const { rm } = client;\n  log('UpdateMany', { resourceName, params });\n  delete params.data.id;\n  const r = await rm.TryGetResource(resourceName);\n  log('UpdateMany', { resourceName, resource: r, params });\n  const ids = params.ids;\n  const returnData = await Promise.all(\n    ids.map(async (id) => {\n      const idStr = id + '';\n      const data = await client.parseDataAndUpload(r, idStr, params.data);\n      const docObj = { ...data };\n      client.checkRemoveIdField(docObj, idStr);\n      await client.addUpdatedByFields(docObj);\n      const docObjTransformed = client.transformToDb(\n        resourceName,\n        docObj,\n        idStr\n      );\n      await updateDoc(doc(r.collection, idStr), docObjTransformed);\n      return {\n        ...data,\n        id: idStr,\n      };\n    })\n  );\n  return {\n    data: returnData,\n  };\n}\n","import { doc, getDoc, getDocs } from 'firebase/firestore';\nimport { FireStoreCollectionRef, FireStoreQuery } from 'misc/firebase-models';\nimport {\n  getAbsolutePath,\n  IFirestoreLogger,\n  log,\n  logWarn,\n  messageTypes,\n  parseFireStoreDocument,\n} from '../../misc';\nimport { RAFirebaseOptions } from '../options';\nimport { IFirebaseWrapper } from './firebase/IFirebaseWrapper';\n\ntype IResourceItem = {} & { id: string; deleted?: boolean };\nexport interface IResource {\n  path: string;\n  pathAbsolute: string;\n  collection: FireStoreCollectionRef;\n  list: Array<IResourceItem>;\n}\n\nexport class ResourceManager {\n  private resources: Record<string, IResource> = {};\n\n  constructor(\n    private fireWrapper: IFirebaseWrapper,\n    private options: RAFirebaseOptions,\n    private flogger: IFirestoreLogger\n  ) {\n    this.fireWrapper.OnUserLogout(() => {\n      this.resources = {};\n    });\n  }\n\n  public async TryGetResource(\n    resourceName: string,\n    refresh?: 'REFRESH',\n    collectionQuery?: messageTypes.CollectionQueryType\n  ): Promise<IResource> {\n    if (refresh) {\n      await this.RefreshResource(resourceName, collectionQuery);\n    }\n    return this.TryGetResourcePromise(resourceName, collectionQuery);\n  }\n\n  public GetResource(relativePath: string): IResource {\n    const resource: IResource = this.resources[relativePath];\n    if (!resource) {\n      throw new Error(\n        `react-admin-firebase: Can't find resource: \"${relativePath}\"`\n      );\n    }\n    return resource;\n  }\n\n  public async TryGetResourcePromise(\n    relativePath: string,\n    collectionQuery?: messageTypes.CollectionQueryType\n  ): Promise<IResource> {\n    log('resourceManager.TryGetResourcePromise', {\n      relativePath,\n      collectionQuery,\n    });\n    await this.initPath(relativePath);\n\n    const resource: IResource = this.resources[relativePath];\n    if (!resource) {\n      throw new Error(\n        `react-admin-firebase: Cant find resource: \"${relativePath}\"`\n      );\n    }\n    return resource;\n  }\n\n  public async RefreshResource(\n    relativePath: string,\n    collectionQuery: messageTypes.CollectionQueryType | undefined\n  ) {\n    if (this.options?.lazyLoading?.enabled) {\n      logWarn('resourceManager.RefreshResource', {\n        warn: 'RefreshResource is not available in lazy loading mode',\n      });\n      throw new Error(\n        'react-admin-firebase: RefreshResource is not available in lazy loading mode'\n      );\n    }\n\n    log('resourceManager.RefreshResource', { relativePath, collectionQuery });\n    await this.initPath(relativePath);\n    const resource = this.resources[relativePath];\n\n    const collectionRef = resource.collection;\n    const collectionOrQuery = this.applyQuery(collectionRef, collectionQuery);\n    const newDocs = await getDocs(collectionOrQuery);\n\n    resource.list = [];\n    newDocs.forEach((d) =>\n      resource.list.push(parseFireStoreDocument<IResourceItem>(d))\n    );\n\n    const count = newDocs.docs.length;\n    this.flogger.logDocument(count)();\n    log('resourceManager.RefreshResource', {\n      newDocs,\n      resource,\n      collectionPath: collectionRef.path,\n    });\n  }\n\n  public async GetSingleDoc(relativePath: string, docId: string) {\n    await this.initPath(relativePath);\n    const resource = this.GetResource(relativePath);\n    this.flogger.logDocument(1)();\n    const docSnap = await getDoc(doc(resource.collection, docId));\n    if (!docSnap.exists) {\n      throw new Error('react-admin-firebase: No id found matching: ' + docId);\n    }\n    const result = parseFireStoreDocument(docSnap);\n    log('resourceManager.GetSingleDoc', {\n      relativePath,\n      resource,\n      docId,\n      docSnap,\n      result,\n    });\n    return result;\n  }\n\n  private async initPath(relativePath: string): Promise<void> {\n    const rootRef = this.options && this.options.rootRef;\n    const absolutePath = getAbsolutePath(rootRef, relativePath);\n    const hasBeenInited = !!this.resources[relativePath];\n    log('resourceManager.initPath()', {\n      absolutePath,\n      hasBeenInited,\n    });\n    if (hasBeenInited) {\n      log('resourceManager.initPath() has been initialized already...');\n      return;\n    }\n    const collection = this.fireWrapper.dbGetCollection(absolutePath);\n    const list: Array<IResourceItem> = [];\n    const resource: IResource = {\n      collection,\n      list,\n      path: relativePath,\n      pathAbsolute: absolutePath,\n    };\n    this.resources[relativePath] = resource;\n    log('resourceManager.initPath() setting resource...', {\n      resource,\n      allResources: this.resources,\n      collection: collection,\n      collectionPath: collection.path,\n    });\n  }\n\n  public async getUserIdentifier(): Promise<string> {\n    const identifier = this.options.associateUsersById\n      ? await this.getCurrentUserId()\n      : await this.getCurrentUserEmail();\n    return identifier;\n  }\n\n  private async getCurrentUserEmail() {\n    const user = await this.fireWrapper.authGetUserLoggedIn();\n    if (user) {\n      return user.email as string;\n    } else {\n      return 'annonymous user';\n    }\n  }\n  private async getCurrentUserId() {\n    const user = await this.fireWrapper.authGetUserLoggedIn();\n    if (user) {\n      return user.uid;\n    } else {\n      return 'annonymous user';\n    }\n  }\n\n  private applyQuery(\n    collection: FireStoreCollectionRef,\n    collectionQuery?: messageTypes.CollectionQueryType\n  ): FireStoreCollectionRef | FireStoreQuery {\n    const collRef = collectionQuery ? collectionQuery(collection) : collection;\n\n    log('resourceManager.applyQuery() ...', {\n      collection,\n      collectionQuery: (collectionQuery || '-').toString(),\n      collRef,\n    });\n    return collRef;\n  }\n}\n","import { doc } from 'firebase/firestore';\nimport { get, set } from 'lodash';\nimport {\n  AddCreatedByFields,\n  AddUpdatedByFields,\n  dispatch,\n  IFirestoreLogger,\n  log,\n  logError,\n  parseStoragePath,\n  translateDocToFirestore,\n} from '../../misc';\nimport {\n  TASK_CANCELED,\n  TASK_PAUSED,\n  TASK_RUNNING,\n} from '../../misc/firebase-models';\nimport { RAFirebaseOptions } from '../options';\nimport { IFirebaseWrapper } from './firebase/IFirebaseWrapper';\nimport { IResource, ResourceManager } from './ResourceManager';\n\nexport class FireClient {\n  public rm: ResourceManager;\n\n  constructor(\n    public fireWrapper: IFirebaseWrapper,\n    public options: RAFirebaseOptions,\n    public flogger: IFirestoreLogger\n  ) {\n    this.rm = new ResourceManager(this.fireWrapper, this.options, this.flogger);\n  }\n\n  public checkRemoveIdField(obj: any, docId: string) {\n    if (!this.options.dontAddIdFieldToDoc) {\n      obj.id = docId;\n    }\n  }\n\n  public transformToDb(\n    resourceName: string,\n    documentData: any,\n    docId: string\n  ): any {\n    if (typeof this.options.transformToDb === 'function') {\n      return this.options.transformToDb(resourceName, documentData, docId);\n    }\n    return documentData;\n  }\n\n  public async parseDataAndUpload(r: IResource, id: string, data: any) {\n    if (!data) {\n      return data;\n    }\n    const docPath = doc(r.collection, id).path;\n\n    const result = translateDocToFirestore(data);\n    const uploads = result.uploads;\n    await Promise.all(\n      uploads.map(async (u) => {\n        const storagePath = parseStoragePath(\n          u.rawFile,\n          docPath,\n          u.fieldDotsPath,\n          !!this.options.useFileNamesInStorage\n        );\n        const link = await this.saveFile(storagePath, u.rawFile);\n        set(data, u.fieldDotsPath + '.src', link);\n      })\n    );\n    return data;\n  }\n\n  public async addCreatedByFields(obj: any) {\n    return AddCreatedByFields(obj, this.fireWrapper, this.rm, this.options);\n  }\n\n  public async addUpdatedByFields(obj: any) {\n    return AddUpdatedByFields(obj, this.fireWrapper, this.rm, this.options);\n  }\n\n  private async saveFile(\n    storagePath: string,\n    rawFile: any\n  ): Promise<string | undefined> {\n    log('saveFile() saving file...', { storagePath, rawFile });\n    try {\n      const { task, taskResult, downloadUrl } = this.fireWrapper.putFile(\n        storagePath,\n        rawFile\n      );\n      const { name } = rawFile;\n      // monitor upload status & progress\n      dispatch('FILE_UPLOAD_WILL_START', name);\n      task.on('state_changed', (snapshot) => {\n        const progress =\n          (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n        log('Upload is ' + progress + '% done');\n        dispatch('FILE_UPLOAD_PROGRESS', name, progress);\n        switch (snapshot.state) {\n          case TASK_PAUSED:\n            log('Upload is paused');\n            dispatch('FILE_UPLOAD_PAUSED', name);\n            break;\n          case TASK_RUNNING:\n            log('Upload is running');\n            dispatch('FILE_UPLOAD_RUNNING', name);\n            break;\n          case TASK_CANCELED:\n            log('Upload has been canceled');\n            dispatch('FILE_UPLOAD_CANCELED', name);\n            break;\n          // case storage.TaskState.ERROR:\n          // already handled by catch\n          // case storage.TaskState.SUCCESS:\n          // already handled by then\n        }\n      });\n      const [getDownloadURL] = await Promise.all([downloadUrl, taskResult]);\n      dispatch('FILE_UPLOAD_COMPLETE', name);\n      dispatch('FILE_SAVED', name);\n      log('saveFile() saved file', {\n        storagePath,\n        taskResult,\n        getDownloadURL,\n      });\n      return this.options.relativeFilePaths ? storagePath : getDownloadURL;\n    } catch (storageError) {\n      if (get(storageError, 'code') === 'storage/unknown') {\n        logError(\n          'saveFile() error saving file, No bucket found! Try clicking \"Get Started\" in firebase -> storage',\n          { storageError }\n        );\n      } else {\n        logError('saveFile() error saving file', {\n          storageError,\n        });\n      }\n    }\n  }\n}\n","import { joinPaths } from './pathHelper';\n\nexport function parseStoragePath(\n  rawFile: File,\n  docPath: string,\n  fieldPath: string,\n  useFileName: boolean\n): string {\n  const fileNameBits = rawFile instanceof File ? rawFile.name.split('.') : [];\n\n  const fileExtension = !fileNameBits?.length ? '' : '.' + fileNameBits.pop();\n\n  return useFileName\n    ? joinPaths(docPath, fieldPath, rawFile.name)\n    : joinPaths(docPath, fieldPath + fileExtension);\n}\n","import { RAFirebaseOptions } from 'index';\nimport { IFirebaseWrapper, ResourceManager } from 'providers/database';\n\nexport async function AddCreatedByFields(\n  obj: any,\n  fireWrapper: IFirebaseWrapper,\n  rm: Pick<ResourceManager, 'getUserIdentifier'>,\n  options: Pick<\n    RAFirebaseOptions,\n    | 'associateUsersById'\n    | 'disableMeta'\n    | 'renameMetaFields'\n    | 'metaFieldCasing'\n  >\n) {\n  if (options.disableMeta) {\n    return;\n  }\n  const currentUserIdentifier = await rm.getUserIdentifier();\n  const createAtSelector = GetSelectorsCreateAt(options);\n  const createBySelector = GetSelectorsCreateBy(options);\n  obj[createAtSelector] = fireWrapper.serverTimestamp();\n  obj[createBySelector] = currentUserIdentifier;\n}\n\nexport async function AddUpdatedByFields(\n  obj: any,\n  fireWrapper: IFirebaseWrapper,\n  rm: Pick<ResourceManager, 'getUserIdentifier'>,\n  options: Pick<\n    RAFirebaseOptions,\n    | 'associateUsersById'\n    | 'disableMeta'\n    | 'renameMetaFields'\n    | 'metaFieldCasing'\n  >\n) {\n  if (options.disableMeta) {\n    return;\n  }\n  const currentUserIdentifier = await rm.getUserIdentifier();\n  const updateAtSelector = GetSelectorsUpdateAt(options);\n  const updateBySelector = GetSelectorsUpdateBy(options);\n  obj[updateAtSelector] = fireWrapper.serverTimestamp();\n  obj[updateBySelector] = currentUserIdentifier;\n}\n\nexport function GetSelectorsUpdateAt(\n  options: Pick<RAFirebaseOptions, 'metaFieldCasing' | 'renameMetaFields'>\n): string {\n  if (options.renameMetaFields && options.renameMetaFields.updated_at) {\n    return options.renameMetaFields.updated_at;\n  }\n  const casing = options.metaFieldCasing;\n  const defautCase = 'lastupdate';\n  if (!casing) {\n    return defautCase;\n  }\n  if (casing === 'camel') {\n    return 'lastUpdate';\n  }\n  if (casing === 'snake') {\n    return 'last_update';\n  }\n  if (casing === 'pascal') {\n    return 'LastUpdate';\n  }\n  if (casing === 'kebab') {\n    return 'last-update';\n  }\n  return defautCase;\n}\n\nexport function GetSelectorsUpdateBy(\n  options: Pick<RAFirebaseOptions, 'metaFieldCasing' | 'renameMetaFields'>\n): string {\n  if (options.renameMetaFields && options.renameMetaFields.updated_by) {\n    return options.renameMetaFields.updated_by;\n  }\n  const casing = options.metaFieldCasing;\n  const defautCase = 'updatedby';\n  if (!casing) {\n    return defautCase;\n  }\n  if (casing === 'camel') {\n    return 'updatedBy';\n  }\n  if (casing === 'snake') {\n    return 'updated_by';\n  }\n  if (casing === 'pascal') {\n    return 'UpdatedBy';\n  }\n  if (casing === 'kebab') {\n    return 'updated-by';\n  }\n  return defautCase;\n}\n\nexport function GetSelectorsCreateAt(\n  options: Pick<RAFirebaseOptions, 'metaFieldCasing' | 'renameMetaFields'>\n): string {\n  if (options.renameMetaFields && options.renameMetaFields.created_at) {\n    return options.renameMetaFields.created_at;\n  }\n  const casing = options.metaFieldCasing;\n  const defautCase = 'createdate';\n  if (!casing) {\n    return defautCase;\n  }\n  if (casing === 'camel') {\n    return 'createDate';\n  }\n  if (casing === 'snake') {\n    return 'create_date';\n  }\n  if (casing === 'pascal') {\n    return 'CreateDate';\n  }\n  if (casing === 'kebab') {\n    return 'create-date';\n  }\n  return defautCase;\n}\n\nexport function GetSelectorsCreateBy(\n  options: Pick<RAFirebaseOptions, 'metaFieldCasing' | 'renameMetaFields'>\n): string {\n  if (options.renameMetaFields && options.renameMetaFields.created_by) {\n    return options.renameMetaFields.created_by;\n  }\n  const casing = options.metaFieldCasing;\n  const defautCase = 'createdby';\n  if (!casing) {\n    return defautCase;\n  }\n  if (casing === 'camel') {\n    return 'createdBy';\n  }\n  if (casing === 'snake') {\n    return 'created_by';\n  }\n  if (casing === 'pascal') {\n    return 'CreatedBy';\n  }\n  if (casing === 'kebab') {\n    return 'created-by';\n  }\n  return defautCase;\n}\n","import { FirebaseApp } from 'firebase/app';\nimport { Auth, User, UserCredential } from 'firebase/auth';\nimport {\n  CollectionReference,\n  DocumentData,\n  DocumentReference,\n  DocumentSnapshot,\n  FieldValue,\n  Firestore,\n  OrderByDirection,\n  Query,\n  QueryDocumentSnapshot,\n  WriteBatch,\n} from 'firebase/firestore';\nimport {\n  FirebaseStorage,\n  StorageReference,\n  TaskState,\n  UploadTask,\n  UploadTaskSnapshot,\n} from 'firebase/storage';\n\nexport type FireUser = User;\nexport type FireApp = FirebaseApp;\n\nexport type FireStorage = FirebaseStorage;\nexport type FireStorageReference = StorageReference;\nexport type FireUploadTaskSnapshot = UploadTaskSnapshot;\nexport type FireUploadTask = UploadTask;\nexport type FireStoragePutFileResult = {\n  task: FireUploadTask;\n  taskResult: Promise<FireUploadTaskSnapshot>;\n  downloadUrl: Promise<string>;\n};\n\nexport type FireAuth = Auth;\nexport type FireAuthUserCredentials = UserCredential;\n\nexport type FireStore = Firestore;\nexport type FireStoreBatch = WriteBatch;\nexport type FireStoreTimeStamp = FieldValue;\nexport type FireStoreDocumentRef = DocumentReference;\nexport type FireStoreDocumentSnapshot = DocumentSnapshot<DocumentData>;\nexport type FireStoreCollectionRef = CollectionReference;\nexport type FireStoreQueryDocumentSnapshot = QueryDocumentSnapshot;\nexport type FireStoreQuery = Query;\nexport type FireStoreQueryOrder = OrderByDirection;\n\nexport const TASK_PAUSED = 'paused' as TaskState;\nexport const TASK_RUNNING = 'running' as TaskState;\nexport const TASK_CANCELED = 'cancelled' as TaskState;\n","import {\n  doc,\n  getDoc,\n  getDocs,\n  limit,\n  query,\n  QueryConstraint,\n  startAfter,\n  startAt,\n} from 'firebase/firestore';\nimport { ref } from 'firebase/storage';\nimport {\n  FireStoreCollectionRef,\n  FireStoreDocumentSnapshot,\n  FireStoreQuery,\n} from 'misc/firebase-models';\nimport { IFirestoreLogger, messageTypes } from '../../misc';\n\nexport function setQueryCursor(\n  document: FireStoreDocumentSnapshot,\n  params: messageTypes.IParamsGetList,\n  resourceName: string\n) {\n  const key = btoa(JSON.stringify({ ...params, resourceName }));\n  localStorage.setItem(key, document.id);\n\n  const allCursorsKey = `ra-firebase-cursor-keys_${resourceName}`;\n  const localCursorKeys = localStorage.getItem(allCursorsKey);\n  if (!localCursorKeys) {\n    localStorage.setItem(allCursorsKey, JSON.stringify([key]));\n  } else {\n    const cursors: string[] = JSON.parse(localCursorKeys);\n    const newCursors = cursors.concat(key);\n    localStorage.setItem(allCursorsKey, JSON.stringify(newCursors));\n  }\n}\n\nexport async function getQueryCursor(\n  collection: FireStoreCollectionRef,\n  params: messageTypes.IParamsGetList,\n  resourceName: string,\n  flogger: IFirestoreLogger\n): Promise<FireStoreDocumentSnapshot | false> {\n  const key = btoa(JSON.stringify({ ...params, resourceName }));\n  const docId = localStorage.getItem(key);\n  if (!docId) {\n    return false;\n  }\n\n  const docSnapshot = await getDoc(doc(collection, docId));\n  flogger.logDocument(1)();\n  if (docSnapshot.exists()) {\n    return docSnapshot;\n  }\n  return false;\n}\n\nexport function clearQueryCursors(resourceName: string) {\n  const allCursorsKey = `ra-firebase-cursor-keys_${resourceName}`;\n  const localCursorKeys = localStorage.getItem(allCursorsKey);\n  if (localCursorKeys) {\n    const cursors: string[] = JSON.parse(localCursorKeys);\n    cursors.forEach((cursor) => localStorage.removeItem(cursor));\n    localStorage.removeItem(allCursorsKey);\n  }\n}\n\nexport async function findLastQueryCursor(\n  collection: FireStoreCollectionRef,\n  queryConstraints: QueryConstraint[],\n  params: messageTypes.IParamsGetList,\n  resourceName: string,\n  flogger: IFirestoreLogger\n) {\n  const { page, perPage } = params.pagination;\n\n  let lastQueryCursor: FireStoreDocumentSnapshot | false = false;\n  let currentPage = page - 1;\n\n  const currentPageParams = {\n    ...params,\n    pagination: {\n      ...params.pagination,\n    },\n  };\n  while (!lastQueryCursor && currentPage > 1) {\n    currentPage--;\n    currentPageParams.pagination.page = currentPage;\n    console.log('getting query cursor currentPage=', currentPage);\n    lastQueryCursor = await getQueryCursor(\n      collection,\n      currentPageParams,\n      resourceName,\n      flogger\n    );\n  }\n  const pageLimit = (page - currentPage) * perPage;\n  const isFirst = currentPage === 1;\n\n  function getQuery() {\n    if (isFirst) {\n      return query(collection, ...[...queryConstraints, limit(pageLimit)]);\n    } else {\n      return query(\n        collection,\n        ...[...queryConstraints, startAfter(lastQueryCursor), limit(pageLimit)]\n      );\n    }\n  }\n\n  const newQuery = getQuery();\n  const snapshots = await getDocs(newQuery);\n  const docsLength = snapshots.docs.length;\n  flogger.logDocument(docsLength)();\n  const lastDocIndex = docsLength - 1;\n  const lastDocRef = snapshots.docs[lastDocIndex];\n  return lastDocRef;\n}\n","import {\n  getDocs,\n  limit,\n  orderBy,\n  query,\n  QueryConstraint,\n  startAfter,\n  where,\n} from 'firebase/firestore';\nimport {\n  FireStoreCollectionRef,\n  FireStoreQuery,\n  FireStoreQueryOrder,\n} from 'misc/firebase-models';\nimport { IFirestoreLogger, messageTypes } from '../../misc';\nimport { findLastQueryCursor, getQueryCursor } from './queryCursors';\n\ninterface ParamsToQueryOptions {\n  filters?: boolean;\n  sort?: boolean;\n  pagination?: boolean;\n}\n\ninterface QueryPair {\n  noPagination: FireStoreQuery;\n  withPagination: FireStoreQuery;\n}\n\nconst defaultParamsToQueryOptions = {\n  filters: true,\n  sort: true,\n  pagination: true,\n};\n\nexport async function paramsToQuery<\n  TParams extends messageTypes.IParamsGetList\n>(\n  collection: FireStoreCollectionRef,\n  params: TParams,\n  resourceName: string,\n  flogger: IFirestoreLogger,\n  options: ParamsToQueryOptions = defaultParamsToQueryOptions\n): Promise<QueryPair> {\n  const filterConstraints = options.filters\n    ? getFiltersConstraints(params.filter)\n    : [];\n\n  const sortConstraints = options.sort ? getSortConstraints(params.sort) : [];\n\n  const paginationConstraints = options.pagination\n    ? await getPaginationConstraints(\n        collection,\n        [...filterConstraints, ...sortConstraints],\n        params,\n        resourceName,\n        flogger\n      )\n    : [];\n\n  return {\n    noPagination: query(\n      collection,\n      ...[...filterConstraints, ...sortConstraints]\n    ),\n    withPagination: query(\n      collection,\n      ...[...filterConstraints, ...sortConstraints, ...paginationConstraints]\n    ),\n  };\n}\n\nexport function getFiltersConstraints(filters: {\n  [fieldName: string]: any;\n}): QueryConstraint[] {\n  return Object.entries(filters).flatMap(([fieldName, fieldValue]) => {\n    if (Array.isArray(fieldValue)) {\n      return [where(fieldName, 'array-contains-any', fieldValue)];\n    } else if (Object.keys(filters).length === 1 && isNaN(fieldValue)) {\n      return [\n        where(fieldName, '>=', fieldValue),\n        where(fieldName, '<', fieldValue + 'z'),\n      ];\n    } else {\n      return [where(fieldName, '==', fieldValue)];\n    }\n  });\n}\n\nexport function getSortConstraints(sort: {\n  field: string;\n  order: string;\n}): QueryConstraint[] {\n  if (sort != null && sort.field !== 'id') {\n    const { field, order } = sort;\n    const parsedOrder = order.toLocaleLowerCase() as FireStoreQueryOrder;\n    return [orderBy(field, parsedOrder)];\n  }\n  return [];\n}\n\nasync function getPaginationConstraints<\n  TParams extends messageTypes.IParamsGetList\n>(\n  collectionRef: FireStoreCollectionRef,\n  queryConstraints: QueryConstraint[],\n  params: TParams,\n  resourceName: string,\n  flogger: IFirestoreLogger\n): Promise<QueryConstraint[]> {\n  const { page, perPage } = params.pagination;\n\n  if (page === 1) {\n    return [limit(perPage)];\n  } else {\n    let queryCursor = await getQueryCursor(\n      collectionRef,\n      params,\n      resourceName,\n      flogger\n    );\n    if (!queryCursor) {\n      queryCursor = await findLastQueryCursor(\n        collectionRef,\n        queryConstraints,\n        params,\n        resourceName,\n        flogger\n      );\n    }\n    return [startAfter(queryCursor), limit(perPage)];\n  }\n}\n\nexport function getFullParamsForQuery<\n  TParams extends messageTypes.IParamsGetList\n>(reactAdminParams: TParams, softdeleteEnabled: boolean): TParams {\n  return {\n    ...reactAdminParams,\n    filter: softdeleteEnabled\n      ? {\n          deleted: false,\n          ...reactAdminParams.filter,\n        }\n      : reactAdminParams.filter,\n  };\n}\n\nexport function getNextPageParams<TParams extends messageTypes.IParamsGetList>(\n  params: TParams\n): TParams {\n  return {\n    ...params,\n    pagination: {\n      ...params.pagination,\n      page: params.pagination.page + 1,\n    },\n  };\n}\n","import { getCountFromServer, getDocs } from 'firebase/firestore';\nimport {\n  log,\n  messageTypes,\n  parseFireStoreDocument,\n  recursivelyMapStorageUrls,\n} from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient, IResource, ResourceManager } from '../database';\nimport { RAFirebaseOptions } from '../options';\nimport {\n  getFullParamsForQuery,\n  getNextPageParams,\n  paramsToQuery,\n} from './paramsToQuery';\nimport { setQueryCursor } from './queryCursors';\n\nexport class FirebaseLazyLoadingClient {\n  constructor(\n    private readonly options: RAFirebaseOptions,\n    private readonly rm: ResourceManager,\n    private client: FireClient\n  ) {}\n\n  public async apiGetList<T extends ra.Record>(\n    resourceName: string,\n    reactAdminParams: ra.GetListParams\n  ): Promise<ra.GetListResult<T>> {\n    const r = await this.tryGetResource(resourceName);\n    const params = getFullParamsForQuery(\n      reactAdminParams,\n      !!this.options.softDelete\n    );\n\n    log('apiGetListLazy', { resourceName, params });\n\n    const { noPagination, withPagination } = await paramsToQuery(\n      r.collection,\n      params,\n      resourceName,\n      this.client.flogger\n    );\n\n    const snapshots = await getDocs(withPagination);\n\n    const resultsCount = snapshots.docs.length;\n    if (!resultsCount) {\n      log('apiGetListLazy', {\n        message: 'There are not records for given query',\n      });\n      return { data: [], total: 0 };\n    }\n    this.client.flogger.logDocument(resultsCount)();\n\n    // tslint:disable-next-line\n    const data = snapshots.docs.map((d) => parseFireStoreDocument<T>(d));\n\n    const nextPageCursor = snapshots.docs[snapshots.docs.length - 1];\n    // After fetching documents save queryCursor for next page\n    setQueryCursor(nextPageCursor, getNextPageParams(params), resourceName);\n    // Hardcoded to allow next pages, as we don't have total number of items\n\n    let total = await getCountFromServer(noPagination);\n\n    if (this.options.relativeFilePaths) {\n      const parsedData = await Promise.all(\n        data.map(async (doc: any) => {\n          for (let fieldName in doc) {\n            doc[fieldName] = await recursivelyMapStorageUrls(\n              this.client.fireWrapper,\n              doc[fieldName]\n            );\n          }\n          return doc;\n        })\n      );\n\n      log('apiGetListLazy result', {\n        docs: parsedData,\n        resource: r,\n        collectionPath: r.collection.path,\n      });\n\n      return {\n        data: parsedData,\n        total: total.data().count,\n      };\n    }\n\n    log('apiGetListLazy result', {\n      docs: data,\n      resource: r,\n      collectionPath: r.collection.path,\n    });\n\n    return { data, total: total.data().count };\n  }\n\n  public async apiGetManyReference(\n    resourceName: string,\n    reactAdminParams: messageTypes.IParamsGetManyReference\n  ): Promise<messageTypes.IResponseGetManyReference> {\n    const r = await this.tryGetResource(resourceName);\n    log('apiGetManyReferenceLazy', {\n      resourceName,\n      resource: r,\n      reactAdminParams,\n    });\n    const filterWithTarget = {\n      ...reactAdminParams.filter,\n      [reactAdminParams.target]: reactAdminParams.id,\n    };\n    const params = getFullParamsForQuery(\n      {\n        ...reactAdminParams,\n        filter: filterWithTarget,\n      },\n      !!this.options.softDelete\n    );\n\n    const { withPagination } = await paramsToQuery(\n      r.collection,\n      params,\n      resourceName,\n      this.client.flogger\n    );\n\n    const snapshots = await getDocs(withPagination);\n    const resultsCount = snapshots.docs.length;\n    this.client.flogger.logDocument(resultsCount)();\n    const data = snapshots.docs.map(parseFireStoreDocument);\n    if (this.options.relativeFilePaths) {\n      const parsedData = await Promise.all(\n        data.map(async (doc: any) => {\n          for (let fieldName in doc) {\n            doc[fieldName] = await recursivelyMapStorageUrls(\n              this.client.fireWrapper,\n              doc[fieldName]\n            );\n          }\n          return doc;\n        })\n      );\n\n      log('apiGetManyReferenceLazy result', {\n        docs: parsedData,\n        resource: r,\n        collectionPath: r.collection.path,\n      });\n\n      return {\n        data: parsedData,\n        total: data.length,\n      };\n    }\n\n    log('apiGetManyReferenceLazy result', {\n      docs: data,\n      resource: r,\n      collectionPath: r.collection.path,\n    });\n    return { data, total: data.length };\n  }\n\n  private async tryGetResource(\n    resourceName: string,\n    collectionQuery?: messageTypes.CollectionQueryType\n  ): Promise<IResource> {\n    return this.rm.TryGetResourcePromise(resourceName, collectionQuery);\n  }\n}\n","import {\n  filterArray,\n  log,\n  recursivelyMapStorageUrls,\n  sortArray,\n} from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\nimport { FirebaseLazyLoadingClient } from '../lazy-loading/FirebaseLazyLoadingClient';\n\nexport async function GetList<T extends ra.Record>(\n  resourceName: string,\n  params: ra.GetListParams,\n  client: FireClient\n): Promise<ra.GetListResult<T>> {\n  log('GetList', { resourceName, params });\n  const { rm, fireWrapper, options } = client;\n\n  if (options?.lazyLoading?.enabled) {\n    const lazyClient = new FirebaseLazyLoadingClient(options, rm, client);\n    return lazyClient.apiGetList<T>(resourceName, params);\n  }\n\n  const filterSafe = params.filter || {};\n\n  const collectionQuery = filterSafe.collectionQuery;\n  delete filterSafe.collectionQuery;\n\n  const r = await rm.TryGetResource(resourceName, 'REFRESH', collectionQuery);\n  const data = r.list;\n  if (params.sort != null) {\n    const { field, order } = params.sort;\n    if (order === 'ASC') {\n      sortArray(data, field, 'asc');\n    } else {\n      sortArray(data, field, 'desc');\n    }\n  }\n  let softDeleted = data;\n  if (options.softDelete && !Object.keys(filterSafe).includes('deleted')) {\n    softDeleted = data.filter((doc) => !doc.deleted);\n  }\n  const filteredData = filterArray(softDeleted, filterSafe);\n  const pageStart = (params.pagination.page - 1) * params.pagination.perPage;\n  const pageEnd = pageStart + params.pagination.perPage;\n  const dataPage = filteredData.slice(pageStart, pageEnd) as T[];\n  const total = filteredData.length;\n\n  if (options.relativeFilePaths) {\n    const fetchedData = await Promise.all(\n      dataPage.map((doc) => recursivelyMapStorageUrls(fireWrapper, doc))\n    );\n    return {\n      data: fetchedData,\n      total,\n    };\n  }\n\n  return {\n    data: dataPage,\n    total,\n  };\n}\n","import { doc, getDoc } from 'firebase/firestore';\nimport { log, recursivelyMapStorageUrls } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\n\nexport async function GetMany<T extends ra.Record>(\n  resourceName: string,\n  params: ra.GetManyParams,\n  client: FireClient\n): Promise<ra.GetManyResult<T>> {\n  const { rm, options, fireWrapper } = client;\n  const r = await rm.TryGetResource(resourceName);\n  const ids = params.ids;\n  log('GetMany', { resourceName, resource: r, params, ids });\n  const matchDocSnaps = await Promise.all(\n    ids.map((idObj) => {\n      if (typeof idObj === 'string') {\n        return getDoc(doc(r.collection, idObj));\n      }\n      // Will get and resolve reference documents into the current doc\n      return getDoc(doc(r.collection, (idObj as any)['___refid']));\n    })\n  );\n  client.flogger.logDocument(ids.length)();\n  const matches = matchDocSnaps.map(\n    (snap) => ({ ...snap.data(), id: snap.id } as T)\n  );\n  const permittedData = options.softDelete\n    ? matches.filter((row) => !row['deleted'])\n    : matches;\n  if (options.relativeFilePaths) {\n    const data = await Promise.all(\n      permittedData.map((d) => recursivelyMapStorageUrls(fireWrapper, d))\n    );\n    return {\n      data,\n    };\n  }\n\n  return {\n    data: permittedData,\n  };\n}\n","import {\n  filterArray,\n  log,\n  recursivelyMapStorageUrls,\n  sortArray,\n} from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\n\nexport async function GetManyReference<T extends ra.Record>(\n  resourceName: string,\n  params: ra.GetManyReferenceParams,\n  client: FireClient\n): Promise<ra.GetManyReferenceResult<T>> {\n  const { rm, options, fireWrapper } = client;\n  log('GetManyReference', { resourceName, params });\n  const filterSafe = params.filter || {};\n  const collectionQuery = filterSafe.collectionQuery;\n  const r = await rm.TryGetResource(resourceName, 'REFRESH', collectionQuery);\n  delete filterSafe.collectionQuery;\n  log('apiGetManyReference', { resourceName, resource: r, params });\n  const data = r.list;\n  const targetField = params.target;\n  const targetValue = params.id;\n  let softDeleted = data;\n  if (options.softDelete) {\n    softDeleted = data.filter((doc) => !doc['deleted']);\n  }\n  const filteredData = filterArray(softDeleted, filterSafe);\n  const targetIdFilter: Record<string, ra.Identifier> = {};\n  targetIdFilter[targetField] = targetValue;\n  const permittedData = filterArray(filteredData, targetIdFilter);\n  if (params.sort != null) {\n    const { field, order } = params.sort;\n    if (order === 'ASC') {\n      sortArray(permittedData, field, 'asc');\n    } else {\n      sortArray(permittedData, field, 'desc');\n    }\n  }\n  const pageStart = (params.pagination.page - 1) * params.pagination.perPage;\n  const pageEnd = pageStart + params.pagination.perPage;\n  const dataPage = permittedData.slice(pageStart, pageEnd) as T[];\n  const total = permittedData.length;\n\n  if (options.relativeFilePaths) {\n    const fetchedData = await Promise.all(\n      permittedData.map((doc) => recursivelyMapStorageUrls(fireWrapper, doc))\n    );\n    return { data: fetchedData, total };\n  }\n\n  return { data: dataPage, total };\n}\n","import { log, translateDocFromFirestore } from '../../misc';\nimport * as ra from '../../misc/react-admin-models';\nimport { FireClient } from '../database/FireClient';\n\nexport async function GetOne<T extends ra.Record>(\n  resourceName: string,\n  params: ra.GetOneParams,\n  client: FireClient\n): Promise<ra.GetOneResult<T>> {\n  log('GetOne', { resourceName, params });\n  const { rm } = client;\n  try {\n    const id = params.id + '';\n    const dataSingle = await rm.GetSingleDoc(resourceName, id);\n    client.flogger.logDocument(1)();\n    return { data: dataSingle as T };\n  } catch (error) {\n    throw new Error(\n      'Error getting id: ' + params.id + ' from collection: ' + resourceName\n    );\n  }\n}\n","import {\n  getAbsolutePath,\n  log,\n  logError,\n  logger,\n  MakeFirestoreLogger,\n  retrieveStatusCode,\n} from '../misc';\nimport { FireApp } from '../misc/firebase-models';\nimport * as ra from '../misc/react-admin-models';\nimport { Create, Delete, DeleteMany, Update, UpdateMany } from './commands';\nimport { FirebaseWrapper } from './database/firebase/FirebaseWrapper';\nimport { FireClient } from './database/FireClient';\nimport { RAFirebaseOptions } from './options';\nimport { GetList, GetMany, GetManyReference, GetOne } from './queries';\n\nexport interface IDataProvider extends ra.DataProvider {\n  app: FireApp;\n}\n\nexport function DataProvider(\n  firebaseConfig: {},\n  optionsInput?: RAFirebaseOptions\n): IDataProvider {\n  const options = optionsInput || {};\n  verifyDataProviderArgs(firebaseConfig, options);\n\n  const flogger = MakeFirestoreLogger(options);\n  logger.SetEnabled(!!options?.logging);\n  flogger.SetEnabled(!!options?.firestoreCostsLogger?.enabled);\n  flogger.ResetCount(!options?.firestoreCostsLogger?.persistCount);\n  log('Creating FirebaseDataProvider', {\n    firebaseConfig,\n    options,\n  });\n\n  const fireWrapper = new FirebaseWrapper(optionsInput, firebaseConfig);\n\n  async function run<T>(cb: () => Promise<T>) {\n    let res: any;\n    try {\n      res = await cb();\n      return res;\n    } catch (error) {\n      const errorMsg = ((error as any) || '').toString();\n      const code = retrieveStatusCode(errorMsg);\n      const errorObj = { status: code, message: errorMsg, json: res };\n      logError('DataProvider:', error, { errorMsg, code, errorObj });\n      throw errorObj;\n    }\n  }\n  const client = new FireClient(fireWrapper, options, flogger);\n\n  const newProviderApi: IDataProvider = {\n    app: fireWrapper.GetApp(),\n    getList<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.GetListParams\n    ): Promise<ra.GetListResult<RecordType>> {\n      return run(() => GetList<RecordType>(resource, params, client));\n    },\n    getOne<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.GetOneParams\n    ): Promise<ra.GetOneResult<RecordType>> {\n      return run(() => GetOne<RecordType>(resource, params, client));\n    },\n    getMany<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.GetManyParams\n    ): Promise<ra.GetManyResult<RecordType>> {\n      return run(() => GetMany<RecordType>(resource, params, client));\n    },\n    getManyReference<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.GetManyReferenceParams\n    ): Promise<ra.GetManyReferenceResult<RecordType>> {\n      return run(() => GetManyReference<RecordType>(resource, params, client));\n    },\n    update<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.UpdateParams\n    ): Promise<ra.UpdateResult<RecordType>> {\n      return run(() => Update<RecordType>(resource, params, client));\n    },\n    updateMany(\n      resource: string,\n      params: ra.UpdateManyParams\n    ): Promise<ra.UpdateManyResult> {\n      return run(() => UpdateMany(resource, params, client));\n    },\n    create<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.CreateParams\n    ): Promise<ra.CreateResult<RecordType>> {\n      return run(() => Create<RecordType>(resource, params, client));\n    },\n    delete<RecordType extends ra.Record = ra.Record>(\n      resource: string,\n      params: ra.DeleteParams\n    ): Promise<ra.DeleteResult<RecordType>> {\n      return run(() => Delete(resource, params, client));\n    },\n    deleteMany(\n      resource: string,\n      params: ra.DeleteManyParams\n    ): Promise<ra.DeleteManyResult> {\n      return run(() => DeleteMany(resource, params, client));\n    },\n  };\n\n  return newProviderApi;\n}\n\nfunction verifyDataProviderArgs(\n  firebaseConfig: {},\n  options?: RAFirebaseOptions\n) {\n  const hasNoApp = !options || !options.app;\n  const hasNoConfig = !firebaseConfig;\n  if (hasNoConfig && hasNoApp) {\n    throw new Error(\n      'Please pass the Firebase firebaseConfig object or options.app to the FirebaseAuthProvider'\n    );\n  }\n  if (options && options.rootRef) {\n    // Will throw error if rootRef doesn't point to a document\n    getAbsolutePath(options.rootRef, 'test');\n  }\n}\n"],"names":["sortArray","data","field","dir","sort","a","b","get","rawB","isAsc","Number","isFinite","rawA","basicSort","toLowerCase","Date","aValue","bValue","filterArray","searchFields","isEmpty","searchObjs","Object","keys","map","fieldName","getSubObjects","value","searchField","searchValue","tree","leaves","obj","path","key","hasOwnProperty","objVal","Array","recursivelyWalk","currentPath","push","getFieldReferences","apply","filter","row","reduce","acc","cur","res","searchThis","toString","includes","isArray","doesRowMatch","LogNoOp","LoggerBase","title","cacheEnabledKey","this","isEnabled","localStorage","getItem","SetEnabled","setItem","removeItem","console","log","bind","warn","error","logger","KEY_SINGLE","logError","dispatch","eventName","fileName","eventMonitor","document","getElementById","event","CustomEvent","detail","dispatchEvent","REF_INDENTIFIER","translateDocFromFirestore","parsedDoc","refdocs","recusivelyCheckObjectValue","result","input","fieldPath","toDate","index","isInputADocReference","documentReference","refDocPath","id","firestore","parent","recursivelyMapStorageUrls","fireWrapper","fieldValue","_exit","_temp2","_result","Promise","all","_recursivelyMapStorag","resolve","_recursivelyMapStorag2","e","reject","isFileField","has","getDownloadURL","ref","storage","src","then","_fieldValue$src","_catch","parseFireStoreDocument","doc","logWarn","refDocs","d","set","applyRefDocs","dataWithRefs","getAbsolutePath","rootRef","relativePath","Error","rootRefValue","withSlashes","join","split","length","slice","joinPaths","call","arguments","translateDocToFirestore","uploads","recusivelyParseObjectValue","fieldDotsPath","refPath","fieldSlashesPath","rawFile","FirebaseWrapper","inputOptions","firebaseConfig","_app","_firestore","_storage","_auth","options","optionsSafe","window","app","apps","getApps","getApp","ObtainFirebaseApp","getFirestore","getStorage","getAuth","_proto","prototype","dbGetCollection","absolutePath","dbCreateBatch","writeBatch","dbMakeNewId","collection","OnUserLogout","callBack","onAuthStateChanged","user","isLoggedOut","putFile","storagePath","uploadBytesResumable","taskResult","rej","task","t","url","downloadUrl","getStorageDownloadUrl","fieldSrc","serverTimestamp","firestoreServerTimestamp","authSetPersistence","persistenceInput","persistenceResolved","browserLocalPersistence","inMemoryPersistence","browserSessionPersistence","setPersistence","authSigninEmailPassword","email","password","signInWithEmailAndPassword","authSignOut","signOut","authGetUserLoggedIn","_this5","auth","currentUser","unsubscribe","GetUserLogin","GetApp","db","AuthClient","optionsInput","persistence","HandleAuthLogin","params","_this","username","getUserLogin","HandleAuthLogout","HandleAuthError","errorHttp","retrieveStatusTxt","status","HandleAuthCheck","HandleGetPermissions","_this3","getIdTokenResult","token","claims","HandleGetIdentity","_this4","_ref","displayName","photoURL","uid","fullName","avatar","HandleGetJWTAuthTime","authTime","HandleGetJWTExpirationTime","_this6","expirationTime","HandleGetJWTSignInProvider","_this7","signInProvider","HandleGetJWTIssuedAtTime","_this8","issuedAtTime","HandleGetJWTToken","_this9","AuthProvider","VerifyAuthProviderArgs","logging","login","logout","checkAuth","checkError","getPermissions","getIdentity","getAuthUser","getJWTAuthTime","getJWTExpirationTime","getJWTSignInProvider","getJWTClaims","getJWTToken","Create","resourceName","client","rm","TryGetResource","r","newId","parseDataAndUpload","docObj","_extends","checkRemoveIdField","addCreatedByFields","addUpdatedByFields","docObjTransformed","transformToDb","setDoc","merge","resource","hasOverridenDocId","overridenId","getDoc","_getDoc","exists","createData","createDocObj","createDocObjTransformed","_data","Delete","softDelete","deleted","updateDoc","previousData","DeleteSoft","_temp","deleteDoc","DeleteMany","DeleteManySoft","ids","idStr","returnData","_step","_iterator","done","docToDelete","batch","commit","Update","UpdateMany","ResourceManager","flogger","resources","refresh","collectionQuery","_this2","TryGetResourcePromise","RefreshResource","GetResource","initPath","_this4$options","_this4$options$lazyLo","lazyLoading","enabled","collectionRef","collectionOrQuery","applyQuery","getDocs","newDocs","list","forEach","logDocument","docs","collectionPath","GetSingleDoc","docId","docSnap","hasBeenInited","pathAbsolute","allResources","getUserIdentifier","associateUsersById","getCurrentUserId","getCurrentUserEmail","collRef","FireClient","dontAddIdFieldToDoc","documentData","docPath","u","parseStoragePath","useFileName","fileNameBits","File","name","fileExtension","pop","useFileNamesInStorage","saveFile","link","AddCreatedByFields","disableMeta","currentUserIdentifier","createAtSelector","GetSelectorsCreateAt","renameMetaFields","created_at","casing","metaFieldCasing","defautCase","createBySelector","GetSelectorsCreateBy","created_by","AddUpdatedByFields","updateAtSelector","GetSelectorsUpdateAt","updated_at","updateBySelector","updated_by","GetSelectorsUpdateBy","_this4$fireWrapper$pu","on","snapshot","progress","bytesTransferred","totalBytes","state","relativeFilePaths","storageError","pact","s","_Pact","o","_settle","v","observer","onFulfilled","onRejected","callback","thenable","getQueryCursor","btoa","JSON","stringify","docSnapshot","paramsToQuery","defaultParamsToQueryOptions","paginationConstraints","noPagination","query","filterConstraints","sortConstraints","withPagination","concat","filters","entries","flatMap","where","isNaN","parsedOrder","order","toLocaleLowerCase","orderBy","getSortConstraints","getPaginationConstraints","pagination","queryConstraints","_params$pagination","perPage","page","limit","queryCursor","_temp3","startAfter","findLastQueryCursor","pageLimit","currentPage","newQuery","lastQueryCursor","snapshots","docsLength","currentPageParams","_getQueryCursor","_findLastQueryCursor","getFullParamsForQuery","reactAdminParams","softdeleteEnabled","FirebaseLazyLoadingClient","apiGetList","tryGetResource","resultsCount","message","total","allCursorsKey","localCursorKeys","newCursors","parse","setQueryCursor","getNextPageParams","getCountFromServer","count","parsedData","_data$total","apiGetManyReference","_extends2","filterWithTarget","target","_ref2","_exit2","_temp5","_result2","_temp6","_temp4","GetList","_options$lazyLoading","lazyClient","filterSafe","dataPage","softDeleted","filteredData","pageStart","fetchedData","GetMany","idObj","matchDocSnaps","permittedData","matches","snap","GetManyReference","targetField","targetIdFilter","targetValue","_params$sort","GetOne","dataSingle","DataProvider","_options$firestoreCos","_options$firestoreCos2","run","cb","_cb","errorMsg","code","statusTxt","regexResult","exec","retrieveStatusCode","errorObj","json","verifyDataProviderArgs","ResetCount","shouldReset","docCount","incrementBy","currentCountRaw","parseInt","incremented","incrementRead","MakeFirestoreLogger","firestoreCostsLogger","persistCount","getList","getOne","getMany","getManyReference","update","updateMany","create","deleteMany"],"mappings":"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"}