{"version":3,"file":"simplyfire.mjs","sources":["../../packages/ngx/db/AbstractFirestoreApi.ts","../../packages/ngx/db/QueryBuilder.ts","../../packages/ngx/utils/arrays.ts","../../packages/lib/functions/firestore.ts","../../packages/lib/index.ts","../../packages/public-api.ts","../../packages/simplyfire.ts"],"sourcesContent":["import type {\n  DocumentData,\n  DocumentReference,\n  DocumentSnapshot,\n  FieldValue,\n  QuerySnapshot,\n  SetOptions,\n  Transaction,\n  WriteBatch\n} from '@firebase/firestore-types';\nimport { QueryBuilder } from './QueryBuilder';\n\nexport abstract class AbstractFirestoreApi {\n  // Maximum number of writes that can be passed to a Commit operation\n  // or performed in a transaction\n  // https://cloud.google.com/firestore/quotas#writes_and_transactions\n  BATCH_MAX_WRITES = 500;\n\n  abstract collection<T = any>(path: string, qb?: QueryBuilder, maxAge?: number): Promise<T[]>;\n  abstract collectionGroup<T = any>(collectionId: string, qb?: QueryBuilder, maxAge?: number): Promise<T[]>;\n  abstract collectionSnapshot(path: string, qb?: QueryBuilder): Promise<QuerySnapshot<DocumentData>>;\n  abstract doc<T = any>(path: string, maxAge?: number): Promise<T>;\n  abstract docRef(docPath: string): DocumentReference<DocumentData>;\n\n  abstract upsert(collection: string, data: { [key: string]: any }, opts?: SetOptions): Promise<string>;\n  abstract update(docPath: string, data: { [key: string]: any }): Promise<void>;\n  abstract delete(docPath: string): Promise<void>;\n\n  abstract bulkUpsert(\n    collection: string,\n    data: DocumentData[] | { data: DocumentData; qb?: QueryBuilder },\n    opts?: SetOptions\n  ): Promise<string[]>;\n  abstract bulkDelete(collection: string, qb?: QueryBuilder): Promise<string[]>;\n  abstract runTransaction(updateFunction: (transaction: Transaction) => Promise<unknown>): Promise<unknown>;\n\n  abstract get batch(): WriteBatch;\n  abstract get serverTimestamp(): FieldValue;\n\n  abstract increment(n?: number): FieldValue;\n\n  abstract createId(collection?: string): string;\n\n  getValueFromSnapshot<T = any>(snapshot: DocumentSnapshot): T {\n    return (snapshot.exists ? snapshot.data() : null) as T;\n  }\n}\n","import type {\n  CollectionReference,\n  DocumentData,\n  DocumentSnapshot,\n  FieldPath,\n  OrderByDirection,\n  Query,\n  WhereFilterOp\n} from '@firebase/firestore-types';\n\ntype QueryWhere = [fieldPath: string | FieldPath, opStr: WhereFilterOp, value: unknown];\ntype QueryOrderBy = [fieldPath: string | FieldPath, directionStr?: OrderByDirection];\ntype QueryLeftJoin = [idField: string, collection: string, alias: string];\ntype QueryCursor = [snapshot: DocumentSnapshot<unknown>] | unknown[];\n\ndeclare const window: any;\n\nexport class QueryBuilder {\n  private _where: QueryWhere[] = [];\n  private _orderBy: QueryOrderBy[] = [];\n  private _leftJoins: QueryLeftJoin[] = [];\n  private _limit?: number;\n  private _limitToLast?: number;\n  private _startAt?: QueryCursor;\n  private _startAfter?: QueryCursor;\n  private _endAt?: QueryCursor;\n  private _endBefore?: QueryCursor;\n\n  get joins() {\n    return this._leftJoins;\n  }\n\n  where(...where: QueryWhere) {\n    this._where.push(where);\n\n    return this;\n  }\n\n  orderBy(...orderBy: QueryOrderBy) {\n    this._orderBy.push(orderBy);\n\n    return this;\n  }\n\n  leftJoin(...leftJoin: QueryLeftJoin) {\n    this._leftJoins.push(leftJoin);\n  }\n\n  limit(limit: number) {\n    this._limit = limit;\n    return this;\n  }\n\n  limitToLast(limitToLast: number) {\n    this._limitToLast = limitToLast;\n    return this;\n  }\n\n  startAt(...startAt: QueryCursor) {\n    this._startAt = startAt;\n    return this;\n  }\n\n  startAfter(...startAfter: QueryCursor) {\n    this._startAfter = startAfter;\n    return this;\n  }\n\n  endAt(...endAt: QueryCursor) {\n    this._endAt = endAt;\n    return this;\n  }\n\n  endBefore(...endBefore: QueryCursor) {\n    this._endBefore = endBefore;\n    return this;\n  }\n\n  // Still have to use <any> type due to most interfaces of @google-cloud/firestore\n  // are not compatible with @firebase/firestore's interfaces.\n  exec(ref: CollectionReference<DocumentData> | any, queryOps?: { [key: string]: any }): Query<DocumentData> | any {\n    if (typeof window === 'undefined') {\n      return this.execQueryForCloud(ref);\n    }\n\n    if (!queryOps) {\n      throw Error('invalid arguments');\n    }\n\n    const { query, where, orderBy, limit, limitToLast, startAt, startAfter, endAt, endBefore } = queryOps;\n\n    const queryConstraints = [\n      ...this._where.map((w) => where(...w)),\n      ...this._orderBy.map((o) => orderBy(...o)),\n      ...(this._limit ? [limit(this._limit)] : []),\n      ...(this._limitToLast ? [limitToLast(this._limitToLast)] : []),\n      ...(this._startAt?.every((i) => !!i) ? [startAt(...this._startAt)] : []),\n      ...(this._startAfter?.every((i) => !!i) ? [startAfter(...this._startAfter)] : []),\n      ...(this._endAt?.every((i) => !!i) ? [endAt(...this._endAt)] : []),\n      ...(this._endBefore?.every((i) => !!i) ? [endBefore(...this._endBefore)] : [])\n    ];\n\n    return query(ref, ...queryConstraints);\n  }\n\n  private execQueryForCloud(ref: CollectionReference<DocumentData>): Query<DocumentData> {\n    let query = this._where.reduce((q, wh) => q.where(...wh), ref);\n    query = this._orderBy.reduce((q, ob) => q.orderBy(...ob), query);\n\n    if (this._limit) {\n      query = query.limit(this._limit);\n    }\n\n    if (this._limitToLast) {\n      query = query.limitToLast(this._limitToLast);\n    }\n\n    if (this._startAt) {\n      query = query.startAt(this._startAt);\n    }\n\n    if (this._startAfter) {\n      query = query.startAfter(this._startAfter);\n    }\n\n    if (this._endAt) {\n      query = query.endAt(this._endAt);\n    }\n\n    if (this._endBefore) {\n      query = query.endBefore(this._endBefore);\n    }\n\n    return query;\n  }\n}\n","// chunk array to a certain size\nexport const arrayToChunks = (list: any[], size: number) => {\n  list = [...list];\n\n  return [...Array(Math.ceil(list.length / size))].map((_) => list.splice(0, size));\n};\n","import type {\n  QuerySnapshot,\n  WriteBatch,\n  DocumentData,\n  SetOptions,\n  DocumentReference,\n  FirebaseFirestore,\n  Transaction,\n  CollectionReference,\n  Settings as FirestoreSettings\n} from '@firebase/firestore-types';\n\nimport { AbstractFirestoreApi, QueryBuilder } from '../../ngx/db';\nimport { arrayToChunks } from '../utils';\n\ntype Firestore = FirebaseFirestore;\n\nexport class FirestoreCloudService extends AbstractFirestoreApi {\n  private db: Firestore;\n  private admin: any;\n\n  private static instance: FirestoreCloudService = null;\n\n  static getInstance(admin: any, settings: FirestoreSettings = {}) {\n    this.instance ??= new this();\n    this.instance.initialize(admin, settings);\n\n    return this.instance;\n  }\n\n  initialize(admin: any, settings: FirestoreSettings) {\n    admin.initializeApp();\n\n    this.db = admin.firestore() as Firestore;\n    this.db.settings(settings);\n    this.admin = admin;\n  }\n\n  // -----------------------------------------------------------------------------------------------------\n  // @ Abstract members\n  // -----------------------------------------------------------------------------------------------------\n  async collection<T = any>(collection: string, qb?: QueryBuilder): Promise<T[]> {\n    return (await this.collectionSnapshot(collection, qb)).docs.map((doc) => ({ id: doc.id, ...doc.data() } as any));\n  }\n\n  async collectionGroup<T = any>(collectionId: string, qb?: QueryBuilder): Promise<T[]> {\n    return (await this.collectionGroupSnapshot(collectionId, qb)).docs.map(\n      (doc) => ({ id: doc.id, ...doc.data() } as any)\n    );\n  }\n\n  async doc<T = any>(path: string): Promise<T> {\n    const snapshot = await this.docRef(path).get();\n    return (snapshot.exists && ({ id: snapshot.id, ...snapshot.data() } as any)) || null;\n  }\n\n  async upsert(collection: string, data: { [key: string]: any }, opts: SetOptions = { merge: true }) {\n    const timestamp = this.serverTimestamp;\n\n    // eslint-disable-next-line prefer-const\n    let { id, ...updata } = data;\n    updata.createdTs ??= timestamp;\n\n    if (!id) {\n      id = this.db.collection(collection).doc().id;\n    }\n\n    updata.updatedTs = timestamp;\n    await this.docRef(`${collection}/${id}`).set(Object.assign({}, updata), opts);\n\n    return id;\n  }\n\n  async update(path: string, data: { [key: string]: any }) {\n    await this.docRef(path).update(data);\n  }\n\n  async delete(path: string) {\n    await this.docRef(path).delete();\n  }\n\n  /**\n   * Bulk update data\n   */\n  async bulkUpsert(\n    path: string,\n    data: DocumentData[] | { data: DocumentData; qb?: QueryBuilder },\n    opts: SetOptions = { merge: true }\n  ): Promise<string[]> {\n    const bulkIds = [];\n    const promises = [];\n\n    const timestamp = this.serverTimestamp;\n\n    if (Array.isArray(data)) {\n      // Due to a batch limitation, need to split docs array into chunks\n      for (const chunks of arrayToChunks(data, this.BATCH_MAX_WRITES)) {\n        const batch = this.batch;\n\n        chunks.forEach((d) => {\n          let { id, ...updata } = d;\n          id ??= this.db.collection(path).doc().id;\n          updata.createdTs ??= timestamp;\n          updata.updatedTs = timestamp;\n\n          batch.set(this.docRef(`${path}/${id}`), updata, opts);\n          bulkIds.push(id);\n        });\n        const p = batch.commit();\n        promises.push(p);\n      }\n    } else {\n      const snapshot = await this.collectionSnapshot(path, data.qb);\n      // Due to a batch limitation, need to split docs array into chunks\n      for (const chunks of arrayToChunks(snapshot.docs, this.BATCH_MAX_WRITES)) {\n        const batch = this.batch;\n\n        chunks.forEach((d) => batch.set(d.ref, { updatedTs: timestamp, ...data.data }, opts) && bulkIds.push(d.id));\n\n        const p = batch.commit();\n        promises.push(p);\n      }\n    }\n\n    await Promise.all(promises);\n\n    return bulkIds;\n  }\n\n  /**\n   * Bulk delete data\n   */\n  async bulkDelete(collection: string, qb?: QueryBuilder, maxSize = 1000) {\n    if (!qb) {\n      qb = new QueryBuilder();\n      qb.limit(maxSize);\n    }\n\n    const bulkIds = [];\n    const promises = [];\n    const snapshot: QuerySnapshot = await this.collectionSnapshot(collection, qb);\n\n    // Due to a batch limitation, need to split docs array into chunks\n    for (const chunks of arrayToChunks(snapshot.docs, this.BATCH_MAX_WRITES)) {\n      const batch = this.batch;\n\n      chunks.forEach((doc) => batch.delete(doc.ref) && bulkIds.push(doc.id));\n      const p = batch.commit();\n      promises.push(p);\n    }\n\n    await Promise.all(promises);\n\n    return bulkIds;\n  }\n\n  get batch(): WriteBatch {\n    return this.db.batch();\n  }\n\n  get serverTimestamp() {\n    return this.admin.firestore.FieldValue.serverTimestamp();\n  }\n\n  increment(n = 1) {\n    return this.admin.firestore.FieldValue.increment(n);\n  }\n\n  /**\n   * Returns a generated Firestore Document Id.\n   */\n  createId(colPath?: string) {\n    return this.db.collection(colPath ?? '_').doc().id;\n  }\n\n  runTransaction(updateFunction: (transaction: Transaction) => Promise<unknown>): Promise<unknown> {\n    return this.db.runTransaction(updateFunction);\n  }\n\n  // Recursively delete a reference and log the references of failures.\n  // https://github.com/googleapis/nodejs-firestore/pull/1494\n  recursiveDelete(ref: CollectionReference<unknown> | DocumentReference<unknown>, bulkWriter?: any) {\n    return (this.db as any).recursiveDelete(ref, bulkWriter);\n  }\n\n  // -----------------------------------------------------------------------------------------------------\n  // @ Custom methods\n  // -----------------------------------------------------------------------------------------------------\n\n  /**\n   * Create a Firestore Timestamp\n   *\n   * @param date\n   */\n\n  createTimestamp(date: Date = new Date()) {\n    return this.admin.firestore.Timestamp.fromDate(date);\n  }\n\n  collectionSnapshot(path: string, qb?: QueryBuilder): Promise<QuerySnapshot> {\n    const collectionRef: any = this.db.collection(path);\n\n    return (qb ? qb.exec(collectionRef) : collectionRef).get();\n  }\n\n  collectionGroupSnapshot(collectionId: string, qb?: QueryBuilder): Promise<QuerySnapshot> {\n    const groupRef: any = this.db.collectionGroup(collectionId);\n\n    return (qb ? qb.exec(groupRef) : groupRef).get();\n  }\n\n  docRef(path: string): DocumentReference<DocumentData> {\n    return this.db.doc(path);\n  }\n}\n","/*\n * Public API Surface of common\n */\nexport * from './functions';\nexport * from './utils';\n","/*\n * Public API Surface of common\n */\n\n// export * from './app';\nexport * from './lib';\nexport * from './ngx/db';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}