firesmelt 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/drivers/web.ts","../src/web.ts"],"names":["WebTimestamp","WebBytes","webServerTimestamp","webIncrement","webArrayUnion","webArrayRemove","webDeleteField","webDoc","webCollection","webCollectionGroup","webQuery","webWhere","webOrderBy","webLimit","webStartAt","webStartAfter","webEndAt","webEndBefore","webGetDoc","webSetDoc","webUpdateDoc","webAddDoc","webDeleteDoc","webSum","webAverage","webOnSnapshot","webRunTransaction","options","webWriteBatch","webDocumentId"],"mappings":"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","file":"web.js","sourcesContent":["import {\n addDoc as webAddDoc,\n arrayRemove as webArrayRemove,\n arrayUnion as webArrayUnion,\n average as webAverage,\n Bytes as WebBytes,\n collection as webCollection,\n collectionGroup as webCollectionGroup,\n deleteDoc as webDeleteDoc,\n deleteField as webDeleteField,\n doc as webDoc,\n documentId as webDocumentId,\n endAt as webEndAt,\n endBefore as webEndBefore,\n getAggregateFromServer,\n getCountFromServer,\n getDoc as webGetDoc,\n getDocs,\n increment as webIncrement,\n limit as webLimit,\n onSnapshot as webOnSnapshot,\n orderBy as webOrderBy,\n query as webQuery,\n runTransaction as webRunTransaction,\n serverTimestamp as webServerTimestamp,\n setDoc as webSetDoc,\n startAfter as webStartAfter,\n startAt as webStartAt,\n sum as webSum,\n Timestamp as WebTimestamp,\n updateDoc as webUpdateDoc,\n where as webWhere,\n writeBatch as webWriteBatch,\n type CollectionReference,\n type DocumentData as WebDocumentData,\n type DocumentReference,\n type FieldPath as WebFieldPath,\n type FieldValue as WebFieldValue,\n type Firestore,\n type FirestoreDataConverter,\n type Query,\n type QueryConstraint,\n type QueryDocumentSnapshot,\n type SetOptions,\n type SnapshotOptions,\n} from \"firebase/firestore\";\n\nimport { toNative } from \"@/core/coerce\";\nimport type {\n BatchDriver,\n CollectionLocation,\n Constraint,\n DocLocation,\n DocObserver,\n DocumentData,\n Driver,\n FieldRef,\n NativeAdapter,\n QueryObserver,\n QuerySource,\n RawConverter,\n RawSnapshot,\n TransactionOptions,\n TxDriver,\n Unsubscribe,\n WriteOptions,\n} from \"@/core/driver\";\nimport { FiresmeltError } from \"@/core/errors\";\nimport {\n ArrayRemoveSentinel,\n ArrayUnionSentinel,\n DeleteFieldSentinel,\n IncrementSentinel,\n type Sentinel,\n ServerTimestampSentinel,\n} from \"@/core/firestore\";\n\n// Pending serverTimestamp() reads null, estimate from clock for the Date type\nconst SNAPSHOT_OPTIONS: SnapshotOptions = { serverTimestamps: \"estimate\" };\n\n// Driver for the firebase modular functional web SDK\nexport class WebDriver implements Driver {\n readonly native: NativeAdapter;\n readonly #fs: Firestore;\n\n constructor(firestore: Firestore) {\n this.#fs = firestore;\n this.native = {\n timestampFromDate: (date) => WebTimestamp.fromDate(date),\n fieldValue: (sentinel) => this.#fieldValue(sentinel),\n bytesFromUint8Array: (bytes) => WebBytes.fromUint8Array(bytes),\n };\n }\n\n #fieldValue(sentinel: Sentinel): WebFieldValue {\n if (sentinel instanceof ServerTimestampSentinel) {\n return webServerTimestamp();\n }\n if (sentinel instanceof IncrementSentinel) {\n return webIncrement(sentinel.by);\n }\n if (sentinel instanceof ArrayUnionSentinel) {\n return webArrayUnion(...this.#values(sentinel.values));\n }\n if (sentinel instanceof ArrayRemoveSentinel) {\n return webArrayRemove(...this.#values(sentinel.values));\n }\n if (sentinel instanceof DeleteFieldSentinel) {\n return webDeleteField();\n }\n throw new FiresmeltError(\"Unknown sentinel\");\n }\n\n #values(values: readonly unknown[]): unknown[] {\n return values.map((value) => toNative(value, this.native));\n }\n\n #setOptions(options?: WriteOptions): SetOptions | undefined {\n if (options?.mergeFields) {\n return { mergeFields: [...options.mergeFields] };\n }\n if (options?.merge) {\n return { merge: true };\n }\n return undefined;\n }\n\n #doc(segments: readonly string[]): DocumentReference {\n return webDoc(this.#fs, segments.join(\"/\"));\n }\n\n #collection(segments: readonly string[]): CollectionReference {\n return webCollection(this.#fs, segments.join(\"/\"));\n }\n\n #query(source: QuerySource, constraints: readonly Constraint[]): Query {\n const base: Query =\n source.kind === \"collection\"\n ? this.#collection(source.segments)\n : webCollectionGroup(this.#fs, source.collectionId);\n return webQuery(base, ...constraints.map((c) => this.#constraint(c)));\n }\n\n #constraint(constraint: Constraint): QueryConstraint {\n switch (constraint.type) {\n case \"where\":\n return webWhere(\n fieldRef(constraint.field),\n constraint.op,\n toNative(constraint.value, this.native),\n );\n case \"orderBy\":\n return webOrderBy(fieldRef(constraint.field), constraint.direction);\n case \"limit\":\n return webLimit(constraint.limit);\n case \"startAt\":\n return webStartAt(...this.#values(constraint.values));\n case \"startAfter\":\n return webStartAfter(...this.#values(constraint.values));\n case \"endAt\":\n return webEndAt(...this.#values(constraint.values));\n case \"endBefore\":\n return webEndBefore(...this.#values(constraint.values));\n }\n }\n\n async getDoc(path: DocLocation): Promise<RawSnapshot> {\n const snapshot = await webGetDoc(this.#doc(path.segments));\n return {\n id: snapshot.id,\n exists: snapshot.exists(),\n data: snapshot.data(SNAPSHOT_OPTIONS),\n };\n }\n\n async setDoc(\n path: DocLocation,\n data: DocumentData,\n options?: WriteOptions,\n ): Promise<void> {\n const ref = this.#doc(path.segments);\n const setOptions = this.#setOptions(options);\n await (setOptions\n ? webSetDoc(ref, data, setOptions)\n : webSetDoc(ref, data));\n }\n\n async updateDoc(path: DocLocation, data: DocumentData): Promise<void> {\n await webUpdateDoc(this.#doc(path.segments), data);\n }\n\n async addDoc(path: CollectionLocation, data: DocumentData): Promise<string> {\n const ref = await webAddDoc(this.#collection(path.segments), data);\n return ref.id;\n }\n\n async deleteDoc(path: DocLocation): Promise<void> {\n await webDeleteDoc(this.#doc(path.segments));\n }\n\n async runQuery(\n source: QuerySource,\n constraints: readonly Constraint[],\n ): Promise<RawSnapshot[]> {\n const snapshot = await getDocs(this.#query(source, constraints));\n return snapshot.docs.map((doc) => ({\n id: doc.id,\n exists: true,\n data: doc.data(SNAPSHOT_OPTIONS),\n }));\n }\n\n async count(\n source: QuerySource,\n constraints: readonly Constraint[],\n ): Promise<number> {\n const snapshot = await getCountFromServer(this.#query(source, constraints));\n return snapshot.data().count;\n }\n\n async sum(\n source: QuerySource,\n constraints: readonly Constraint[],\n field: string,\n ): Promise<number> {\n const snapshot = await getAggregateFromServer(\n this.#query(source, constraints),\n { value: webSum(field) },\n );\n return snapshot.data().value;\n }\n\n async average(\n source: QuerySource,\n constraints: readonly Constraint[],\n field: string,\n ): Promise<number | null> {\n const snapshot = await getAggregateFromServer(\n this.#query(source, constraints),\n { value: webAverage(field) },\n );\n return snapshot.data().value;\n }\n\n onSnapshotDoc(path: DocLocation, observer: DocObserver): Unsubscribe {\n return webOnSnapshot(\n this.#doc(path.segments),\n (snapshot) =>\n observer.next({\n id: snapshot.id,\n exists: snapshot.exists(),\n data: snapshot.data(SNAPSHOT_OPTIONS),\n }),\n observer.error?.bind(observer),\n );\n }\n\n onSnapshotQuery(\n source: QuerySource,\n constraints: readonly Constraint[],\n observer: QueryObserver,\n ): Unsubscribe {\n return webOnSnapshot(\n this.#query(source, constraints),\n (snapshot) =>\n observer.next(\n snapshot.docs.map((doc) => ({\n id: doc.id,\n exists: true,\n data: doc.data(SNAPSHOT_OPTIONS),\n })),\n ),\n observer.error?.bind(observer),\n );\n }\n\n runTransaction<T>(\n fn: (tx: TxDriver) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n return webRunTransaction(\n this.#fs,\n (transaction) => {\n const tx: TxDriver = {\n get: async (path) => {\n const snapshot = await transaction.get(this.#doc(path.segments));\n return {\n id: snapshot.id,\n exists: snapshot.exists(),\n data: snapshot.data(SNAPSHOT_OPTIONS),\n };\n },\n set: (path, data, options) => {\n const ref = this.#doc(path.segments);\n const setOptions = this.#setOptions(options);\n if (setOptions) {\n transaction.set(ref, data, setOptions);\n } else {\n transaction.set(ref, data);\n }\n },\n update: (path, data) => {\n transaction.update(this.#doc(path.segments), data);\n },\n delete: (path) => {\n transaction.delete(this.#doc(path.segments));\n },\n };\n return fn(tx);\n },\n options,\n );\n }\n\n batch(): BatchDriver {\n const batch = webWriteBatch(this.#fs);\n return {\n set: (path, data, options) => {\n const ref = this.#doc(path.segments);\n const setOptions = this.#setOptions(options);\n if (setOptions) {\n batch.set(ref, data, setOptions);\n } else {\n batch.set(ref, data);\n }\n },\n update: (path, data) => {\n batch.update(this.#doc(path.segments), data);\n },\n delete: (path) => {\n batch.delete(this.#doc(path.segments));\n },\n commit: async () => {\n await batch.commit();\n },\n };\n }\n\n docRef(path: DocLocation, converter: RawConverter): unknown {\n return this.#doc(path.segments).withConverter(adaptConverter(converter));\n }\n\n collectionRef(path: CollectionLocation, converter: RawConverter): unknown {\n return this.#collection(path.segments).withConverter(\n adaptConverter(converter),\n );\n }\n\n queryRef(\n source: QuerySource,\n constraints: readonly Constraint[],\n converter: RawConverter,\n ): unknown {\n return this.#query(source, constraints).withConverter(\n adaptConverter(converter),\n );\n }\n}\n\n// Document id reference translates to SDK documentId field path\nfunction fieldRef(field: FieldRef): string | WebFieldPath {\n return typeof field === \"string\" ? field : webDocumentId();\n}\n\nfunction adaptConverter(\n converter: RawConverter,\n): FirestoreDataConverter<DocumentData, WebDocumentData> {\n return {\n toFirestore: (model) => converter.toNative(model),\n fromFirestore: (\n snapshot: QueryDocumentSnapshot<WebDocumentData>,\n options: SnapshotOptions,\n ) =>\n converter.fromNative(\n snapshot.id,\n snapshot.data(options.serverTimestamps ? options : SNAPSHOT_OPTIONS),\n ) as DocumentData,\n };\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n CollectionReference,\n DocumentReference,\n Firestore,\n Query,\n} from \"firebase/firestore\";\n\nimport { Database } from \"@/core/database\";\nimport type { CollectionHandle, DocumentHandle } from \"@/core/handles\";\nimport type { QueryBuilder } from \"@/core/query\";\nimport type { Doc } from \"@/core/types\";\nimport { WebDriver } from \"@/drivers/web\";\n\nexport function createDatabase(firestore: Firestore): Database {\n return new Database(new WebDriver(firestore));\n}\n\n// Typed escape hatches, cast the neutral unknown .ref to the web SDK ref\nexport function docRef<S extends StandardSchemaV1>(\n handle: DocumentHandle<S>,\n): DocumentReference<Doc<S>> {\n return handle.ref as DocumentReference<Doc<S>>;\n}\n\nexport function collectionRef<S extends StandardSchemaV1>(\n handle: CollectionHandle<S>,\n): CollectionReference<Doc<S>> {\n return handle.ref as CollectionReference<Doc<S>>;\n}\n\nexport function queryRef<S extends StandardSchemaV1>(\n builder: QueryBuilder<S>,\n): Query<Doc<S>> {\n return builder.ref as Query<Doc<S>>;\n}\n\nexport * from \"@/index\";\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "firesmelt",
3
+ "version": "0.1.0",
4
+ "description": "Thin typed wrapper over both Firestore SDKs",
5
+ "license": "MIT",
6
+ "author": "mwpryer",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/mwpryer/firesmelt.git"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./admin": {
21
+ "types": "./dist/admin.d.ts",
22
+ "import": "./dist/admin.js"
23
+ },
24
+ "./web": {
25
+ "types": "./dist/web.d.ts",
26
+ "import": "./dist/web.js"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "typecheck": "tsc --noEmit",
32
+ "test": "firebase emulators:exec --only firestore --project firesmelt 'bun test'",
33
+ "lint": "oxlint",
34
+ "lint:fix": "oxlint --fix",
35
+ "fmt": "oxfmt",
36
+ "fmt:check": "oxfmt --check",
37
+ "format": "bun run lint:fix && bun run fmt",
38
+ "preversion": "bun run typecheck && bun run lint && bun run fmt:check && bun run test",
39
+ "postversion": "git push --follow-tags"
40
+ },
41
+ "dependencies": {
42
+ "@standard-schema/spec": "^1.1.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/bun": "latest",
46
+ "firebase": "^12.15.0",
47
+ "firebase-admin": "^14.0.0",
48
+ "firebase-tools": "^15.16.0",
49
+ "oxfmt": "^0.56.0",
50
+ "oxlint": "^1.71.0",
51
+ "tsup": "^8.5.1",
52
+ "zod": "^4.4.3"
53
+ },
54
+ "peerDependencies": {
55
+ "firebase": "^11.0.0 || ^12.0.0",
56
+ "firebase-admin": "^12.0.0 || ^13.0.0 || ^14.0.0"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "firebase": {
60
+ "optional": true
61
+ },
62
+ "firebase-admin": {
63
+ "optional": true
64
+ }
65
+ }
66
+ }