@brightchain/db 0.20.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.
Files changed (56) hide show
  1. package/README.md +81 -0
  2. package/package.json +18 -0
  3. package/src/__tests__/helpers/mockBlockStore.d.ts +113 -0
  4. package/src/__tests__/helpers/mockBlockStore.js +380 -0
  5. package/src/__tests__/helpers/mockBlockStore.js.map +1 -0
  6. package/src/index.d.ts +31 -0
  7. package/src/index.js +78 -0
  8. package/src/index.js.map +1 -0
  9. package/src/lib/aggregation.d.ts +18 -0
  10. package/src/lib/aggregation.js +407 -0
  11. package/src/lib/aggregation.js.map +1 -0
  12. package/src/lib/cblIndex.d.ts +268 -0
  13. package/src/lib/cblIndex.js +856 -0
  14. package/src/lib/cblIndex.js.map +1 -0
  15. package/src/lib/collection.d.ts +305 -0
  16. package/src/lib/collection.js +991 -0
  17. package/src/lib/collection.js.map +1 -0
  18. package/src/lib/cursor.d.ts +8 -0
  19. package/src/lib/cursor.js +13 -0
  20. package/src/lib/cursor.js.map +1 -0
  21. package/src/lib/database.d.ts +158 -0
  22. package/src/lib/database.js +332 -0
  23. package/src/lib/database.js.map +1 -0
  24. package/src/lib/errors.d.ts +85 -0
  25. package/src/lib/errors.js +103 -0
  26. package/src/lib/errors.js.map +1 -0
  27. package/src/lib/expressMiddleware.d.ts +57 -0
  28. package/src/lib/expressMiddleware.js +488 -0
  29. package/src/lib/expressMiddleware.js.map +1 -0
  30. package/src/lib/headRegistry.d.ts +60 -0
  31. package/src/lib/headRegistry.js +216 -0
  32. package/src/lib/headRegistry.js.map +1 -0
  33. package/src/lib/indexing.d.ts +7 -0
  34. package/src/lib/indexing.js +14 -0
  35. package/src/lib/indexing.js.map +1 -0
  36. package/src/lib/model.d.ts +162 -0
  37. package/src/lib/model.js +260 -0
  38. package/src/lib/model.js.map +1 -0
  39. package/src/lib/pooledStoreAdapter.d.ts +44 -0
  40. package/src/lib/pooledStoreAdapter.js +109 -0
  41. package/src/lib/pooledStoreAdapter.js.map +1 -0
  42. package/src/lib/queryEngine.d.ts +48 -0
  43. package/src/lib/queryEngine.js +461 -0
  44. package/src/lib/queryEngine.js.map +1 -0
  45. package/src/lib/schemaValidation.d.ts +80 -0
  46. package/src/lib/schemaValidation.js +353 -0
  47. package/src/lib/schemaValidation.js.map +1 -0
  48. package/src/lib/transaction.d.ts +7 -0
  49. package/src/lib/transaction.js +12 -0
  50. package/src/lib/transaction.js.map +1 -0
  51. package/src/lib/types.d.ts +360 -0
  52. package/src/lib/types.js +6 -0
  53. package/src/lib/types.js.map +1 -0
  54. package/src/lib/updateEngine.d.ts +7 -0
  55. package/src/lib/updateEngine.js +13 -0
  56. package/src/lib/updateEngine.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../brightchain-db/src/lib/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * PooledStoreAdapter – adapts an IPooledBlockStore to IBlockStore
3
+ * by fixing all operations to a specific pool.
4
+ *
5
+ * This allows Collection to remain unchanged: it continues to call
6
+ * store.has(), store.get(), store.put() as before, but the adapter
7
+ * routes those calls through pool-scoped methods on the inner store.
8
+ */
9
+ import type { BlockStoreOptions, BrightenResult, CBLMagnetComponents, CBLStorageResult, CBLWhiteningOptions, IBlockMetadata, IBlockStore, IPooledBlockStore, PoolId, RecoveryResult } from '@brightchain/brightchain-lib';
10
+ import { BaseBlock, BlockHandle, BlockSize, Checksum, RawDataBlock } from '@brightchain/brightchain-lib';
11
+ /**
12
+ * Adapts an IPooledBlockStore to IBlockStore by fixing all operations
13
+ * to a specific pool. This allows Collection to remain unchanged —
14
+ * all pool routing is handled transparently at the adapter level.
15
+ */
16
+ export declare class PooledStoreAdapter implements IBlockStore {
17
+ private readonly inner;
18
+ private readonly poolId;
19
+ constructor(inner: IPooledBlockStore, poolId: PoolId);
20
+ get blockSize(): BlockSize;
21
+ has(key: Checksum | string): Promise<boolean>;
22
+ getData(key: Checksum): Promise<RawDataBlock>;
23
+ setData(block: RawDataBlock, options?: BlockStoreOptions): Promise<void>;
24
+ deleteData(key: Checksum): Promise<void>;
25
+ getRandomBlocks(count: number): Promise<Checksum[]>;
26
+ get<T extends BaseBlock>(key: Checksum | string): BlockHandle<T>;
27
+ put(key: Checksum | string, data: Uint8Array, options?: BlockStoreOptions): Promise<void>;
28
+ delete(key: Checksum | string): Promise<void>;
29
+ getMetadata(key: Checksum | string): Promise<IBlockMetadata | null>;
30
+ updateMetadata(key: Checksum | string, updates: Partial<IBlockMetadata>): Promise<void>;
31
+ generateParityBlocks(key: Checksum | string, parityCount: number): Promise<Checksum[]>;
32
+ getParityBlocks(key: Checksum | string): Promise<Checksum[]>;
33
+ recoverBlock(key: Checksum | string): Promise<RecoveryResult>;
34
+ verifyBlockIntegrity(key: Checksum | string): Promise<boolean>;
35
+ getBlocksPendingReplication(): Promise<Checksum[]>;
36
+ getUnderReplicatedBlocks(): Promise<Checksum[]>;
37
+ recordReplication(key: Checksum | string, nodeId: string): Promise<void>;
38
+ recordReplicaLoss(key: Checksum | string, nodeId: string): Promise<void>;
39
+ brightenBlock(key: Checksum | string, randomBlockCount: number): Promise<BrightenResult>;
40
+ storeCBLWithWhitening(cblData: Uint8Array, options?: CBLWhiteningOptions): Promise<CBLStorageResult>;
41
+ retrieveCBL(blockId1: Checksum | string, blockId2: Checksum | string, block1ParityIds?: string[], block2ParityIds?: string[]): Promise<Uint8Array>;
42
+ parseCBLMagnetUrl(magnetUrl: string): CBLMagnetComponents;
43
+ generateCBLMagnetUrl(blockId1: Checksum | string, blockId2: Checksum | string, blockSize: number, block1ParityIds?: string[], block2ParityIds?: string[], isEncrypted?: boolean): string;
44
+ }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * PooledStoreAdapter – adapts an IPooledBlockStore to IBlockStore
4
+ * by fixing all operations to a specific pool.
5
+ *
6
+ * This allows Collection to remain unchanged: it continues to call
7
+ * store.has(), store.get(), store.put() as before, but the adapter
8
+ * routes those calls through pool-scoped methods on the inner store.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.PooledStoreAdapter = void 0;
12
+ const brightchain_lib_1 = require("@brightchain/brightchain-lib");
13
+ /**
14
+ * Adapts an IPooledBlockStore to IBlockStore by fixing all operations
15
+ * to a specific pool. This allows Collection to remain unchanged —
16
+ * all pool routing is handled transparently at the adapter level.
17
+ */
18
+ class PooledStoreAdapter {
19
+ constructor(inner, poolId) {
20
+ this.inner = inner;
21
+ this.poolId = poolId;
22
+ }
23
+ // === Delegated property ===
24
+ get blockSize() {
25
+ return this.inner.blockSize;
26
+ }
27
+ // === Pool-scoped core block operations ===
28
+ async has(key) {
29
+ const hash = typeof key === 'string' ? key : key.toHex();
30
+ return this.inner.hasInPool(this.poolId, hash);
31
+ }
32
+ async getData(key) {
33
+ const data = await this.inner.getFromPool(this.poolId, key.toHex());
34
+ return new brightchain_lib_1.RawDataBlock(this.blockSize, data);
35
+ }
36
+ async setData(block, options) {
37
+ await this.inner.putInPool(this.poolId, block.data, options);
38
+ }
39
+ async deleteData(key) {
40
+ await this.inner.deleteFromPool(this.poolId, key.toHex());
41
+ }
42
+ async getRandomBlocks(count) {
43
+ return this.inner.getRandomBlocksFromPool(this.poolId, count);
44
+ }
45
+ get(key) {
46
+ const hash = typeof key === 'string' ? key : key.toHex();
47
+ const storageKey = (0, brightchain_lib_1.makeStorageKey)(this.poolId, hash);
48
+ return this.inner.get(storageKey);
49
+ }
50
+ async put(key, data, options) {
51
+ await this.inner.putInPool(this.poolId, data, options);
52
+ }
53
+ async delete(key) {
54
+ const hash = typeof key === 'string' ? key : key.toHex();
55
+ await this.inner.deleteFromPool(this.poolId, hash);
56
+ }
57
+ // === Metadata operations (delegated directly to inner store) ===
58
+ async getMetadata(key) {
59
+ return this.inner.getMetadata(key);
60
+ }
61
+ async updateMetadata(key, updates) {
62
+ return this.inner.updateMetadata(key, updates);
63
+ }
64
+ // === FEC/Durability operations (delegated directly to inner store) ===
65
+ async generateParityBlocks(key, parityCount) {
66
+ return this.inner.generateParityBlocks(key, parityCount);
67
+ }
68
+ async getParityBlocks(key) {
69
+ return this.inner.getParityBlocks(key);
70
+ }
71
+ async recoverBlock(key) {
72
+ return this.inner.recoverBlock(key);
73
+ }
74
+ async verifyBlockIntegrity(key) {
75
+ return this.inner.verifyBlockIntegrity(key);
76
+ }
77
+ // === Replication operations (delegated directly to inner store) ===
78
+ async getBlocksPendingReplication() {
79
+ return this.inner.getBlocksPendingReplication();
80
+ }
81
+ async getUnderReplicatedBlocks() {
82
+ return this.inner.getUnderReplicatedBlocks();
83
+ }
84
+ async recordReplication(key, nodeId) {
85
+ return this.inner.recordReplication(key, nodeId);
86
+ }
87
+ async recordReplicaLoss(key, nodeId) {
88
+ return this.inner.recordReplicaLoss(key, nodeId);
89
+ }
90
+ // === XOR Brightening operations (delegated directly to inner store) ===
91
+ async brightenBlock(key, randomBlockCount) {
92
+ return this.inner.brightenBlock(key, randomBlockCount);
93
+ }
94
+ // === CBL Whitening operations (delegated through pool) ===
95
+ async storeCBLWithWhitening(cblData, options) {
96
+ return this.inner.storeCBLWithWhiteningInPool(this.poolId, cblData, options);
97
+ }
98
+ async retrieveCBL(blockId1, blockId2, block1ParityIds, block2ParityIds) {
99
+ return this.inner.retrieveCBLFromPool(this.poolId, blockId1, blockId2, block1ParityIds, block2ParityIds);
100
+ }
101
+ parseCBLMagnetUrl(magnetUrl) {
102
+ return this.inner.parseCBLMagnetUrl(magnetUrl);
103
+ }
104
+ generateCBLMagnetUrl(blockId1, blockId2, blockSize, block1ParityIds, block2ParityIds, isEncrypted) {
105
+ return this.inner.generateCBLMagnetUrl(blockId1, blockId2, blockSize, block1ParityIds, block2ParityIds, isEncrypted);
106
+ }
107
+ }
108
+ exports.PooledStoreAdapter = PooledStoreAdapter;
109
+ //# sourceMappingURL=pooledStoreAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pooledStoreAdapter.js","sourceRoot":"","sources":["../../../../brightchain-db/src/lib/pooledStoreAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Query engine – evaluates MongoDB-style filter queries against documents.
3
+ *
4
+ * Supports:
5
+ * - Comparison: $eq, $ne, $gt, $gte, $lt, $lte
6
+ * - Set membership: $in, $nin
7
+ * - Pattern: $regex
8
+ * - Existence: $exists
9
+ * - Array: $elemMatch, $size, $all
10
+ * - Logical: $and, $or, $nor, $not
11
+ * - Type: $type
12
+ * - Text: $text / $search (full-text search across indexed fields)
13
+ */
14
+ import { BsonDocument, FilterQuery } from './types';
15
+ /**
16
+ * Configure which fields are included in $text search.
17
+ * Call this before running a filter that contains $text.
18
+ */
19
+ export declare function setTextSearchFields(fields: string[]): void;
20
+ /**
21
+ * Get the currently configured text search fields.
22
+ */
23
+ export declare function getTextSearchFields(): string[];
24
+ /**
25
+ * Compare two values for ordering (like MongoDB's BSON comparison).
26
+ * Returns negative if a < b, 0 if equal, positive if a > b.
27
+ */
28
+ export declare function compareValues(a: unknown, b: unknown): number;
29
+ /**
30
+ * Deep equality check (handles primitives, arrays, plain objects, Dates).
31
+ */
32
+ export declare function deepEquals(a: unknown, b: unknown): boolean;
33
+ /**
34
+ * Check if a document matches a filter query.
35
+ */
36
+ export declare function matchesFilter<T extends BsonDocument>(doc: T, filter: FilterQuery<T>): boolean;
37
+ /**
38
+ * Apply projection to a document.
39
+ */
40
+ export declare function applyProjection<T extends BsonDocument>(doc: T, projection: Record<string, 0 | 1>): Partial<T>;
41
+ /**
42
+ * Sort an array of documents by a sort specification.
43
+ */
44
+ export declare function sortDocuments<T extends BsonDocument>(docs: T[], sort: Record<string, 1 | -1>): T[];
45
+ /**
46
+ * Tokenize a string into lowercase words (basic whitespace + punctuation split).
47
+ */
48
+ export declare function tokenize(text: string): string[];
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ /**
3
+ * Query engine – evaluates MongoDB-style filter queries against documents.
4
+ *
5
+ * Supports:
6
+ * - Comparison: $eq, $ne, $gt, $gte, $lt, $lte
7
+ * - Set membership: $in, $nin
8
+ * - Pattern: $regex
9
+ * - Existence: $exists
10
+ * - Array: $elemMatch, $size, $all
11
+ * - Logical: $and, $or, $nor, $not
12
+ * - Type: $type
13
+ * - Text: $text / $search (full-text search across indexed fields)
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.setTextSearchFields = setTextSearchFields;
17
+ exports.getTextSearchFields = getTextSearchFields;
18
+ exports.compareValues = compareValues;
19
+ exports.deepEquals = deepEquals;
20
+ exports.matchesFilter = matchesFilter;
21
+ exports.applyProjection = applyProjection;
22
+ exports.sortDocuments = sortDocuments;
23
+ exports.tokenize = tokenize;
24
+ /** Reserved operator keys */
25
+ const LOGICAL_OPS = new Set(['$and', '$or', '$nor', '$not']);
26
+ /** Fields to search for $text queries – set by the collection before querying */
27
+ let textSearchFields = [];
28
+ /**
29
+ * Configure which fields are included in $text search.
30
+ * Call this before running a filter that contains $text.
31
+ */
32
+ function setTextSearchFields(fields) {
33
+ textSearchFields = fields;
34
+ }
35
+ /**
36
+ * Get the currently configured text search fields.
37
+ */
38
+ function getTextSearchFields() {
39
+ return textSearchFields;
40
+ }
41
+ /**
42
+ * Resolve a potentially nested field path like "address.city" on a document.
43
+ */
44
+ function getNestedValue(doc, path) {
45
+ const parts = path.split('.');
46
+ let current = doc;
47
+ for (const part of parts) {
48
+ if (current === null || current === undefined)
49
+ return undefined;
50
+ if (Array.isArray(current)) {
51
+ const idx = Number(part);
52
+ if (!Number.isNaN(idx)) {
53
+ current = current[idx];
54
+ }
55
+ else {
56
+ // Array implicit iteration – match any element
57
+ const results = current
58
+ .map((item) => typeof item === 'object' && item !== null
59
+ ? item[part]
60
+ : undefined)
61
+ .filter((v) => v !== undefined);
62
+ return results.length === 1
63
+ ? results[0]
64
+ : results.length > 0
65
+ ? results
66
+ : undefined;
67
+ }
68
+ }
69
+ else if (typeof current === 'object') {
70
+ current = current[part];
71
+ }
72
+ else {
73
+ return undefined;
74
+ }
75
+ }
76
+ return current;
77
+ }
78
+ /**
79
+ * Compare two values for ordering (like MongoDB's BSON comparison).
80
+ * Returns negative if a < b, 0 if equal, positive if a > b.
81
+ */
82
+ function compareValues(a, b) {
83
+ if (a === b)
84
+ return 0;
85
+ if (a === null || a === undefined)
86
+ return -1;
87
+ if (b === null || b === undefined)
88
+ return 1;
89
+ if (typeof a === 'number' && typeof b === 'number')
90
+ return a - b;
91
+ if (typeof a === 'string' && typeof b === 'string')
92
+ return a.localeCompare(b);
93
+ if (typeof a === 'boolean' && typeof b === 'boolean')
94
+ return a === b ? 0 : a ? 1 : -1;
95
+ if (a instanceof Date && b instanceof Date)
96
+ return a.getTime() - b.getTime();
97
+ // Fallback: stringify comparison
98
+ return String(a).localeCompare(String(b));
99
+ }
100
+ /**
101
+ * Check if a value matches a filter operator object.
102
+ */
103
+ function matchOperator(value, op) {
104
+ for (const [key, operand] of Object.entries(op)) {
105
+ switch (key) {
106
+ case '$eq':
107
+ if (!deepEquals(value, operand))
108
+ return false;
109
+ break;
110
+ case '$ne':
111
+ if (deepEquals(value, operand))
112
+ return false;
113
+ break;
114
+ case '$gt':
115
+ if (compareValues(value, operand) <= 0)
116
+ return false;
117
+ break;
118
+ case '$gte':
119
+ if (compareValues(value, operand) < 0)
120
+ return false;
121
+ break;
122
+ case '$lt':
123
+ if (compareValues(value, operand) >= 0)
124
+ return false;
125
+ break;
126
+ case '$lte':
127
+ if (compareValues(value, operand) > 0)
128
+ return false;
129
+ break;
130
+ case '$in': {
131
+ const arr = operand;
132
+ if (!arr.some((item) => deepEquals(value, item)))
133
+ return false;
134
+ break;
135
+ }
136
+ case '$nin': {
137
+ const arr = operand;
138
+ if (arr.some((item) => deepEquals(value, item)))
139
+ return false;
140
+ break;
141
+ }
142
+ case '$regex': {
143
+ if (typeof value !== 'string')
144
+ return false;
145
+ const re = operand instanceof RegExp ? operand : new RegExp(operand);
146
+ if (!re.test(value))
147
+ return false;
148
+ break;
149
+ }
150
+ case '$exists':
151
+ if (operand && value === undefined)
152
+ return false;
153
+ if (!operand && value !== undefined)
154
+ return false;
155
+ break;
156
+ case '$not':
157
+ if (matchOperator(value, operand))
158
+ return false;
159
+ break;
160
+ case '$elemMatch': {
161
+ if (!Array.isArray(value))
162
+ return false;
163
+ const subFilter = operand;
164
+ if (!value.some((elem) => matchesFilter(elem, subFilter))) {
165
+ return false;
166
+ }
167
+ break;
168
+ }
169
+ case '$size':
170
+ if (!Array.isArray(value) || value.length !== operand)
171
+ return false;
172
+ break;
173
+ case '$all': {
174
+ if (!Array.isArray(value))
175
+ return false;
176
+ const allItems = operand;
177
+ if (!allItems.every((item) => value.some((v) => deepEquals(v, item))))
178
+ return false;
179
+ break;
180
+ }
181
+ case '$type': {
182
+ const expectedType = operand;
183
+ if (!matchesType(value, expectedType))
184
+ return false;
185
+ break;
186
+ }
187
+ default:
188
+ // Unknown operator – ignore
189
+ break;
190
+ }
191
+ }
192
+ return true;
193
+ }
194
+ function matchesType(value, expectedType) {
195
+ switch (expectedType) {
196
+ case 'string':
197
+ return typeof value === 'string';
198
+ case 'number':
199
+ case 'int':
200
+ case 'long':
201
+ case 'double':
202
+ case 'decimal':
203
+ return typeof value === 'number';
204
+ case 'bool':
205
+ return typeof value === 'boolean';
206
+ case 'object':
207
+ return (typeof value === 'object' && value !== null && !Array.isArray(value));
208
+ case 'array':
209
+ return Array.isArray(value);
210
+ case 'null':
211
+ return value === null;
212
+ case 'date':
213
+ return value instanceof Date;
214
+ case 'undefined':
215
+ return value === undefined;
216
+ default:
217
+ return typeof value === expectedType;
218
+ }
219
+ }
220
+ /**
221
+ * Deep equality check (handles primitives, arrays, plain objects, Dates).
222
+ */
223
+ function deepEquals(a, b) {
224
+ if (a === b)
225
+ return true;
226
+ if (a === null || b === null || a === undefined || b === undefined)
227
+ return a === b;
228
+ if (typeof a !== typeof b)
229
+ return false;
230
+ if (a instanceof Date && b instanceof Date)
231
+ return a.getTime() === b.getTime();
232
+ if (Array.isArray(a) && Array.isArray(b)) {
233
+ if (a.length !== b.length)
234
+ return false;
235
+ return a.every((item, i) => deepEquals(item, b[i]));
236
+ }
237
+ if (typeof a === 'object' && typeof b === 'object') {
238
+ const keysA = Object.keys(a);
239
+ const keysB = Object.keys(b);
240
+ if (keysA.length !== keysB.length)
241
+ return false;
242
+ return keysA.every((k) => deepEquals(a[k], b[k]));
243
+ }
244
+ return false;
245
+ }
246
+ /**
247
+ * Check if a document matches a filter query.
248
+ */
249
+ function matchesFilter(doc, filter) {
250
+ for (const [key, condition] of Object.entries(filter)) {
251
+ // Handle logical operators at the top level
252
+ if (key === '$and') {
253
+ const clauses = condition;
254
+ if (!clauses.every((clause) => matchesFilter(doc, clause)))
255
+ return false;
256
+ continue;
257
+ }
258
+ if (key === '$or') {
259
+ const clauses = condition;
260
+ if (!clauses.some((clause) => matchesFilter(doc, clause)))
261
+ return false;
262
+ continue;
263
+ }
264
+ if (key === '$nor') {
265
+ const clauses = condition;
266
+ if (clauses.some((clause) => matchesFilter(doc, clause)))
267
+ return false;
268
+ continue;
269
+ }
270
+ if (key === '$not') {
271
+ if (matchesFilter(doc, condition))
272
+ return false;
273
+ continue;
274
+ }
275
+ if (key === '$text') {
276
+ const textSpec = condition;
277
+ const searchStr = textSpec['$search'] ?? '';
278
+ if (!matchesTextSearch(doc, searchStr))
279
+ return false;
280
+ continue;
281
+ }
282
+ if (LOGICAL_OPS.has(key))
283
+ continue;
284
+ const value = getNestedValue(doc, key);
285
+ if (condition !== null &&
286
+ typeof condition === 'object' &&
287
+ !Array.isArray(condition) &&
288
+ !(condition instanceof RegExp) &&
289
+ !(condition instanceof Date)) {
290
+ // Check if any keys look like operators
291
+ const condObj = condition;
292
+ const hasOps = Object.keys(condObj).some((k) => k.startsWith('$'));
293
+ if (hasOps) {
294
+ if (!matchOperator(value, condObj))
295
+ return false;
296
+ continue;
297
+ }
298
+ }
299
+ // Exact match – if the value is in an array, match against array elements (MongoDB behavior)
300
+ if (Array.isArray(value)) {
301
+ if (!value.some((v) => deepEquals(v, condition)) &&
302
+ !deepEquals(value, condition)) {
303
+ return false;
304
+ }
305
+ }
306
+ else {
307
+ if (!deepEquals(value, condition))
308
+ return false;
309
+ }
310
+ }
311
+ return true;
312
+ }
313
+ /**
314
+ * Apply projection to a document.
315
+ */
316
+ function applyProjection(doc, projection) {
317
+ const keys = Object.keys(projection);
318
+ if (keys.length === 0)
319
+ return { ...doc };
320
+ const isInclusion = Object.values(projection).some((v) => v === 1);
321
+ const result = {};
322
+ if (isInclusion) {
323
+ // Always include _id unless explicitly excluded
324
+ if (projection['_id'] !== 0) {
325
+ result['_id'] = doc._id;
326
+ }
327
+ for (const key of keys) {
328
+ if (key === '_id')
329
+ continue;
330
+ if (projection[key] === 1) {
331
+ result[key] = getNestedValue(doc, key);
332
+ }
333
+ }
334
+ }
335
+ else {
336
+ // Exclusion mode – include everything except excluded fields
337
+ for (const [k, v] of Object.entries(doc)) {
338
+ if (projection[k] === 0)
339
+ continue;
340
+ result[k] = v;
341
+ }
342
+ }
343
+ return result;
344
+ }
345
+ /**
346
+ * Sort an array of documents by a sort specification.
347
+ */
348
+ function sortDocuments(docs, sort) {
349
+ const sortEntries = Object.entries(sort);
350
+ if (sortEntries.length === 0)
351
+ return docs;
352
+ return [...docs].sort((a, b) => {
353
+ for (const [field, direction] of sortEntries) {
354
+ const va = getNestedValue(a, field);
355
+ const vb = getNestedValue(b, field);
356
+ const cmp = compareValues(va, vb);
357
+ if (cmp !== 0)
358
+ return cmp * direction;
359
+ }
360
+ return 0;
361
+ });
362
+ }
363
+ // ── Text search ──
364
+ /**
365
+ * Tokenize a string into lowercase words (basic whitespace + punctuation split).
366
+ */
367
+ function tokenize(text) {
368
+ return text
369
+ .toLowerCase()
370
+ .replace(/[^\w\s]/g, ' ')
371
+ .split(/\s+/)
372
+ .filter(Boolean);
373
+ }
374
+ /**
375
+ * Check whether a document matches a `$text: { $search: ... }` query.
376
+ *
377
+ * When `textSearchFields` is configured, only those fields are searched.
378
+ * Otherwise falls back to searching all string fields in the document.
379
+ *
380
+ * Supports:
381
+ * - Multiple search terms (OR semantics – any token match)
382
+ * - Quoted phrases for exact substring matching: `"hello world"`
383
+ * - Negation with minus prefix: `-unwanted`
384
+ */
385
+ function matchesTextSearch(doc, search) {
386
+ if (!search)
387
+ return true;
388
+ // Collect text from document
389
+ const fieldsToSearch = textSearchFields.length > 0 ? textSearchFields : null;
390
+ const docText = extractText(doc, fieldsToSearch).toLowerCase();
391
+ // Parse search string: quoted phrases, negated terms, and regular terms
392
+ const phrases = [];
393
+ const negated = [];
394
+ const tokens = [];
395
+ // Extract quoted phrases
396
+ const quoteRegex = /"([^"]+)"/g;
397
+ let cleaned = search;
398
+ let match;
399
+ while ((match = quoteRegex.exec(search)) !== null) {
400
+ phrases.push(match[1].toLowerCase());
401
+ }
402
+ cleaned = cleaned.replace(quoteRegex, '').trim();
403
+ // Split remaining into tokens
404
+ for (const word of cleaned.split(/\s+/).filter(Boolean)) {
405
+ if (word.startsWith('-') && word.length > 1) {
406
+ negated.push(word.slice(1).toLowerCase());
407
+ }
408
+ else {
409
+ tokens.push(word.toLowerCase());
410
+ }
411
+ }
412
+ // Check negated terms (must NOT appear)
413
+ for (const neg of negated) {
414
+ if (docText.includes(neg))
415
+ return false;
416
+ }
417
+ // Check quoted phrases (must appear as substring)
418
+ for (const phrase of phrases) {
419
+ if (!docText.includes(phrase))
420
+ return false;
421
+ }
422
+ // Check tokens (at least one must match, or if no tokens – phrases already matched)
423
+ if (tokens.length > 0) {
424
+ const docTokens = new Set(tokenize(docText));
425
+ if (!tokens.some((t) => docTokens.has(t)))
426
+ return false;
427
+ }
428
+ return true;
429
+ }
430
+ /**
431
+ * Extract all text content from a document for full-text search.
432
+ */
433
+ function extractText(obj, fields, prefix = '') {
434
+ const parts = [];
435
+ for (const [key, value] of Object.entries(obj)) {
436
+ const path = prefix ? `${prefix}.${key}` : key;
437
+ if (fields &&
438
+ !fields.some((f) => path.startsWith(f) || f.startsWith(path))) {
439
+ continue;
440
+ }
441
+ if (typeof value === 'string') {
442
+ parts.push(value);
443
+ }
444
+ else if (Array.isArray(value)) {
445
+ for (const item of value) {
446
+ if (typeof item === 'string')
447
+ parts.push(item);
448
+ else if (typeof item === 'object' && item !== null) {
449
+ parts.push(extractText(item, fields, path));
450
+ }
451
+ }
452
+ }
453
+ else if (typeof value === 'object' &&
454
+ value !== null &&
455
+ !(value instanceof Date)) {
456
+ parts.push(extractText(value, fields, path));
457
+ }
458
+ }
459
+ return parts.join(' ');
460
+ }
461
+ //# sourceMappingURL=queryEngine.js.map