@typed-firestore/rest
v0.1.0
Published
Elegant, typed abstractions for Firestore on any runtime with fetch and Web Crypto
Maintainers
Readme
@typed-firestore/rest
Elegant, typed abstractions for Firestore on any runtime with fetch and Web
Crypto.
This package talks to Firestore over its REST API instead of through a Firebase
SDK, and has no dependencies at all. That makes it the one to reach for
where firebase-admin does not fully run: Cloudflare Workers, Deno, edge
functions, and Bun.
The limitation is structural rather than incidental. The Firestore client inside
firebase-admin reaches @google-cloud/firestore, which speaks gRPC over
node:http2 via google-gax and protobufjs. Edge runtimes provide no http2
client, so no compatibility flag makes it work.
Install
pnpm add @typed-firestore/restUse
import {
createDb,
createDocumentMaybe,
getDocument,
getDocuments,
serviceAccount,
} from "@typed-firestore/rest";
/** Read the credential however your runtime supplies one. */
const db = createDb({
auth: serviceAccount(serviceAccountJson),
});
/** No cast needed; the type argument is supplied directly. */
export const refs = {
users: db.collection<User>("users"),
books: db.collection<Book>("books"),
} as const;
const user = await getDocument(refs.users, "abc123");
await user.update({ isActive: true });
const published = await getDocuments(refs.books, (query) =>
query
.where("isPublished", "==", true)
.orderBy("publishedAt", "desc")
.limit(50),
);Beyond the SDK
Two capabilities exist here and in @typed-firestore/server, but not in the
client packages, because the client SDKs do not expose a document's
updateTime at all:
/** Create at a known id, failing when one already exists. */
const created = await createDocumentMaybe(refs.users, "abc123", data);
/** Compare-and-swap against the version this document was read at. */
const wrote = await user.update({ isActive: true }, { ifUnchanged: true });
if (!wrote) {
/** Someone wrote first. A value, not an exception. */
}Not here yet
Transactions,
unbounded queries and processDocuments,
collection groups,
FieldValue sentinels, and
count() aggregation.
Every query needs an explicit .limit() until cursor pagination lands.
Documentation
https://typed-firestore.dev/rest/getting-started
License
Apache-2.0
