fires2rest 0.1.3 → 0.2.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.
package/README.md CHANGED
@@ -12,7 +12,7 @@ Firestore REST with Transactions → Firestore RES**T** → FirestoREST → Fire
12
12
 
13
13
  - 🔥 **Full Firestore REST API support** - CRUD operations via REST
14
14
  - ⚡ **Transaction support** - Atomic reads and writes with automatic retry
15
- - 🎯 **TypeScript first** - Full type safety with generics
15
+ - 🔍 **Query support** - Filter, order, limit, and paginate collections
16
16
  - 🌐 **Serverless ready** - Works in Cloudflare Workers, Deno, Bun, and any JS runtime
17
17
  - 📦 **Lightweight** - The only dependency is `jose` for JWT auth
18
18
  - 🔄 **FieldValue support** - serverTimestamp, increment, delete, arrayUnion, arrayRemove
@@ -141,6 +141,57 @@ Reference to a collection.
141
141
 
142
142
  - `doc(id?)` - Get a `DocumentReference` (auto-generates ID if not provided)
143
143
  - `add(data)` - Add document with auto-generated ID
144
+ - `where(field, op, value)` - Filter by field value
145
+ - `orderBy(field, direction?)` - Order results
146
+ - `limit(n)` / `limitToLast(n)` - Limit results
147
+ - `offset(n)` - Skip results
148
+ - `startAt(...values)` / `startAfter(...values)` - Cursor pagination
149
+ - `endAt(...values)` / `endBefore(...values)` - Cursor pagination
150
+ - `select(...fields)` - Field projection
151
+ - `get()` - Execute query and return `QuerySnapshot`
152
+ - `count()` - Count matching documents
153
+
154
+ ### Queries
155
+
156
+ Build queries using chainable methods:
157
+
158
+ ```typescript
159
+ // Filter, order, and limit
160
+ const snapshot = await db
161
+ .collection("users")
162
+ .where("age", ">=", 18)
163
+ .where("active", "==", true)
164
+ .orderBy("createdAt", "desc")
165
+ .limit(10)
166
+ .get();
167
+
168
+ // Iterate results
169
+ snapshot.forEach((doc) => {
170
+ console.log(doc.id, doc.data());
171
+ });
172
+
173
+ // Count documents
174
+ const countSnap = await db
175
+ .collection("users")
176
+ .where("active", "==", true)
177
+ .count();
178
+ console.log("Active users:", countSnap.data().count);
179
+
180
+ // Cursor-based pagination
181
+ const page2 = await db
182
+ .collection("users")
183
+ .orderBy("name")
184
+ .startAfter("Alice")
185
+ .limit(10)
186
+ .get();
187
+ ```
188
+
189
+ **Supported filter operators:**
190
+
191
+ - `==`, `!=` - Equality
192
+ - `<`, `<=`, `>`, `>=` - Comparison
193
+ - `array-contains`, `array-contains-any` - Array queries
194
+ - `in`, `not-in` - Inclusion queries
144
195
 
145
196
  ### `FieldValue`
146
197
 
package/dist/index.d.ts CHANGED
@@ -205,6 +205,265 @@ interface DocumentSnapshot<T = DocumentData> {
205
205
  /** Time the document was last updated */
206
206
  readonly updateTime?: Date;
207
207
  }
208
+ /** Filter operators for where() clauses */
209
+ type WhereFilterOp = "<" | "<=" | "==" | "!=" | ">=" | ">" | "array-contains" | "array-contains-any" | "in" | "not-in";
210
+ /** Order direction for orderBy() */
211
+ type OrderByDirection = "asc" | "desc";
212
+ /** A selector for a collection */
213
+ interface CollectionSelector {
214
+ /** The collection ID (relative, not full path) */
215
+ collectionId: string;
216
+ /** When true, selects all descendant collections */
217
+ allDescendants?: boolean;
218
+ }
219
+ /** A field reference */
220
+ interface FieldReference {
221
+ /** The field path */
222
+ fieldPath: string;
223
+ }
224
+ /** An ordering on a field */
225
+ interface Order {
226
+ /** The field to order on */
227
+ field: FieldReference;
228
+ /** The direction to order by */
229
+ direction?: "ASCENDING" | "DESCENDING";
230
+ }
231
+ /** A position in a query result set */
232
+ interface Cursor {
233
+ /** Values that represent a position */
234
+ values: FirestoreValue[];
235
+ /** If the position is before the values */
236
+ before?: boolean;
237
+ }
238
+ /** A projection of fields to return */
239
+ interface Projection {
240
+ /** The fields to return */
241
+ fields: FieldReference[];
242
+ }
243
+ /** A filter on a specific field */
244
+ interface FieldFilter {
245
+ /** The field to filter on */
246
+ field: FieldReference;
247
+ /** The operator to filter by */
248
+ op: "LESS_THAN" | "LESS_THAN_OR_EQUAL" | "GREATER_THAN" | "GREATER_THAN_OR_EQUAL" | "EQUAL" | "NOT_EQUAL" | "ARRAY_CONTAINS" | "IN" | "ARRAY_CONTAINS_ANY" | "NOT_IN";
249
+ /** The value to compare to */
250
+ value: FirestoreValue;
251
+ }
252
+ /** A filter that merges multiple other filters */
253
+ interface CompositeFilter {
254
+ /** The operator for combining multiple filters */
255
+ op: "AND" | "OR";
256
+ /** The list of filters to combine */
257
+ filters: Filter[];
258
+ }
259
+ /** A filter on a single field for unary operators */
260
+ interface UnaryFilter {
261
+ /** The unary operator to apply */
262
+ op: "IS_NAN" | "IS_NULL" | "IS_NOT_NAN" | "IS_NOT_NULL";
263
+ /** The field to apply the filter on */
264
+ field: FieldReference;
265
+ }
266
+ /** A filter */
267
+ interface Filter {
268
+ /** A composite filter */
269
+ compositeFilter?: CompositeFilter;
270
+ /** A filter on a field */
271
+ fieldFilter?: FieldFilter;
272
+ /** A filter with a unary operator */
273
+ unaryFilter?: UnaryFilter;
274
+ }
275
+ /** A structured query */
276
+ interface StructuredQuery {
277
+ /** The collections to query */
278
+ from?: CollectionSelector[];
279
+ /** The filter to apply */
280
+ where?: Filter;
281
+ /** The order to apply to the query results */
282
+ orderBy?: Order[];
283
+ /** A starting point for the query results */
284
+ startAt?: Cursor;
285
+ /** An end point for the query results */
286
+ endAt?: Cursor;
287
+ /** The number of documents to skip */
288
+ offset?: number;
289
+ /** The maximum number of results to return */
290
+ limit?: {
291
+ value: number;
292
+ };
293
+ /** The projection to return */
294
+ select?: Projection;
295
+ }
296
+ /** A single result from a runQuery call */
297
+ interface RunQueryResponseItem {
298
+ /** A query result (if present) */
299
+ document?: FirestoreDocument;
300
+ /** The time at which the document was read */
301
+ readTime?: string;
302
+ /** If present, Firestore has completely finished the request */
303
+ done?: boolean;
304
+ /** The number of documents skipped (for offset) */
305
+ skippedResults?: number;
306
+ }
307
+ /** An aggregation to run on a query */
308
+ interface Aggregation {
309
+ /** Optional. The alias for the aggregation result */
310
+ alias?: string;
311
+ /** Count aggregation */
312
+ count?: Record<string, never>;
313
+ /** Sum aggregation */
314
+ sum?: {
315
+ field: FieldReference;
316
+ };
317
+ /** Average aggregation */
318
+ avg?: {
319
+ field: FieldReference;
320
+ };
321
+ }
322
+ /** Result of an aggregation query */
323
+ interface AggregationResult {
324
+ /** The aggregation results */
325
+ result: {
326
+ aggregateFields: Record<string, FirestoreValue>;
327
+ };
328
+ /** The time at which the aggregate was computed */
329
+ readTime: string;
330
+ }
331
+ /** A snapshot of query results */
332
+ interface QuerySnapshot<T = DocumentData> {
333
+ /** The documents in this snapshot */
334
+ readonly docs: QueryDocumentSnapshot<T>[];
335
+ /** True if there are no documents */
336
+ readonly empty: boolean;
337
+ /** The number of documents */
338
+ readonly size: number;
339
+ /** Execute a callback for each document */
340
+ forEach(callback: (doc: QueryDocumentSnapshot<T>) => void): void;
341
+ }
342
+ /** A snapshot of a document in a query result (always exists) */
343
+ interface QueryDocumentSnapshot<T = DocumentData> extends DocumentSnapshot<T> {
344
+ /** Always true for query document snapshots */
345
+ readonly exists: true;
346
+ /** The document data (always defined) */
347
+ data(): T;
348
+ }
349
+ /** A snapshot of an aggregate query result */
350
+ interface AggregateQuerySnapshot {
351
+ /** The count result */
352
+ data(): {
353
+ count: number;
354
+ };
355
+ }
356
+ /**
357
+ * Interface for the Firestore client.
358
+ * Used internally by Query, DocumentReference, and CollectionReference.
359
+ */
360
+ interface FirestoreClientInterface {
361
+ _getDocument(path: string, transactionId?: string): Promise<FirestoreDocument | null>;
362
+ _getDocumentName(path: string): string;
363
+ _setDocument(path: string, data: Record<string, unknown>, options?: {
364
+ merge?: boolean;
365
+ }): Promise<WriteResult>;
366
+ _updateDocument(path: string, data: Record<string, unknown>): Promise<WriteResult>;
367
+ _deleteDocument(path: string): Promise<void>;
368
+ _runQuery(collectionPath: string, query: StructuredQuery, transactionId?: string): Promise<RunQueryResponseItem[]>;
369
+ _runAggregationQuery(collectionPath: string, query: StructuredQuery, aggregations: Aggregation[]): Promise<AggregationResult>;
370
+ }
371
+ //#endregion
372
+ //#region src/query.d.ts
373
+ /** Internal representation of query constraints */
374
+ interface QueryConstraints {
375
+ filters: Filter[];
376
+ orderBy: Order[];
377
+ limit?: number;
378
+ limitToLast?: number;
379
+ offset?: number;
380
+ startAt?: {
381
+ values: unknown[];
382
+ before: boolean;
383
+ };
384
+ endAt?: {
385
+ values: unknown[];
386
+ before: boolean;
387
+ };
388
+ select?: string[];
389
+ }
390
+ /**
391
+ * A Query refers to a query which you can read or listen to.
392
+ * You can refine a Query with query constraints.
393
+ */
394
+ declare class Query<T = DocumentData> {
395
+ /** @internal */
396
+ protected readonly _firestore: FirestoreClientInterface;
397
+ /** @internal */
398
+ protected readonly _collectionPath: string;
399
+ /** @internal */
400
+ protected readonly _constraints: QueryConstraints;
401
+ constructor(firestore: FirestoreClientInterface, collectionPath: string, constraints?: QueryConstraints);
402
+ /**
403
+ * Creates a new query with an additional filter.
404
+ */
405
+ where(fieldPath: string, opStr: WhereFilterOp, value: unknown): Query<T>;
406
+ /**
407
+ * Creates a new query with an additional ordering.
408
+ */
409
+ orderBy(fieldPath: string, directionStr?: OrderByDirection): Query<T>;
410
+ /**
411
+ * Creates a new query that returns only the first matching documents.
412
+ */
413
+ limit(count: number): Query<T>;
414
+ /**
415
+ * Creates a new query that returns only the last matching documents.
416
+ * Must be used with at least one orderBy clause.
417
+ */
418
+ limitToLast(count: number): Query<T>;
419
+ /**
420
+ * Creates a new query that skips the first matching documents.
421
+ */
422
+ offset(count: number): Query<T>;
423
+ /**
424
+ * Creates a new query starting at the provided values (inclusive).
425
+ */
426
+ startAt(...values: unknown[]): Query<T>;
427
+ /**
428
+ * Creates a new query starting after the provided values (exclusive).
429
+ */
430
+ startAfter(...values: unknown[]): Query<T>;
431
+ /**
432
+ * Creates a new query ending at the provided values (inclusive).
433
+ */
434
+ endAt(...values: unknown[]): Query<T>;
435
+ /**
436
+ * Creates a new query ending before the provided values (exclusive).
437
+ */
438
+ endBefore(...values: unknown[]): Query<T>;
439
+ /**
440
+ * Creates a new query that returns only specific fields.
441
+ */
442
+ select(...fields: string[]): Query<T>;
443
+ /**
444
+ * Executes the query and returns the results.
445
+ */
446
+ get(): Promise<QuerySnapshot<T>>;
447
+ /**
448
+ * Returns a count of the documents matching the query.
449
+ */
450
+ count(): Promise<AggregateQuerySnapshot>;
451
+ /**
452
+ * Converts the query constraints to a StructuredQuery.
453
+ * @internal
454
+ */
455
+ _toStructuredQuery(): StructuredQuery;
456
+ /**
457
+ * Builds a cursor from values.
458
+ * @internal
459
+ */
460
+ private _buildCursor;
461
+ /**
462
+ * Builds a projection from field paths.
463
+ * @internal
464
+ */
465
+ private _buildProjection;
466
+ }
208
467
  //#endregion
209
468
  //#region src/references.d.ts
210
469
  /**
@@ -221,15 +480,6 @@ declare class DocumentSnapshotImpl<T = DocumentData> implements DocumentSnapshot
221
480
  data(): T | undefined;
222
481
  get(fieldPath: string): unknown;
223
482
  }
224
- interface FirestoreClientInterface {
225
- _getDocument(path: string, transactionId?: string): Promise<FirestoreDocument | null>;
226
- _getDocumentName(path: string): string;
227
- _setDocument(path: string, data: Record<string, unknown>, options?: {
228
- merge?: boolean;
229
- }): Promise<WriteResult>;
230
- _updateDocument(path: string, data: Record<string, unknown>): Promise<WriteResult>;
231
- _deleteDocument(path: string): Promise<void>;
232
- }
233
483
  /**
234
484
  * A reference to a Firestore document.
235
485
  */
@@ -267,12 +517,12 @@ declare class DocumentReference<T = DocumentData> {
267
517
  }
268
518
  /**
269
519
  * A reference to a Firestore collection.
520
+ * Extends Query to provide query methods.
270
521
  */
271
- declare class CollectionReference<T = DocumentData> {
272
- private readonly _firestore;
522
+ declare class CollectionReference<T = DocumentData> extends Query<T> {
273
523
  readonly id: string;
274
524
  readonly path: string;
275
- constructor(_firestore: FirestoreClientInterface, path: string);
525
+ constructor(firestore: FirestoreClientInterface, path: string);
276
526
  /**
277
527
  * Get a document reference in this collection.
278
528
  * If no ID is provided, a random one will be generated.
@@ -364,6 +614,10 @@ declare class Firestore implements FirestoreClientInterface {
364
614
  _beginTransaction(retryTransaction?: string): Promise<string>;
365
615
  /** @internal */
366
616
  _commitTransaction(transactionId: string, writes: Write[]): Promise<CommitResponse>;
617
+ /** @internal Run a structured query against a collection */
618
+ _runQuery(collectionPath: string, query: StructuredQuery, transactionId?: string): Promise<RunQueryResponseItem[]>;
619
+ /** @internal Run an aggregation query against a collection */
620
+ _runAggregationQuery(collectionPath: string, query: StructuredQuery, aggregations: Aggregation[]): Promise<AggregationResult>;
367
621
  }
368
622
  //#endregion
369
623
  //#region src/field-value.d.ts
@@ -521,5 +775,5 @@ declare function fromFirestoreFields(fields: Record<string, FirestoreValue>): Re
521
775
  declare function createJWT(config: ServiceAccountConfig): Promise<string>;
522
776
  declare function getFirestoreToken(config: ServiceAccountConfig): Promise<string>;
523
777
  //#endregion
524
- export { ArrayRemoveValue, ArrayUnionValue, ArrayValue, AuthConfig, BatchGetResponse, BeginTransactionResponse, BooleanValue, BytesValue, CollectionReference, CommitResponse, DeleteFieldValue, DocumentData, DocumentReference, DocumentSnapshot, DocumentSnapshotImpl, DocumentTransform, DoubleValue, FieldTransform, FieldValue, type FieldValueType, Firestore, FirestoreClientInterface, FirestoreDocument, FirestoreValue, GeoPoint, GeoPointValue, IncrementValue, IntegerValue, MapValue, NullValue, Precondition, ReferenceValue, ServerTimestampValue, ServiceAccountConfig, StringValue, Timestamp, TimestampValue, TokenConfig, Transaction, TransactionOptions, Write, WriteResult, createJWT, extractDeleteFields, extractFieldTransforms, extractTransformFields, fromFirestoreFields, fromFirestoreValue, getArrayRemoveElements, getArrayUnionElements, getFirestoreToken, getIncrementAmount, isArrayRemove, isArrayUnion, isDeleteField, isFieldValue, isIncrement, isServerTimestamp, toFirestoreFields, toFirestoreValue };
778
+ export { AggregateQuerySnapshot, Aggregation, AggregationResult, ArrayRemoveValue, ArrayUnionValue, ArrayValue, AuthConfig, BatchGetResponse, BeginTransactionResponse, BooleanValue, BytesValue, CollectionReference, CollectionSelector, CommitResponse, CompositeFilter, Cursor, DeleteFieldValue, DocumentData, DocumentReference, DocumentSnapshot, DocumentSnapshotImpl, DocumentTransform, DoubleValue, FieldFilter, FieldReference, FieldTransform, FieldValue, type FieldValueType, Filter, Firestore, FirestoreClientInterface, FirestoreDocument, FirestoreValue, GeoPoint, GeoPointValue, IncrementValue, IntegerValue, MapValue, NullValue, Order, OrderByDirection, Precondition, Projection, Query, QueryConstraints, QueryDocumentSnapshot, QuerySnapshot, ReferenceValue, RunQueryResponseItem, ServerTimestampValue, ServiceAccountConfig, StringValue, StructuredQuery, Timestamp, TimestampValue, TokenConfig, Transaction, TransactionOptions, UnaryFilter, WhereFilterOp, Write, WriteResult, createJWT, extractDeleteFields, extractFieldTransforms, extractTransformFields, fromFirestoreFields, fromFirestoreValue, getArrayRemoveElements, getArrayUnionElements, getFirestoreToken, getIncrementAmount, isArrayRemove, isArrayUnion, isDeleteField, isFieldValue, isIncrement, isServerTimestamp, toFirestoreFields, toFirestoreValue };
525
779
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/references.ts","../src/transaction.ts","../src/client.ts","../src/field-value.ts","../src/value.ts","../src/auth.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/query.ts","../src/references.ts","../src/transaction.ts","../src/client.ts","../src/field-value.ts","../src/value.ts","../src/auth.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -85,6 +85,13 @@ function extractDocumentId(name) {
85
85
  return parts[parts.length - 1];
86
86
  }
87
87
  /**
88
+ * Extract document path from full resource name
89
+ */
90
+ function extractDocumentPath(name) {
91
+ const match = name.match(/documents\/(.+)$/);
92
+ return match ? match[1] : name;
93
+ }
94
+ /**
88
95
  * Get all field paths from an object.
89
96
  */
90
97
  function getFieldPaths(obj, prefix = "", isFieldValue$1) {
@@ -436,9 +443,274 @@ function fromFirestoreFields(fields) {
436
443
  return result;
437
444
  }
438
445
 
446
+ //#endregion
447
+ //#region src/query.ts
448
+ /** Maps SDK operators to Firestore REST API operator strings */
449
+ const OPERATOR_MAP = {
450
+ "<": "LESS_THAN",
451
+ "<=": "LESS_THAN_OR_EQUAL",
452
+ "==": "EQUAL",
453
+ "!=": "NOT_EQUAL",
454
+ ">=": "GREATER_THAN_OR_EQUAL",
455
+ ">": "GREATER_THAN",
456
+ "array-contains": "ARRAY_CONTAINS",
457
+ "array-contains-any": "ARRAY_CONTAINS_ANY",
458
+ in: "IN",
459
+ "not-in": "NOT_IN"
460
+ };
461
+ function getRestOperator(op) {
462
+ return OPERATOR_MAP[op];
463
+ }
464
+ /** Implementation of QueryDocumentSnapshot */
465
+ var QueryDocumentSnapshotImpl = class {
466
+ constructor(doc) {
467
+ this.exists = true;
468
+ this._data = fromFirestoreFields(doc.fields ?? {});
469
+ this.path = doc.name ? extractDocumentPath(doc.name) : "";
470
+ this.id = this.path.split("/").pop() ?? "";
471
+ this.createTime = doc.createTime ? new Date(doc.createTime) : void 0;
472
+ this.updateTime = doc.updateTime ? new Date(doc.updateTime) : void 0;
473
+ }
474
+ data() {
475
+ return this._data;
476
+ }
477
+ get(fieldPath) {
478
+ const parts = fieldPath.split(".");
479
+ let current = this._data;
480
+ for (const part of parts) {
481
+ if (current === null || current === void 0) return void 0;
482
+ if (typeof current !== "object") return void 0;
483
+ current = current[part];
484
+ }
485
+ return current;
486
+ }
487
+ };
488
+ /** Implementation of QuerySnapshot */
489
+ var QuerySnapshotImpl = class {
490
+ constructor(documents) {
491
+ this.docs = documents.map((doc) => new QueryDocumentSnapshotImpl(doc));
492
+ this.empty = this.docs.length === 0;
493
+ this.size = this.docs.length;
494
+ }
495
+ forEach(callback) {
496
+ this.docs.forEach(callback);
497
+ }
498
+ };
499
+ /** Implementation of AggregateQuerySnapshot */
500
+ var AggregateQuerySnapshotImpl = class {
501
+ constructor(result) {
502
+ const countField = result.result?.aggregateFields?.count_alias;
503
+ if (countField && "integerValue" in countField) this._count = parseInt(countField.integerValue, 10);
504
+ else this._count = 0;
505
+ }
506
+ data() {
507
+ return { count: this._count };
508
+ }
509
+ };
510
+ /**
511
+ * A Query refers to a query which you can read or listen to.
512
+ * You can refine a Query with query constraints.
513
+ */
514
+ var Query = class Query {
515
+ constructor(firestore, collectionPath, constraints) {
516
+ this._firestore = firestore;
517
+ this._collectionPath = collectionPath;
518
+ this._constraints = constraints ?? {
519
+ filters: [],
520
+ orderBy: []
521
+ };
522
+ }
523
+ /**
524
+ * Creates a new query with an additional filter.
525
+ */
526
+ where(fieldPath, opStr, value) {
527
+ const filter = { fieldFilter: {
528
+ field: { fieldPath },
529
+ op: getRestOperator(opStr),
530
+ value: toFirestoreValue(value)
531
+ } };
532
+ return new Query(this._firestore, this._collectionPath, {
533
+ ...this._constraints,
534
+ filters: [...this._constraints.filters, filter]
535
+ });
536
+ }
537
+ /**
538
+ * Creates a new query with an additional ordering.
539
+ */
540
+ orderBy(fieldPath, directionStr = "asc") {
541
+ const order = {
542
+ field: { fieldPath },
543
+ direction: directionStr === "asc" ? "ASCENDING" : "DESCENDING"
544
+ };
545
+ return new Query(this._firestore, this._collectionPath, {
546
+ ...this._constraints,
547
+ orderBy: [...this._constraints.orderBy, order]
548
+ });
549
+ }
550
+ /**
551
+ * Creates a new query that returns only the first matching documents.
552
+ */
553
+ limit(count) {
554
+ if (count < 0) throw new Error("Limit must be non-negative");
555
+ return new Query(this._firestore, this._collectionPath, {
556
+ ...this._constraints,
557
+ limit: count,
558
+ limitToLast: void 0
559
+ });
560
+ }
561
+ /**
562
+ * Creates a new query that returns only the last matching documents.
563
+ * Must be used with at least one orderBy clause.
564
+ */
565
+ limitToLast(count) {
566
+ if (count < 0) throw new Error("Limit must be non-negative");
567
+ return new Query(this._firestore, this._collectionPath, {
568
+ ...this._constraints,
569
+ limitToLast: count,
570
+ limit: void 0
571
+ });
572
+ }
573
+ /**
574
+ * Creates a new query that skips the first matching documents.
575
+ */
576
+ offset(count) {
577
+ if (count < 0) throw new Error("Offset must be non-negative");
578
+ return new Query(this._firestore, this._collectionPath, {
579
+ ...this._constraints,
580
+ offset: count
581
+ });
582
+ }
583
+ /**
584
+ * Creates a new query starting at the provided values (inclusive).
585
+ */
586
+ startAt(...values) {
587
+ return new Query(this._firestore, this._collectionPath, {
588
+ ...this._constraints,
589
+ startAt: {
590
+ values,
591
+ before: true
592
+ }
593
+ });
594
+ }
595
+ /**
596
+ * Creates a new query starting after the provided values (exclusive).
597
+ */
598
+ startAfter(...values) {
599
+ return new Query(this._firestore, this._collectionPath, {
600
+ ...this._constraints,
601
+ startAt: {
602
+ values,
603
+ before: false
604
+ }
605
+ });
606
+ }
607
+ /**
608
+ * Creates a new query ending at the provided values (inclusive).
609
+ */
610
+ endAt(...values) {
611
+ return new Query(this._firestore, this._collectionPath, {
612
+ ...this._constraints,
613
+ endAt: {
614
+ values,
615
+ before: false
616
+ }
617
+ });
618
+ }
619
+ /**
620
+ * Creates a new query ending before the provided values (exclusive).
621
+ */
622
+ endBefore(...values) {
623
+ return new Query(this._firestore, this._collectionPath, {
624
+ ...this._constraints,
625
+ endAt: {
626
+ values,
627
+ before: true
628
+ }
629
+ });
630
+ }
631
+ /**
632
+ * Creates a new query that returns only specific fields.
633
+ */
634
+ select(...fields) {
635
+ return new Query(this._firestore, this._collectionPath, {
636
+ ...this._constraints,
637
+ select: fields
638
+ });
639
+ }
640
+ /**
641
+ * Executes the query and returns the results.
642
+ */
643
+ async get() {
644
+ const structuredQuery = this._toStructuredQuery();
645
+ const results = await this._firestore._runQuery(this._collectionPath, structuredQuery);
646
+ const documents = [];
647
+ for (const item of results) if (item.document) documents.push(item.document);
648
+ if (this._constraints.limitToLast !== void 0) documents.reverse();
649
+ return new QuerySnapshotImpl(documents);
650
+ }
651
+ /**
652
+ * Returns a count of the documents matching the query.
653
+ */
654
+ async count() {
655
+ const structuredQuery = this._toStructuredQuery();
656
+ delete structuredQuery.limit;
657
+ delete structuredQuery.offset;
658
+ return new AggregateQuerySnapshotImpl(await this._firestore._runAggregationQuery(this._collectionPath, structuredQuery, [{
659
+ alias: "count_alias",
660
+ count: {}
661
+ }]));
662
+ }
663
+ /**
664
+ * Converts the query constraints to a StructuredQuery.
665
+ * @internal
666
+ */
667
+ _toStructuredQuery() {
668
+ const query = {};
669
+ if (this._constraints.filters.length === 1) query.where = this._constraints.filters[0];
670
+ else if (this._constraints.filters.length > 1) query.where = { compositeFilter: {
671
+ op: "AND",
672
+ filters: this._constraints.filters
673
+ } };
674
+ if (this._constraints.orderBy.length > 0) {
675
+ query.orderBy = this._constraints.orderBy;
676
+ if (this._constraints.limitToLast !== void 0) query.orderBy = query.orderBy.map((order) => ({
677
+ ...order,
678
+ direction: order.direction === "ASCENDING" ? "DESCENDING" : "ASCENDING"
679
+ }));
680
+ }
681
+ const limitValue = this._constraints.limit ?? this._constraints.limitToLast;
682
+ if (limitValue !== void 0) query.limit = { value: limitValue };
683
+ if (this._constraints.offset !== void 0) query.offset = this._constraints.offset;
684
+ if (this._constraints.startAt) query.startAt = this._buildCursor(this._constraints.startAt);
685
+ if (this._constraints.endAt) query.endAt = this._buildCursor(this._constraints.endAt);
686
+ if (this._constraints.select && this._constraints.select.length > 0) query.select = this._buildProjection(this._constraints.select);
687
+ return query;
688
+ }
689
+ /**
690
+ * Builds a cursor from values.
691
+ * @internal
692
+ */
693
+ _buildCursor(cursor) {
694
+ return {
695
+ values: cursor.values.map((v) => toFirestoreValue(v)),
696
+ before: cursor.before
697
+ };
698
+ }
699
+ /**
700
+ * Builds a projection from field paths.
701
+ * @internal
702
+ */
703
+ _buildProjection(fields) {
704
+ return { fields: fields.map((fieldPath) => ({ fieldPath })) };
705
+ }
706
+ };
707
+
439
708
  //#endregion
440
709
  //#region src/references.ts
441
710
  /**
711
+ * Document and Collection References
712
+ */
713
+ /**
442
714
  * Document snapshot implementation.
443
715
  */
444
716
  var DocumentSnapshotImpl = class {
@@ -519,10 +791,11 @@ var DocumentReference = class {
519
791
  };
520
792
  /**
521
793
  * A reference to a Firestore collection.
794
+ * Extends Query to provide query methods.
522
795
  */
523
- var CollectionReference = class {
524
- constructor(_firestore, path) {
525
- this._firestore = _firestore;
796
+ var CollectionReference = class extends Query {
797
+ constructor(firestore, path) {
798
+ super(firestore, path);
526
799
  this.path = path;
527
800
  const parts = path.split("/");
528
801
  this.id = parts[parts.length - 1];
@@ -841,8 +1114,67 @@ var Firestore = class {
841
1114
  }
842
1115
  return response.json();
843
1116
  }
1117
+ /** @internal Run a structured query against a collection */
1118
+ async _runQuery(collectionPath, query, transactionId) {
1119
+ const token = await this._getToken();
1120
+ const database = this._getDatabasePath();
1121
+ const pathParts = collectionPath.split("/");
1122
+ const collectionId = pathParts[pathParts.length - 1];
1123
+ let parent = `${database}/documents`;
1124
+ if (pathParts.length > 1) parent = `${database}/documents/${pathParts.slice(0, -1).join("/")}`;
1125
+ const body = { structuredQuery: {
1126
+ ...query,
1127
+ from: [{ collectionId }]
1128
+ } };
1129
+ if (transactionId) body.transaction = transactionId;
1130
+ const response = await fetch(`${API_BASE}/${parent}:runQuery`, {
1131
+ method: "POST",
1132
+ headers: {
1133
+ Authorization: `Bearer ${token}`,
1134
+ "Content-Type": "application/json"
1135
+ },
1136
+ body: JSON.stringify(body)
1137
+ });
1138
+ if (!response.ok) {
1139
+ const error = await response.json();
1140
+ throw new Error(`Failed to run query: ${JSON.stringify(error)}`);
1141
+ }
1142
+ return await response.json();
1143
+ }
1144
+ /** @internal Run an aggregation query against a collection */
1145
+ async _runAggregationQuery(collectionPath, query, aggregations) {
1146
+ const token = await this._getToken();
1147
+ const database = this._getDatabasePath();
1148
+ const pathParts = collectionPath.split("/");
1149
+ const collectionId = pathParts[pathParts.length - 1];
1150
+ let parent = `${database}/documents`;
1151
+ if (pathParts.length > 1) parent = `${database}/documents/${pathParts.slice(0, -1).join("/")}`;
1152
+ const body = { structuredAggregationQuery: {
1153
+ structuredQuery: {
1154
+ ...query,
1155
+ from: [{ collectionId }]
1156
+ },
1157
+ aggregations
1158
+ } };
1159
+ const response = await fetch(`${API_BASE}/${parent}:runAggregationQuery`, {
1160
+ method: "POST",
1161
+ headers: {
1162
+ Authorization: `Bearer ${token}`,
1163
+ "Content-Type": "application/json"
1164
+ },
1165
+ body: JSON.stringify(body)
1166
+ });
1167
+ if (!response.ok) {
1168
+ const error = await response.json();
1169
+ throw new Error(`Failed to run aggregation query: ${JSON.stringify(error)}`);
1170
+ }
1171
+ return (await response.json())[0] ?? {
1172
+ result: { aggregateFields: {} },
1173
+ readTime: ""
1174
+ };
1175
+ }
844
1176
  };
845
1177
 
846
1178
  //#endregion
847
- export { ArrayRemoveValue, ArrayUnionValue, CollectionReference, DeleteFieldValue, DocumentReference, DocumentSnapshotImpl, FieldValue, Firestore, GeoPoint, IncrementValue, ServerTimestampValue, Timestamp, Transaction, createJWT, extractDeleteFields, extractFieldTransforms, extractTransformFields, fromFirestoreFields, fromFirestoreValue, getArrayRemoveElements, getArrayUnionElements, getFirestoreToken, getIncrementAmount, isArrayRemove, isArrayUnion, isDeleteField, isFieldValue, isIncrement, isServerTimestamp, toFirestoreFields, toFirestoreValue };
1179
+ export { ArrayRemoveValue, ArrayUnionValue, CollectionReference, DeleteFieldValue, DocumentReference, DocumentSnapshotImpl, FieldValue, Firestore, GeoPoint, IncrementValue, Query, ServerTimestampValue, Timestamp, Transaction, createJWT, extractDeleteFields, extractFieldTransforms, extractTransformFields, fromFirestoreFields, fromFirestoreValue, getArrayRemoveElements, getArrayUnionElements, getFirestoreToken, getIncrementAmount, isArrayRemove, isArrayUnion, isDeleteField, isFieldValue, isIncrement, isServerTimestamp, toFirestoreFields, toFirestoreValue };
848
1180
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["isFieldValue","toFirestoreValue"],"sources":["../src/auth.ts","../src/utils.ts","../src/field-value.ts","../src/value.ts","../src/references.ts","../src/transaction.ts","../src/client.ts"],"sourcesContent":["import { importPKCS8, SignJWT } from \"jose\";\nimport type { ServiceAccountConfig } from \"./types.js\";\n\nexport async function createJWT(config: ServiceAccountConfig): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n iss: config.clientEmail,\n sub: config.clientEmail,\n aud: \"https://oauth2.googleapis.com/token\",\n iat: now,\n exp: now + 3600,\n scope: \"https://www.googleapis.com/auth/datastore\",\n };\n\n try {\n const privateKey = await importPKCS8(config.privateKey, \"RS256\");\n\n const token = await new SignJWT(payload)\n .setProtectedHeader({\n alg: \"RS256\",\n typ: \"JWT\",\n })\n .sign(privateKey);\n\n return token;\n } catch (error) {\n throw error;\n }\n}\n\nexport async function getFirestoreToken(\n config: ServiceAccountConfig,\n): Promise<string> {\n const response = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion: await createJWT(config),\n }),\n });\n\n const data = (await response.json()) as { access_token: unknown };\n if (typeof data.access_token !== \"string\") {\n throw new Error(\"Invalid access token\");\n }\n\n return data.access_token;\n}\n","/**\n * Firestore Utility Functions\n */\n\nimport type { FirestoreValue } from \"./types.js\";\n\n/**\n * Regular expression for valid unquoted Firestore field path segments.\n * Unquoted segments must start with a letter or underscore, followed by\n * letters, underscores, or digits.\n */\nconst SIMPLE_FIELD_PATH_REGEX = /^[a-zA-Z_][a-zA-Z_0-9]*$/;\n\n/**\n * Quote a field path segment if it contains special characters.\n * Segments that don't match the simple identifier pattern must be quoted with backticks.\n */\nexport function quoteFieldPathSegment(segment: string): string {\n if (SIMPLE_FIELD_PATH_REGEX.test(segment)) {\n return segment;\n }\n // Escape backticks and backslashes in the segment\n const escaped = segment.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\");\n return `\\`${escaped}\\``;\n}\n\n/**\n * Quote a full field path, handling each segment individually.\n * Splits the path by dots and quotes each segment if needed.\n */\nexport function quoteFieldPath(path: string): string {\n return path.split(\".\").map(quoteFieldPathSegment).join(\".\");\n}\n\n/**\n * Generate a random document ID (20 characters, alphanumeric)\n */\nexport function generateDocumentId(): string {\n const chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let result = \"\";\n for (let i = 0; i < 20; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Parse a document path into collection and document ID\n */\nexport function parseDocumentPath(path: string): {\n collection: string;\n docId: string;\n} {\n const parts = path.split(\"/\");\n if (parts.length < 2 || parts.length % 2 !== 0) {\n throw new Error(`Invalid document path: ${path}`);\n }\n return {\n collection: parts.slice(0, -1).join(\"/\"),\n docId: parts[parts.length - 1],\n };\n}\n\n/**\n * Extract document ID from full resource name\n */\nexport function extractDocumentId(name: string): string {\n const parts = name.split(\"/\");\n return parts[parts.length - 1];\n}\n\n/**\n * Extract document path from full resource name\n */\nexport function extractDocumentPath(name: string): string {\n // Format: projects/{project}/databases/{db}/documents/{path}\n const match = name.match(/documents\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/**\n * Get all field paths from an object.\n */\nexport function getFieldPaths(\n obj: Record<string, unknown>,\n prefix = \"\",\n isFieldValue: (v: unknown) => boolean,\n): string[] {\n const paths: string[] = [];\n for (const key of Object.keys(obj)) {\n const quotedKey = quoteFieldPathSegment(key);\n // Check if key contains dots (dot-notation path)\n if (key.includes(\".\")) {\n // For dot-notation keys, quote each segment\n paths.push(quoteFieldPath(key));\n } else {\n const fullPath = prefix ? `${prefix}.${quotedKey}` : quotedKey;\n const value = obj[key];\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !isFieldValue(value) &&\n Object.keys(value).length > 0 &&\n !(\"latitude\" in value && \"longitude\" in value)\n ) {\n paths.push(\n ...getFieldPaths(\n value as Record<string, unknown>,\n fullPath,\n isFieldValue,\n ),\n );\n } else {\n paths.push(fullPath);\n }\n }\n }\n return paths;\n}\n\n/**\n * Build Firestore fields from update data, handling dot-notation paths.\n */\nexport function buildUpdateFields(\n data: Record<string, unknown>,\n toFirestoreValue: (v: unknown) => FirestoreValue,\n isFieldValue: (v: unknown) => boolean,\n): Record<string, FirestoreValue> {\n const fields: Record<string, FirestoreValue> = {};\n\n for (const [key, value] of Object.entries(data)) {\n // Skip FieldValue sentinels\n if (isFieldValue(value)) {\n continue;\n }\n\n // Handle dot-notation paths like \"user.age\"\n if (key.includes(\".\")) {\n const parts = key.split(\".\");\n let current = fields;\n\n // Navigate/create nested structure\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!current[part]) {\n current[part] = {\n mapValue: { fields: {} },\n };\n }\n const mapVal = current[part] as {\n mapValue: { fields: Record<string, FirestoreValue> };\n };\n if (!mapVal.mapValue.fields) {\n mapVal.mapValue.fields = {};\n }\n current = mapVal.mapValue.fields;\n }\n\n // Set the final value\n current[parts[parts.length - 1]] = toFirestoreValue(value);\n } else {\n // Regular field\n fields[key] = toFirestoreValue(value);\n }\n }\n\n return fields;\n}\n","/**\n * FieldValue Sentinels\n *\n * Sentinel values for special Firestore operations.\n */\n\n/** Property name to identify FieldValue instances */\nconst FIELD_VALUE_MARKER = \"__isFieldValue__\" as const;\n\n/** Base class for FieldValue sentinels */\nabstract class FieldValueBase {\n readonly __isFieldValue__: true = true;\n abstract readonly _type: string;\n}\n\n/** Server timestamp sentinel */\nexport class ServerTimestampValue extends FieldValueBase {\n readonly _type = \"serverTimestamp\";\n}\n\n/** Delete field sentinel */\nexport class DeleteFieldValue extends FieldValueBase {\n readonly _type = \"delete\";\n}\n\n/** Increment sentinel */\nexport class IncrementValue extends FieldValueBase {\n readonly _type = \"increment\";\n constructor(readonly amount: number) {\n super();\n }\n}\n\n/** Array union sentinel */\nexport class ArrayUnionValue extends FieldValueBase {\n readonly _type = \"arrayUnion\";\n constructor(readonly elements: unknown[]) {\n super();\n }\n}\n\n/** Array remove sentinel */\nexport class ArrayRemoveValue extends FieldValueBase {\n readonly _type = \"arrayRemove\";\n constructor(readonly elements: unknown[]) {\n super();\n }\n}\n\n/** FieldValue sentinel type */\nexport type FieldValueType =\n | ServerTimestampValue\n | DeleteFieldValue\n | IncrementValue\n | ArrayUnionValue\n | ArrayRemoveValue;\n\n/**\n * FieldValue factory for creating sentinel values\n */\nexport const FieldValue = {\n /**\n * Returns a sentinel to include a server-generated timestamp in the written data.\n */\n serverTimestamp(): FieldValueType {\n return new ServerTimestampValue();\n },\n\n /**\n * Returns a sentinel to delete a field.\n */\n delete(): FieldValueType {\n return new DeleteFieldValue();\n },\n\n /**\n * Returns a sentinel to increment a numeric field by the given amount.\n */\n increment(amount: number): FieldValueType {\n return new IncrementValue(amount);\n },\n\n /**\n * Returns a sentinel to union elements into an array field.\n * Only adds elements not already present.\n */\n arrayUnion(...elements: unknown[]): FieldValueType {\n return new ArrayUnionValue(elements);\n },\n\n /**\n * Returns a sentinel to remove elements from an array field.\n */\n arrayRemove(...elements: unknown[]): FieldValueType {\n return new ArrayRemoveValue(elements);\n },\n};\n\n/**\n * Check if a value is a FieldValue sentinel\n */\nexport function isFieldValue(value: unknown): value is FieldValueType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n FIELD_VALUE_MARKER in value &&\n (value as Record<string, unknown>)[FIELD_VALUE_MARKER] === true\n );\n}\n\n/**\n * Check if a value is a ServerTimestamp sentinel\n */\nexport function isServerTimestamp(\n value: unknown,\n): value is ServerTimestampValue {\n return value instanceof ServerTimestampValue;\n}\n\n/**\n * Check if a value is a Delete sentinel\n */\nexport function isDeleteField(value: unknown): value is DeleteFieldValue {\n return value instanceof DeleteFieldValue;\n}\n\n/**\n * Check if a value is an Increment sentinel\n */\nexport function isIncrement(value: unknown): value is IncrementValue {\n return value instanceof IncrementValue;\n}\n\n/**\n * Get increment amount if value is an increment sentinel\n */\nexport function getIncrementAmount(value: unknown): number | undefined {\n if (value instanceof IncrementValue) {\n return value.amount;\n }\n return undefined;\n}\n\n/**\n * Check if a value is an ArrayUnion sentinel\n */\nexport function isArrayUnion(value: unknown): value is ArrayUnionValue {\n return value instanceof ArrayUnionValue;\n}\n\n/**\n * Get array union elements if value is an array union sentinel\n */\nexport function getArrayUnionElements(value: unknown): unknown[] | undefined {\n if (value instanceof ArrayUnionValue) {\n return value.elements;\n }\n return undefined;\n}\n\n/**\n * Check if a value is an ArrayRemove sentinel\n */\nexport function isArrayRemove(value: unknown): value is ArrayRemoveValue {\n return value instanceof ArrayRemoveValue;\n}\n\n/**\n * Get array remove elements if value is an array remove sentinel\n */\nexport function getArrayRemoveElements(value: unknown): unknown[] | undefined {\n if (value instanceof ArrayRemoveValue) {\n return value.elements;\n }\n return undefined;\n}\n","/**\n * Value Conversion Utilities\n *\n * Bidirectional conversion between JavaScript values and Firestore REST format.\n */\n\nimport {\n type FieldValueType,\n getArrayRemoveElements,\n getArrayUnionElements,\n getIncrementAmount,\n isArrayRemove,\n isArrayUnion,\n isDeleteField,\n isFieldValue,\n isIncrement,\n isServerTimestamp,\n} from \"./field-value.js\";\nimport type {\n ArrayValue,\n FieldTransform,\n FirestoreValue,\n MapValue,\n} from \"./types.js\";\nimport { quoteFieldPath, quoteFieldPathSegment } from \"./utils.js\";\n\n// Re-export from field-value\nexport {\n FieldValue,\n isFieldValue,\n type FieldValueType,\n} from \"./field-value.js\";\n\n// ============================================================================\n// GeoPoint Class\n// ============================================================================\n\n/**\n * Represents a geographic point (latitude/longitude).\n */\nexport class GeoPoint {\n constructor(\n readonly latitude: number,\n readonly longitude: number,\n ) {\n if (latitude < -90 || latitude > 90) {\n throw new Error(\"Latitude must be between -90 and 90\");\n }\n if (longitude < -180 || longitude > 180) {\n throw new Error(\"Longitude must be between -180 and 180\");\n }\n }\n\n isEqual(other: GeoPoint): boolean {\n return (\n this.latitude === other.latitude &&\n this.longitude === other.longitude\n );\n }\n}\n\n// ============================================================================\n// Timestamp Class\n// ============================================================================\n\n/**\n * Represents a Firestore timestamp with nanosecond precision.\n */\nexport class Timestamp {\n constructor(\n readonly seconds: number,\n readonly nanoseconds: number,\n ) {}\n\n static now(): Timestamp {\n const now = Date.now();\n return new Timestamp(Math.floor(now / 1000), (now % 1000) * 1_000_000);\n }\n\n static fromDate(date: Date): Timestamp {\n const ms = date.getTime();\n return new Timestamp(Math.floor(ms / 1000), (ms % 1000) * 1_000_000);\n }\n\n static fromMillis(milliseconds: number): Timestamp {\n return new Timestamp(\n Math.floor(milliseconds / 1000),\n (milliseconds % 1000) * 1_000_000,\n );\n }\n\n toDate(): Date {\n return new Date(this.seconds * 1000 + this.nanoseconds / 1_000_000);\n }\n\n toMillis(): number {\n return this.seconds * 1000 + this.nanoseconds / 1_000_000;\n }\n\n isEqual(other: Timestamp): boolean {\n return (\n this.seconds === other.seconds &&\n this.nanoseconds === other.nanoseconds\n );\n }\n}\n\n// ============================================================================\n// JavaScript to Firestore Conversion\n// ============================================================================\n\n/**\n * Convert a JavaScript value to Firestore REST format.\n */\nexport function toFirestoreValue(value: unknown): FirestoreValue {\n // null\n if (value === null) {\n return { nullValue: null };\n }\n\n // undefined -> null\n if (value === undefined) {\n return { nullValue: null };\n }\n\n // boolean\n if (typeof value === \"boolean\") {\n return { booleanValue: value };\n }\n\n // number\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { integerValue: String(value) };\n }\n return { doubleValue: value };\n }\n\n // string\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n\n // Date\n if (value instanceof Date) {\n return { timestampValue: value.toISOString() };\n }\n\n // Timestamp\n if (value instanceof Timestamp) {\n return { timestampValue: value.toDate().toISOString() };\n }\n\n // GeoPoint\n if (value instanceof GeoPoint) {\n return {\n geoPointValue: {\n latitude: value.latitude,\n longitude: value.longitude,\n },\n };\n }\n\n // Uint8Array (bytes)\n if (value instanceof Uint8Array) {\n // Convert to base64\n const binary = Array.from(value, (byte) =>\n String.fromCharCode(byte),\n ).join(\"\");\n return { bytesValue: btoa(binary) };\n }\n\n // Array\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map(toFirestoreValue),\n },\n };\n }\n\n // Object (map)\n if (typeof value === \"object\") {\n const fields: Record<string, FirestoreValue> = {};\n for (const [key, val] of Object.entries(value)) {\n // Skip FieldValue sentinels - they're handled separately as transforms\n if (!isFieldValue(val)) {\n fields[key] = toFirestoreValue(val);\n }\n }\n return {\n mapValue: {\n fields,\n },\n };\n }\n\n throw new Error(`Unsupported value type: ${typeof value}`);\n}\n\n/**\n * Convert document data to Firestore fields format.\n */\nexport function toFirestoreFields(\n data: Record<string, unknown>,\n): Record<string, FirestoreValue> {\n const fields: Record<string, FirestoreValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (!isFieldValue(value)) {\n fields[key] = toFirestoreValue(value);\n }\n }\n return fields;\n}\n\n/**\n * Extract field transforms from document data.\n */\nexport function extractFieldTransforms(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): FieldTransform[] {\n const transforms: FieldTransform[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value)) {\n const transform = fieldValueToTransform(value, fieldPath);\n if (transform) {\n transforms.push(transform);\n }\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n // Recurse into nested objects\n transforms.push(\n ...extractFieldTransforms(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return transforms;\n}\n\n/**\n * Convert a FieldValue sentinel to a FieldTransform.\n */\nfunction fieldValueToTransform(\n fieldValue: FieldValueType,\n fieldPath: string,\n): FieldTransform | null {\n if (isServerTimestamp(fieldValue)) {\n return {\n fieldPath,\n setToServerValue: \"REQUEST_TIME\",\n };\n }\n\n if (isDeleteField(fieldValue)) {\n // Delete is handled differently - not a transform\n return null;\n }\n\n if (isIncrement(fieldValue)) {\n return {\n fieldPath,\n increment: toFirestoreValue(getIncrementAmount(fieldValue)),\n };\n }\n\n if (isArrayUnion(fieldValue)) {\n const elements = getArrayUnionElements(fieldValue) ?? [];\n return {\n fieldPath,\n appendMissingElements: {\n values: elements.map(toFirestoreValue),\n },\n };\n }\n\n if (isArrayRemove(fieldValue)) {\n const elements = getArrayRemoveElements(fieldValue) ?? [];\n return {\n fieldPath,\n removeAllFromArray: {\n values: elements.map(toFirestoreValue),\n },\n };\n }\n\n return null;\n}\n\n/**\n * Extract delete field paths from document data.\n */\nexport function extractDeleteFields(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): string[] {\n const deletePaths: string[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value) && isDeleteField(value)) {\n deletePaths.push(fieldPath);\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n deletePaths.push(\n ...extractDeleteFields(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return deletePaths;\n}\n\n/**\n * Extract transform field paths from document data.\n * These are fields with FieldValue sentinels that become transforms (not delete).\n */\nexport function extractTransformFields(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): string[] {\n const transformPaths: string[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value) && !isDeleteField(value)) {\n transformPaths.push(fieldPath);\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n transformPaths.push(\n ...extractTransformFields(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return transformPaths;\n}\n\n// ============================================================================\n// Firestore to JavaScript Conversion\n// ============================================================================\n\n/**\n * Convert a Firestore REST value to JavaScript.\n */\nexport function fromFirestoreValue(value: FirestoreValue): unknown {\n if (\"nullValue\" in value) {\n return null;\n }\n\n if (\"booleanValue\" in value) {\n return value.booleanValue;\n }\n\n if (\"integerValue\" in value) {\n return parseInt(value.integerValue, 10);\n }\n\n if (\"doubleValue\" in value) {\n return value.doubleValue;\n }\n\n if (\"timestampValue\" in value) {\n return new Date(value.timestampValue);\n }\n\n if (\"stringValue\" in value) {\n return value.stringValue;\n }\n\n if (\"bytesValue\" in value) {\n // Decode base64\n const binary = atob(value.bytesValue);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n if (\"referenceValue\" in value) {\n return value.referenceValue;\n }\n\n if (\"geoPointValue\" in value) {\n return new GeoPoint(\n value.geoPointValue.latitude,\n value.geoPointValue.longitude,\n );\n }\n\n if (\"arrayValue\" in value) {\n const arr = value as ArrayValue;\n return (arr.arrayValue.values ?? []).map(fromFirestoreValue);\n }\n\n if (\"mapValue\" in value) {\n const map = value as MapValue;\n return fromFirestoreFields(map.mapValue.fields ?? {});\n }\n\n throw new Error(\"Unknown Firestore value type\");\n}\n\n/**\n * Convert Firestore fields to JavaScript object.\n */\nexport function fromFirestoreFields(\n fields: Record<string, FirestoreValue>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n result[key] = fromFirestoreValue(value);\n }\n return result;\n}\n","/**\n * Document and Collection References\n */\n\nimport type {\n DocumentData,\n DocumentSnapshot,\n FirestoreDocument,\n WriteResult,\n} from \"./types.js\";\nimport {\n extractDocumentId,\n generateDocumentId,\n parseDocumentPath,\n} from \"./utils.js\";\nimport { fromFirestoreFields } from \"./value.js\";\n\n/**\n * Document snapshot implementation.\n */\nexport class DocumentSnapshotImpl<\n T = DocumentData,\n> implements DocumentSnapshot<T> {\n readonly exists: boolean;\n readonly id: string;\n readonly path: string;\n readonly createTime?: Date;\n readonly updateTime?: Date;\n\n private readonly _data?: T;\n\n constructor(doc: FirestoreDocument | null, path: string) {\n if (doc && doc.fields) {\n this.exists = true;\n this._data = fromFirestoreFields(doc.fields) as T;\n this.createTime = doc.createTime\n ? new Date(doc.createTime)\n : undefined;\n this.updateTime = doc.updateTime\n ? new Date(doc.updateTime)\n : undefined;\n } else {\n this.exists = false;\n this._data = undefined;\n }\n\n this.path = path;\n this.id = extractDocumentId(path);\n }\n\n data(): T | undefined {\n return this._data;\n }\n\n get(fieldPath: string): unknown {\n if (!this._data) return undefined;\n\n const parts = fieldPath.split(\".\");\n let current: unknown = this._data;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n }\n}\n\n// Type for the Firestore client interface needed by references\nexport interface FirestoreClientInterface {\n _getDocument(\n path: string,\n transactionId?: string,\n ): Promise<FirestoreDocument | null>;\n _getDocumentName(path: string): string;\n _setDocument(\n path: string,\n data: Record<string, unknown>,\n options?: { merge?: boolean },\n ): Promise<WriteResult>;\n _updateDocument(\n path: string,\n data: Record<string, unknown>,\n ): Promise<WriteResult>;\n _deleteDocument(path: string): Promise<void>;\n}\n\n/**\n * A reference to a Firestore document.\n */\nexport class DocumentReference<T = DocumentData> {\n readonly id: string;\n readonly path: string;\n\n constructor(\n private readonly _firestore: FirestoreClientInterface,\n path: string,\n ) {\n this.path = path;\n this.id = extractDocumentId(path);\n }\n\n /**\n * Get the parent collection reference.\n */\n get parent(): CollectionReference<T> {\n const { collection } = parseDocumentPath(this.path);\n return new CollectionReference<T>(this._firestore, collection);\n }\n\n /**\n * Get a subcollection of this document.\n */\n collection(collectionPath: string): CollectionReference {\n return new CollectionReference(\n this._firestore,\n `${this.path}/${collectionPath}`,\n );\n }\n\n /**\n * Get the document.\n */\n async get(): Promise<DocumentSnapshot<T>> {\n const doc = await this._firestore._getDocument(this.path);\n return new DocumentSnapshotImpl<T>(doc, this.path);\n }\n\n /**\n * Set the document data.\n */\n async set(data: T, options?: { merge?: boolean }): Promise<WriteResult> {\n return this._firestore._setDocument(\n this.path,\n data as Record<string, unknown>,\n options,\n );\n }\n\n /**\n * Update the document data.\n */\n async update(data: Partial<T>): Promise<WriteResult> {\n return this._firestore._updateDocument(\n this.path,\n data as Record<string, unknown>,\n );\n }\n\n /**\n * Delete the document.\n */\n async delete(): Promise<void> {\n await this._firestore._deleteDocument(this.path);\n }\n}\n\n/**\n * A reference to a Firestore collection.\n */\nexport class CollectionReference<T = DocumentData> {\n readonly id: string;\n readonly path: string;\n\n constructor(\n private readonly _firestore: FirestoreClientInterface,\n path: string,\n ) {\n this.path = path;\n const parts = path.split(\"/\");\n this.id = parts[parts.length - 1];\n }\n\n /**\n * Get a document reference in this collection.\n * If no ID is provided, a random one will be generated.\n */\n doc(documentId?: string): DocumentReference<T> {\n const docId = documentId ?? generateDocumentId();\n return new DocumentReference<T>(\n this._firestore,\n `${this.path}/${docId}`,\n );\n }\n\n /**\n * Add a new document with an auto-generated ID.\n */\n async add(data: T): Promise<DocumentReference<T>> {\n const ref = this.doc();\n await ref.set(data);\n return ref;\n }\n}\n","/**\n * Firestore Transaction\n */\n\nimport {\n DocumentReference,\n DocumentSnapshotImpl,\n type FirestoreClientInterface,\n} from \"./references.js\";\nimport type {\n DocumentData,\n DocumentSnapshot,\n FirestoreDocument,\n Write,\n} from \"./types.js\";\nimport { getFieldPaths } from \"./utils.js\";\nimport {\n extractDeleteFields,\n extractFieldTransforms,\n isFieldValue,\n toFirestoreFields,\n} from \"./value.js\";\n\n/**\n * A Firestore transaction.\n * All reads must happen before any writes.\n */\nexport class Transaction {\n private readonly _writes: Write[] = [];\n\n constructor(\n private readonly _firestore: FirestoreClientInterface & {\n _getDocument(\n path: string,\n transactionId?: string,\n ): Promise<FirestoreDocument | null>;\n },\n private readonly _transactionId: string,\n ) {}\n\n /**\n * Get a document within this transaction.\n */\n async get<T = DocumentData>(\n ref: DocumentReference<T>,\n ): Promise<DocumentSnapshot<T>> {\n const doc = await this._firestore._getDocument(\n ref.path,\n this._transactionId,\n );\n return new DocumentSnapshotImpl<T>(doc, ref.path);\n }\n\n /**\n * Queue a set operation.\n */\n set<T = DocumentData>(\n ref: DocumentReference<T>,\n data: T,\n options?: { merge?: boolean },\n ): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n const fields = toFirestoreFields(data as Record<string, unknown>);\n const transforms = extractFieldTransforms(\n data as Record<string, unknown>,\n );\n\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n };\n\n // Handle merge option\n if (options?.merge) {\n const fieldPaths = getFieldPaths(\n data as Record<string, unknown>,\n \"\",\n isFieldValue,\n );\n write.updateMask = { fieldPaths };\n }\n\n // Add transforms if any\n if (transforms.length > 0) {\n write.updateTransforms = transforms;\n }\n\n this._writes.push(write);\n return this;\n }\n\n /**\n * Queue an update operation.\n */\n update<T = DocumentData>(\n ref: DocumentReference<T>,\n data: Partial<T>,\n ): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n\n // Filter out FieldValue.delete() fields for the update mask\n const deleteFields = extractDeleteFields(\n data as Record<string, unknown>,\n );\n const transforms = extractFieldTransforms(\n data as Record<string, unknown>,\n );\n\n // Get all field paths that are being set (not deleted or transformed)\n const fieldPaths = getFieldPaths(\n data as Record<string, unknown>,\n \"\",\n isFieldValue,\n ).filter((p) => !deleteFields.includes(p));\n\n // Build fields, excluding FieldValue sentinels\n const fields = toFirestoreFields(data as Record<string, unknown>);\n\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n updateMask: { fieldPaths: [...fieldPaths, ...deleteFields] },\n currentDocument: { exists: true },\n };\n\n if (transforms.length > 0) {\n write.updateTransforms = transforms;\n }\n\n this._writes.push(write);\n return this;\n }\n\n /**\n * Queue a delete operation.\n */\n delete(ref: DocumentReference): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n this._writes.push({\n delete: docName,\n });\n return this;\n }\n\n /** @internal */\n _getWrites(): Write[] {\n return this._writes;\n }\n\n /** @internal */\n _getTransactionId(): string {\n return this._transactionId;\n }\n}\n","/**\n * Firestore REST Client\n *\n * Main client implementation for Firestore REST API with transaction support.\n */\n\nimport { getFirestoreToken } from \"./auth.js\";\nimport {\n CollectionReference,\n DocumentReference,\n type FirestoreClientInterface,\n} from \"./references.js\";\nimport { Transaction } from \"./transaction.js\";\nimport type {\n AuthConfig,\n BeginTransactionResponse,\n CommitResponse,\n FirestoreDocument,\n TransactionOptions,\n Write,\n WriteResult,\n} from \"./types.js\";\nimport { buildUpdateFields, getFieldPaths } from \"./utils.js\";\nimport {\n extractDeleteFields,\n extractFieldTransforms,\n extractTransformFields,\n isFieldValue,\n toFirestoreFields,\n toFirestoreValue,\n} from \"./value.js\";\n\nconst API_BASE = \"https://firestore.googleapis.com/v1\";\nconst DEFAULT_DATABASE = \"(default)\";\n\n/**\n * Firestore REST API client.\n */\nexport class Firestore implements FirestoreClientInterface {\n private readonly _config: AuthConfig;\n private readonly _databaseId: string;\n private _token: string | null = null;\n private _tokenExpiry: number = 0;\n\n constructor(config: AuthConfig, databaseId: string = DEFAULT_DATABASE) {\n this._config = config;\n this._databaseId = databaseId;\n }\n\n /**\n * Get a collection reference.\n */\n collection(collectionPath: string): CollectionReference {\n return new CollectionReference(this, collectionPath);\n }\n\n /**\n * Get a document reference.\n */\n doc(documentPath: string): DocumentReference {\n return new DocumentReference(this, documentPath);\n }\n\n /**\n * Run a transaction.\n */\n async runTransaction<R>(\n updateFn: (transaction: Transaction) => Promise<R>,\n options?: { maxAttempts?: number },\n ): Promise<R> {\n const maxAttempts = options?.maxAttempts ?? 5;\n let lastError: Error | null = null;\n let retryTransaction: string | undefined;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n // Begin transaction\n const transactionId =\n await this._beginTransaction(retryTransaction);\n const transaction = new Transaction(this, transactionId);\n\n // Run user function\n const result = await updateFn(transaction);\n\n // Commit transaction\n await this._commitTransaction(\n transactionId,\n transaction._getWrites(),\n );\n\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if this is a contention error that should be retried\n if (\n error instanceof Error &&\n error.message.includes(\"ABORTED\")\n ) {\n // Use the failed transaction ID for retry\n retryTransaction = undefined; // Will create new transaction\n continue;\n }\n\n // Non-retryable error\n throw error;\n }\n }\n\n throw lastError ?? new Error(\"Transaction failed after max attempts\");\n }\n\n // ========================================================================\n // Internal Methods\n // ========================================================================\n\n /** @internal */\n async _getToken(): Promise<string> {\n // Check config type first\n if (\"privateKey\" in this._config) {\n // Service Account flow with caching\n if (this._token && Date.now() < this._tokenExpiry - 60000) {\n return this._token;\n }\n\n this._token = await getFirestoreToken(this._config);\n this._tokenExpiry = Date.now() + 3600 * 1000; // 1 hour\n return this._token;\n } else {\n // Token/User flow: the provided function is invoked for each call.\n // If the implementation performs its own caching, that behavior will be honored.\n return await this._config.token();\n }\n }\n\n /** @internal */\n _getDatabasePath(): string {\n return `projects/${this._config.projectId}/databases/${this._databaseId}`;\n }\n\n /** @internal */\n _getDocumentName(path: string): string {\n return `${this._getDatabasePath()}/documents/${path}`;\n }\n\n /** @internal */\n async _getDocument(\n path: string,\n transactionId?: string,\n ): Promise<FirestoreDocument | null> {\n const token = await this._getToken();\n const docName = this._getDocumentName(path);\n\n let url = `${API_BASE}/${docName}`;\n if (transactionId) {\n url += `?transaction=${encodeURIComponent(transactionId)}`;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`Failed to get document: ${JSON.stringify(error)}`);\n }\n\n return response.json();\n }\n\n /** @internal */\n async _setDocument(\n path: string,\n data: Record<string, unknown>,\n options?: { merge?: boolean },\n ): Promise<WriteResult> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const fields = toFirestoreFields(data);\n const transforms = extractFieldTransforms(data);\n\n const writes: Write[] = [\n {\n update: {\n name: docName,\n fields,\n },\n },\n ];\n\n if (options?.merge) {\n const fieldPaths = getFieldPaths(data, \"\", isFieldValue);\n writes[0].updateMask = { fieldPaths };\n }\n\n if (transforms.length > 0) {\n writes[0].updateTransforms = transforms;\n }\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ writes }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`Failed to set document: ${JSON.stringify(error)}`);\n }\n\n const result: CommitResponse = await response.json();\n return result.writeResults?.[0] ?? {};\n }\n\n /** @internal */\n async _updateDocument(\n path: string,\n data: Record<string, unknown>,\n ): Promise<WriteResult> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const deleteFields = extractDeleteFields(data);\n const transforms = extractFieldTransforms(data);\n const transformFields = extractTransformFields(data);\n\n // Get all field paths, excluding delete fields and transform fields\n const fieldPaths = getFieldPaths(data, \"\", isFieldValue).filter(\n (p) => !deleteFields.includes(p) && !transformFields.includes(p),\n );\n\n // Build fields for non-FieldValue data, also handling dot-notation\n const fields = buildUpdateFields(data, toFirestoreValue, isFieldValue);\n\n // Combine updateMask: regular fields + delete fields (transforms are NOT in mask)\n const updateMaskPaths = [...fieldPaths, ...deleteFields];\n\n const writes: Write[] = [];\n\n // If we have regular fields or delete fields, create an update write\n if (updateMaskPaths.length > 0) {\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n updateMask: { fieldPaths: updateMaskPaths },\n currentDocument: { exists: true },\n };\n writes.push(write);\n }\n\n // If we have transforms, add them\n if (transforms.length > 0) {\n if (writes.length > 0) {\n // Add transforms to the existing update write\n writes[0].updateTransforms = transforms;\n } else {\n // Transform-only: use a transform write\n writes.push({\n transform: {\n document: docName,\n fieldTransforms: transforms,\n },\n currentDocument: { exists: true },\n });\n }\n }\n\n if (writes.length === 0) {\n // Nothing to write\n return {};\n }\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ writes }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to update document: ${JSON.stringify(error)}`,\n );\n }\n\n const result: CommitResponse = await response.json();\n return result.writeResults?.[0] ?? {};\n }\n\n /** @internal */\n async _deleteDocument(path: string): Promise<void> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n writes: [{ delete: docName }],\n }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to delete document: ${JSON.stringify(error)}`,\n );\n }\n }\n\n /** @internal */\n async _beginTransaction(retryTransaction?: string): Promise<string> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n const options: TransactionOptions = {\n readWrite: retryTransaction ? { retryTransaction } : {},\n };\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:beginTransaction`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ options }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to begin transaction: ${JSON.stringify(error)}`,\n );\n }\n\n const result: BeginTransactionResponse = await response.json();\n return result.transaction;\n }\n\n /** @internal */\n async _commitTransaction(\n transactionId: string,\n writes: Write[],\n ): Promise<CommitResponse> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n writes,\n transaction: transactionId,\n }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to commit transaction: ${JSON.stringify(error)}`,\n );\n }\n\n return response.json();\n }\n}\n"],"mappings":";;;AAGA,eAAsB,UAAU,QAA+C;CAC3E,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CACzC,MAAM,UAAU;EACZ,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK;EACL,KAAK;EACL,KAAK,MAAM;EACX,OAAO;EACV;AAED,KAAI;EACA,MAAM,aAAa,MAAM,YAAY,OAAO,YAAY,QAAQ;AAShE,SAPc,MAAM,IAAI,QAAQ,QAAQ,CACnC,mBAAmB;GAChB,KAAK;GACL,KAAK;GACR,CAAC,CACD,KAAK,WAAW;UAGhB,OAAO;AACZ,QAAM;;;AAId,eAAsB,kBAClB,QACe;CAYf,MAAM,OAAQ,OAXG,MAAM,MAAM,uCAAuC;EAChE,QAAQ;EACR,SAAS,EACL,gBAAgB,oBACnB;EACD,MAAM,KAAK,UAAU;GACjB,YAAY;GACZ,WAAW,MAAM,UAAU,OAAO;GACrC,CAAC;EACL,CAAC,EAE2B,MAAM;AACnC,KAAI,OAAO,KAAK,iBAAiB,SAC7B,OAAM,IAAI,MAAM,uBAAuB;AAG3C,QAAO,KAAK;;;;;;;;;;ACtChB,MAAM,0BAA0B;;;;;AAMhC,SAAgB,sBAAsB,SAAyB;AAC3D,KAAI,wBAAwB,KAAK,QAAQ,CACrC,QAAO;AAIX,QAAO,KADS,QAAQ,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,CAC/C;;;;;;AAOxB,SAAgB,eAAe,MAAsB;AACjD,QAAO,KAAK,MAAM,IAAI,CAAC,IAAI,sBAAsB,CAAC,KAAK,IAAI;;;;;AAM/D,SAAgB,qBAA6B;CACzC,MAAM,QACF;CACJ,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACpB,WAAU,MAAM,OAAO,KAAK,MAAM,KAAK,QAAQ,GAAG,GAAa,CAAC;AAEpE,QAAO;;;;;AAMX,SAAgB,kBAAkB,MAGhC;CACE,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,KAAI,MAAM,SAAS,KAAK,MAAM,SAAS,MAAM,EACzC,OAAM,IAAI,MAAM,0BAA0B,OAAO;AAErD,QAAO;EACH,YAAY,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI;EACxC,OAAO,MAAM,MAAM,SAAS;EAC/B;;;;;AAML,SAAgB,kBAAkB,MAAsB;CACpD,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAO,MAAM,MAAM,SAAS;;;;;AAehC,SAAgB,cACZ,KACA,SAAS,IACT,gBACQ;CACR,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,EAAE;EAChC,MAAM,YAAY,sBAAsB,IAAI;AAE5C,MAAI,IAAI,SAAS,IAAI,CAEjB,OAAM,KAAK,eAAe,IAAI,CAAC;OAC5B;GACH,MAAM,WAAW,SAAS,GAAG,OAAO,GAAG,cAAc;GACrD,MAAM,QAAQ,IAAI;AAClB,OACI,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,IACrB,EAAE,iBAAiB,SACnB,CAACA,eAAa,MAAM,IACpB,OAAO,KAAK,MAAM,CAAC,SAAS,KAC5B,EAAE,cAAc,SAAS,eAAe,OAExC,OAAM,KACF,GAAG,cACC,OACA,UACAA,eACH,CACJ;OAED,OAAM,KAAK,SAAS;;;AAIhC,QAAO;;;;;AAMX,SAAgB,kBACZ,MACA,oBACA,gBAC8B;CAC9B,MAAM,SAAyC,EAAE;AAEjD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;AAE7C,MAAIA,eAAa,MAAM,CACnB;AAIJ,MAAI,IAAI,SAAS,IAAI,EAAE;GACnB,MAAM,QAAQ,IAAI,MAAM,IAAI;GAC5B,IAAI,UAAU;AAGd,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;IACvC,MAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,MACT,SAAQ,QAAQ,EACZ,UAAU,EAAE,QAAQ,EAAE,EAAE,EAC3B;IAEL,MAAM,SAAS,QAAQ;AAGvB,QAAI,CAAC,OAAO,SAAS,OACjB,QAAO,SAAS,SAAS,EAAE;AAE/B,cAAU,OAAO,SAAS;;AAI9B,WAAQ,MAAM,MAAM,SAAS,MAAMC,mBAAiB,MAAM;QAG1D,QAAO,OAAOA,mBAAiB,MAAM;;AAI7C,QAAO;;;;;;;;;;;AClKX,MAAM,qBAAqB;;AAG3B,IAAe,iBAAf,MAA8B;;0BACQ;;;;AAKtC,IAAa,uBAAb,cAA0C,eAAe;;;eACpC;;;;AAIrB,IAAa,mBAAb,cAAsC,eAAe;;;eAChC;;;;AAIrB,IAAa,iBAAb,cAAoC,eAAe;CAE/C,YAAY,AAAS,QAAgB;AACjC,SAAO;EADU;eADJ;;;;AAOrB,IAAa,kBAAb,cAAqC,eAAe;CAEhD,YAAY,AAAS,UAAqB;AACtC,SAAO;EADU;eADJ;;;;AAOrB,IAAa,mBAAb,cAAsC,eAAe;CAEjD,YAAY,AAAS,UAAqB;AACtC,SAAO;EADU;eADJ;;;;;;AAiBrB,MAAa,aAAa;CAItB,kBAAkC;AAC9B,SAAO,IAAI,sBAAsB;;CAMrC,SAAyB;AACrB,SAAO,IAAI,kBAAkB;;CAMjC,UAAU,QAAgC;AACtC,SAAO,IAAI,eAAe,OAAO;;CAOrC,WAAW,GAAG,UAAqC;AAC/C,SAAO,IAAI,gBAAgB,SAAS;;CAMxC,YAAY,GAAG,UAAqC;AAChD,SAAO,IAAI,iBAAiB,SAAS;;CAE5C;;;;AAKD,SAAgB,aAAa,OAAyC;AAClE,QACI,OAAO,UAAU,YACjB,UAAU,QACV,sBAAsB,SACrB,MAAkC,wBAAwB;;;;;AAOnE,SAAgB,kBACZ,OAC6B;AAC7B,QAAO,iBAAiB;;;;;AAM5B,SAAgB,cAAc,OAA2C;AACrE,QAAO,iBAAiB;;;;;AAM5B,SAAgB,YAAY,OAAyC;AACjE,QAAO,iBAAiB;;;;;AAM5B,SAAgB,mBAAmB,OAAoC;AACnE,KAAI,iBAAiB,eACjB,QAAO,MAAM;;;;;AAQrB,SAAgB,aAAa,OAA0C;AACnE,QAAO,iBAAiB;;;;;AAM5B,SAAgB,sBAAsB,OAAuC;AACzE,KAAI,iBAAiB,gBACjB,QAAO,MAAM;;;;;AAQrB,SAAgB,cAAc,OAA2C;AACrE,QAAO,iBAAiB;;;;;AAM5B,SAAgB,uBAAuB,OAAuC;AAC1E,KAAI,iBAAiB,iBACjB,QAAO,MAAM;;;;;;;;;;;;;ACpIrB,IAAa,WAAb,MAAsB;CAClB,YACI,AAAS,UACT,AAAS,WACX;EAFW;EACA;AAET,MAAI,WAAW,OAAO,WAAW,GAC7B,OAAM,IAAI,MAAM,sCAAsC;AAE1D,MAAI,YAAY,QAAQ,YAAY,IAChC,OAAM,IAAI,MAAM,yCAAyC;;CAIjE,QAAQ,OAA0B;AAC9B,SACI,KAAK,aAAa,MAAM,YACxB,KAAK,cAAc,MAAM;;;;;;AAYrC,IAAa,YAAb,MAAa,UAAU;CACnB,YACI,AAAS,SACT,AAAS,aACX;EAFW;EACA;;CAGb,OAAO,MAAiB;EACpB,MAAM,MAAM,KAAK,KAAK;AACtB,SAAO,IAAI,UAAU,KAAK,MAAM,MAAM,IAAK,EAAG,MAAM,MAAQ,IAAU;;CAG1E,OAAO,SAAS,MAAuB;EACnC,MAAM,KAAK,KAAK,SAAS;AACzB,SAAO,IAAI,UAAU,KAAK,MAAM,KAAK,IAAK,EAAG,KAAK,MAAQ,IAAU;;CAGxE,OAAO,WAAW,cAAiC;AAC/C,SAAO,IAAI,UACP,KAAK,MAAM,eAAe,IAAK,EAC9B,eAAe,MAAQ,IAC3B;;CAGL,SAAe;AACX,yBAAO,IAAI,KAAK,KAAK,UAAU,MAAO,KAAK,cAAc,IAAU;;CAGvE,WAAmB;AACf,SAAO,KAAK,UAAU,MAAO,KAAK,cAAc;;CAGpD,QAAQ,OAA2B;AAC/B,SACI,KAAK,YAAY,MAAM,WACvB,KAAK,gBAAgB,MAAM;;;;;;AAYvC,SAAgB,iBAAiB,OAAgC;AAE7D,KAAI,UAAU,KACV,QAAO,EAAE,WAAW,MAAM;AAI9B,KAAI,UAAU,OACV,QAAO,EAAE,WAAW,MAAM;AAI9B,KAAI,OAAO,UAAU,UACjB,QAAO,EAAE,cAAc,OAAO;AAIlC,KAAI,OAAO,UAAU,UAAU;AAC3B,MAAI,OAAO,UAAU,MAAM,CACvB,QAAO,EAAE,cAAc,OAAO,MAAM,EAAE;AAE1C,SAAO,EAAE,aAAa,OAAO;;AAIjC,KAAI,OAAO,UAAU,SACjB,QAAO,EAAE,aAAa,OAAO;AAIjC,KAAI,iBAAiB,KACjB,QAAO,EAAE,gBAAgB,MAAM,aAAa,EAAE;AAIlD,KAAI,iBAAiB,UACjB,QAAO,EAAE,gBAAgB,MAAM,QAAQ,CAAC,aAAa,EAAE;AAI3D,KAAI,iBAAiB,SACjB,QAAO,EACH,eAAe;EACX,UAAU,MAAM;EAChB,WAAW,MAAM;EACpB,EACJ;AAIL,KAAI,iBAAiB,YAAY;EAE7B,MAAM,SAAS,MAAM,KAAK,QAAQ,SAC9B,OAAO,aAAa,KAAK,CAC5B,CAAC,KAAK,GAAG;AACV,SAAO,EAAE,YAAY,KAAK,OAAO,EAAE;;AAIvC,KAAI,MAAM,QAAQ,MAAM,CACpB,QAAO,EACH,YAAY,EACR,QAAQ,MAAM,IAAI,iBAAiB,EACtC,EACJ;AAIL,KAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,SAAyC,EAAE;AACjD,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,CAE1C,KAAI,CAAC,aAAa,IAAI,CAClB,QAAO,OAAO,iBAAiB,IAAI;AAG3C,SAAO,EACH,UAAU,EACN,QACH,EACJ;;AAGL,OAAM,IAAI,MAAM,2BAA2B,OAAO,QAAQ;;;;;AAM9D,SAAgB,kBACZ,MAC8B;CAC9B,MAAM,SAAyC,EAAE;AACjD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC3C,KAAI,CAAC,aAAa,MAAM,CACpB,QAAO,OAAO,iBAAiB,MAAM;AAG7C,QAAO;;;;;AAMX,SAAgB,uBACZ,MACA,aAAa,IACG;CAChB,MAAM,aAA+B,EAAE;AAEvC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;EAC7C,MAAM,YAAY,IAAI,SAAS,IAAI,GAC7B,eAAe,IAAI,GACnB,sBAAsB,IAAI;EAChC,MAAM,YAAY,aAAa,GAAG,WAAW,GAAG,cAAc;AAE9D,MAAI,aAAa,MAAM,EAAE;GACrB,MAAM,YAAY,sBAAsB,OAAO,UAAU;AACzD,OAAI,UACA,YAAW,KAAK,UAAU;aAG9B,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,IACrB,EAAE,iBAAiB,SACnB,EAAE,iBAAiB,cACnB,EAAE,iBAAiB,aACnB,EAAE,iBAAiB,YAGnB,YAAW,KACP,GAAG,uBACC,OACA,UACH,CACJ;;AAIT,QAAO;;;;;AAMX,SAAS,sBACL,YACA,WACqB;AACrB,KAAI,kBAAkB,WAAW,CAC7B,QAAO;EACH;EACA,kBAAkB;EACrB;AAGL,KAAI,cAAc,WAAW,CAEzB,QAAO;AAGX,KAAI,YAAY,WAAW,CACvB,QAAO;EACH;EACA,WAAW,iBAAiB,mBAAmB,WAAW,CAAC;EAC9D;AAGL,KAAI,aAAa,WAAW,CAExB,QAAO;EACH;EACA,uBAAuB,EACnB,SAJS,sBAAsB,WAAW,IAAI,EAAE,EAI/B,IAAI,iBAAiB,EACzC;EACJ;AAGL,KAAI,cAAc,WAAW,CAEzB,QAAO;EACH;EACA,oBAAoB,EAChB,SAJS,uBAAuB,WAAW,IAAI,EAAE,EAIhC,IAAI,iBAAiB,EACzC;EACJ;AAGL,QAAO;;;;;AAMX,SAAgB,oBACZ,MACA,aAAa,IACL;CACR,MAAM,cAAwB,EAAE;AAEhC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;EAC7C,MAAM,YAAY,IAAI,SAAS,IAAI,GAC7B,eAAe,IAAI,GACnB,sBAAsB,IAAI;EAChC,MAAM,YAAY,aAAa,GAAG,WAAW,GAAG,cAAc;AAE9D,MAAI,aAAa,MAAM,IAAI,cAAc,MAAM,CAC3C,aAAY,KAAK,UAAU;WAE3B,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,IACrB,EAAE,iBAAiB,SACnB,EAAE,iBAAiB,cACnB,EAAE,iBAAiB,aACnB,EAAE,iBAAiB,YAEnB,aAAY,KACR,GAAG,oBACC,OACA,UACH,CACJ;;AAIT,QAAO;;;;;;AAOX,SAAgB,uBACZ,MACA,aAAa,IACL;CACR,MAAM,iBAA2B,EAAE;AAEnC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;EAC7C,MAAM,YAAY,IAAI,SAAS,IAAI,GAC7B,eAAe,IAAI,GACnB,sBAAsB,IAAI;EAChC,MAAM,YAAY,aAAa,GAAG,WAAW,GAAG,cAAc;AAE9D,MAAI,aAAa,MAAM,IAAI,CAAC,cAAc,MAAM,CAC5C,gBAAe,KAAK,UAAU;WAE9B,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,IACrB,EAAE,iBAAiB,SACnB,EAAE,iBAAiB,cACnB,EAAE,iBAAiB,aACnB,EAAE,iBAAiB,YAEnB,gBAAe,KACX,GAAG,uBACC,OACA,UACH,CACJ;;AAIT,QAAO;;;;;AAUX,SAAgB,mBAAmB,OAAgC;AAC/D,KAAI,eAAe,MACf,QAAO;AAGX,KAAI,kBAAkB,MAClB,QAAO,MAAM;AAGjB,KAAI,kBAAkB,MAClB,QAAO,SAAS,MAAM,cAAc,GAAG;AAG3C,KAAI,iBAAiB,MACjB,QAAO,MAAM;AAGjB,KAAI,oBAAoB,MACpB,QAAO,IAAI,KAAK,MAAM,eAAe;AAGzC,KAAI,iBAAiB,MACjB,QAAO,MAAM;AAGjB,KAAI,gBAAgB,OAAO;EAEvB,MAAM,SAAS,KAAK,MAAM,WAAW;EACrC,MAAM,QAAQ,IAAI,WAAW,OAAO,OAAO;AAC3C,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IAC/B,OAAM,KAAK,OAAO,WAAW,EAAE;AAEnC,SAAO;;AAGX,KAAI,oBAAoB,MACpB,QAAO,MAAM;AAGjB,KAAI,mBAAmB,MACnB,QAAO,IAAI,SACP,MAAM,cAAc,UACpB,MAAM,cAAc,UACvB;AAGL,KAAI,gBAAgB,MAEhB,SADY,MACA,WAAW,UAAU,EAAE,EAAE,IAAI,mBAAmB;AAGhE,KAAI,cAAc,MAEd,QAAO,oBADK,MACmB,SAAS,UAAU,EAAE,CAAC;AAGzD,OAAM,IAAI,MAAM,+BAA+B;;;;;AAMnD,SAAgB,oBACZ,QACuB;CACvB,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC7C,QAAO,OAAO,mBAAmB,MAAM;AAE3C,QAAO;;;;;;;;ACvbX,IAAa,uBAAb,MAEiC;CAS7B,YAAY,KAA+B,MAAc;AACrD,MAAI,OAAO,IAAI,QAAQ;AACnB,QAAK,SAAS;AACd,QAAK,QAAQ,oBAAoB,IAAI,OAAO;AAC5C,QAAK,aAAa,IAAI,aAChB,IAAI,KAAK,IAAI,WAAW,GACxB;AACN,QAAK,aAAa,IAAI,aAChB,IAAI,KAAK,IAAI,WAAW,GACxB;SACH;AACH,QAAK,SAAS;AACd,QAAK,QAAQ;;AAGjB,OAAK,OAAO;AACZ,OAAK,KAAK,kBAAkB,KAAK;;CAGrC,OAAsB;AAClB,SAAO,KAAK;;CAGhB,IAAI,WAA4B;AAC5B,MAAI,CAAC,KAAK,MAAO,QAAO;EAExB,MAAM,QAAQ,UAAU,MAAM,IAAI;EAClC,IAAI,UAAmB,KAAK;AAE5B,OAAK,MAAM,QAAQ,OAAO;AACtB,OAAI,YAAY,QAAQ,YAAY,OAAW,QAAO;AACtD,OAAI,OAAO,YAAY,SAAU,QAAO;AACxC,aAAW,QAAoC;;AAGnD,SAAO;;;;;;AA0Bf,IAAa,oBAAb,MAAiD;CAI7C,YACI,AAAiB,YACjB,MACF;EAFmB;AAGjB,OAAK,OAAO;AACZ,OAAK,KAAK,kBAAkB,KAAK;;;;;CAMrC,IAAI,SAAiC;EACjC,MAAM,EAAE,eAAe,kBAAkB,KAAK,KAAK;AACnD,SAAO,IAAI,oBAAuB,KAAK,YAAY,WAAW;;;;;CAMlE,WAAW,gBAA6C;AACpD,SAAO,IAAI,oBACP,KAAK,YACL,GAAG,KAAK,KAAK,GAAG,iBACnB;;;;;CAML,MAAM,MAAoC;AAEtC,SAAO,IAAI,qBADC,MAAM,KAAK,WAAW,aAAa,KAAK,KAAK,EACjB,KAAK,KAAK;;;;;CAMtD,MAAM,IAAI,MAAS,SAAqD;AACpE,SAAO,KAAK,WAAW,aACnB,KAAK,MACL,MACA,QACH;;;;;CAML,MAAM,OAAO,MAAwC;AACjD,SAAO,KAAK,WAAW,gBACnB,KAAK,MACL,KACH;;;;;CAML,MAAM,SAAwB;AAC1B,QAAM,KAAK,WAAW,gBAAgB,KAAK,KAAK;;;;;;AAOxD,IAAa,sBAAb,MAAmD;CAI/C,YACI,AAAiB,YACjB,MACF;EAFmB;AAGjB,OAAK,OAAO;EACZ,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,OAAK,KAAK,MAAM,MAAM,SAAS;;;;;;CAOnC,IAAI,YAA2C;EAC3C,MAAM,QAAQ,cAAc,oBAAoB;AAChD,SAAO,IAAI,kBACP,KAAK,YACL,GAAG,KAAK,KAAK,GAAG,QACnB;;;;;CAML,MAAM,IAAI,MAAwC;EAC9C,MAAM,MAAM,KAAK,KAAK;AACtB,QAAM,IAAI,IAAI,KAAK;AACnB,SAAO;;;;;;;;;;;;;ACtKf,IAAa,cAAb,MAAyB;CAGrB,YACI,AAAiB,YAMjB,AAAiB,gBACnB;EAPmB;EAMA;iBATe,EAAE;;;;;CAetC,MAAM,IACF,KAC4B;AAK5B,SAAO,IAAI,qBAJC,MAAM,KAAK,WAAW,aAC9B,IAAI,MACJ,KAAK,eACR,EACuC,IAAI,KAAK;;;;;CAMrD,IACI,KACA,MACA,SACW;EACX,MAAM,UAAU,KAAK,WAAW,iBAAiB,IAAI,KAAK;EAC1D,MAAM,SAAS,kBAAkB,KAAgC;EACjE,MAAM,aAAa,uBACf,KACH;EAED,MAAM,QAAe,EACjB,QAAQ;GACJ,MAAM;GACN;GACH,EACJ;AAGD,MAAI,SAAS,MAMT,OAAM,aAAa,EAAE,YALF,cACf,MACA,IACA,aACH,EACgC;AAIrC,MAAI,WAAW,SAAS,EACpB,OAAM,mBAAmB;AAG7B,OAAK,QAAQ,KAAK,MAAM;AACxB,SAAO;;;;;CAMX,OACI,KACA,MACW;EACX,MAAM,UAAU,KAAK,WAAW,iBAAiB,IAAI,KAAK;EAG1D,MAAM,eAAe,oBACjB,KACH;EACD,MAAM,aAAa,uBACf,KACH;EAGD,MAAM,aAAa,cACf,MACA,IACA,aACH,CAAC,QAAQ,MAAM,CAAC,aAAa,SAAS,EAAE,CAAC;EAK1C,MAAM,QAAe;GACjB,QAAQ;IACJ,MAAM;IACN,QALO,kBAAkB,KAAgC;IAM5D;GACD,YAAY,EAAE,YAAY,CAAC,GAAG,YAAY,GAAG,aAAa,EAAE;GAC5D,iBAAiB,EAAE,QAAQ,MAAM;GACpC;AAED,MAAI,WAAW,SAAS,EACpB,OAAM,mBAAmB;AAG7B,OAAK,QAAQ,KAAK,MAAM;AACxB,SAAO;;;;;CAMX,OAAO,KAAqC;EACxC,MAAM,UAAU,KAAK,WAAW,iBAAiB,IAAI,KAAK;AAC1D,OAAK,QAAQ,KAAK,EACd,QAAQ,SACX,CAAC;AACF,SAAO;;;CAIX,aAAsB;AAClB,SAAO,KAAK;;;CAIhB,oBAA4B;AACxB,SAAO,KAAK;;;;;;;;;;;AC3HpB,MAAM,WAAW;AACjB,MAAM,mBAAmB;;;;AAKzB,IAAa,YAAb,MAA2D;CAMvD,YAAY,QAAoB,aAAqB,kBAAkB;gBAHvC;sBACD;AAG3B,OAAK,UAAU;AACf,OAAK,cAAc;;;;;CAMvB,WAAW,gBAA6C;AACpD,SAAO,IAAI,oBAAoB,MAAM,eAAe;;;;;CAMxD,IAAI,cAAyC;AACzC,SAAO,IAAI,kBAAkB,MAAM,aAAa;;;;;CAMpD,MAAM,eACF,UACA,SACU;EACV,MAAM,cAAc,SAAS,eAAe;EAC5C,IAAI,YAA0B;EAC9B,IAAI;AAEJ,OAAK,IAAI,UAAU,GAAG,UAAU,aAAa,UACzC,KAAI;GAEA,MAAM,gBACF,MAAM,KAAK,kBAAkB,iBAAiB;GAClD,MAAM,cAAc,IAAI,YAAY,MAAM,cAAc;GAGxD,MAAM,SAAS,MAAM,SAAS,YAAY;AAG1C,SAAM,KAAK,mBACP,eACA,YAAY,YAAY,CAC3B;AAED,UAAO;WACF,OAAO;AACZ,eAAY;AAGZ,OACI,iBAAiB,SACjB,MAAM,QAAQ,SAAS,UAAU,EACnC;AAEE,uBAAmB;AACnB;;AAIJ,SAAM;;AAId,QAAM,6BAAa,IAAI,MAAM,wCAAwC;;;CAQzE,MAAM,YAA6B;AAE/B,MAAI,gBAAgB,KAAK,SAAS;AAE9B,OAAI,KAAK,UAAU,KAAK,KAAK,GAAG,KAAK,eAAe,IAChD,QAAO,KAAK;AAGhB,QAAK,SAAS,MAAM,kBAAkB,KAAK,QAAQ;AACnD,QAAK,eAAe,KAAK,KAAK,GAAG,OAAO;AACxC,UAAO,KAAK;QAIZ,QAAO,MAAM,KAAK,QAAQ,OAAO;;;CAKzC,mBAA2B;AACvB,SAAO,YAAY,KAAK,QAAQ,UAAU,aAAa,KAAK;;;CAIhE,iBAAiB,MAAsB;AACnC,SAAO,GAAG,KAAK,kBAAkB,CAAC,aAAa;;;CAInD,MAAM,aACF,MACA,eACiC;EACjC,MAAM,QAAQ,MAAM,KAAK,WAAW;EAGpC,IAAI,MAAM,GAAG,SAAS,GAFN,KAAK,iBAAiB,KAAK;AAG3C,MAAI,cACA,QAAO,gBAAgB,mBAAmB,cAAc;EAG5D,MAAM,WAAW,MAAM,MAAM,KAAK;GAC9B,QAAQ;GACR,SAAS,EACL,eAAe,UAAU,SAC5B;GACJ,CAAC;AAEF,MAAI,SAAS,WAAW,IACpB,QAAO;AAGX,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,MAAM,GAAG;;AAGvE,SAAO,SAAS,MAAM;;;CAI1B,MAAM,aACF,MACA,MACA,SACoB;EACpB,MAAM,QAAQ,MAAM,KAAK,WAAW;EACpC,MAAM,WAAW,KAAK,kBAAkB;EACxC,MAAM,UAAU,KAAK,iBAAiB,KAAK;EAE3C,MAAM,SAAS,kBAAkB,KAAK;EACtC,MAAM,aAAa,uBAAuB,KAAK;EAE/C,MAAM,SAAkB,CACpB,EACI,QAAQ;GACJ,MAAM;GACN;GACH,EACJ,CACJ;AAED,MAAI,SAAS,OAAO;GAChB,MAAM,aAAa,cAAc,MAAM,IAAI,aAAa;AACxD,UAAO,GAAG,aAAa,EAAE,YAAY;;AAGzC,MAAI,WAAW,SAAS,EACpB,QAAO,GAAG,mBAAmB;EAGjC,MAAM,WAAW,MAAM,MACnB,GAAG,SAAS,GAAG,SAAS,oBACxB;GACI,QAAQ;GACR,SAAS;IACL,eAAe,UAAU;IACzB,gBAAgB;IACnB;GACD,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;GACnC,CACJ;AAED,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,MAAM,GAAG;;AAIvE,UAD+B,MAAM,SAAS,MAAM,EACtC,eAAe,MAAM,EAAE;;;CAIzC,MAAM,gBACF,MACA,MACoB;EACpB,MAAM,QAAQ,MAAM,KAAK,WAAW;EACpC,MAAM,WAAW,KAAK,kBAAkB;EACxC,MAAM,UAAU,KAAK,iBAAiB,KAAK;EAE3C,MAAM,eAAe,oBAAoB,KAAK;EAC9C,MAAM,aAAa,uBAAuB,KAAK;EAC/C,MAAM,kBAAkB,uBAAuB,KAAK;EAGpD,MAAM,aAAa,cAAc,MAAM,IAAI,aAAa,CAAC,QACpD,MAAM,CAAC,aAAa,SAAS,EAAE,IAAI,CAAC,gBAAgB,SAAS,EAAE,CACnE;EAGD,MAAM,SAAS,kBAAkB,MAAM,kBAAkB,aAAa;EAGtE,MAAM,kBAAkB,CAAC,GAAG,YAAY,GAAG,aAAa;EAExD,MAAM,SAAkB,EAAE;AAG1B,MAAI,gBAAgB,SAAS,GAAG;GAC5B,MAAM,QAAe;IACjB,QAAQ;KACJ,MAAM;KACN;KACH;IACD,YAAY,EAAE,YAAY,iBAAiB;IAC3C,iBAAiB,EAAE,QAAQ,MAAM;IACpC;AACD,UAAO,KAAK,MAAM;;AAItB,MAAI,WAAW,SAAS,EACpB,KAAI,OAAO,SAAS,EAEhB,QAAO,GAAG,mBAAmB;MAG7B,QAAO,KAAK;GACR,WAAW;IACP,UAAU;IACV,iBAAiB;IACpB;GACD,iBAAiB,EAAE,QAAQ,MAAM;GACpC,CAAC;AAIV,MAAI,OAAO,WAAW,EAElB,QAAO,EAAE;EAGb,MAAM,WAAW,MAAM,MACnB,GAAG,SAAS,GAAG,SAAS,oBACxB;GACI,QAAQ;GACR,SAAS;IACL,eAAe,UAAU;IACzB,gBAAgB;IACnB;GACD,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;GACnC,CACJ;AAED,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MACN,8BAA8B,KAAK,UAAU,MAAM,GACtD;;AAIL,UAD+B,MAAM,SAAS,MAAM,EACtC,eAAe,MAAM,EAAE;;;CAIzC,MAAM,gBAAgB,MAA6B;EAC/C,MAAM,QAAQ,MAAM,KAAK,WAAW;EACpC,MAAM,WAAW,KAAK,kBAAkB;EACxC,MAAM,UAAU,KAAK,iBAAiB,KAAK;EAE3C,MAAM,WAAW,MAAM,MACnB,GAAG,SAAS,GAAG,SAAS,oBACxB;GACI,QAAQ;GACR,SAAS;IACL,eAAe,UAAU;IACzB,gBAAgB;IACnB;GACD,MAAM,KAAK,UAAU,EACjB,QAAQ,CAAC,EAAE,QAAQ,SAAS,CAAC,EAChC,CAAC;GACL,CACJ;AAED,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MACN,8BAA8B,KAAK,UAAU,MAAM,GACtD;;;;CAKT,MAAM,kBAAkB,kBAA4C;EAChE,MAAM,QAAQ,MAAM,KAAK,WAAW;EACpC,MAAM,WAAW,KAAK,kBAAkB;EAExC,MAAM,UAA8B,EAChC,WAAW,mBAAmB,EAAE,kBAAkB,GAAG,EAAE,EAC1D;EAED,MAAM,WAAW,MAAM,MACnB,GAAG,SAAS,GAAG,SAAS,8BACxB;GACI,QAAQ;GACR,SAAS;IACL,eAAe,UAAU;IACzB,gBAAgB;IACnB;GACD,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;GACpC,CACJ;AAED,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MACN,gCAAgC,KAAK,UAAU,MAAM,GACxD;;AAIL,UADyC,MAAM,SAAS,MAAM,EAChD;;;CAIlB,MAAM,mBACF,eACA,QACuB;EACvB,MAAM,QAAQ,MAAM,KAAK,WAAW;EACpC,MAAM,WAAW,KAAK,kBAAkB;EAExC,MAAM,WAAW,MAAM,MACnB,GAAG,SAAS,GAAG,SAAS,oBACxB;GACI,QAAQ;GACR,SAAS;IACL,eAAe,UAAU;IACzB,gBAAgB;IACnB;GACD,MAAM,KAAK,UAAU;IACjB;IACA,aAAa;IAChB,CAAC;GACL,CACJ;AAED,MAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,SAAM,IAAI,MACN,iCAAiC,KAAK,UAAU,MAAM,GACzD;;AAGL,SAAO,SAAS,MAAM"}
1
+ {"version":3,"file":"index.js","names":["isFieldValue","toFirestoreValue"],"sources":["../src/auth.ts","../src/utils.ts","../src/field-value.ts","../src/value.ts","../src/query.ts","../src/references.ts","../src/transaction.ts","../src/client.ts"],"sourcesContent":["import { importPKCS8, SignJWT } from \"jose\";\nimport type { ServiceAccountConfig } from \"./types.js\";\n\nexport async function createJWT(config: ServiceAccountConfig): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n iss: config.clientEmail,\n sub: config.clientEmail,\n aud: \"https://oauth2.googleapis.com/token\",\n iat: now,\n exp: now + 3600,\n scope: \"https://www.googleapis.com/auth/datastore\",\n };\n\n try {\n const privateKey = await importPKCS8(config.privateKey, \"RS256\");\n\n const token = await new SignJWT(payload)\n .setProtectedHeader({\n alg: \"RS256\",\n typ: \"JWT\",\n })\n .sign(privateKey);\n\n return token;\n } catch (error) {\n throw error;\n }\n}\n\nexport async function getFirestoreToken(\n config: ServiceAccountConfig,\n): Promise<string> {\n const response = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion: await createJWT(config),\n }),\n });\n\n const data = (await response.json()) as { access_token: unknown };\n if (typeof data.access_token !== \"string\") {\n throw new Error(\"Invalid access token\");\n }\n\n return data.access_token;\n}\n","/**\n * Firestore Utility Functions\n */\n\nimport type { FirestoreValue } from \"./types.js\";\n\n/**\n * Regular expression for valid unquoted Firestore field path segments.\n * Unquoted segments must start with a letter or underscore, followed by\n * letters, underscores, or digits.\n */\nconst SIMPLE_FIELD_PATH_REGEX = /^[a-zA-Z_][a-zA-Z_0-9]*$/;\n\n/**\n * Quote a field path segment if it contains special characters.\n * Segments that don't match the simple identifier pattern must be quoted with backticks.\n */\nexport function quoteFieldPathSegment(segment: string): string {\n if (SIMPLE_FIELD_PATH_REGEX.test(segment)) {\n return segment;\n }\n // Escape backticks and backslashes in the segment\n const escaped = segment.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\");\n return `\\`${escaped}\\``;\n}\n\n/**\n * Quote a full field path, handling each segment individually.\n * Splits the path by dots and quotes each segment if needed.\n */\nexport function quoteFieldPath(path: string): string {\n return path.split(\".\").map(quoteFieldPathSegment).join(\".\");\n}\n\n/**\n * Generate a random document ID (20 characters, alphanumeric)\n */\nexport function generateDocumentId(): string {\n const chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let result = \"\";\n for (let i = 0; i < 20; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Parse a document path into collection and document ID\n */\nexport function parseDocumentPath(path: string): {\n collection: string;\n docId: string;\n} {\n const parts = path.split(\"/\");\n if (parts.length < 2 || parts.length % 2 !== 0) {\n throw new Error(`Invalid document path: ${path}`);\n }\n return {\n collection: parts.slice(0, -1).join(\"/\"),\n docId: parts[parts.length - 1],\n };\n}\n\n/**\n * Extract document ID from full resource name\n */\nexport function extractDocumentId(name: string): string {\n const parts = name.split(\"/\");\n return parts[parts.length - 1];\n}\n\n/**\n * Extract document path from full resource name\n */\nexport function extractDocumentPath(name: string): string {\n // Format: projects/{project}/databases/{db}/documents/{path}\n const match = name.match(/documents\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/**\n * Get all field paths from an object.\n */\nexport function getFieldPaths(\n obj: Record<string, unknown>,\n prefix = \"\",\n isFieldValue: (v: unknown) => boolean,\n): string[] {\n const paths: string[] = [];\n for (const key of Object.keys(obj)) {\n const quotedKey = quoteFieldPathSegment(key);\n // Check if key contains dots (dot-notation path)\n if (key.includes(\".\")) {\n // For dot-notation keys, quote each segment\n paths.push(quoteFieldPath(key));\n } else {\n const fullPath = prefix ? `${prefix}.${quotedKey}` : quotedKey;\n const value = obj[key];\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !isFieldValue(value) &&\n Object.keys(value).length > 0 &&\n !(\"latitude\" in value && \"longitude\" in value)\n ) {\n paths.push(\n ...getFieldPaths(\n value as Record<string, unknown>,\n fullPath,\n isFieldValue,\n ),\n );\n } else {\n paths.push(fullPath);\n }\n }\n }\n return paths;\n}\n\n/**\n * Build Firestore fields from update data, handling dot-notation paths.\n */\nexport function buildUpdateFields(\n data: Record<string, unknown>,\n toFirestoreValue: (v: unknown) => FirestoreValue,\n isFieldValue: (v: unknown) => boolean,\n): Record<string, FirestoreValue> {\n const fields: Record<string, FirestoreValue> = {};\n\n for (const [key, value] of Object.entries(data)) {\n // Skip FieldValue sentinels\n if (isFieldValue(value)) {\n continue;\n }\n\n // Handle dot-notation paths like \"user.age\"\n if (key.includes(\".\")) {\n const parts = key.split(\".\");\n let current = fields;\n\n // Navigate/create nested structure\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!current[part]) {\n current[part] = {\n mapValue: { fields: {} },\n };\n }\n const mapVal = current[part] as {\n mapValue: { fields: Record<string, FirestoreValue> };\n };\n if (!mapVal.mapValue.fields) {\n mapVal.mapValue.fields = {};\n }\n current = mapVal.mapValue.fields;\n }\n\n // Set the final value\n current[parts[parts.length - 1]] = toFirestoreValue(value);\n } else {\n // Regular field\n fields[key] = toFirestoreValue(value);\n }\n }\n\n return fields;\n}\n","/**\n * FieldValue Sentinels\n *\n * Sentinel values for special Firestore operations.\n */\n\n/** Property name to identify FieldValue instances */\nconst FIELD_VALUE_MARKER = \"__isFieldValue__\" as const;\n\n/** Base class for FieldValue sentinels */\nabstract class FieldValueBase {\n readonly __isFieldValue__: true = true;\n abstract readonly _type: string;\n}\n\n/** Server timestamp sentinel */\nexport class ServerTimestampValue extends FieldValueBase {\n readonly _type = \"serverTimestamp\";\n}\n\n/** Delete field sentinel */\nexport class DeleteFieldValue extends FieldValueBase {\n readonly _type = \"delete\";\n}\n\n/** Increment sentinel */\nexport class IncrementValue extends FieldValueBase {\n readonly _type = \"increment\";\n constructor(readonly amount: number) {\n super();\n }\n}\n\n/** Array union sentinel */\nexport class ArrayUnionValue extends FieldValueBase {\n readonly _type = \"arrayUnion\";\n constructor(readonly elements: unknown[]) {\n super();\n }\n}\n\n/** Array remove sentinel */\nexport class ArrayRemoveValue extends FieldValueBase {\n readonly _type = \"arrayRemove\";\n constructor(readonly elements: unknown[]) {\n super();\n }\n}\n\n/** FieldValue sentinel type */\nexport type FieldValueType =\n | ServerTimestampValue\n | DeleteFieldValue\n | IncrementValue\n | ArrayUnionValue\n | ArrayRemoveValue;\n\n/**\n * FieldValue factory for creating sentinel values\n */\nexport const FieldValue = {\n /**\n * Returns a sentinel to include a server-generated timestamp in the written data.\n */\n serverTimestamp(): FieldValueType {\n return new ServerTimestampValue();\n },\n\n /**\n * Returns a sentinel to delete a field.\n */\n delete(): FieldValueType {\n return new DeleteFieldValue();\n },\n\n /**\n * Returns a sentinel to increment a numeric field by the given amount.\n */\n increment(amount: number): FieldValueType {\n return new IncrementValue(amount);\n },\n\n /**\n * Returns a sentinel to union elements into an array field.\n * Only adds elements not already present.\n */\n arrayUnion(...elements: unknown[]): FieldValueType {\n return new ArrayUnionValue(elements);\n },\n\n /**\n * Returns a sentinel to remove elements from an array field.\n */\n arrayRemove(...elements: unknown[]): FieldValueType {\n return new ArrayRemoveValue(elements);\n },\n};\n\n/**\n * Check if a value is a FieldValue sentinel\n */\nexport function isFieldValue(value: unknown): value is FieldValueType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n FIELD_VALUE_MARKER in value &&\n value[FIELD_VALUE_MARKER] === true\n );\n}\n\n/**\n * Check if a value is a ServerTimestamp sentinel\n */\nexport function isServerTimestamp(\n value: unknown,\n): value is ServerTimestampValue {\n return value instanceof ServerTimestampValue;\n}\n\n/**\n * Check if a value is a Delete sentinel\n */\nexport function isDeleteField(value: unknown): value is DeleteFieldValue {\n return value instanceof DeleteFieldValue;\n}\n\n/**\n * Check if a value is an Increment sentinel\n */\nexport function isIncrement(value: unknown): value is IncrementValue {\n return value instanceof IncrementValue;\n}\n\n/**\n * Get increment amount if value is an increment sentinel\n */\nexport function getIncrementAmount(value: unknown): number | undefined {\n if (value instanceof IncrementValue) {\n return value.amount;\n }\n return undefined;\n}\n\n/**\n * Check if a value is an ArrayUnion sentinel\n */\nexport function isArrayUnion(value: unknown): value is ArrayUnionValue {\n return value instanceof ArrayUnionValue;\n}\n\n/**\n * Get array union elements if value is an array union sentinel\n */\nexport function getArrayUnionElements(value: unknown): unknown[] | undefined {\n if (value instanceof ArrayUnionValue) {\n return value.elements;\n }\n return undefined;\n}\n\n/**\n * Check if a value is an ArrayRemove sentinel\n */\nexport function isArrayRemove(value: unknown): value is ArrayRemoveValue {\n return value instanceof ArrayRemoveValue;\n}\n\n/**\n * Get array remove elements if value is an array remove sentinel\n */\nexport function getArrayRemoveElements(value: unknown): unknown[] | undefined {\n if (value instanceof ArrayRemoveValue) {\n return value.elements;\n }\n return undefined;\n}\n","/**\n * Value Conversion Utilities\n *\n * Bidirectional conversion between JavaScript values and Firestore REST format.\n */\n\nimport {\n type FieldValueType,\n getArrayRemoveElements,\n getArrayUnionElements,\n getIncrementAmount,\n isArrayRemove,\n isArrayUnion,\n isDeleteField,\n isFieldValue,\n isIncrement,\n isServerTimestamp,\n} from \"./field-value.js\";\nimport type { FieldTransform, FirestoreValue } from \"./types.js\";\nimport { quoteFieldPath, quoteFieldPathSegment } from \"./utils.js\";\n\n// Re-export from field-value\nexport {\n FieldValue,\n isFieldValue,\n type FieldValueType,\n} from \"./field-value.js\";\n\n// ============================================================================\n// GeoPoint Class\n// ============================================================================\n\n/**\n * Represents a geographic point (latitude/longitude).\n */\nexport class GeoPoint {\n constructor(\n readonly latitude: number,\n readonly longitude: number,\n ) {\n if (latitude < -90 || latitude > 90) {\n throw new Error(\"Latitude must be between -90 and 90\");\n }\n if (longitude < -180 || longitude > 180) {\n throw new Error(\"Longitude must be between -180 and 180\");\n }\n }\n\n isEqual(other: GeoPoint): boolean {\n return (\n this.latitude === other.latitude &&\n this.longitude === other.longitude\n );\n }\n}\n\n// ============================================================================\n// Timestamp Class\n// ============================================================================\n\n/**\n * Represents a Firestore timestamp with nanosecond precision.\n */\nexport class Timestamp {\n constructor(\n readonly seconds: number,\n readonly nanoseconds: number,\n ) {}\n\n static now(): Timestamp {\n const now = Date.now();\n return new Timestamp(Math.floor(now / 1000), (now % 1000) * 1_000_000);\n }\n\n static fromDate(date: Date): Timestamp {\n const ms = date.getTime();\n return new Timestamp(Math.floor(ms / 1000), (ms % 1000) * 1_000_000);\n }\n\n static fromMillis(milliseconds: number): Timestamp {\n return new Timestamp(\n Math.floor(milliseconds / 1000),\n (milliseconds % 1000) * 1_000_000,\n );\n }\n\n toDate(): Date {\n return new Date(this.seconds * 1000 + this.nanoseconds / 1_000_000);\n }\n\n toMillis(): number {\n return this.seconds * 1000 + this.nanoseconds / 1_000_000;\n }\n\n isEqual(other: Timestamp): boolean {\n return (\n this.seconds === other.seconds &&\n this.nanoseconds === other.nanoseconds\n );\n }\n}\n\n// ============================================================================\n// JavaScript to Firestore Conversion\n// ============================================================================\n\n/**\n * Convert a JavaScript value to Firestore REST format.\n */\nexport function toFirestoreValue(value: unknown): FirestoreValue {\n // null\n if (value === null) {\n return { nullValue: null };\n }\n\n // undefined -> null\n if (value === undefined) {\n return { nullValue: null };\n }\n\n // boolean\n if (typeof value === \"boolean\") {\n return { booleanValue: value };\n }\n\n // number\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { integerValue: String(value) };\n }\n return { doubleValue: value };\n }\n\n // string\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n\n // Date\n if (value instanceof Date) {\n return { timestampValue: value.toISOString() };\n }\n\n // Timestamp\n if (value instanceof Timestamp) {\n return { timestampValue: value.toDate().toISOString() };\n }\n\n // GeoPoint\n if (value instanceof GeoPoint) {\n return {\n geoPointValue: {\n latitude: value.latitude,\n longitude: value.longitude,\n },\n };\n }\n\n // Uint8Array (bytes)\n if (value instanceof Uint8Array) {\n // Convert to base64\n const binary = Array.from(value, (byte) =>\n String.fromCharCode(byte),\n ).join(\"\");\n return { bytesValue: btoa(binary) };\n }\n\n // Array\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map(toFirestoreValue),\n },\n };\n }\n\n // Object (map)\n if (typeof value === \"object\") {\n const fields: Record<string, FirestoreValue> = {};\n for (const [key, val] of Object.entries(value)) {\n // Skip FieldValue sentinels - they're handled separately as transforms\n if (!isFieldValue(val)) {\n fields[key] = toFirestoreValue(val);\n }\n }\n return {\n mapValue: {\n fields,\n },\n };\n }\n\n throw new Error(`Unsupported value type: ${typeof value}`);\n}\n\n/**\n * Convert document data to Firestore fields format.\n */\nexport function toFirestoreFields(\n data: Record<string, unknown>,\n): Record<string, FirestoreValue> {\n const fields: Record<string, FirestoreValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (!isFieldValue(value)) {\n fields[key] = toFirestoreValue(value);\n }\n }\n return fields;\n}\n\n/**\n * Extract field transforms from document data.\n */\nexport function extractFieldTransforms(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): FieldTransform[] {\n const transforms: FieldTransform[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value)) {\n const transform = fieldValueToTransform(value, fieldPath);\n if (transform) {\n transforms.push(transform);\n }\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n // Recurse into nested objects\n transforms.push(\n ...extractFieldTransforms(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return transforms;\n}\n\n/**\n * Convert a FieldValue sentinel to a FieldTransform.\n */\nfunction fieldValueToTransform(\n fieldValue: FieldValueType,\n fieldPath: string,\n): FieldTransform | null {\n if (isServerTimestamp(fieldValue)) {\n return {\n fieldPath,\n setToServerValue: \"REQUEST_TIME\",\n };\n }\n\n if (isDeleteField(fieldValue)) {\n // Delete is handled differently - not a transform\n return null;\n }\n\n if (isIncrement(fieldValue)) {\n return {\n fieldPath,\n increment: toFirestoreValue(getIncrementAmount(fieldValue)),\n };\n }\n\n if (isArrayUnion(fieldValue)) {\n const elements = getArrayUnionElements(fieldValue) ?? [];\n return {\n fieldPath,\n appendMissingElements: {\n values: elements.map(toFirestoreValue),\n },\n };\n }\n\n if (isArrayRemove(fieldValue)) {\n const elements = getArrayRemoveElements(fieldValue) ?? [];\n return {\n fieldPath,\n removeAllFromArray: {\n values: elements.map(toFirestoreValue),\n },\n };\n }\n\n return null;\n}\n\n/**\n * Extract delete field paths from document data.\n */\nexport function extractDeleteFields(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): string[] {\n const deletePaths: string[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value) && isDeleteField(value)) {\n deletePaths.push(fieldPath);\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n deletePaths.push(\n ...extractDeleteFields(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return deletePaths;\n}\n\n/**\n * Extract transform field paths from document data.\n * These are fields with FieldValue sentinels that become transforms (not delete).\n */\nexport function extractTransformFields(\n data: Record<string, unknown>,\n pathPrefix = \"\",\n): string[] {\n const transformPaths: string[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n const quotedKey = key.includes(\".\")\n ? quoteFieldPath(key)\n : quoteFieldPathSegment(key);\n const fieldPath = pathPrefix ? `${pathPrefix}.${quotedKey}` : quotedKey;\n\n if (isFieldValue(value) && !isDeleteField(value)) {\n transformPaths.push(fieldPath);\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Timestamp) &&\n !(value instanceof GeoPoint) &&\n !(value instanceof Uint8Array)\n ) {\n transformPaths.push(\n ...extractTransformFields(\n value as Record<string, unknown>,\n fieldPath,\n ),\n );\n }\n }\n\n return transformPaths;\n}\n\n// ============================================================================\n// Firestore to JavaScript Conversion\n// ============================================================================\n\n/**\n * Convert a Firestore REST value to JavaScript.\n */\nexport function fromFirestoreValue(value: FirestoreValue): unknown {\n if (\"nullValue\" in value) {\n return null;\n }\n\n if (\"booleanValue\" in value) {\n return value.booleanValue;\n }\n\n if (\"integerValue\" in value) {\n return parseInt(value.integerValue, 10);\n }\n\n if (\"doubleValue\" in value) {\n return value.doubleValue;\n }\n\n if (\"timestampValue\" in value) {\n return new Date(value.timestampValue);\n }\n\n if (\"stringValue\" in value) {\n return value.stringValue;\n }\n\n if (\"bytesValue\" in value) {\n // Decode base64\n const binary = atob(value.bytesValue);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n if (\"referenceValue\" in value) {\n return value.referenceValue;\n }\n\n if (\"geoPointValue\" in value) {\n return new GeoPoint(\n value.geoPointValue.latitude,\n value.geoPointValue.longitude,\n );\n }\n\n if (\"arrayValue\" in value) {\n return (value.arrayValue.values ?? []).map(fromFirestoreValue);\n }\n\n if (\"mapValue\" in value) {\n return fromFirestoreFields(value.mapValue.fields ?? {});\n }\n\n throw new Error(\"Unknown Firestore value type\");\n}\n\n/**\n * Convert Firestore fields to JavaScript object.\n */\nexport function fromFirestoreFields(\n fields: Record<string, FirestoreValue>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n result[key] = fromFirestoreValue(value);\n }\n return result;\n}\n","/**\n * Query Implementation\n *\n * Fluent query builder for Firestore collections.\n */\n\nimport type {\n AggregateQuerySnapshot,\n AggregationResult,\n Cursor,\n DocumentData,\n Filter,\n FirestoreClientInterface,\n FirestoreDocument,\n Order,\n OrderByDirection,\n Projection,\n QueryDocumentSnapshot,\n QuerySnapshot,\n StructuredQuery,\n WhereFilterOp,\n} from \"./types.js\";\nimport { extractDocumentPath } from \"./utils.js\";\nimport { fromFirestoreFields, toFirestoreValue } from \"./value.js\";\n\n// ============================================================================\n// Query Constraints (Internal)\n// ============================================================================\n\n/** Internal representation of query constraints */\nexport interface QueryConstraints {\n filters: Filter[];\n orderBy: Order[];\n limit?: number;\n limitToLast?: number;\n offset?: number;\n startAt?: { values: unknown[]; before: boolean };\n endAt?: { values: unknown[]; before: boolean };\n select?: string[];\n}\n\n// ============================================================================\n// Operator Mapping\n// ============================================================================\n\n/** Maps SDK operators to Firestore REST API operator strings */\nconst OPERATOR_MAP: Record<WhereFilterOp, Filter[\"fieldFilter\"][\"op\"]> = {\n \"<\": \"LESS_THAN\",\n \"<=\": \"LESS_THAN_OR_EQUAL\",\n \"==\": \"EQUAL\",\n \"!=\": \"NOT_EQUAL\",\n \">=\": \"GREATER_THAN_OR_EQUAL\",\n \">\": \"GREATER_THAN\",\n \"array-contains\": \"ARRAY_CONTAINS\",\n \"array-contains-any\": \"ARRAY_CONTAINS_ANY\",\n in: \"IN\",\n \"not-in\": \"NOT_IN\",\n};\n\nfunction getRestOperator(op: WhereFilterOp): Filter[\"fieldFilter\"][\"op\"] {\n return OPERATOR_MAP[op];\n}\n\n// ============================================================================\n// Query Document Snapshot Implementation\n// ============================================================================\n\n/** Implementation of QueryDocumentSnapshot */\nclass QueryDocumentSnapshotImpl<\n T = DocumentData,\n> implements QueryDocumentSnapshot<T> {\n readonly exists: true = true;\n readonly id: string;\n readonly path: string;\n readonly createTime?: Date;\n readonly updateTime?: Date;\n\n private readonly _data: T;\n\n constructor(doc: FirestoreDocument) {\n this._data = fromFirestoreFields(doc.fields ?? {}) as T;\n this.path = doc.name ? extractDocumentPath(doc.name) : \"\";\n this.id = this.path.split(\"/\").pop() ?? \"\";\n this.createTime = doc.createTime ? new Date(doc.createTime) : undefined;\n this.updateTime = doc.updateTime ? new Date(doc.updateTime) : undefined;\n }\n\n data(): T {\n return this._data;\n }\n\n get(fieldPath: string): unknown {\n const parts = fieldPath.split(\".\");\n let current: unknown = this._data;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n }\n}\n\n// ============================================================================\n// Query Snapshot Implementation\n// ============================================================================\n\n/** Implementation of QuerySnapshot */\nclass QuerySnapshotImpl<T = DocumentData> implements QuerySnapshot<T> {\n readonly docs: QueryDocumentSnapshot<T>[];\n readonly empty: boolean;\n readonly size: number;\n\n constructor(documents: FirestoreDocument[]) {\n this.docs = documents.map(\n (doc) => new QueryDocumentSnapshotImpl<T>(doc),\n );\n this.empty = this.docs.length === 0;\n this.size = this.docs.length;\n }\n\n forEach(callback: (doc: QueryDocumentSnapshot<T>) => void): void {\n this.docs.forEach(callback);\n }\n}\n\n// ============================================================================\n// Aggregate Query Snapshot Implementation\n// ============================================================================\n\n/** Implementation of AggregateQuerySnapshot */\nclass AggregateQuerySnapshotImpl implements AggregateQuerySnapshot {\n private readonly _count: number;\n\n constructor(result: AggregationResult) {\n const countField = result.result?.aggregateFields?.count_alias;\n if (countField && \"integerValue\" in countField) {\n this._count = parseInt(countField.integerValue, 10);\n } else {\n this._count = 0;\n }\n }\n\n data(): { count: number } {\n return { count: this._count };\n }\n}\n\n// ============================================================================\n// Query Class\n// ============================================================================\n\n/**\n * A Query refers to a query which you can read or listen to.\n * You can refine a Query with query constraints.\n */\nexport class Query<T = DocumentData> {\n /** @internal */\n protected readonly _firestore: FirestoreClientInterface;\n /** @internal */\n protected readonly _collectionPath: string;\n /** @internal */\n protected readonly _constraints: QueryConstraints;\n\n constructor(\n firestore: FirestoreClientInterface,\n collectionPath: string,\n constraints?: QueryConstraints,\n ) {\n this._firestore = firestore;\n this._collectionPath = collectionPath;\n this._constraints = constraints ?? {\n filters: [],\n orderBy: [],\n };\n }\n\n // ========================================================================\n // Filter Methods\n // ========================================================================\n\n /**\n * Creates a new query with an additional filter.\n */\n where(fieldPath: string, opStr: WhereFilterOp, value: unknown): Query<T> {\n const filter: Filter = {\n fieldFilter: {\n field: { fieldPath },\n op: getRestOperator(opStr),\n value: toFirestoreValue(value),\n },\n };\n\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n filters: [...this._constraints.filters, filter],\n });\n }\n\n // ========================================================================\n // Order Methods\n // ========================================================================\n\n /**\n * Creates a new query with an additional ordering.\n */\n orderBy(\n fieldPath: string,\n directionStr: OrderByDirection = \"asc\",\n ): Query<T> {\n const order: Order = {\n field: { fieldPath },\n direction: directionStr === \"asc\" ? \"ASCENDING\" : \"DESCENDING\",\n };\n\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n orderBy: [...this._constraints.orderBy, order],\n });\n }\n\n // ========================================================================\n // Limit Methods\n // ========================================================================\n\n /**\n * Creates a new query that returns only the first matching documents.\n */\n limit(count: number): Query<T> {\n if (count < 0) {\n throw new Error(\"Limit must be non-negative\");\n }\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n limit: count,\n limitToLast: undefined,\n });\n }\n\n /**\n * Creates a new query that returns only the last matching documents.\n * Must be used with at least one orderBy clause.\n */\n limitToLast(count: number): Query<T> {\n if (count < 0) {\n throw new Error(\"Limit must be non-negative\");\n }\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n limitToLast: count,\n limit: undefined,\n });\n }\n\n /**\n * Creates a new query that skips the first matching documents.\n */\n offset(count: number): Query<T> {\n if (count < 0) {\n throw new Error(\"Offset must be non-negative\");\n }\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n offset: count,\n });\n }\n\n // ========================================================================\n // Cursor Methods\n // ========================================================================\n\n /**\n * Creates a new query starting at the provided values (inclusive).\n */\n startAt(...values: unknown[]): Query<T> {\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n startAt: { values, before: true },\n });\n }\n\n /**\n * Creates a new query starting after the provided values (exclusive).\n */\n startAfter(...values: unknown[]): Query<T> {\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n startAt: { values, before: false },\n });\n }\n\n /**\n * Creates a new query ending at the provided values (inclusive).\n */\n endAt(...values: unknown[]): Query<T> {\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n endAt: { values, before: false },\n });\n }\n\n /**\n * Creates a new query ending before the provided values (exclusive).\n */\n endBefore(...values: unknown[]): Query<T> {\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n endAt: { values, before: true },\n });\n }\n\n // ========================================================================\n // Projection Methods\n // ========================================================================\n\n /**\n * Creates a new query that returns only specific fields.\n */\n select(...fields: string[]): Query<T> {\n return new Query<T>(this._firestore, this._collectionPath, {\n ...this._constraints,\n select: fields,\n });\n }\n\n // ========================================================================\n // Execution Methods\n // ========================================================================\n\n /**\n * Executes the query and returns the results.\n */\n async get(): Promise<QuerySnapshot<T>> {\n const structuredQuery = this._toStructuredQuery();\n const results = await this._firestore._runQuery(\n this._collectionPath,\n structuredQuery,\n );\n\n // Extract documents from results\n const documents: FirestoreDocument[] = [];\n for (const item of results) {\n if (item.document) {\n documents.push(item.document);\n }\n }\n\n // Handle limitToLast by reversing results\n if (this._constraints.limitToLast !== undefined) {\n documents.reverse();\n }\n\n return new QuerySnapshotImpl<T>(documents);\n }\n\n /**\n * Returns a count of the documents matching the query.\n */\n async count(): Promise<AggregateQuerySnapshot> {\n const structuredQuery = this._toStructuredQuery();\n // Remove limit for count queries\n delete structuredQuery.limit;\n delete structuredQuery.offset;\n\n const result = await this._firestore._runAggregationQuery(\n this._collectionPath,\n structuredQuery,\n [{ alias: \"count_alias\", count: {} }],\n );\n\n return new AggregateQuerySnapshotImpl(result);\n }\n\n // ========================================================================\n // Internal Methods\n // ========================================================================\n\n /**\n * Converts the query constraints to a StructuredQuery.\n * @internal\n */\n _toStructuredQuery(): StructuredQuery {\n const query: StructuredQuery = {};\n\n // Build where clause\n if (this._constraints.filters.length === 1) {\n query.where = this._constraints.filters[0];\n } else if (this._constraints.filters.length > 1) {\n query.where = {\n compositeFilter: {\n op: \"AND\",\n filters: this._constraints.filters,\n },\n };\n }\n\n // Build orderBy\n if (this._constraints.orderBy.length > 0) {\n query.orderBy = this._constraints.orderBy;\n\n // For limitToLast, reverse the order for the query\n if (this._constraints.limitToLast !== undefined) {\n query.orderBy = query.orderBy.map((order) => ({\n ...order,\n direction:\n order.direction === \"ASCENDING\"\n ? \"DESCENDING\"\n : \"ASCENDING\",\n }));\n }\n }\n\n // Build limit\n const limitValue =\n this._constraints.limit ?? this._constraints.limitToLast;\n if (limitValue !== undefined) {\n query.limit = { value: limitValue };\n }\n\n // Build offset\n if (this._constraints.offset !== undefined) {\n query.offset = this._constraints.offset;\n }\n\n // Build cursors\n if (this._constraints.startAt) {\n query.startAt = this._buildCursor(this._constraints.startAt);\n }\n if (this._constraints.endAt) {\n query.endAt = this._buildCursor(this._constraints.endAt);\n }\n\n // Build projection\n if (this._constraints.select && this._constraints.select.length > 0) {\n query.select = this._buildProjection(this._constraints.select);\n }\n\n return query;\n }\n\n /**\n * Builds a cursor from values.\n * @internal\n */\n private _buildCursor(cursor: {\n values: unknown[];\n before: boolean;\n }): Cursor {\n return {\n values: cursor.values.map((v) => toFirestoreValue(v)),\n before: cursor.before,\n };\n }\n\n /**\n * Builds a projection from field paths.\n * @internal\n */\n private _buildProjection(fields: string[]): Projection {\n return {\n fields: fields.map((fieldPath) => ({ fieldPath })),\n };\n }\n}\n","/**\n * Document and Collection References\n */\n\nimport { Query } from \"./query.js\";\nimport type {\n DocumentData,\n DocumentSnapshot,\n FirestoreClientInterface,\n FirestoreDocument,\n WriteResult,\n} from \"./types.js\";\nimport {\n extractDocumentId,\n generateDocumentId,\n parseDocumentPath,\n} from \"./utils.js\";\nimport { fromFirestoreFields } from \"./value.js\";\n\n/**\n * Document snapshot implementation.\n */\nexport class DocumentSnapshotImpl<\n T = DocumentData,\n> implements DocumentSnapshot<T> {\n readonly exists: boolean;\n readonly id: string;\n readonly path: string;\n readonly createTime?: Date;\n readonly updateTime?: Date;\n\n private readonly _data?: T;\n\n constructor(doc: FirestoreDocument | null, path: string) {\n if (doc && doc.fields) {\n this.exists = true;\n this._data = fromFirestoreFields(doc.fields) as T;\n this.createTime = doc.createTime\n ? new Date(doc.createTime)\n : undefined;\n this.updateTime = doc.updateTime\n ? new Date(doc.updateTime)\n : undefined;\n } else {\n this.exists = false;\n this._data = undefined;\n }\n\n this.path = path;\n this.id = extractDocumentId(path);\n }\n\n data(): T | undefined {\n return this._data;\n }\n\n get(fieldPath: string): unknown {\n if (!this._data) return undefined;\n\n const parts = fieldPath.split(\".\");\n let current: unknown = this._data;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n }\n}\n\n/**\n * A reference to a Firestore document.\n */\nexport class DocumentReference<T = DocumentData> {\n readonly id: string;\n readonly path: string;\n\n constructor(\n private readonly _firestore: FirestoreClientInterface,\n path: string,\n ) {\n this.path = path;\n this.id = extractDocumentId(path);\n }\n\n /**\n * Get the parent collection reference.\n */\n get parent(): CollectionReference<T> {\n const { collection } = parseDocumentPath(this.path);\n return new CollectionReference<T>(this._firestore, collection);\n }\n\n /**\n * Get a subcollection of this document.\n */\n collection(collectionPath: string): CollectionReference {\n return new CollectionReference(\n this._firestore,\n `${this.path}/${collectionPath}`,\n );\n }\n\n /**\n * Get the document.\n */\n async get(): Promise<DocumentSnapshot<T>> {\n const doc = await this._firestore._getDocument(this.path);\n return new DocumentSnapshotImpl<T>(doc, this.path);\n }\n\n /**\n * Set the document data.\n */\n async set(data: T, options?: { merge?: boolean }): Promise<WriteResult> {\n return this._firestore._setDocument(\n this.path,\n data as Record<string, unknown>,\n options,\n );\n }\n\n /**\n * Update the document data.\n */\n async update(data: Partial<T>): Promise<WriteResult> {\n return this._firestore._updateDocument(\n this.path,\n data as Record<string, unknown>,\n );\n }\n\n /**\n * Delete the document.\n */\n async delete(): Promise<void> {\n await this._firestore._deleteDocument(this.path);\n }\n}\n\n/**\n * A reference to a Firestore collection.\n * Extends Query to provide query methods.\n */\nexport class CollectionReference<T = DocumentData> extends Query<T> {\n readonly id: string;\n readonly path: string;\n\n constructor(firestore: FirestoreClientInterface, path: string) {\n super(firestore, path);\n this.path = path;\n const parts = path.split(\"/\");\n this.id = parts[parts.length - 1];\n }\n\n /**\n * Get a document reference in this collection.\n * If no ID is provided, a random one will be generated.\n */\n doc(documentId?: string): DocumentReference<T> {\n const docId = documentId ?? generateDocumentId();\n return new DocumentReference<T>(\n this._firestore,\n `${this.path}/${docId}`,\n );\n }\n\n /**\n * Add a new document with an auto-generated ID.\n */\n async add(data: T): Promise<DocumentReference<T>> {\n const ref = this.doc();\n await ref.set(data);\n return ref;\n }\n}\n","/**\n * Firestore Transaction\n */\n\nimport { DocumentReference, DocumentSnapshotImpl } from \"./references.js\";\nimport type {\n DocumentData,\n DocumentSnapshot,\n FirestoreClientInterface,\n FirestoreDocument,\n Write,\n} from \"./types.js\";\nimport { getFieldPaths } from \"./utils.js\";\nimport {\n extractDeleteFields,\n extractFieldTransforms,\n isFieldValue,\n toFirestoreFields,\n} from \"./value.js\";\n\n/**\n * A Firestore transaction.\n * All reads must happen before any writes.\n */\nexport class Transaction {\n private readonly _writes: Write[] = [];\n\n constructor(\n private readonly _firestore: FirestoreClientInterface & {\n _getDocument(\n path: string,\n transactionId?: string,\n ): Promise<FirestoreDocument | null>;\n },\n private readonly _transactionId: string,\n ) {}\n\n /**\n * Get a document within this transaction.\n */\n async get<T = DocumentData>(\n ref: DocumentReference<T>,\n ): Promise<DocumentSnapshot<T>> {\n const doc = await this._firestore._getDocument(\n ref.path,\n this._transactionId,\n );\n return new DocumentSnapshotImpl<T>(doc, ref.path);\n }\n\n /**\n * Queue a set operation.\n */\n set<T = DocumentData>(\n ref: DocumentReference<T>,\n data: T,\n options?: { merge?: boolean },\n ): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n const fields = toFirestoreFields(data as Record<string, unknown>);\n const transforms = extractFieldTransforms(\n data as Record<string, unknown>,\n );\n\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n };\n\n // Handle merge option\n if (options?.merge) {\n const fieldPaths = getFieldPaths(\n data as Record<string, unknown>,\n \"\",\n isFieldValue,\n );\n write.updateMask = { fieldPaths };\n }\n\n // Add transforms if any\n if (transforms.length > 0) {\n write.updateTransforms = transforms;\n }\n\n this._writes.push(write);\n return this;\n }\n\n /**\n * Queue an update operation.\n */\n update<T = DocumentData>(\n ref: DocumentReference<T>,\n data: Partial<T>,\n ): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n\n // Filter out FieldValue.delete() fields for the update mask\n const deleteFields = extractDeleteFields(\n data as Record<string, unknown>,\n );\n const transforms = extractFieldTransforms(\n data as Record<string, unknown>,\n );\n\n // Get all field paths that are being set (not deleted or transformed)\n const fieldPaths = getFieldPaths(\n data as Record<string, unknown>,\n \"\",\n isFieldValue,\n ).filter((p) => !deleteFields.includes(p));\n\n // Build fields, excluding FieldValue sentinels\n const fields = toFirestoreFields(data as Record<string, unknown>);\n\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n updateMask: { fieldPaths: [...fieldPaths, ...deleteFields] },\n currentDocument: { exists: true },\n };\n\n if (transforms.length > 0) {\n write.updateTransforms = transforms;\n }\n\n this._writes.push(write);\n return this;\n }\n\n /**\n * Queue a delete operation.\n */\n delete(ref: DocumentReference): Transaction {\n const docName = this._firestore._getDocumentName(ref.path);\n this._writes.push({\n delete: docName,\n });\n return this;\n }\n\n /** @internal */\n _getWrites(): Write[] {\n return this._writes;\n }\n\n /** @internal */\n _getTransactionId(): string {\n return this._transactionId;\n }\n}\n","/**\n * Firestore REST Client\n *\n * Main client implementation for Firestore REST API with transaction support.\n */\n\nimport { getFirestoreToken } from \"./auth.js\";\nimport { CollectionReference, DocumentReference } from \"./references.js\";\nimport { Transaction } from \"./transaction.js\";\nimport type {\n Aggregation,\n AggregationResult,\n AuthConfig,\n BeginTransactionResponse,\n CommitResponse,\n FirestoreClientInterface,\n FirestoreDocument,\n RunQueryResponseItem,\n StructuredQuery,\n TransactionOptions,\n Write,\n WriteResult,\n} from \"./types.js\";\nimport { buildUpdateFields, getFieldPaths } from \"./utils.js\";\nimport {\n extractDeleteFields,\n extractFieldTransforms,\n extractTransformFields,\n isFieldValue,\n toFirestoreFields,\n toFirestoreValue,\n} from \"./value.js\";\n\nconst API_BASE = \"https://firestore.googleapis.com/v1\";\nconst DEFAULT_DATABASE = \"(default)\";\n\n/**\n * Firestore REST API client.\n */\nexport class Firestore implements FirestoreClientInterface {\n private readonly _config: AuthConfig;\n private readonly _databaseId: string;\n private _token: string | null = null;\n private _tokenExpiry: number = 0;\n\n constructor(config: AuthConfig, databaseId: string = DEFAULT_DATABASE) {\n this._config = config;\n this._databaseId = databaseId;\n }\n\n /**\n * Get a collection reference.\n */\n collection(collectionPath: string): CollectionReference {\n return new CollectionReference(this, collectionPath);\n }\n\n /**\n * Get a document reference.\n */\n doc(documentPath: string): DocumentReference {\n return new DocumentReference(this, documentPath);\n }\n\n /**\n * Run a transaction.\n */\n async runTransaction<R>(\n updateFn: (transaction: Transaction) => Promise<R>,\n options?: { maxAttempts?: number },\n ): Promise<R> {\n const maxAttempts = options?.maxAttempts ?? 5;\n let lastError: Error | null = null;\n let retryTransaction: string | undefined;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n // Begin transaction\n const transactionId =\n await this._beginTransaction(retryTransaction);\n const transaction = new Transaction(this, transactionId);\n\n // Run user function\n const result = await updateFn(transaction);\n\n // Commit transaction\n await this._commitTransaction(\n transactionId,\n transaction._getWrites(),\n );\n\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if this is a contention error that should be retried\n if (\n error instanceof Error &&\n error.message.includes(\"ABORTED\")\n ) {\n // Use the failed transaction ID for retry\n retryTransaction = undefined; // Will create new transaction\n continue;\n }\n\n // Non-retryable error\n throw error;\n }\n }\n\n throw lastError ?? new Error(\"Transaction failed after max attempts\");\n }\n\n // ========================================================================\n // Internal Methods\n // ========================================================================\n\n /** @internal */\n async _getToken(): Promise<string> {\n // Check config type first\n if (\"privateKey\" in this._config) {\n // Service Account flow with caching\n if (this._token && Date.now() < this._tokenExpiry - 60000) {\n return this._token;\n }\n\n this._token = await getFirestoreToken(this._config);\n this._tokenExpiry = Date.now() + 3600 * 1000; // 1 hour\n return this._token;\n } else {\n // Token/User flow: the provided function is invoked for each call.\n // If the implementation performs its own caching, that behavior will be honored.\n return await this._config.token();\n }\n }\n\n /** @internal */\n _getDatabasePath(): string {\n return `projects/${this._config.projectId}/databases/${this._databaseId}`;\n }\n\n /** @internal */\n _getDocumentName(path: string): string {\n return `${this._getDatabasePath()}/documents/${path}`;\n }\n\n /** @internal */\n async _getDocument(\n path: string,\n transactionId?: string,\n ): Promise<FirestoreDocument | null> {\n const token = await this._getToken();\n const docName = this._getDocumentName(path);\n\n let url = `${API_BASE}/${docName}`;\n if (transactionId) {\n url += `?transaction=${encodeURIComponent(transactionId)}`;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`Failed to get document: ${JSON.stringify(error)}`);\n }\n\n return response.json();\n }\n\n /** @internal */\n async _setDocument(\n path: string,\n data: Record<string, unknown>,\n options?: { merge?: boolean },\n ): Promise<WriteResult> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const fields = toFirestoreFields(data);\n const transforms = extractFieldTransforms(data);\n\n const writes: Write[] = [\n {\n update: {\n name: docName,\n fields,\n },\n },\n ];\n\n if (options?.merge) {\n const fieldPaths = getFieldPaths(data, \"\", isFieldValue);\n writes[0].updateMask = { fieldPaths };\n }\n\n if (transforms.length > 0) {\n writes[0].updateTransforms = transforms;\n }\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ writes }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`Failed to set document: ${JSON.stringify(error)}`);\n }\n\n const result: CommitResponse = await response.json();\n return result.writeResults?.[0] ?? {};\n }\n\n /** @internal */\n async _updateDocument(\n path: string,\n data: Record<string, unknown>,\n ): Promise<WriteResult> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const deleteFields = extractDeleteFields(data);\n const transforms = extractFieldTransforms(data);\n const transformFields = extractTransformFields(data);\n\n // Get all field paths, excluding delete fields and transform fields\n const fieldPaths = getFieldPaths(data, \"\", isFieldValue).filter(\n (p) => !deleteFields.includes(p) && !transformFields.includes(p),\n );\n\n // Build fields for non-FieldValue data, also handling dot-notation\n const fields = buildUpdateFields(data, toFirestoreValue, isFieldValue);\n\n // Combine updateMask: regular fields + delete fields (transforms are NOT in mask)\n const updateMaskPaths = [...fieldPaths, ...deleteFields];\n\n const writes: Write[] = [];\n\n // If we have regular fields or delete fields, create an update write\n if (updateMaskPaths.length > 0) {\n const write: Write = {\n update: {\n name: docName,\n fields,\n },\n updateMask: { fieldPaths: updateMaskPaths },\n currentDocument: { exists: true },\n };\n writes.push(write);\n }\n\n // If we have transforms, add them\n if (transforms.length > 0) {\n if (writes.length > 0) {\n // Add transforms to the existing update write\n writes[0].updateTransforms = transforms;\n } else {\n // Transform-only: use a transform write\n writes.push({\n transform: {\n document: docName,\n fieldTransforms: transforms,\n },\n currentDocument: { exists: true },\n });\n }\n }\n\n if (writes.length === 0) {\n // Nothing to write\n return {};\n }\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ writes }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to update document: ${JSON.stringify(error)}`,\n );\n }\n\n const result: CommitResponse = await response.json();\n return result.writeResults?.[0] ?? {};\n }\n\n /** @internal */\n async _deleteDocument(path: string): Promise<void> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n const docName = this._getDocumentName(path);\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n writes: [{ delete: docName }],\n }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to delete document: ${JSON.stringify(error)}`,\n );\n }\n }\n\n /** @internal */\n async _beginTransaction(retryTransaction?: string): Promise<string> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n const options: TransactionOptions = {\n readWrite: retryTransaction ? { retryTransaction } : {},\n };\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:beginTransaction`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ options }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to begin transaction: ${JSON.stringify(error)}`,\n );\n }\n\n const result: BeginTransactionResponse = await response.json();\n return result.transaction;\n }\n\n /** @internal */\n async _commitTransaction(\n transactionId: string,\n writes: Write[],\n ): Promise<CommitResponse> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n const response = await fetch(\n `${API_BASE}/${database}/documents:commit`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n writes,\n transaction: transactionId,\n }),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to commit transaction: ${JSON.stringify(error)}`,\n );\n }\n\n return response.json();\n }\n\n // ========================================================================\n // Query Methods\n // ========================================================================\n\n /** @internal Run a structured query against a collection */\n async _runQuery(\n collectionPath: string,\n query: StructuredQuery,\n transactionId?: string,\n ): Promise<RunQueryResponseItem[]> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n // Extract collection ID from path\n const pathParts = collectionPath.split(\"/\");\n const collectionId = pathParts[pathParts.length - 1];\n\n // Build the parent path for the query\n let parent = `${database}/documents`;\n if (pathParts.length > 1) {\n parent = `${database}/documents/${pathParts.slice(0, -1).join(\"/\")}`;\n }\n\n // Add collection selector\n const structuredQuery: StructuredQuery = {\n ...query,\n from: [{ collectionId }],\n };\n\n const body: Record<string, unknown> = { structuredQuery };\n if (transactionId) {\n body.transaction = transactionId;\n }\n\n const response = await fetch(`${API_BASE}/${parent}:runQuery`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`Failed to run query: ${JSON.stringify(error)}`);\n }\n\n const results: RunQueryResponseItem[] = await response.json();\n return results;\n }\n\n /** @internal Run an aggregation query against a collection */\n async _runAggregationQuery(\n collectionPath: string,\n query: StructuredQuery,\n aggregations: Aggregation[],\n ): Promise<AggregationResult> {\n const token = await this._getToken();\n const database = this._getDatabasePath();\n\n // Extract collection ID from path\n const pathParts = collectionPath.split(\"/\");\n const collectionId = pathParts[pathParts.length - 1];\n\n // Build the parent path for the query\n let parent = `${database}/documents`;\n if (pathParts.length > 1) {\n parent = `${database}/documents/${pathParts.slice(0, -1).join(\"/\")}`;\n }\n\n // Add collection selector\n const structuredQuery: StructuredQuery = {\n ...query,\n from: [{ collectionId }],\n };\n\n const body = {\n structuredAggregationQuery: {\n structuredQuery,\n aggregations,\n },\n };\n\n const response = await fetch(\n `${API_BASE}/${parent}:runAggregationQuery`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(\n `Failed to run aggregation query: ${JSON.stringify(error)}`,\n );\n }\n\n const results = await response.json();\n // The response is an array with one element\n return results[0] ?? { result: { aggregateFields: {} }, readTime: \"\" };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fires2rest",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Lightweight Firestore REST API client with full transaction support for serverless environments",
5
5
  "type": "module",
6
6
  "keywords": [