@entropic-bond/firebase-admin 1.7.18 → 1.7.20
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 +1 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/esm/index.js +39 -33
- package/lib/esm/index.js.map +1 -1
- package/package.json +4 -4
package/lib/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("entropic-bond"),p=require("firebase-admin/app"),f=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 s{static setFirebaseConfig(e){s._firebaseConfig=e}constructor(){p.initializeApp(s._firebaseConfig)}static get instance(){return this._instance||(this._instance=new s)}firestore(){return u.getFirestore()}auth(){return f.getAuth()}}class b extends h.DataSource{constructor(e){super(),this._lastLimit=0,e&&d.setGlobalOptions(e)}findById(e,t){const r=s.instance.firestore();return new Promise(async o=>{try{const i=await r.doc(`${t}/${e}`).get();o(i.data())}catch(n){return console.log(n),null}})}save(e){const t=s.instance.firestore(),r=t.batch();return Object.entries(e).forEach(([o,n])=>{n?.forEach(i=>{const a=t.doc(`${o}/${i.id}`);r.set(a,i)})}),r.commit()}find(e,t){const r=this.queryObjectToFirebaseQuery(e,t);return this._lastQuery=r,this.getFromQuery(r)}async count(e,t){return(await this.queryObjectToFirebaseQuery(e,t).count().get()).data().count}delete(e,t){const r=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(o=>o.data()))})}queryObjectToFirebaseQuery(e,t){const r=s.instance.firestore(),o=[],n=[];h.DataSource.toPropertyPathOperations(e.operations).forEach(a=>{const l=this.toFirebaseOperator(a.operator);a.aggregate?n.push(u.Filter.where(a.property,l,a.value)):o.push(u.Filter.where(a.property,l,a.value))});let i=r.collection(t).where(u.Filter.or(...n,u.Filter.and(...o)));return e.sort?.propertyName&&(i=i.orderBy(e.sort.propertyName,e.sort.order)),e.limit&&(this._lastLimit=e.limit,i=i.limit(e.limit)),i}toFirebaseOperator(e){switch(e){case"==":case"!=":case"<":case"<=":case">":case">=":return e;case"contains":return"array-contains";case"containsAny":return"array-contains-any";default:return e}}subscribeToDocumentChangeListener(e,t){const r=d.firestore.onDocumentUpdated(e+"/{docId}",o=>{const n=o.data;t({before:n?.before.data(),after:n?.after.data(),type:"update",params:o.params,collectionPath:e})});return{uninstall:()=>{},nativeHandler:r,collectionPath:e,props:[]}}async resolveCollectionPaths(e){const t=e.split("/");if(t.length>3||t.length<1)throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${e}`);const[r,o,n]=t;if(!r||!o||!n)throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");if(o[0]!=="{")return[e];const i=s.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=>{n?l.push(`${r}/${m.id}/${n}`):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 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\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen\n\t\t}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, _document, subcollection ] = templateTokens\n\t\tif ( !mainCollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","_document","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen,\n\t\t\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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"}
|
package/lib/esm/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { DataSource as d, ServerAuthService as p } from "entropic-bond";
|
|
2
2
|
import { initializeApp as f } from "firebase-admin/app";
|
|
3
|
-
import { getAuth as
|
|
4
|
-
import { getFirestore as
|
|
3
|
+
import { getAuth as g } from "firebase-admin/auth";
|
|
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 s {
|
|
7
7
|
static setFirebaseConfig(e) {
|
|
8
|
-
|
|
8
|
+
s._firebaseConfig = e;
|
|
9
9
|
}
|
|
10
10
|
constructor() {
|
|
11
|
-
f(
|
|
11
|
+
f(s._firebaseConfig);
|
|
12
12
|
}
|
|
13
13
|
static get instance() {
|
|
14
|
-
return this._instance || (this._instance = new
|
|
14
|
+
return this._instance || (this._instance = new s());
|
|
15
15
|
}
|
|
16
16
|
firestore() {
|
|
17
|
-
return
|
|
17
|
+
return y();
|
|
18
18
|
}
|
|
19
19
|
auth() {
|
|
20
|
-
return
|
|
20
|
+
return g();
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
class T extends d {
|
|
@@ -25,20 +25,20 @@ class T extends d {
|
|
|
25
25
|
super(), this._lastLimit = 0, e && u.setGlobalOptions(e);
|
|
26
26
|
}
|
|
27
27
|
findById(e, t) {
|
|
28
|
-
const r =
|
|
28
|
+
const r = s.instance.firestore();
|
|
29
29
|
return new Promise(async (o) => {
|
|
30
30
|
try {
|
|
31
31
|
const i = await r.doc(`${t}/${e}`).get();
|
|
32
32
|
o(i.data());
|
|
33
|
-
} catch (
|
|
34
|
-
return console.log(
|
|
33
|
+
} catch (n) {
|
|
34
|
+
return console.log(n), null;
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
save(e) {
|
|
39
|
-
const t =
|
|
40
|
-
return Object.entries(e).forEach(([o,
|
|
41
|
-
|
|
39
|
+
const t = s.instance.firestore(), r = t.batch();
|
|
40
|
+
return Object.entries(e).forEach(([o, n]) => {
|
|
41
|
+
n?.forEach((i) => {
|
|
42
42
|
const a = t.doc(`${o}/${i.id}`);
|
|
43
43
|
r.set(a, i);
|
|
44
44
|
});
|
|
@@ -52,7 +52,7 @@ class T extends d {
|
|
|
52
52
|
return (await this.queryObjectToFirebaseQuery(e, t).count().get()).data().count;
|
|
53
53
|
}
|
|
54
54
|
delete(e, t) {
|
|
55
|
-
const r =
|
|
55
|
+
const r = s.instance.firestore();
|
|
56
56
|
return r.recursiveDelete(r.doc(`${t}/${e}`));
|
|
57
57
|
}
|
|
58
58
|
next(e) {
|
|
@@ -71,12 +71,12 @@ class T extends d {
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
queryObjectToFirebaseQuery(e, t) {
|
|
74
|
-
const r =
|
|
74
|
+
const r = s.instance.firestore(), o = [], n = [];
|
|
75
75
|
d.toPropertyPathOperations(e.operations).forEach((a) => {
|
|
76
76
|
const c = this.toFirebaseOperator(a.operator);
|
|
77
|
-
a.aggregate ?
|
|
77
|
+
a.aggregate ? n.push(l.where(a.property, c, a.value)) : o.push(l.where(a.property, c, a.value));
|
|
78
78
|
});
|
|
79
|
-
let i = r.collection(t).where(l.or(...
|
|
79
|
+
let i = r.collection(t).where(l.or(...n, l.and(...o)));
|
|
80
80
|
return e.sort?.propertyName && (i = i.orderBy(e.sort.propertyName, e.sort.order)), e.limit && (this._lastLimit = e.limit, i = i.limit(e.limit)), i;
|
|
81
81
|
}
|
|
82
82
|
toFirebaseOperator(e) {
|
|
@@ -98,10 +98,10 @@ class T extends d {
|
|
|
98
98
|
}
|
|
99
99
|
subscribeToDocumentChangeListener(e, t) {
|
|
100
100
|
const r = u.firestore.onDocumentUpdated(e + "/{docId}", (o) => {
|
|
101
|
-
const
|
|
101
|
+
const n = o.data;
|
|
102
102
|
t({
|
|
103
|
-
before:
|
|
104
|
-
after:
|
|
103
|
+
before: n?.before.data(),
|
|
104
|
+
after: n?.after.data(),
|
|
105
105
|
type: "update",
|
|
106
106
|
params: o.params,
|
|
107
107
|
collectionPath: e
|
|
@@ -111,17 +111,23 @@ class T extends d {
|
|
|
111
111
|
uninstall: () => {
|
|
112
112
|
},
|
|
113
113
|
nativeHandler: r,
|
|
114
|
-
collectionPath: e
|
|
114
|
+
collectionPath: e,
|
|
115
|
+
props: []
|
|
115
116
|
};
|
|
116
117
|
}
|
|
117
118
|
async resolveCollectionPaths(e) {
|
|
118
119
|
const t = e.split("/");
|
|
119
120
|
if (t.length > 3 || t.length < 1) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${e}`);
|
|
120
|
-
const [r, o,
|
|
121
|
-
if (!r) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
|
|
122
|
-
|
|
121
|
+
const [r, o, n] = t;
|
|
122
|
+
if (!r || !o || !n) throw new Error("FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection");
|
|
123
|
+
if (o[0] !== "{") return [e];
|
|
124
|
+
const i = s.instance.firestore();
|
|
125
|
+
u.logger.info(`Resolving collection paths matching template ${e}`);
|
|
126
|
+
const a = await i.collection(r).get();
|
|
127
|
+
u.logger.info(`Found ${a.size} documents in collection ${r}`);
|
|
128
|
+
const c = [];
|
|
123
129
|
return a.docs.forEach((m) => {
|
|
124
|
-
|
|
130
|
+
n ? c.push(`${r}/${m.id}/${n}`) : c.push(r);
|
|
125
131
|
}), c;
|
|
126
132
|
}
|
|
127
133
|
onCollectionChange(e, t, r) {
|
|
@@ -131,11 +137,11 @@ class T extends d {
|
|
|
131
137
|
throw new Error("Not implemented yet");
|
|
132
138
|
}
|
|
133
139
|
}
|
|
134
|
-
class
|
|
140
|
+
class F extends p {
|
|
135
141
|
async getUser(e) {
|
|
136
142
|
try {
|
|
137
143
|
return this.convertToUserCredentials(
|
|
138
|
-
await
|
|
144
|
+
await s.instance.auth().getUser(e)
|
|
139
145
|
);
|
|
140
146
|
} catch (t) {
|
|
141
147
|
if (t.code === "auth/user-not-found") return;
|
|
@@ -143,16 +149,16 @@ class U extends p {
|
|
|
143
149
|
}
|
|
144
150
|
}
|
|
145
151
|
setCustomCredentials(e, t) {
|
|
146
|
-
return
|
|
152
|
+
return s.instance.auth().setCustomUserClaims(e, t);
|
|
147
153
|
}
|
|
148
154
|
async updateUser(e, t) {
|
|
149
155
|
return this.convertToUserCredentials(
|
|
150
|
-
await
|
|
156
|
+
await s.instance.auth().updateUser(e, t)
|
|
151
157
|
);
|
|
152
158
|
}
|
|
153
159
|
async deleteUser(e) {
|
|
154
160
|
try {
|
|
155
|
-
await
|
|
161
|
+
await s.instance.auth().deleteUser(e);
|
|
156
162
|
} catch (t) {
|
|
157
163
|
if (t.code === "auth/user-not-found") return;
|
|
158
164
|
throw new Error(t);
|
|
@@ -174,7 +180,7 @@ class U extends p {
|
|
|
174
180
|
}
|
|
175
181
|
export {
|
|
176
182
|
T as FirebaseAdminDatasource,
|
|
177
|
-
|
|
178
|
-
|
|
183
|
+
s as FirebaseAdminHelper,
|
|
184
|
+
F as FirebaseServerAuth
|
|
179
185
|
};
|
|
180
186
|
//# 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}\n\t}\n\n\tprotected override async resolveCollectionPaths( template: string ): Promise<string[]> {\n\t\tconst templateTokens = template.split( '/' )\n\t\tif ( templateTokens.length > 3 || templateTokens.length < 1 ) throw new Error(`FirebaseAdminDatasource.collectionsMatchingTemplate only supports collection and subcollection paths (max 3 tokens). Collection path provided: ${ template }`)\n\t\tconst [ mainCollection, _document, subcollection ] = templateTokens\n\t\tif ( !mainCollection ) throw new Error('FirebaseAdminDatasource.collectionsMatchingTemplate requires a document and subcollection')\n\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst docs = await db.collection( mainCollection ).get()\n\n\t\tconst collectionList: string[] = []\n\t\tdocs.docs.forEach(( doc ) => {\n\t\t\tif ( subcollection ) collectionList.push( `${ mainCollection }/${ doc.id }/${ subcollection }` )\n\t\t\telse collectionList.push( mainCollection )\n\t\t})\n\t\treturn collectionList\n\t}\n\t\n\toverride onCollectionChange( query: QueryObject<DocumentObject>, collectionName: string, listener: CollectionChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const queryConstraints = this.queryObjectToQueryConstraints( query as unknown as QueryObject<DocumentObject>, collectionName )\n\t\t// return onSnapshot( queryConstraints, snapshot => {\n\t\t// \tsnapshot.docChanges().forEach( change => {\n\t\t// \t\tlistener({\n\t\t// \t\t\ttype: change.type === 'added'? 'create' : change.type === 'modified'? 'update' : 'delete',\n\t\t// \t\t\tafter: change.doc.data() as DocumentObject,\n\t\t// \t\t\tbefore: undefined,\n\t\t// \t\t\tparams: {}\n\t\t// \t\t})\n\t\t// \t})\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\n\toverride onDocumentChange( documentPath: string, documentId: string, listener: DocumentChangeListener<DocumentObject> ): Unsubscriber {\n\t\t// const db = FirebaseHelper.instance.firestore()\n\n\t\t// return onSnapshot( doc( db, documentPath, documentId ), snapshot => {\n\t\t// \tlistener({\n\t\t// \t\ttype: 'update',\n\t\t// \t\tbefore: undefined,\n\t\t// \t\tafter: snapshot.data() as DocumentObject,\n\t\t// \t\tparams: {}\n\t\t// \t})\n\n\t\t// })\n\t\tthrow new Error( 'Not implemented yet')\n\t}\n\t\n\n\tprivate _lastQuery: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> | undefined\n\tprivate _lastLimit: number = 0\n\tprivate _lastDocRetrieved: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined\n}","import { ServerAuthService, UserCredentials, CustomCredentials } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { UserRecord } from 'firebase-admin/auth'\n\nexport class FirebaseServerAuth extends ServerAuthService {\n\n\tasync getUser<T extends {}>( userId: string ): Promise<UserCredentials<T> | undefined> {\n\t\ttry {\n\t\t\treturn this.convertToUserCredentials(\n\t\t\t\tawait FirebaseAdminHelper.instance.auth().getUser( userId )\n\t\t\t)\n\t\t} catch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tsetCustomCredentials<T extends CustomCredentials>( userId: string, customCredentials: T ): Promise<void> {\n\t\treturn FirebaseAdminHelper.instance.auth().setCustomUserClaims( userId, customCredentials )\n\t}\n\n\tasync updateUser<T extends {}>( userId: string, credentials: UserCredentials<T> ): Promise<UserCredentials<T>> {\n\t\treturn this.convertToUserCredentials(\n\t\t\tawait FirebaseAdminHelper.instance.auth().updateUser( userId, credentials )\n\t\t)\n\t}\n\n\tasync deleteUser( userId: string ): Promise<void> {\n\t\ttry {\n\t\t\tawait FirebaseAdminHelper.instance.auth().deleteUser( userId )\n\t\t}\n\t\tcatch ( error ) {\n\t\t\tif ( error.code === 'auth/user-not-found' ) return undefined\n\t\t\telse throw new Error( error )\n\t\t}\n\t}\n\n\tprivate convertToUserCredentials<T extends {}>( userData: UserRecord ): UserCredentials<T> {\n\t\treturn {\n\t\t\tid: userData.uid,\n\t\t\temail: userData.email ?? '',\n\t\t\temailVerified: userData.emailVerified ?? undefined,\n\t\t\tcreationDate: userData.metadata.creationTime? new Date( userData.metadata.creationTime ).getTime() : undefined,\n\t\t\tlastLogin: userData.metadata.lastSignInTime? new Date( userData.metadata.lastSignInTime ).getTime() : undefined,\n\t\t\tname: userData.displayName,\n\t\t\tphoneNumber: userData.phoneNumber ?? undefined,\n\t\t\tpictureUrl: userData.photoURL ?? undefined,\n\t\t\tcustomData: userData.customClaims as T\n\t\t}\n\t}\n}"],"names":["FirebaseAdminHelper","config","initializeApp","getFirestore","getAuth","FirebaseAdminDatasource","DataSource","firebaseFunctionsGlobalOptions","functions","id","collectionName","db","resolve","retrievedObj","error","collections","batch","collection","document","ref","queryObject","query","maxDocs","doc","andConstraints","orConstraints","operation","operator","Filter","collectionPathToListen","listener","handler","event","snapshot","template","templateTokens","mainCollection","_document","subcollection","docs","collectionList","documentPath","documentId","FirebaseServerAuth","ServerAuthService","userId","customCredentials","credentials","userData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/firebase-admin-helper.ts","../../src/store/firebase-admin-datasource.ts","../../src/server-auth/firebase-server-auth.ts"],"sourcesContent":["import { AppOptions, initializeApp } from 'firebase-admin/app'\nimport { Auth, getAuth } from 'firebase-admin/auth'\nimport { getFirestore } from 'firebase-admin/firestore'\n\nexport class FirebaseAdminHelper {\n\t\n\tstatic setFirebaseConfig( config?: AppOptions ) {\n\t\tFirebaseAdminHelper._firebaseConfig = config\n\t}\n\n\tprivate constructor() {\n\t\tinitializeApp( FirebaseAdminHelper._firebaseConfig )\n\t}\n\n\tstatic get instance() {\n\t\treturn this._instance || ( this._instance = new FirebaseAdminHelper() )\n\t}\n\n\tfirestore() {\n\t\treturn getFirestore()\n\t}\n\n\tauth(): Auth{\n\t\treturn getAuth()\n\t}\n\n\tprivate static _instance: FirebaseAdminHelper\n\tprivate static _firebaseConfig: AppOptions | undefined\n}\n","import { CollectionChangeListener, Collections, DataSource, DocumentChangeListener, DocumentChangeListenerHandler, DocumentObject, QueryObject, QueryOperator, Unsubscriber } from 'entropic-bond'\nimport { FirebaseAdminHelper } from '../firebase-admin-helper'\nimport { Filter, WhereFilterOp } from 'firebase-admin/firestore'\nimport * as functions from 'firebase-functions/v2'\n\nexport class FirebaseAdminDatasource extends DataSource {\n\n\tconstructor( firebaseFunctionsGlobalOptions?: functions.GlobalOptions ) {\n\t\tsuper()\n\t\tif ( firebaseFunctionsGlobalOptions )\tfunctions.setGlobalOptions( firebaseFunctionsGlobalOptions )\n\t}\n\n\toverride findById( id: string, collectionName: string ): Promise< DocumentObject > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\t\n\t\treturn new Promise<DocumentObject>( async resolve => {\n\t\t\ttry {\n\t\t\t\tconst docSnap = db.doc( `${ collectionName }/${ id }`)\n\t\t\t\tconst retrievedObj = await docSnap.get()\n\t\t\t\tresolve( retrievedObj.data() as DocumentObject )\n\t\t\t} \n\t\t\tcatch( error ) {\n\t\t\t\tconsole.log( error )\n\t\t\t\treturn null\n\t\t\t}\n\t\t})\n\t}\n\n\toverride save( collections: Collections ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\t\tconst batch = db.batch()\n\n\t\tObject.entries( collections ).forEach(([ collectionName, collection ]) => {\n\t\t\tcollection?.forEach( document => {\n\t\t\t\t\tconst ref = db.doc( `${ collectionName }/${ document.id }` )\n\t\t\t\t\tbatch.set( ref, document ) \n\t\t\t})\n\t\t})\n\n\t\treturn batch.commit() as unknown as Promise<void>\n\t}\n\n\toverride find( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise< DocumentObject[] > {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\n\t\tthis._lastQuery = query\n\t\treturn this.getFromQuery( query )\n\t}\n\n\toverride async count( queryObject: QueryObject<DocumentObject>, collectionName: string ): Promise<number> {\n\t\tconst query = this.queryObjectToFirebaseQuery( queryObject, collectionName )\n\t\tconst snapShot = await query.count().get()\n\n\t\treturn snapShot.data().count\n\t}\n\n\toverride delete( id: string, collectionName: string ): Promise< void > {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\treturn db.recursiveDelete( db.doc( `${ collectionName }/${ id }` ) )\n\t}\n\n\toverride next( maxDocs?: number ): Promise< DocumentObject[] > {\n\t\tif( !this._lastQuery ) throw new Error('You should perform a query prior to using method next')\n\n\t\tthis._lastLimit = maxDocs || this._lastLimit\n\n\t\tconst query = this._lastQuery.limit( this._lastLimit ).startAfter( this._lastDocRetrieved )\n\n\t\treturn this.getFromQuery( query )\n\t}\n\n\t// prev should be used with next in reverse order\n\t// prev( limit?: number ): Promise< DocumentObject[] > {\n\t// }\n\n\tprivate getFromQuery( query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData> ): Promise<DocumentObject[]> {\n\t\treturn new Promise< DocumentObject[] >( async resolve => {\n\t\t\tconst doc = await query.get()\n\t\t\tthis._lastDocRetrieved = doc.docs[ doc.docs.length-1 ]\n\n\t\t\tresolve( doc.docs.map( doc => doc.data() as DocumentObject ) ) \n\t\t})\n\t}\n\n\tprivate queryObjectToFirebaseQuery( queryObject: QueryObject<DocumentObject>, collectionName: string ): FirebaseFirestore.Query<FirebaseFirestore.DocumentData> {\n\t\tconst db = FirebaseAdminHelper.instance.firestore()\n\n\t\tconst andConstraints: Filter[] = []\n\t\tconst orConstraints: Filter[] = []\n\n\t\tDataSource.toPropertyPathOperations( queryObject.operations as any ).forEach( operation =>\t{\n\t\t\tconst operator = this.toFirebaseOperator( operation.operator )\n\t\t\tif ( operation.aggregate) orConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t\telse andConstraints.push( Filter.where( operation.property, operator, operation.value ) )\n\t\t})\n\n\t\tlet query = db.collection( collectionName ).where( Filter.or( ...orConstraints, Filter.and( ...andConstraints ) )) \n\n\t\tif ( queryObject.sort?.propertyName ) {\n\t\t\tquery = query.orderBy( queryObject.sort.propertyName, queryObject.sort.order ) \n\t\t}\n\n\t\tif ( queryObject.limit ) {\n\t\t\tthis._lastLimit = queryObject.limit\n\t\t\tquery = query.limit( queryObject.limit )\n\t\t}\n\n\t\treturn query\n\t}\n\n\ttoFirebaseOperator( operator: QueryOperator ): WhereFilterOp {\n\t\tswitch( operator ) {\n\t\t\tcase '==': \n\t\t\tcase '!=':\n\t\t\tcase '<':\n\t\t\tcase '<=':\n\t\t\tcase '>':\n\t\t\tcase '>=': return operator\n\t\t\tcase 'contains': return 'array-contains'\n\t\t\tcase 'containsAny': return 'array-contains-any'\n\t\t\tdefault: return operator\n\t\t}\n\t}\n\n\tprotected override subscribeToDocumentChangeListener( collectionPathToListen: string, listener: DocumentChangeListener<DocumentObject> ): DocumentChangeListenerHandler | undefined {\n\t\tconst handler = functions.firestore.onDocumentUpdated( collectionPathToListen + '/{docId}', event => {\n\t\t\tconst snapshot = event.data\n\t\t\tlistener({ \n\t\t\t\tbefore: snapshot?.before.data() as DocumentObject, \n\t\t\t\tafter: snapshot?.after.data() as DocumentObject,\n\t\t\t\ttype: 'update',\n\t\t\t\tparams: event.params,\n\t\t\t\tcollectionPath: collectionPathToListen\n\t\t\t})\n\t\t})\n\t\t\n\t\treturn {\n\t\t\tuninstall: () => {},\n\t\t\tnativeHandler: handler,\n\t\t\tcollectionPath: collectionPathToListen,\n\t\t\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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"}
|
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.20",
|
|
5
5
|
"description": "Firebase Admin plugins for Entropic Bond",
|
|
6
6
|
"main": "lib/cjs/index.js",
|
|
7
7
|
"module": "lib/esm/index.js",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@semantic-release/changelog": "^6.0.3",
|
|
60
60
|
"@semantic-release/git": "^10.0.1",
|
|
61
|
-
"@types/node": "^25.
|
|
61
|
+
"@types/node": "^25.4.0",
|
|
62
62
|
"semantic-release": "^25.0.3",
|
|
63
63
|
"typescript": "^5.9.3",
|
|
64
64
|
"vite": "^7.3.1",
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
"vitest": "^4.0.18"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"entropic-bond": "^1.
|
|
69
|
+
"entropic-bond": "^1.56.5",
|
|
70
70
|
"firebase-admin": "^13.6.1",
|
|
71
|
-
"firebase-functions": "7.0.
|
|
71
|
+
"firebase-functions": "7.0.6"
|
|
72
72
|
}
|
|
73
73
|
}
|