@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.
- package/dist/FirestoreDB.d.ts +114 -0
- package/dist/FirestoreDB.d.ts.map +1 -0
- package/dist/FirestoreDB.js +407 -0
- package/dist/FirestoreQuery.d.ts +58 -0
- package/dist/FirestoreQuery.d.ts.map +1 -0
- package/dist/FirestoreQuery.js +200 -0
- package/dist/ParallelPipe.d.ts +22 -0
- package/dist/ParallelPipe.d.ts.map +1 -0
- package/dist/ParallelPipe.js +63 -0
- package/dist/cjs/FirestoreDB.d.ts +114 -0
- package/dist/cjs/FirestoreDB.d.ts.map +1 -0
- package/dist/cjs/FirestoreDB.js +407 -0
- package/dist/cjs/FirestoreQuery.d.ts +58 -0
- package/dist/cjs/FirestoreQuery.d.ts.map +1 -0
- package/dist/cjs/FirestoreQuery.js +200 -0
- package/dist/cjs/ParallelPipe.d.ts +22 -0
- package/dist/cjs/ParallelPipe.d.ts.map +1 -0
- package/dist/cjs/ParallelPipe.js +63 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/types.d.ts +22 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils/$Operators.d.ts +4 -0
- package/dist/cjs/utils/$Operators.d.ts.map +1 -0
- package/dist/cjs/utils/$Operators.js +12 -0
- package/dist/cjs/utils/Hasher.d.ts +11 -0
- package/dist/cjs/utils/Hasher.d.ts.map +1 -0
- package/dist/cjs/utils/Hasher.js +28 -0
- package/dist/cjs/utils/LRUCache.d.ts +13 -0
- package/dist/cjs/utils/LRUCache.d.ts.map +1 -0
- package/dist/cjs/utils/LRUCache.js +39 -0
- package/dist/cjs/utils/hydrateDates.d.ts +6 -0
- package/dist/cjs/utils/hydrateDates.d.ts.map +1 -0
- package/dist/cjs/utils/hydrateDates.js +29 -0
- package/dist/cjs/utils/index.d.ts +5 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +20 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/utils/$Operators.d.ts +4 -0
- package/dist/utils/$Operators.d.ts.map +1 -0
- package/dist/utils/$Operators.js +12 -0
- package/dist/utils/Hasher.d.ts +11 -0
- package/dist/utils/Hasher.d.ts.map +1 -0
- package/dist/utils/Hasher.js +28 -0
- package/dist/utils/LRUCache.d.ts +13 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +39 -0
- package/dist/utils/hydrateDates.d.ts +6 -0
- package/dist/utils/hydrateDates.d.ts.map +1 -0
- package/dist/utils/hydrateDates.js +29 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- 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 @@
|
|
|
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 @@
|
|
|
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,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 @@
|
|
|
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 @@
|
|
|
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);
|
package/dist/index.d.ts
ADDED
|
@@ -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);
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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,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 @@
|
|
|
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 @@
|
|
|
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);
|