@entropic-bond/firebase-admin 1.7.27 → 1.7.28
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 h=require("entropic-bond"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("entropic-bond"),f=require("firebase-admin/app"),p=require("firebase-admin/auth"),u=require("firebase-admin/firestore"),g=require("firebase-functions/v2");function y(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 d=y(g);class o{static setFirebaseConfig(e){o._firebaseConfig=e}constructor(){f.initializeApp(o._firebaseConfig)}static get instance(){return this._instance||(this._instance=new o)}firestore(){return u.getFirestore()}auth(){return p.getAuth()}}class b extends h.DataSource{constructor(e){super(),this._lastLimit=0,e&&d.setGlobalOptions(e)}findById(e,t){const r=o.instance.firestore();return new Promise(async n=>{try{const i=await r.doc(`${t}/${e}`).get();n(i.data())}catch(s){return console.log(s),null}})}save(e){const t=o.instance.firestore(),r=t.batch();return Object.entries(e).forEach(([n,s])=>{s?.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=o.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=o.instance.firestore(),n=[],s=[];h.DataSource.toPropertyPathOperations(e.operations).forEach(a=>{const l=this.toFirebaseOperator(a.operator);a.aggregate?s.push(u.Filter.where(a.property,l,a.value)):n.push(u.Filter.where(a.property,l,a.value))});let i=r.collection(t).where(u.Filter.or(...s,u.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}}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,s]=t;if(!r||!n||!s)throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");if(n[0]!=="{")return[e];const i=o.instance.firestore();d.logger.info(`Resolving collection paths matching template ${e}`);const a=await i.collection(r).get();d.logger.info(`Found ${a.size} documents in collection ${r}`);const 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 h.ServerAuthService{async getUser(e){try{return this.convertToUserCredentials(await o.instance.auth().getUser(e))}catch(t){if(t.code==="auth/user-not-found")return;throw new Error(t)}}setCustomCredentials(e,t){return o.instance.auth().setCustomUserClaims(e,t)}async updateUser(e,t){return this.convertToUserCredentials(await o.instance.auth().updateUser(e,t))}async deleteUser(e){try{await o.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=o;exports.FirebaseServerAuth=w;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -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\tprops: []\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\tfunctions.logger.info( `Resolving collection paths matching template ${ template }` )\n\t\tconst docs = await db.collection( mainCollection ).get()\n\t\tfunctions.logger.info( `Found ${ docs.size } documents in collection ${ mainCollection }` )\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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"}
|
|
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, 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 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\tfunctions.logger.info( `Resolving collection paths matching template ${ template }` )\n\t\tconst docs = await db.collection( mainCollection ).get()\n\t\tfunctions.logger.info( `Found ${ docs.size } documents in collection ${ mainCollection }` )\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","template","templateTokens","mainCollection","subcollection","docs","collectionList","listener","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
|
|
2
|
-
import { initializeApp as
|
|
1
|
+
import { DataSource as d, ServerAuthService as f } from "entropic-bond";
|
|
2
|
+
import { initializeApp as p } from "firebase-admin/app";
|
|
3
3
|
import { getAuth as g } from "firebase-admin/auth";
|
|
4
4
|
import { getFirestore as y, Filter as l } from "firebase-admin/firestore";
|
|
5
5
|
import * as u from "firebase-functions/v2";
|
|
6
|
-
class
|
|
6
|
+
class o {
|
|
7
7
|
static setFirebaseConfig(e) {
|
|
8
|
-
|
|
8
|
+
o._firebaseConfig = e;
|
|
9
9
|
}
|
|
10
10
|
constructor() {
|
|
11
|
-
|
|
11
|
+
p(o._firebaseConfig);
|
|
12
12
|
}
|
|
13
13
|
static get instance() {
|
|
14
|
-
return this._instance || (this._instance = new
|
|
14
|
+
return this._instance || (this._instance = new o());
|
|
15
15
|
}
|
|
16
16
|
firestore() {
|
|
17
17
|
return y();
|
|
@@ -25,21 +25,21 @@ class T extends d {
|
|
|
25
25
|
super(), this._lastLimit = 0, e && u.setGlobalOptions(e);
|
|
26
26
|
}
|
|
27
27
|
findById(e, t) {
|
|
28
|
-
const r =
|
|
29
|
-
return new Promise(async (
|
|
28
|
+
const r = o.instance.firestore();
|
|
29
|
+
return new Promise(async (n) => {
|
|
30
30
|
try {
|
|
31
31
|
const i = await r.doc(`${t}/${e}`).get();
|
|
32
|
-
|
|
33
|
-
} catch (
|
|
34
|
-
return console.log(
|
|
32
|
+
n(i.data());
|
|
33
|
+
} catch (s) {
|
|
34
|
+
return console.log(s), null;
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
save(e) {
|
|
39
|
-
const t =
|
|
40
|
-
return Object.entries(e).forEach(([
|
|
41
|
-
|
|
42
|
-
const a = t.doc(`${
|
|
39
|
+
const t = o.instance.firestore(), r = t.batch();
|
|
40
|
+
return Object.entries(e).forEach(([n, s]) => {
|
|
41
|
+
s?.forEach((i) => {
|
|
42
|
+
const a = t.doc(`${n}/${i.id}`);
|
|
43
43
|
r.set(a, i);
|
|
44
44
|
});
|
|
45
45
|
}), r.commit();
|
|
@@ -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 =
|
|
55
|
+
const r = o.instance.firestore();
|
|
56
56
|
return r.recursiveDelete(r.doc(`${t}/${e}`));
|
|
57
57
|
}
|
|
58
58
|
next(e) {
|
|
@@ -67,16 +67,16 @@ class T extends d {
|
|
|
67
67
|
getFromQuery(e) {
|
|
68
68
|
return new Promise(async (t) => {
|
|
69
69
|
const r = await e.get();
|
|
70
|
-
this._lastDocRetrieved = r.docs[r.docs.length - 1], t(r.docs.map((
|
|
70
|
+
this._lastDocRetrieved = r.docs[r.docs.length - 1], t(r.docs.map((n) => n.data()));
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
queryObjectToFirebaseQuery(e, t) {
|
|
74
|
-
const r =
|
|
74
|
+
const r = o.instance.firestore(), n = [], s = [];
|
|
75
75
|
d.toPropertyPathOperations(e.operations).forEach((a) => {
|
|
76
76
|
const c = this.toFirebaseOperator(a.operator);
|
|
77
|
-
a.aggregate ?
|
|
77
|
+
a.aggregate ? s.push(l.where(a.property, c, a.value)) : n.push(l.where(a.property, c, a.value));
|
|
78
78
|
});
|
|
79
|
-
let i = r.collection(t).where(l.or(...
|
|
79
|
+
let i = r.collection(t).where(l.or(...s, l.and(...n)));
|
|
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) {
|
|
@@ -96,38 +96,19 @@ class T extends d {
|
|
|
96
96
|
return e;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
subscribeToDocumentChangeListener(e, t) {
|
|
100
|
-
const r = u.firestore.onDocumentUpdated(e + "/{docId}", (o) => {
|
|
101
|
-
const n = o.data;
|
|
102
|
-
t({
|
|
103
|
-
before: n?.before.data(),
|
|
104
|
-
after: n?.after.data(),
|
|
105
|
-
type: "update",
|
|
106
|
-
params: o.params,
|
|
107
|
-
collectionPath: e
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
return {
|
|
111
|
-
uninstall: () => {
|
|
112
|
-
},
|
|
113
|
-
nativeHandler: r,
|
|
114
|
-
collectionPath: e,
|
|
115
|
-
props: []
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
99
|
async resolveCollectionPaths(e) {
|
|
119
100
|
const t = e.split("/");
|
|
120
101
|
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}`);
|
|
121
|
-
const [r,
|
|
122
|
-
if (!r || !
|
|
123
|
-
if (
|
|
124
|
-
const i =
|
|
102
|
+
const [r, n, s] = t;
|
|
103
|
+
if (!r || !n || !s) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
|
|
104
|
+
if (n[0] !== "{") return [e];
|
|
105
|
+
const i = o.instance.firestore();
|
|
125
106
|
u.logger.info(`Resolving collection paths matching template ${e}`);
|
|
126
107
|
const a = await i.collection(r).get();
|
|
127
108
|
u.logger.info(`Found ${a.size} documents in collection ${r}`);
|
|
128
109
|
const c = [];
|
|
129
110
|
return a.docs.forEach((m) => {
|
|
130
|
-
|
|
111
|
+
s ? c.push(`${r}/${m.id}/${s}`) : c.push(r);
|
|
131
112
|
}), c;
|
|
132
113
|
}
|
|
133
114
|
onCollectionChange(e, t, r) {
|
|
@@ -137,11 +118,11 @@ class T extends d {
|
|
|
137
118
|
throw new Error("Not implemented yet");
|
|
138
119
|
}
|
|
139
120
|
}
|
|
140
|
-
class F extends
|
|
121
|
+
class F extends f {
|
|
141
122
|
async getUser(e) {
|
|
142
123
|
try {
|
|
143
124
|
return this.convertToUserCredentials(
|
|
144
|
-
await
|
|
125
|
+
await o.instance.auth().getUser(e)
|
|
145
126
|
);
|
|
146
127
|
} catch (t) {
|
|
147
128
|
if (t.code === "auth/user-not-found") return;
|
|
@@ -149,16 +130,16 @@ class F extends p {
|
|
|
149
130
|
}
|
|
150
131
|
}
|
|
151
132
|
setCustomCredentials(e, t) {
|
|
152
|
-
return
|
|
133
|
+
return o.instance.auth().setCustomUserClaims(e, t);
|
|
153
134
|
}
|
|
154
135
|
async updateUser(e, t) {
|
|
155
136
|
return this.convertToUserCredentials(
|
|
156
|
-
await
|
|
137
|
+
await o.instance.auth().updateUser(e, t)
|
|
157
138
|
);
|
|
158
139
|
}
|
|
159
140
|
async deleteUser(e) {
|
|
160
141
|
try {
|
|
161
|
-
await
|
|
142
|
+
await o.instance.auth().deleteUser(e);
|
|
162
143
|
} catch (t) {
|
|
163
144
|
if (t.code === "auth/user-not-found") return;
|
|
164
145
|
throw new Error(t);
|
|
@@ -180,7 +161,7 @@ class F extends p {
|
|
|
180
161
|
}
|
|
181
162
|
export {
|
|
182
163
|
T as FirebaseAdminDatasource,
|
|
183
|
-
|
|
164
|
+
o as FirebaseAdminHelper,
|
|
184
165
|
F as FirebaseServerAuth
|
|
185
166
|
};
|
|
186
167
|
//# sourceMappingURL=index.js.map
|
package/lib/esm/index.js.map
CHANGED
|
@@ -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\tprops: []\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\tfunctions.logger.info( `Resolving collection paths matching template ${ template }` )\n\t\tconst docs = await db.collection( mainCollection ).get()\n\t\tfunctions.logger.info( `Found ${ docs.size } documents in collection ${ mainCollection }` )\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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"}
|
|
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, 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 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\tfunctions.logger.info( `Resolving collection paths matching template ${ template }` )\n\t\tconst docs = await db.collection( mainCollection ).get()\n\t\tfunctions.logger.info( `Found ${ docs.size } documents in collection ${ mainCollection }` )\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","template","templateTokens","mainCollection","subcollection","docs","collectionList","listener","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener,
|
|
1
|
+
import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond';
|
|
2
2
|
import { WhereFilterOp } from 'firebase-admin/firestore';
|
|
3
3
|
import * as functions from 'firebase-functions/v2';
|
|
4
4
|
export declare class FirebaseAdminDatasource extends DataSource {
|
|
@@ -12,7 +12,6 @@ export declare class FirebaseAdminDatasource extends DataSource {
|
|
|
12
12
|
private getFromQuery;
|
|
13
13
|
private queryObjectToFirebaseQuery;
|
|
14
14
|
toFirebaseOperator(operator: QueryOperator): WhereFilterOp;
|
|
15
|
-
protected subscribeToDocumentChangeListener(collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject>): DocumentChangeListenerHandler | undefined;
|
|
16
15
|
protected resolveCollectionPaths(template: string): Promise<string[]>;
|
|
17
16
|
onCollectionChange(query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject>): Unsubscriber;
|
|
18
17
|
onDocumentChange(documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject>): Unsubscriber;
|
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.
|
|
4
|
+
"version": "1.7.28",
|
|
5
5
|
"description": "Firebase Admin plugins for Entropic Bond",
|
|
6
6
|
"main": "lib/cjs/index.js",
|
|
7
7
|
"module": "lib/esm/index.js",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"vitest": "^4.0.18"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"entropic-bond": "^1.
|
|
69
|
+
"entropic-bond": "^1.57.0",
|
|
70
70
|
"firebase-admin": "^13.7.0",
|
|
71
71
|
"firebase-functions": "7.1.1"
|
|
72
72
|
}
|