firefighter
firefighter is Firestore REST API wrapper library worked on @sveltejs/kit + Cloudflare Workers.
This library can write/read firestore with set JWT (and fetch function) authenticated by Firebase Authentication or Google OAuth.
why
Official Firestore library is awesome library, but currently , in 2021-11-10, cannot work on page.js and server.js of @sveltejs/kit + Cloudflare Workers.
So, I made this library.
feature
- get
- list
- runQuery
- patch (set, update, delete)
- createDocument
- commit (batch, transaction)
install
npm install firefighter
imporant
- gRPC Listen (called onSnapshot function in official firestore library) is not supported
- It is not recommended to have a firestore instance globally as the Firestore objects in this library do not automatically update the JWT.
usage
get
import { firestore, reference, from } from 'firefighter'
import type { FromConverter } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const ref = reference(fs, 'collection', 'document')
.withConverter({ from: (result) => ({ id: result.id, ...result.toJson() }) })
const result = await from(ref, { picks: ['documentProperty'] } ).find()
console.log(result.toJson())
list
import { firestore, reference, from } from 'firefighter'
import type { FromConverter } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const ref = reference(fs, 'collection')
.withConverter({ from: (result) => ({ id: result.id, ...result.toJson() }) })
const result = await from(ref, { picks: ['documentProperty'] } ).findAll()
console.log(result.toList())
runQuery
import { firestore, reference, from, where, offset } from 'firefighter'
import type { FromConverter } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const ref = reference(fs, 'collection')
.withConverter({ from: (result) => ({ id: result.id, ...result.toJson() }) })
const { query, groupQuery } = await from(ref, { picks: ['documentProperty'] } )
let result = await query(where('count', '>', 1), offset(10))
console.log(result.toList())
let result = await groupQuery(where('count', '>', 1), offset(10))
console.log(result.toList())
patch(set, update, delete)
import { firestore, reference, on, increment } from 'firefighter'
import type { ToConverter } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const ref = reference(fs, 'collection', 'document')
.withConverter<{ name: string, count: number }>({ to: (data) => ({ name: data.name, count: data.count }) })
const data = { id: 'document', name: 'user', count: 1 }
const { set, update, delete: del } = on(ref)
await set(data)
await update({ count: increment(1) })
await del()
createDocument
import { firestore, reference, on } from 'firefighter'
import type { ToConverter } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const ref = reference(fs, 'collection')
const data = { id: 'document', name: 'user', count: 1 }
const documentId = await on(ref).create(data)
commit (batch, transaction)
import { firestore, reference, batcher, transactor } from 'firefighter'
const token = 'eyJhbGciOiJSUzI...'
const fs = firestore({ projectId: 'projectId', token }, { fetch: fetch } )
const batch = batcher(fs)
batch.set(reference(fs, 'collection', 'document'), { name: 'user', count: 1 })
batch.update(reference(fs, 'collection', 'document'), { count: 2 })
batch.delete(reference(fs, 'collection', 'document'))
await batch.commit()
await transactor(fs).run(async (t) => {
const ref = reference(fs, 'collection', 'document')
const result = await t.get(ref)
if (!result.toJson()) {
throw new Error('error')
}
t.set(ref, { count: result.toJson().count + 1 })
})