@entropic-bond/firebase-admin 1.7.18 → 1.7.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("entropic-bond"),p=require("firebase-admin/app"),f=require("firebase-admin/auth"),u=require("firebase-admin/firestore"),y=require("firebase-functions/v2");function g(c){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const t in c)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(c,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>c[t]})}}return e.default=c,Object.freeze(e)}const h=g(y);class n{static setFirebaseConfig(e){n._firebaseConfig=e}constructor(){p.initializeApp(n._firebaseConfig)}static get instance(){return this._instance||(this._instance=new n)}firestore(){return u.getFirestore()}auth(){return f.getAuth()}}class b extends d.DataSource{constructor(e){super(),this._lastLimit=0,e&&h.setGlobalOptions(e)}findById(e,t){const r=n.instance.firestore();return new Promise(async o=>{try{const i=await r.doc(`${t}/${e}`).get();o(i.data())}catch(s){return console.log(s),null}})}save(e){const t=n.instance.firestore(),r=t.batch();return Object.entries(e).forEach(([o,s])=>{s?.forEach(i=>{const a=t.doc(`${o}/${i.id}`);r.set(a,i)})}),r.commit()}find(e,t){const r=this.queryObjectToFirebaseQuery(e,t);return this._lastQuery=r,this.getFromQuery(r)}async count(e,t){return(await this.queryObjectToFirebaseQuery(e,t).count().get()).data().count}delete(e,t){const r=n.instance.firestore();return r.recursiveDelete(r.doc(`${t}/${e}`))}next(e){if(!this._lastQuery)throw new Error("You should perform a query prior to using method next");this._lastLimit=e||this._lastLimit;const t=this._lastQuery.limit(this._lastLimit).startAfter(this._lastDocRetrieved);return this.getFromQuery(t)}getFromQuery(e){return new Promise(async t=>{const r=await e.get();this._lastDocRetrieved=r.docs[r.docs.length-1],t(r.docs.map(o=>o.data()))})}queryObjectToFirebaseQuery(e,t){const r=n.instance.firestore(),o=[],s=[];d.DataSource.toPropertyPathOperations(e.operations).forEach(a=>{const l=this.toFirebaseOperator(a.operator);a.aggregate?s.push(u.Filter.where(a.property,l,a.value)):o.push(u.Filter.where(a.property,l,a.value))});let i=r.collection(t).where(u.Filter.or(...s,u.Filter.and(...o)));return e.sort?.propertyName&&(i=i.orderBy(e.sort.propertyName,e.sort.order)),e.limit&&(this._lastLimit=e.limit,i=i.limit(e.limit)),i}toFirebaseOperator(e){switch(e){case"==":case"!=":case"<":case"<=":case">":case">=":return e;case"contains":return"array-contains";case"containsAny":return"array-contains-any";default:return e}}subscribeToDocumentChangeListener(e,t){const r=h.firestore.onDocumentUpdated(e+"/{docId}",o=>{const s=o.data;t({before:s?.before.data(),after:s?.after.data(),type:"update",params:o.params,collectionPath:e})});return{uninstall:()=>{},nativeHandler:r,collectionPath:e}}async resolveCollectionPaths(e){const t=e.split("/");if(t.length>3||t.length<1)throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${e}`);const[r,o,s]=t;if(!r)throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");const a=await n.instance.firestore().collection(r).get(),l=[];return a.docs.forEach(m=>{s?l.push(`${r}/${m.id}/${s}`):l.push(r)}),l}onCollectionChange(e,t,r){throw new Error("Not implemented yet")}onDocumentChange(e,t,r){throw new Error("Not implemented yet")}}class w extends d.ServerAuthService{async getUser(e){try{return this.convertToUserCredentials(await n.instance.auth().getUser(e))}catch(t){if(t.code==="auth/user-not-found")return;throw new Error(t)}}setCustomCredentials(e,t){return n.instance.auth().setCustomUserClaims(e,t)}async updateUser(e,t){return this.convertToUserCredentials(await n.instance.auth().updateUser(e,t))}async deleteUser(e){try{await n.instance.auth().deleteUser(e)}catch(t){if(t.code==="auth/user-not-found")return;throw new Error(t)}}convertToUserCredentials(e){return{id:e.uid,email:e.email??"",emailVerified:e.emailVerified??void 0,creationDate:e.metadata.creationTime?new Date(e.metadata.creationTime).getTime():void 0,lastLogin:e.metadata.lastSignInTime?new Date(e.metadata.lastSignInTime).getTime():void 0,name:e.displayName,phoneNumber:e.phoneNumber??void 0,pictureUrl:e.photoURL??void 0,customData:e.customClaims}}}exports.FirebaseAdminDatasource=b;exports.FirebaseAdminHelper=n;exports.FirebaseServerAuth=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("entropic-bond"),f=require("firebase-admin/app"),p=require("firebase-admin/auth"),l=require("firebase-admin/firestore"),y=require("firebase-functions/v2");function g(c){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const t in c)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(c,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>c[t]})}}return e.default=c,Object.freeze(e)}const h=g(y);class s{static setFirebaseConfig(e){s._firebaseConfig=e}constructor(){f.initializeApp(s._firebaseConfig)}static get instance(){return this._instance||(this._instance=new s)}firestore(){return l.getFirestore()}auth(){return p.getAuth()}}class b extends d.DataSource{constructor(e){super(),this._lastLimit=0,e&&h.setGlobalOptions(e)}findById(e,t){const r=s.instance.firestore();return new Promise(async n=>{try{const i=await r.doc(`${t}/${e}`).get();n(i.data())}catch(o){return console.log(o),null}})}save(e){const t=s.instance.firestore(),r=t.batch();return Object.entries(e).forEach(([n,o])=>{o?.forEach(i=>{const a=t.doc(`${n}/${i.id}`);r.set(a,i)})}),r.commit()}find(e,t){const r=this.queryObjectToFirebaseQuery(e,t);return this._lastQuery=r,this.getFromQuery(r)}async count(e,t){return(await this.queryObjectToFirebaseQuery(e,t).count().get()).data().count}delete(e,t){const r=s.instance.firestore();return r.recursiveDelete(r.doc(`${t}/${e}`))}next(e){if(!this._lastQuery)throw new Error("You should perform a query prior to using method next");this._lastLimit=e||this._lastLimit;const t=this._lastQuery.limit(this._lastLimit).startAfter(this._lastDocRetrieved);return this.getFromQuery(t)}getFromQuery(e){return new Promise(async t=>{const r=await e.get();this._lastDocRetrieved=r.docs[r.docs.length-1],t(r.docs.map(n=>n.data()))})}queryObjectToFirebaseQuery(e,t){const r=s.instance.firestore(),n=[],o=[];d.DataSource.toPropertyPathOperations(e.operations).forEach(a=>{const u=this.toFirebaseOperator(a.operator);a.aggregate?o.push(l.Filter.where(a.property,u,a.value)):n.push(l.Filter.where(a.property,u,a.value))});let i=r.collection(t).where(l.Filter.or(...o,l.Filter.and(...n)));return e.sort?.propertyName&&(i=i.orderBy(e.sort.propertyName,e.sort.order)),e.limit&&(this._lastLimit=e.limit,i=i.limit(e.limit)),i}toFirebaseOperator(e){switch(e){case"==":case"!=":case"<":case"<=":case">":case">=":return e;case"contains":return"array-contains";case"containsAny":return"array-contains-any";default:return e}}subscribeToDocumentChangeListener(e,t){const r=h.firestore.onDocumentUpdated(e+"/{docId}",n=>{const o=n.data;t({before:o?.before.data(),after:o?.after.data(),type:"update",params:n.params,collectionPath:e})});return{uninstall:()=>{},nativeHandler:r,collectionPath:e}}async resolveCollectionPaths(e){const t=e.split("/");if(t.length>3||t.length<1)throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${e}`);const[r,n,o]=t;if(!r||!n||!o)throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");if(n[0]!=="{")return[e];const a=await s.instance.firestore().collection(r).get(),u=[];return a.docs.forEach(m=>{o?u.push(`${r}/${m.id}/${o}`):u.push(r)}),u}onCollectionChange(e,t,r){throw new Error("Not implemented yet")}onDocumentChange(e,t,r){throw new Error("Not implemented yet")}}class w extends d.ServerAuthService{async getUser(e){try{return this.convertToUserCredentials(await s.instance.auth().getUser(e))}catch(t){if(t.code==="auth/user-not-found")return;throw new Error(t)}}setCustomCredentials(e,t){return s.instance.auth().setCustomUserClaims(e,t)}async updateUser(e,t){return this.convertToUserCredentials(await s.instance.auth().updateUser(e,t))}async deleteUser(e){try{await s.instance.auth().deleteUser(e)}catch(t){if(t.code==="auth/user-not-found")return;throw new Error(t)}}convertToUserCredentials(e){return{id:e.uid,email:e.email??"",emailVerified:e.emailVerified??void 0,creationDate:e.metadata.creationTime?new Date(e.metadata.creationTime).getTime():void 0,lastLogin:e.metadata.lastSignInTime?new Date(e.metadata.lastSignInTime).getTime():void 0,name:e.displayName,phoneNumber:e.phoneNumber??void 0,pictureUrl:e.photoURL??void 0,customData:e.customClaims}}}exports.FirebaseAdminDatasource=b;exports.FirebaseAdminHelper=s;exports.FirebaseServerAuth=w;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen\n\t\t}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, _document, subcollection ] = templateTokens\n\t\tif ( !mainCollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","_document","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen\n\t\t}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, document, subcollection ] = templateTokens\n\t\tif ( !mainCollection || !document || !subcollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\t\t\n\t\tif ( document[0] !== '{' ) return [ template ] // if the second token is not a document, we are in a simple collection path and we can return it as is\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
package/lib/esm/index.js CHANGED
@@ -1,17 +1,17 @@
1
- import { DataSource as d, ServerAuthService as p } from "entropic-bond";
1
+ import { DataSource as u, ServerAuthService as p } from "entropic-bond";
2
2
  import { initializeApp as f } from "firebase-admin/app";
3
3
  import { getAuth as y } from "firebase-admin/auth";
4
4
  import { getFirestore as g, Filter as l } from "firebase-admin/firestore";
5
- import * as u from "firebase-functions/v2";
6
- class n {
5
+ import * as d from "firebase-functions/v2";
6
+ class s {
7
7
  static setFirebaseConfig(e) {
8
- n._firebaseConfig = e;
8
+ s._firebaseConfig = e;
9
9
  }
10
10
  constructor() {
11
- f(n._firebaseConfig);
11
+ f(s._firebaseConfig);
12
12
  }
13
13
  static get instance() {
14
- return this._instance || (this._instance = new n());
14
+ return this._instance || (this._instance = new s());
15
15
  }
16
16
  firestore() {
17
17
  return g();
@@ -20,25 +20,25 @@ class n {
20
20
  return y();
21
21
  }
22
22
  }
23
- class T extends d {
23
+ class T extends u {
24
24
  constructor(e) {
25
- super(), this._lastLimit = 0, e && u.setGlobalOptions(e);
25
+ super(), this._lastLimit = 0, e && d.setGlobalOptions(e);
26
26
  }
27
27
  findById(e, t) {
28
- const r = n.instance.firestore();
28
+ const r = s.instance.firestore();
29
29
  return new Promise(async (o) => {
30
30
  try {
31
31
  const i = await r.doc(`${t}/${e}`).get();
32
32
  o(i.data());
33
- } catch (s) {
34
- return console.log(s), null;
33
+ } catch (n) {
34
+ return console.log(n), null;
35
35
  }
36
36
  });
37
37
  }
38
38
  save(e) {
39
- const t = n.instance.firestore(), r = t.batch();
40
- return Object.entries(e).forEach(([o, s]) => {
41
- s?.forEach((i) => {
39
+ const t = s.instance.firestore(), r = t.batch();
40
+ return Object.entries(e).forEach(([o, n]) => {
41
+ n?.forEach((i) => {
42
42
  const a = t.doc(`${o}/${i.id}`);
43
43
  r.set(a, i);
44
44
  });
@@ -52,7 +52,7 @@ class T extends d {
52
52
  return (await this.queryObjectToFirebaseQuery(e, t).count().get()).data().count;
53
53
  }
54
54
  delete(e, t) {
55
- const r = n.instance.firestore();
55
+ const r = s.instance.firestore();
56
56
  return r.recursiveDelete(r.doc(`${t}/${e}`));
57
57
  }
58
58
  next(e) {
@@ -71,12 +71,12 @@ class T extends d {
71
71
  });
72
72
  }
73
73
  queryObjectToFirebaseQuery(e, t) {
74
- const r = n.instance.firestore(), o = [], s = [];
75
- d.toPropertyPathOperations(e.operations).forEach((a) => {
74
+ const r = s.instance.firestore(), o = [], n = [];
75
+ u.toPropertyPathOperations(e.operations).forEach((a) => {
76
76
  const c = this.toFirebaseOperator(a.operator);
77
- a.aggregate ? s.push(l.where(a.property, c, a.value)) : o.push(l.where(a.property, c, a.value));
77
+ a.aggregate ? n.push(l.where(a.property, c, a.value)) : o.push(l.where(a.property, c, a.value));
78
78
  });
79
- let i = r.collection(t).where(l.or(...s, l.and(...o)));
79
+ let i = r.collection(t).where(l.or(...n, l.and(...o)));
80
80
  return e.sort?.propertyName && (i = i.orderBy(e.sort.propertyName, e.sort.order)), e.limit && (this._lastLimit = e.limit, i = i.limit(e.limit)), i;
81
81
  }
82
82
  toFirebaseOperator(e) {
@@ -97,11 +97,11 @@ class T extends d {
97
97
  }
98
98
  }
99
99
  subscribeToDocumentChangeListener(e, t) {
100
- const r = u.firestore.onDocumentUpdated(e + "/{docId}", (o) => {
101
- const s = o.data;
100
+ const r = d.firestore.onDocumentUpdated(e + "/{docId}", (o) => {
101
+ const n = o.data;
102
102
  t({
103
- before: s?.before.data(),
104
- after: s?.after.data(),
103
+ before: n?.before.data(),
104
+ after: n?.after.data(),
105
105
  type: "update",
106
106
  params: o.params,
107
107
  collectionPath: e
@@ -117,11 +117,12 @@ class T extends d {
117
117
  async resolveCollectionPaths(e) {
118
118
  const t = e.split("/");
119
119
  if (t.length > 3 || t.length < 1) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${e}`);
120
- const [r, o, s] = t;
121
- if (!r) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
122
- const a = await n.instance.firestore().collection(r).get(), c = [];
120
+ const [r, o, n] = t;
121
+ if (!r || !o || !n) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
122
+ if (o[0] !== "{") return [e];
123
+ const a = await s.instance.firestore().collection(r).get(), c = [];
123
124
  return a.docs.forEach((m) => {
124
- s ? c.push(`${r}/${m.id}/${s}`) : c.push(r);
125
+ n ? c.push(`${r}/${m.id}/${n}`) : c.push(r);
125
126
  }), c;
126
127
  }
127
128
  onCollectionChange(e, t, r) {
@@ -135,7 +136,7 @@ class U extends p {
135
136
  async getUser(e) {
136
137
  try {
137
138
  return this.convertToUserCredentials(
138
- await n.instance.auth().getUser(e)
139
+ await s.instance.auth().getUser(e)
139
140
  );
140
141
  } catch (t) {
141
142
  if (t.code === "auth/user-not-found") return;
@@ -143,16 +144,16 @@ class U extends p {
143
144
  }
144
145
  }
145
146
  setCustomCredentials(e, t) {
146
- return n.instance.auth().setCustomUserClaims(e, t);
147
+ return s.instance.auth().setCustomUserClaims(e, t);
147
148
  }
148
149
  async updateUser(e, t) {
149
150
  return this.convertToUserCredentials(
150
- await n.instance.auth().updateUser(e, t)
151
+ await s.instance.auth().updateUser(e, t)
151
152
  );
152
153
  }
153
154
  async deleteUser(e) {
154
155
  try {
155
- await n.instance.auth().deleteUser(e);
156
+ await s.instance.auth().deleteUser(e);
156
157
  } catch (t) {
157
158
  if (t.code === "auth/user-not-found") return;
158
159
  throw new Error(t);
@@ -174,7 +175,7 @@ class U extends p {
174
175
  }
175
176
  export {
176
177
  T as FirebaseAdminDatasource,
177
- n as FirebaseAdminHelper,
178
+ s as FirebaseAdminHelper,
178
179
  U as FirebaseServerAuth
179
180
  };
180
181
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen\n\t\t}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, _document, subcollection ] = templateTokens\n\t\tif ( !mainCollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","_document","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":";;;;;AAIO,MAAMA,EAAoB;AAAA,EAEhC,OAAO,kBAAmBC,GAAsB;AAC/C,IAAAD,EAAoB,kBAAkBC;AAAA,EACvC;AAAA,EAEQ,cAAc;AACrB,IAAAC,EAAeF,EAAoB,eAAgB;AAAA,EACpD;AAAA,EAEA,WAAW,WAAW;AACrB,WAAO,KAAK,cAAe,KAAK,YAAY,IAAIA,EAAA;AAAA,EACjD;AAAA,EAEA,YAAY;AACX,WAAOG,EAAA;AAAA,EACR;AAAA,EAEA,OAAY;AACX,WAAOC,EAAA;AAAA,EACR;AAID;ACvBO,MAAMC,UAAgCC,EAAW;AAAA,EAEvD,YAAaC,GAA2D;AACvE,UAAA,GA0LD,KAAQ,aAAqB,GAzLvBA,KAAiCC,EAAU,iBAAkBD,CAA+B;AAAA,EAClG;AAAA,EAES,SAAUE,GAAYC,GAAoD;AAClF,UAAMC,IAAKX,EAAoB,SAAS,UAAA;AAExC,WAAO,IAAI,QAAyB,OAAMY,MAAW;AACpD,UAAI;AAEH,cAAMC,IAAe,MADLF,EAAG,IAAK,GAAID,CAAe,IAAKD,CAAG,EAAE,EAClB,IAAA;AACnC,QAAAG,EAASC,EAAa,MAAyB;AAAA,MAChD,SACOC,GAAQ;AACd,uBAAQ,IAAKA,CAAM,GACZ;AAAA,MACR;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAES,KAAMC,GAA4C;AAC1D,UAAMJ,IAAKX,EAAoB,SAAS,UAAA,GAClCgB,IAAQL,EAAG,MAAA;AAEjB,kBAAO,QAASI,CAAY,EAAE,QAAQ,CAAC,CAAEL,GAAgBO,CAAW,MAAM;AACzE,MAAAA,GAAY,QAAS,CAAAC,MAAY;AAC/B,cAAMC,IAAMR,EAAG,IAAK,GAAID,CAAe,IAAKQ,EAAS,EAAG,EAAG;AAC3D,QAAAF,EAAM,IAAKG,GAAKD,CAAS;AAAA,MAC3B,CAAC;AAAA,IACF,CAAC,GAEMF,EAAM,OAAA;AAAA,EACd;AAAA,EAES,KAAMI,GAA0CV,GAAsD;AAC9G,UAAMW,IAAQ,KAAK,2BAA4BD,GAAaV,CAAe;AAE3E,gBAAK,aAAaW,GACX,KAAK,aAAcA,CAAM;AAAA,EACjC;AAAA,EAEA,MAAe,MAAOD,GAA0CV,GAA0C;AAIzG,YAFiB,MADH,KAAK,2BAA4BU,GAAaV,CAAe,EAC9C,MAAA,EAAQ,IAAA,GAErB,OAAO;AAAA,EACxB;AAAA,EAES,OAAQD,GAAYC,GAA0C;AACtE,UAAMC,IAAKX,EAAoB,SAAS,UAAA;AAExC,WAAOW,EAAG,gBAAiBA,EAAG,IAAK,GAAID,CAAe,IAAKD,CAAG,EAAG,CAAE;AAAA,EACpE;AAAA,EAES,KAAMa,GAAgD;AAC9D,QAAI,CAAC,KAAK,WAAa,OAAM,IAAI,MAAM,uDAAuD;AAE9F,SAAK,aAAaA,KAAW,KAAK;AAElC,UAAMD,IAAQ,KAAK,WAAW,MAAO,KAAK,UAAW,EAAE,WAAY,KAAK,iBAAkB;AAE1F,WAAO,KAAK,aAAcA,CAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAcA,GAA4F;AACjH,WAAO,IAAI,QAA6B,OAAMT,MAAW;AACxD,YAAMW,IAAM,MAAMF,EAAM,IAAA;AACxB,WAAK,oBAAoBE,EAAI,KAAMA,EAAI,KAAK,SAAO,CAAE,GAErDX,EAASW,EAAI,KAAK,IAAK,CAAAA,MAAOA,EAAI,KAAA,CAAyB,CAAE;AAAA,IAC9D,CAAC;AAAA,EACF;AAAA,EAEQ,2BAA4BH,GAA0CV,GAAkF;AAC/J,UAAMC,IAAKX,EAAoB,SAAS,UAAA,GAElCwB,IAA2B,CAAA,GAC3BC,IAA0B,CAAA;AAEhC,IAAAnB,EAAW,yBAA0Bc,EAAY,UAAkB,EAAE,QAAS,CAAAM,MAAa;AAC1F,YAAMC,IAAW,KAAK,mBAAoBD,EAAU,QAAS;AAC7D,MAAKA,EAAU,YAAWD,EAAc,KAAMG,EAAO,MAAOF,EAAU,UAAUC,GAAUD,EAAU,KAAM,CAAE,IACvGF,EAAe,KAAMI,EAAO,MAAOF,EAAU,UAAUC,GAAUD,EAAU,KAAM,CAAE;AAAA,IACzF,CAAC;AAED,QAAIL,IAAQV,EAAG,WAAYD,CAAe,EAAE,MAAOkB,EAAO,GAAI,GAAGH,GAAeG,EAAO,IAAK,GAAGJ,CAAe,CAAE,CAAC;AAEjH,WAAKJ,EAAY,MAAM,iBACtBC,IAAQA,EAAM,QAASD,EAAY,KAAK,cAAcA,EAAY,KAAK,KAAM,IAGzEA,EAAY,UAChB,KAAK,aAAaA,EAAY,OAC9BC,IAAQA,EAAM,MAAOD,EAAY,KAAM,IAGjCC;AAAA,EACR;AAAA,EAEA,mBAAoBM,GAAyC;AAC5D,YAAQA,GAAA;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAM,eAAOA;AAAA,MAClB,KAAK;AAAY,eAAO;AAAA,MACxB,KAAK;AAAe,eAAO;AAAA,MAC3B;AAAS,eAAOA;AAAA,IAAA;AAAA,EAElB;AAAA,EAEmB,kCAAmCE,GAAgCC,GAA8F;AACnL,UAAMC,IAAUvB,EAAU,UAAU,kBAAmBqB,IAAyB,YAAY,CAAAG,MAAS;AACpG,YAAMC,IAAWD,EAAM;AACvB,MAAAF,EAAS;AAAA,QACR,QAAQG,GAAU,OAAO,KAAA;AAAA,QACzB,OAAOA,GAAU,MAAM,KAAA;AAAA,QACvB,MAAM;AAAA,QACN,QAAQD,EAAM;AAAA,QACd,gBAAgBH;AAAA,MAAA,CAChB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACN,WAAW,MAAM;AAAA,MAAC;AAAA,MAClB,eAAeE;AAAA,MACf,gBAAgBF;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,MAAyB,uBAAwBK,GAAsC;AACtF,UAAMC,IAAiBD,EAAS,MAAO,GAAI;AAC3C,QAAKC,EAAe,SAAS,KAAKA,EAAe,SAAS,EAAI,OAAM,IAAI,MAAM,kJAAmJD,CAAS,EAAE;AAC5O,UAAM,CAAEE,GAAgBC,GAAWC,CAAc,IAAIH;AACrD,QAAK,CAACC,EAAiB,OAAM,IAAI,MAAM,2FAA2F;AAIlI,UAAMG,IAAO,MAFFvC,EAAoB,SAAS,UAAA,EAElB,WAAYoC,CAAe,EAAE,IAAA,GAE7CI,IAA2B,CAAA;AACjC,WAAAD,EAAK,KAAK,QAAQ,CAAEhB,MAAS;AAC5B,MAAKe,IAAgBE,EAAe,KAAM,GAAIJ,CAAe,IAAKb,EAAI,EAAG,IAAKe,CAAc,EAAG,IAC1FE,EAAe,KAAMJ,CAAe;AAAA,IAC1C,CAAC,GACMI;AAAA,EACR;AAAA,EAES,mBAAoBnB,GAAoCX,GAAwBoB,GAAmE;AAY3J,UAAM,IAAI,MAAO,qBAAqB;AAAA,EACvC;AAAA,EAES,iBAAkBW,GAAsBC,GAAoBZ,GAAiE;AAYrI,UAAM,IAAI,MAAO,qBAAqB;AAAA,EACvC;AAMD;AChMO,MAAMa,UAA2BC,EAAkB;AAAA,EAEzD,MAAM,QAAuBC,GAA0D;AACtF,QAAI;AACH,aAAO,KAAK;AAAA,QACX,MAAM7C,EAAoB,SAAS,KAAA,EAAO,QAAS6C,CAAO;AAAA,MAAA;AAAA,IAE5D,SAAU/B,GAAQ;AACjB,UAAKA,EAAM,SAAS,sBAAwB;AACvC,YAAM,IAAI,MAAOA,CAAM;AAAA,IAC7B;AAAA,EACD;AAAA,EAEA,qBAAmD+B,GAAgBC,GAAsC;AACxG,WAAO9C,EAAoB,SAAS,KAAA,EAAO,oBAAqB6C,GAAQC,CAAkB;AAAA,EAC3F;AAAA,EAEA,MAAM,WAA0BD,GAAgBE,GAA+D;AAC9G,WAAO,KAAK;AAAA,MACX,MAAM/C,EAAoB,SAAS,OAAO,WAAY6C,GAAQE,CAAY;AAAA,IAAA;AAAA,EAE5E;AAAA,EAEA,MAAM,WAAYF,GAAgC;AACjD,QAAI;AACH,YAAM7C,EAAoB,SAAS,KAAA,EAAO,WAAY6C,CAAO;AAAA,IAC9D,SACQ/B,GAAQ;AACf,UAAKA,EAAM,SAAS,sBAAwB;AACvC,YAAM,IAAI,MAAOA,CAAM;AAAA,IAC7B;AAAA,EACD;AAAA,EAEQ,yBAAwCkC,GAA2C;AAC1F,WAAO;AAAA,MACN,IAAIA,EAAS;AAAA,MACb,OAAOA,EAAS,SAAS;AAAA,MACzB,eAAeA,EAAS,iBAAiB;AAAA,MACzC,cAAcA,EAAS,SAAS,eAAc,IAAI,KAAMA,EAAS,SAAS,YAAa,EAAE,QAAA,IAAY;AAAA,MACrG,WAAWA,EAAS,SAAS,iBAAgB,IAAI,KAAMA,EAAS,SAAS,cAAe,EAAE,QAAA,IAAY;AAAA,MACtG,MAAMA,EAAS;AAAA,MACf,aAAaA,EAAS,eAAe;AAAA,MACrC,YAAYA,EAAS,YAAY;AAAA,MACjC,YAAYA,EAAS;AAAA,IAAA;AAAA,EAEvB;AACD;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen\n\t\t}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, document, subcollection ] = templateTokens\n\t\tif ( !mainCollection || !document || !subcollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\t\t\n\t\tif ( document[0] !== '{' ) return [ template ] // if the second token is not a document, we are in a simple collection path and we can return it as is\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@entropic-bond/firebase-admin",
3
3
  "type": "module",
4
- "version": "1.7.18",
4
+ "version": "1.7.19",
5
5
  "description": "Firebase Admin plugins for Entropic Bond",
6
6
  "main": "lib/cjs/index.js",
7
7
  "module": "lib/esm/index.js",
@@ -58,7 +58,7 @@
58
58
  "devDependencies": {
59
59
  "@semantic-release/changelog": "^6.0.3",
60
60
  "@semantic-release/git": "^10.0.1",
61
- "@types/node": "^25.2.3",
61
+ "@types/node": "^25.3.1",
62
62
  "semantic-release": "^25.0.3",
63
63
  "typescript": "^5.9.3",
64
64
  "vite": "^7.3.1",
@@ -66,8 +66,8 @@
66
66
  "vitest": "^4.0.18"
67
67
  },
68
68
  "dependencies": {
69
- "entropic-bond": "^1.55.5",
69
+ "entropic-bond": "^1.56.0",
70
70
  "firebase-admin": "^13.6.1",
71
- "firebase-functions": "7.0.5"
71
+ "firebase-functions": "7.0.6"
72
72
  }
73
73
  }