@knymbus/firestoredb 1.0.2

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.
Files changed (61) hide show
  1. package/dist/FirestoreDB.d.ts +114 -0
  2. package/dist/FirestoreDB.d.ts.map +1 -0
  3. package/dist/FirestoreDB.js +407 -0
  4. package/dist/FirestoreQuery.d.ts +58 -0
  5. package/dist/FirestoreQuery.d.ts.map +1 -0
  6. package/dist/FirestoreQuery.js +200 -0
  7. package/dist/ParallelPipe.d.ts +22 -0
  8. package/dist/ParallelPipe.d.ts.map +1 -0
  9. package/dist/ParallelPipe.js +63 -0
  10. package/dist/cjs/FirestoreDB.d.ts +114 -0
  11. package/dist/cjs/FirestoreDB.d.ts.map +1 -0
  12. package/dist/cjs/FirestoreDB.js +407 -0
  13. package/dist/cjs/FirestoreQuery.d.ts +58 -0
  14. package/dist/cjs/FirestoreQuery.d.ts.map +1 -0
  15. package/dist/cjs/FirestoreQuery.js +200 -0
  16. package/dist/cjs/ParallelPipe.d.ts +22 -0
  17. package/dist/cjs/ParallelPipe.d.ts.map +1 -0
  18. package/dist/cjs/ParallelPipe.js +63 -0
  19. package/dist/cjs/index.d.ts +4 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +19 -0
  22. package/dist/cjs/types.d.ts +22 -0
  23. package/dist/cjs/types.d.ts.map +1 -0
  24. package/dist/cjs/types.js +2 -0
  25. package/dist/cjs/utils/$Operators.d.ts +4 -0
  26. package/dist/cjs/utils/$Operators.d.ts.map +1 -0
  27. package/dist/cjs/utils/$Operators.js +12 -0
  28. package/dist/cjs/utils/Hasher.d.ts +11 -0
  29. package/dist/cjs/utils/Hasher.d.ts.map +1 -0
  30. package/dist/cjs/utils/Hasher.js +28 -0
  31. package/dist/cjs/utils/LRUCache.d.ts +13 -0
  32. package/dist/cjs/utils/LRUCache.d.ts.map +1 -0
  33. package/dist/cjs/utils/LRUCache.js +39 -0
  34. package/dist/cjs/utils/hydrateDates.d.ts +6 -0
  35. package/dist/cjs/utils/hydrateDates.d.ts.map +1 -0
  36. package/dist/cjs/utils/hydrateDates.js +29 -0
  37. package/dist/cjs/utils/index.d.ts +5 -0
  38. package/dist/cjs/utils/index.d.ts.map +1 -0
  39. package/dist/cjs/utils/index.js +20 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +19 -0
  43. package/dist/types.d.ts +22 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +2 -0
  46. package/dist/utils/$Operators.d.ts +4 -0
  47. package/dist/utils/$Operators.d.ts.map +1 -0
  48. package/dist/utils/$Operators.js +12 -0
  49. package/dist/utils/Hasher.d.ts +11 -0
  50. package/dist/utils/Hasher.d.ts.map +1 -0
  51. package/dist/utils/Hasher.js +28 -0
  52. package/dist/utils/LRUCache.d.ts +13 -0
  53. package/dist/utils/LRUCache.d.ts.map +1 -0
  54. package/dist/utils/LRUCache.js +39 -0
  55. package/dist/utils/hydrateDates.d.ts +6 -0
  56. package/dist/utils/hydrateDates.d.ts.map +1 -0
  57. package/dist/utils/hydrateDates.js +29 -0
  58. package/dist/utils/index.d.ts +5 -0
  59. package/dist/utils/index.d.ts.map +1 -0
  60. package/dist/utils/index.js +20 -0
  61. package/package.json +45 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * PARALLEL TRANSFORM STREAM
3
+ * @example
4
+ * // 1. Stream data from Firestore
5
+ const source = Products.find({ status: 'pending' }).stream();
6
+
7
+ // 2. Process 50 items in parallel with 3 retries
8
+ const processor = parallelPipe(50, 3, async (doc) => {
9
+ const apiData = await transformNetworkAction(doc); // Your slow O(n) task
10
+ return { ...doc, ...apiData, status: 'processed' };
11
+ });
12
+
13
+ // 3. Write back to Firestore
14
+ const saver = new WritableStream({
15
+ async write(doc) { await Products.updateOne(doc._id, doc); }
16
+ });
17
+
18
+ // 4. Pipe through
19
+ await source.pipeThrough(processor).pipeTo(saver);
20
+ */
21
+ export declare const ParallelPipe: <TIn, TOut>(concurrency: number, retryCount: number, transformFn: (item: TIn) => Promise<TOut>) => TransformStream<TIn, TOut>;
22
+ //# sourceMappingURL=ParallelPipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParallelPipe.d.ts","sourceRoot":"","sources":["../../src/ParallelPipe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,EAAE,IAAI,EAClC,aAAa,MAAM,EACnB,YAAY,MAAM,EAClB,aAAa,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,+BAsB5C,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ParallelPipe = void 0;
13
+ /**
14
+ * PARALLEL TRANSFORM STREAM
15
+ * @example
16
+ * // 1. Stream data from Firestore
17
+ const source = Products.find({ status: 'pending' }).stream();
18
+
19
+ // 2. Process 50 items in parallel with 3 retries
20
+ const processor = parallelPipe(50, 3, async (doc) => {
21
+ const apiData = await transformNetworkAction(doc); // Your slow O(n) task
22
+ return { ...doc, ...apiData, status: 'processed' };
23
+ });
24
+
25
+ // 3. Write back to Firestore
26
+ const saver = new WritableStream({
27
+ async write(doc) { await Products.updateOne(doc._id, doc); }
28
+ });
29
+
30
+ // 4. Pipe through
31
+ await source.pipeThrough(processor).pipeTo(saver);
32
+ */
33
+ const ParallelPipe = (concurrency, retryCount, transformFn) => {
34
+ const inFlight = new Set();
35
+ const executeWithRetry = (item_1, ...args_1) => __awaiter(void 0, [item_1, ...args_1], void 0, function* (item, attempt = 0) {
36
+ try {
37
+ return yield transformFn(item);
38
+ }
39
+ catch (err) {
40
+ if (attempt < retryCount)
41
+ return yield executeWithRetry(item, attempt + 1);
42
+ throw err;
43
+ }
44
+ });
45
+ return new TransformStream({
46
+ transform(item, controller) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const p = (() => __awaiter(this, void 0, void 0, function* () {
49
+ const result = yield executeWithRetry(item);
50
+ controller.enqueue(result);
51
+ }))();
52
+ inFlight.add(p);
53
+ p.finally(() => inFlight.delete(p));
54
+ if (inFlight.size >= concurrency)
55
+ yield Promise.race(inFlight);
56
+ });
57
+ },
58
+ flush() {
59
+ return __awaiter(this, void 0, void 0, function* () { yield Promise.all(inFlight); });
60
+ }
61
+ });
62
+ };
63
+ exports.ParallelPipe = ParallelPipe;
@@ -0,0 +1,4 @@
1
+ export * from './FirestoreDB';
2
+ export * from './ParallelPipe';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./FirestoreDB"), exports);
18
+ __exportStar(require("./ParallelPipe"), exports);
19
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,22 @@
1
+ export type DocumentInput<T> = Partial<T> & {
2
+ _id?: string;
3
+ };
4
+ /**
5
+ * We allow keys from T, or any string (for nested dot-notation)
6
+ */
7
+ export type QueryFilter<T> = {
8
+ [P in keyof T]?: any;
9
+ } & Record<string, any>;
10
+ export type UpdateDocument<T> = {
11
+ docId: string;
12
+ entity: Partial<T>;
13
+ };
14
+ type FirestoreDBDocument = {
15
+ _id: string;
16
+ createdAt: Date;
17
+ updatedAt: Date;
18
+ deletedAt?: Date;
19
+ };
20
+ export type WithSystemFields<T> = T & FirestoreDBDocument;
21
+ export {};
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5D;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;CACvB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGxB,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CACrB,CAAA;AAID,KAAK,mBAAmB,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,CAAC,EAAE,IAAI,CAAA;CACnB,CAAA;AAGD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ import { WhereFilterOp } from "firebase/firestore";
2
+ export type $OperatorSymbols = '$gt' | '$gte' | '$lt' | '$lte' | '$ne' | '$in' | '$nin';
3
+ export declare const $OperatorMap: Record<$OperatorSymbols, WhereFilterOp>;
4
+ //# sourceMappingURL=$Operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"$Operators.d.ts","sourceRoot":"","sources":["../../../src/utils/$Operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AACvF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAQhE,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.$OperatorMap = void 0;
4
+ exports.$OperatorMap = {
5
+ '$gt': '>',
6
+ '$gte': '>=',
7
+ '$lt': '<',
8
+ '$lte': '<=',
9
+ '$ne': '!=',
10
+ '$in': 'in',
11
+ '$nin': 'not-in'
12
+ };
@@ -0,0 +1,11 @@
1
+ export declare class Hasher {
2
+ /**
3
+ * Generates a short, consistent hash from any object or string.
4
+ */
5
+ static hash(input: any): string;
6
+ /**
7
+ * Generates a specific cache key for a collection.
8
+ */
9
+ static generateCacheKey(collectionName: string, queryParams: object): string;
10
+ }
11
+ //# sourceMappingURL=Hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hasher.d.ts","sourceRoot":"","sources":["../../../src/utils/Hasher.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM;IACf;;OAEG;WACW,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAetC;;OAEG;WACW,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAItF"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Hasher = void 0;
4
+ class Hasher {
5
+ /**
6
+ * Generates a short, consistent hash from any object or string.
7
+ */
8
+ static hash(input) {
9
+ const str = typeof input === 'string' ? input : JSON.stringify(input);
10
+ let hash = 0;
11
+ for (let i = 0; i < str.length; i++) {
12
+ const char = str.charCodeAt(i);
13
+ // High-performance bitwise hashing
14
+ hash = (hash << 5) - hash + char;
15
+ hash |= 0; // Convert to 32-bit integer
16
+ }
17
+ // Return as an unsigned base36 string (short and URL-friendly)
18
+ return (hash >>> 0).toString(36);
19
+ }
20
+ /**
21
+ * Generates a specific cache key for a collection.
22
+ */
23
+ static generateCacheKey(collectionName, queryParams) {
24
+ const hash = this.hash(queryParams);
25
+ return `${collectionName}_${hash}`;
26
+ }
27
+ }
28
+ exports.Hasher = Hasher;
@@ -0,0 +1,13 @@
1
+ export declare class LRUCache {
2
+ private cache;
3
+ private readonly maxSize;
4
+ constructor(maxSize?: number);
5
+ get(key: string): {
6
+ data: any;
7
+ timestamp: number;
8
+ } | null;
9
+ set(key: string, value: any): void;
10
+ delete(key: string): void;
11
+ keys(): MapIterator<string>;
12
+ }
13
+ //# sourceMappingURL=LRUCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LRUCache.d.ts","sourceRoot":"","sources":["../../../src/utils/LRUCache.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACjB,OAAO,CAAC,KAAK,CAAuD;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAAM;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM;cAPyB,GAAG;mBAAa,MAAM;;IAiB9D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAgB3B,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI;CAGP"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LRUCache = void 0;
4
+ class LRUCache {
5
+ constructor(maxSize = 100) {
6
+ this.cache = new Map();
7
+ this.maxSize = maxSize;
8
+ }
9
+ get(key) {
10
+ const item = this.cache.get(key);
11
+ if (!item)
12
+ return null;
13
+ // "Refresh" the item: delete and re-insert to move it to the end (most recent)
14
+ this.cache.delete(key);
15
+ this.cache.set(key, item);
16
+ return item;
17
+ }
18
+ set(key, value) {
19
+ // If key exists, delete first to update its position
20
+ if (this.cache.has(key)) {
21
+ this.cache.delete(key);
22
+ }
23
+ else if (this.cache.size >= this.maxSize) {
24
+ // EVICT: Remove the very first item (the least recently used)
25
+ const firstKey = this.cache.keys().next();
26
+ if (!firstKey.done) {
27
+ this.cache.delete(firstKey.value);
28
+ }
29
+ }
30
+ this.cache.set(key, { data: value, timestamp: Date.now() });
31
+ }
32
+ delete(key) {
33
+ this.cache.delete(key);
34
+ }
35
+ keys() {
36
+ return this.cache.keys();
37
+ }
38
+ }
39
+ exports.LRUCache = LRUCache;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * RECURSIVE DATE HYDRATION HELPER
3
+ * Deeply scans an object and converts any Firestore Timestamps to JS Dates.
4
+ */
5
+ export declare const hydrateDates: (data: any) => Record<string, any>;
6
+ //# sourceMappingURL=hydrateDates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrateDates.d.ts","sourceRoot":"","sources":["../../../src/utils/hydrateDates.ts"],"names":[],"mappings":"AACA;;;EAGE;AACF,eAAO,MAAM,YAAY,GAAI,MAAM,GAAG,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAoB1D,CAAA"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hydrateDates = void 0;
4
+ /**
5
+ * RECURSIVE DATE HYDRATION HELPER
6
+ * Deeply scans an object and converts any Firestore Timestamps to JS Dates.
7
+ */
8
+ const hydrateDates = (data) => {
9
+ if (!data || typeof data !== 'object')
10
+ return data;
11
+ if (typeof data !== 'object')
12
+ return data;
13
+ // 1. Handle Arrays
14
+ if (Array.isArray(data)) {
15
+ return data.map(item => (0, exports.hydrateDates)(item));
16
+ }
17
+ // 2. Check if the object is a Firestore Timestamp
18
+ // Standard Firestore Timestamps have a .toDate() method
19
+ if (typeof data.toDate === 'function') {
20
+ return data.toDate();
21
+ }
22
+ // 3. Handle Nested Objects
23
+ const hydrated = {};
24
+ for (const [key, value] of Object.entries(data)) {
25
+ hydrated[key] = (0, exports.hydrateDates)(value);
26
+ }
27
+ return hydrated;
28
+ };
29
+ exports.hydrateDates = hydrateDates;
@@ -0,0 +1,5 @@
1
+ export * from './hydrateDates';
2
+ export * from './Hasher';
3
+ export * from './LRUCache';
4
+ export * from './$Operators';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./hydrateDates"), exports);
18
+ __exportStar(require("./Hasher"), exports);
19
+ __exportStar(require("./LRUCache"), exports);
20
+ __exportStar(require("./$Operators"), exports);
@@ -0,0 +1,4 @@
1
+ export * from './FirestoreDB';
2
+ export * from './ParallelPipe';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./FirestoreDB"), exports);
18
+ __exportStar(require("./ParallelPipe"), exports);
19
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,22 @@
1
+ export type DocumentInput<T> = Partial<T> & {
2
+ _id?: string;
3
+ };
4
+ /**
5
+ * We allow keys from T, or any string (for nested dot-notation)
6
+ */
7
+ export type QueryFilter<T> = {
8
+ [P in keyof T]?: any;
9
+ } & Record<string, any>;
10
+ export type UpdateDocument<T> = {
11
+ docId: string;
12
+ entity: Partial<T>;
13
+ };
14
+ type FirestoreDBDocument = {
15
+ _id: string;
16
+ createdAt: Date;
17
+ updatedAt: Date;
18
+ deletedAt?: Date;
19
+ };
20
+ export type WithSystemFields<T> = T & FirestoreDBDocument;
21
+ export {};
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5D;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;CACvB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGxB,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CACrB,CAAA;AAID,KAAK,mBAAmB,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,CAAC,EAAE,IAAI,CAAA;CACnB,CAAA;AAGD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ import { WhereFilterOp } from "firebase/firestore";
2
+ export type $OperatorSymbols = '$gt' | '$gte' | '$lt' | '$lte' | '$ne' | '$in' | '$nin';
3
+ export declare const $OperatorMap: Record<$OperatorSymbols, WhereFilterOp>;
4
+ //# sourceMappingURL=$Operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"$Operators.d.ts","sourceRoot":"","sources":["../../src/utils/$Operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AACvF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAQhE,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.$OperatorMap = void 0;
4
+ exports.$OperatorMap = {
5
+ '$gt': '>',
6
+ '$gte': '>=',
7
+ '$lt': '<',
8
+ '$lte': '<=',
9
+ '$ne': '!=',
10
+ '$in': 'in',
11
+ '$nin': 'not-in'
12
+ };
@@ -0,0 +1,11 @@
1
+ export declare class Hasher {
2
+ /**
3
+ * Generates a short, consistent hash from any object or string.
4
+ */
5
+ static hash(input: any): string;
6
+ /**
7
+ * Generates a specific cache key for a collection.
8
+ */
9
+ static generateCacheKey(collectionName: string, queryParams: object): string;
10
+ }
11
+ //# sourceMappingURL=Hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hasher.d.ts","sourceRoot":"","sources":["../../src/utils/Hasher.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM;IACf;;OAEG;WACW,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAetC;;OAEG;WACW,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAItF"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Hasher = void 0;
4
+ class Hasher {
5
+ /**
6
+ * Generates a short, consistent hash from any object or string.
7
+ */
8
+ static hash(input) {
9
+ const str = typeof input === 'string' ? input : JSON.stringify(input);
10
+ let hash = 0;
11
+ for (let i = 0; i < str.length; i++) {
12
+ const char = str.charCodeAt(i);
13
+ // High-performance bitwise hashing
14
+ hash = (hash << 5) - hash + char;
15
+ hash |= 0; // Convert to 32-bit integer
16
+ }
17
+ // Return as an unsigned base36 string (short and URL-friendly)
18
+ return (hash >>> 0).toString(36);
19
+ }
20
+ /**
21
+ * Generates a specific cache key for a collection.
22
+ */
23
+ static generateCacheKey(collectionName, queryParams) {
24
+ const hash = this.hash(queryParams);
25
+ return `${collectionName}_${hash}`;
26
+ }
27
+ }
28
+ exports.Hasher = Hasher;
@@ -0,0 +1,13 @@
1
+ export declare class LRUCache {
2
+ private cache;
3
+ private readonly maxSize;
4
+ constructor(maxSize?: number);
5
+ get(key: string): {
6
+ data: any;
7
+ timestamp: number;
8
+ } | null;
9
+ set(key: string, value: any): void;
10
+ delete(key: string): void;
11
+ keys(): MapIterator<string>;
12
+ }
13
+ //# sourceMappingURL=LRUCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LRUCache.d.ts","sourceRoot":"","sources":["../../src/utils/LRUCache.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACjB,OAAO,CAAC,KAAK,CAAuD;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAAM;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM;cAPyB,GAAG;mBAAa,MAAM;;IAiB9D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAgB3B,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI;CAGP"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LRUCache = void 0;
4
+ class LRUCache {
5
+ constructor(maxSize = 100) {
6
+ this.cache = new Map();
7
+ this.maxSize = maxSize;
8
+ }
9
+ get(key) {
10
+ const item = this.cache.get(key);
11
+ if (!item)
12
+ return null;
13
+ // "Refresh" the item: delete and re-insert to move it to the end (most recent)
14
+ this.cache.delete(key);
15
+ this.cache.set(key, item);
16
+ return item;
17
+ }
18
+ set(key, value) {
19
+ // If key exists, delete first to update its position
20
+ if (this.cache.has(key)) {
21
+ this.cache.delete(key);
22
+ }
23
+ else if (this.cache.size >= this.maxSize) {
24
+ // EVICT: Remove the very first item (the least recently used)
25
+ const firstKey = this.cache.keys().next();
26
+ if (!firstKey.done) {
27
+ this.cache.delete(firstKey.value);
28
+ }
29
+ }
30
+ this.cache.set(key, { data: value, timestamp: Date.now() });
31
+ }
32
+ delete(key) {
33
+ this.cache.delete(key);
34
+ }
35
+ keys() {
36
+ return this.cache.keys();
37
+ }
38
+ }
39
+ exports.LRUCache = LRUCache;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * RECURSIVE DATE HYDRATION HELPER
3
+ * Deeply scans an object and converts any Firestore Timestamps to JS Dates.
4
+ */
5
+ export declare const hydrateDates: (data: any) => Record<string, any>;
6
+ //# sourceMappingURL=hydrateDates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrateDates.d.ts","sourceRoot":"","sources":["../../src/utils/hydrateDates.ts"],"names":[],"mappings":"AACA;;;EAGE;AACF,eAAO,MAAM,YAAY,GAAI,MAAM,GAAG,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAoB1D,CAAA"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hydrateDates = void 0;
4
+ /**
5
+ * RECURSIVE DATE HYDRATION HELPER
6
+ * Deeply scans an object and converts any Firestore Timestamps to JS Dates.
7
+ */
8
+ const hydrateDates = (data) => {
9
+ if (!data || typeof data !== 'object')
10
+ return data;
11
+ if (typeof data !== 'object')
12
+ return data;
13
+ // 1. Handle Arrays
14
+ if (Array.isArray(data)) {
15
+ return data.map(item => (0, exports.hydrateDates)(item));
16
+ }
17
+ // 2. Check if the object is a Firestore Timestamp
18
+ // Standard Firestore Timestamps have a .toDate() method
19
+ if (typeof data.toDate === 'function') {
20
+ return data.toDate();
21
+ }
22
+ // 3. Handle Nested Objects
23
+ const hydrated = {};
24
+ for (const [key, value] of Object.entries(data)) {
25
+ hydrated[key] = (0, exports.hydrateDates)(value);
26
+ }
27
+ return hydrated;
28
+ };
29
+ exports.hydrateDates = hydrateDates;
@@ -0,0 +1,5 @@
1
+ export * from './hydrateDates';
2
+ export * from './Hasher';
3
+ export * from './LRUCache';
4
+ export * from './$Operators';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./hydrateDates"), exports);
18
+ __exportStar(require("./Hasher"), exports);
19
+ __exportStar(require("./LRUCache"), exports);
20
+ __exportStar(require("./$Operators"), exports);