← all adapters

firebase-style

simulates Firebase Auth + Firestore + Cloud Messaging API v1

restadapter v0.1.022 routes

verification

VMVM tier — no SDK suite yet· surface 22 · not implemented 4 · differs 8

use it

# add to stunt.yaml
services:
  firebase:
    adapter: embedded:firebase-style

# then
$ stunt up

The embedded: source extracts this adapter from the binary — no git clone, fully offline.

how to mock the Firebase Auth + Firestore + Cloud Messaging API locally

Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Firebase Auth + Firestore + Cloud Messaging API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Firebase Auth + Firestore + Cloud Messaging API v1 surface — the data is fake, the behavior is real.

backing stores

usersdocumentsmessages

api surface (22)

generated from the adapter manifest — exactly what boots, nothing more

22 routes
POST/v1/accounts:signInWithPassword
POST/v1/accounts:signUp
POST/v1/accounts:signInWithIdp
POST/v1/accounts:getAccountInfo
POST/v1/accounts:lookup
POST/identitytoolkit/v3/relyingparty/{action}
POST/v1/token
POST/v1/projects/{project}/databases/(default)/documents:runQuery
GET/v1/projects/{project}/databases/(default)/documents/{collection}
POST/v1/projects/{project}/databases/(default)/documents/{collection}
GET/v1/projects/{project}/databases/(default)/documents/{collection}/{id}
PATCH/v1/projects/{project}/databases/(default)/documents/{collection}/{id}
DELETE/v1/projects/{project}/databases/(default)/documents/{collection}/{id}
GET/v1/projects/{project}/databases/(default)/documents/{collection}/{document}/{sub}
POST/v1/projects/{project}/databases/(default)/documents/{collection}/{document}/{sub}
GET/v1/projects/{project}/databases/(default)/documents/{collection}/{document}/{sub}/{id}
PATCH/v1/projects/{project}/databases/(default)/documents/{collection}/{document}/{sub}/{id}
DELETE/v1/projects/{project}/databases/(default)/documents/{collection}/{document}/{sub}/{id}
POST/v1/projects/{project}/messages:send
GET/v1/projects/{project}/messages
POST/v1/projects/{project}/topics/{topic}:subscribe
POST/v1/projects/{project}/topics/{topic}:unsubscribe

VM-verified behaviors (28)

  • ✓signUp mints the Identity Toolkit token set with a padded localId
  • ✓duplicate and email-less signUps are Firebase-coded 400s
  • ✓password sign-in round-trips the user; bad credentials answer the real codes
  • ✓signInWithIdp provisions a verified Google user
  • ✓the v3 relyingparty dispatcher mirrors verifyPassword and 404s unknown actions
  • ✓endpoints accept Bearer or key and reject anonymous requests 401
  • ✓getAccountInfo resolves each idToken to the user it was minted for
  • ✓unknown and empty idTokens are 401 INVALID_ID_TOKEN
  • ✓the idToken dies at 1h while its refresh token survives
  • ✓v3 refreshToken rotates the token pair for the bound user
  • ✓unknown and missing refresh tokens are 400 INVALID_REFRESH_TOKEN
  • ✓POST /v1/token exchanges a refresh token in the securetoken shape
  • ✓the grant rejects wrong grant types and unknown tokens
  • ✓create wraps fields in Firestore typed values under a full resource name
  • ✓get reads the document back; unknown ids are 404 NOT_FOUND
  • ✓PATCH merges fields, bumps updateTime, and upserts unknown ids
  • ✓explicit documentIds are scoped per project+collection and 409 on reuse
  • ✓delete returns an empty 200 and leaves 404s behind (its own project only)
  • ✓list pages with pageSize/pageToken and rejects a malformed token
  • ✓subcollections nest under their parent document path
  • ✓runQuery filters, sorts, and limits over typed fields
  • ✓IN and ARRAY_CONTAINS resolve over array values
  • ✓queries are project-scoped and malformed bodies are 400 INVALID_ARGUMENT
  • ✓a token send is stored with its recipient and answers with its resource name
  • ✓a send must carry exactly one target
  • ✓topic and condition sends fan out to the subscribed tokens
  • ✓unsubscribing shrinks the fanout and a bare subscribe is a 400
  • ✓the stored message list is project-scoped

Not implemented (4)

  • No Realtime Database, Cloud Storage, or App Check surfaces
  • No password reset (sendOobCode), account update/delete, or phone auth
  • No Firestore index management, listCollectionIds, batchGet, or listen
  • runQuery lacks composite/unary filters, offset, and startAt/endAt cursors

Differs from the real API (8)

  • Firestore subcollections supported one level deep only
  • runQuery covers a structuredQuery subset: from/where/orderBy/limit, 8 filter ops
  • Auth checks credential presence only; Bearer or key value never validated
  • FCM topic :subscribe/:unsubscribe stand in for the Instance ID API
  • GET .../messages lists sent messages — simulator extension, no real endpoint
  • securetoken /v1/token errors use the Identity Toolkit envelope; real securetoken answers OAuth-style {error: invalid_grant}
  • securetoken access_token mirrors id_token; real Firebase mints distinct tokens
  • signUp includes registered:true and an empty displayName (real API emits those on sign-in only)
want more of the Firebase Auth + Firestore + Cloud Messaging API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.