@entropic-bond/firebase-admin 1.7.17 → 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"),
|
|
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
|
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\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","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","functions","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,28 +1,28 @@
|
|
|
1
|
-
import { DataSource as u, ServerAuthService as
|
|
2
|
-
import { initializeApp as
|
|
3
|
-
import { getAuth as
|
|
4
|
-
import { getFirestore as
|
|
5
|
-
import * as
|
|
1
|
+
import { DataSource as u, ServerAuthService as p } from "entropic-bond";
|
|
2
|
+
import { initializeApp as f } from "firebase-admin/app";
|
|
3
|
+
import { getAuth as y } from "firebase-admin/auth";
|
|
4
|
+
import { getFirestore as g, Filter as l } from "firebase-admin/firestore";
|
|
5
|
+
import * as d from "firebase-functions/v2";
|
|
6
6
|
class s {
|
|
7
7
|
static setFirebaseConfig(e) {
|
|
8
8
|
s._firebaseConfig = e;
|
|
9
9
|
}
|
|
10
10
|
constructor() {
|
|
11
|
-
|
|
11
|
+
f(s._firebaseConfig);
|
|
12
12
|
}
|
|
13
13
|
static get instance() {
|
|
14
14
|
return this._instance || (this._instance = new s());
|
|
15
15
|
}
|
|
16
16
|
firestore() {
|
|
17
|
-
return
|
|
17
|
+
return g();
|
|
18
18
|
}
|
|
19
19
|
auth() {
|
|
20
|
-
return
|
|
20
|
+
return y();
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
class T extends u {
|
|
24
|
-
constructor() {
|
|
25
|
-
super(
|
|
24
|
+
constructor(e) {
|
|
25
|
+
super(), this._lastLimit = 0, e && d.setGlobalOptions(e);
|
|
26
26
|
}
|
|
27
27
|
findById(e, t) {
|
|
28
28
|
const r = s.instance.firestore();
|
|
@@ -97,7 +97,7 @@ class T extends u {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
subscribeToDocumentChangeListener(e, t) {
|
|
100
|
-
const r =
|
|
100
|
+
const r = d.firestore.onDocumentUpdated(e + "/{docId}", (o) => {
|
|
101
101
|
const n = o.data;
|
|
102
102
|
t({
|
|
103
103
|
before: n?.before.data(),
|
|
@@ -118,10 +118,11 @@ class T extends u {
|
|
|
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
120
|
const [r, o, n] = t;
|
|
121
|
-
if (!r) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
|
|
121
|
+
if (!r || !o || !n) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
|
|
122
|
+
if (o[0] !== "{") return [e];
|
|
122
123
|
const a = await s.instance.firestore().collection(r).get(), c = [];
|
|
123
|
-
return a.docs.forEach((
|
|
124
|
-
n ? c.push(`${r}/${
|
|
124
|
+
return a.docs.forEach((m) => {
|
|
125
|
+
n ? c.push(`${r}/${m.id}/${n}`) : c.push(r);
|
|
125
126
|
}), c;
|
|
126
127
|
}
|
|
127
128
|
onCollectionChange(e, t, r) {
|
|
@@ -131,7 +132,7 @@ class T extends u {
|
|
|
131
132
|
throw new Error("Not implemented yet");
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
|
-
class
|
|
135
|
+
class U extends p {
|
|
135
136
|
async getUser(e) {
|
|
136
137
|
try {
|
|
137
138
|
return this.convertToUserCredentials(
|
|
@@ -175,6 +176,6 @@ class F extends m {
|
|
|
175
176
|
export {
|
|
176
177
|
T as FirebaseAdminDatasource,
|
|
177
178
|
s as FirebaseAdminHelper,
|
|
178
|
-
|
|
179
|
+
U as FirebaseServerAuth
|
|
179
180
|
};
|
|
180
181
|
//# 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\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","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","functions","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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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond';
|
|
2
2
|
import { WhereFilterOp } from 'firebase-admin/firestore';
|
|
3
|
+
import * as functions from 'firebase-functions/v2';
|
|
3
4
|
export declare class FirebaseAdminDatasource extends DataSource {
|
|
5
|
+
constructor(firebaseFunctionsGlobalOptions?: functions.GlobalOptions);
|
|
4
6
|
findById(id: string, collectionName: string): Promise<DocumentObject>;
|
|
5
7
|
save(collections: Collections): Promise<void>;
|
|
6
8
|
find(queryObject: QueryObject<DocumentObject>, collectionName: string): Promise<DocumentObject[]>;
|
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.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,16 +58,16 @@
|
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@semantic-release/changelog": "^6.0.3",
|
|
60
60
|
"@semantic-release/git": "^10.0.1",
|
|
61
|
-
"@types/node": "^25.
|
|
62
|
-
"semantic-release": "^25.0.
|
|
61
|
+
"@types/node": "^25.3.1",
|
|
62
|
+
"semantic-release": "^25.0.3",
|
|
63
63
|
"typescript": "^5.9.3",
|
|
64
64
|
"vite": "^7.3.1",
|
|
65
65
|
"vite-plugin-dts": "^4.5.4",
|
|
66
66
|
"vitest": "^4.0.18"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"entropic-bond": "^1.
|
|
70
|
-
"firebase-admin": "^13.6.
|
|
71
|
-
"firebase-functions": "7.0.
|
|
69
|
+
"entropic-bond": "^1.56.0",
|
|
70
|
+
"firebase-admin": "^13.6.1",
|
|
71
|
+
"firebase-functions": "7.0.6"
|
|
72
72
|
}
|
|
73
73
|
}
|