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