@push.rocks/smartmongo 2.1.0 → 3.0.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +3 -3
- package/dist_ts/tsmdb/engine/AggregationEngine.js +189 -0
- package/dist_ts/tsmdb/engine/IndexEngine.js +376 -0
- package/dist_ts/tsmdb/engine/QueryEngine.js +271 -0
- package/dist_ts/{congodb → tsmdb}/engine/TransactionEngine.d.ts +1 -1
- package/dist_ts/tsmdb/engine/TransactionEngine.js +287 -0
- package/dist_ts/tsmdb/engine/UpdateEngine.js +461 -0
- package/dist_ts/{congodb/errors/CongoErrors.d.ts → tsmdb/errors/TsmdbErrors.d.ts} +16 -16
- package/dist_ts/tsmdb/errors/TsmdbErrors.js +155 -0
- package/dist_ts/{congodb → tsmdb}/index.d.ts +4 -4
- package/dist_ts/tsmdb/index.js +26 -0
- package/dist_ts/{congodb → tsmdb}/server/CommandRouter.d.ts +4 -4
- package/dist_ts/tsmdb/server/CommandRouter.js +132 -0
- package/dist_ts/{congodb/server/CongoServer.d.ts → tsmdb/server/TsmdbServer.d.ts} +6 -6
- package/dist_ts/tsmdb/server/TsmdbServer.js +227 -0
- package/dist_ts/{congodb → tsmdb}/server/WireProtocol.d.ts +1 -1
- package/dist_ts/tsmdb/server/WireProtocol.js +298 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AdminHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AdminHandler.js +568 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AggregateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AggregateHandler.js +277 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/DeleteHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/DeleteHandler.js +83 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/FindHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/FindHandler.js +261 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.d.ts +1 -1
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.js +2 -2
- package/dist_ts/{congodb → tsmdb}/server/handlers/IndexHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/IndexHandler.js +183 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/InsertHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/InsertHandler.js +76 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/UpdateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/UpdateHandler.js +270 -0
- package/dist_ts/tsmdb/server/handlers/index.js +10 -0
- package/dist_ts/{congodb → tsmdb}/server/index.d.ts +2 -2
- package/dist_ts/tsmdb/server/index.js +7 -0
- package/dist_ts/{congodb → tsmdb}/storage/FileStorageAdapter.d.ts +2 -2
- package/dist_ts/tsmdb/storage/FileStorageAdapter.js +396 -0
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.d.ts +2 -2
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.js +1 -1
- package/dist_ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.d.ts +2 -2
- package/dist_ts/tsmdb/storage/MemoryStorageAdapter.js +367 -0
- package/dist_ts/{congodb → tsmdb}/storage/OpLog.d.ts +1 -1
- package/dist_ts/tsmdb/storage/OpLog.js +221 -0
- package/dist_ts/tsmdb/tsmdb.plugins.js +14 -0
- package/dist_ts/{congodb → tsmdb}/types/interfaces.d.ts +3 -3
- package/dist_ts/{congodb → tsmdb}/types/interfaces.js +1 -1
- package/package.json +1 -1
- package/readme.hints.md +7 -12
- package/readme.md +398 -44
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -2
- package/ts/{congodb → tsmdb}/engine/AggregationEngine.ts +1 -1
- package/ts/{congodb → tsmdb}/engine/IndexEngine.ts +7 -7
- package/ts/{congodb → tsmdb}/engine/QueryEngine.ts +1 -1
- package/ts/{congodb → tsmdb}/engine/TransactionEngine.ts +12 -12
- package/ts/{congodb → tsmdb}/engine/UpdateEngine.ts +1 -1
- package/ts/{congodb/errors/CongoErrors.ts → tsmdb/errors/TsmdbErrors.ts} +34 -34
- package/ts/{congodb → tsmdb}/index.ts +7 -7
- package/ts/{congodb → tsmdb}/server/CommandRouter.ts +5 -5
- package/ts/{congodb/server/CongoServer.ts → tsmdb/server/TsmdbServer.ts} +8 -8
- package/ts/{congodb → tsmdb}/server/WireProtocol.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/AdminHandler.ts +6 -6
- package/ts/{congodb → tsmdb}/server/handlers/AggregateHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/DeleteHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/FindHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/HelloHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/IndexHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/InsertHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/UpdateHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/index.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/FileStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/IStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/OpLog.ts +1 -1
- package/ts/{congodb → tsmdb}/types/interfaces.ts +3 -3
- package/dist_ts/congodb/congodb.plugins.js +0 -14
- package/dist_ts/congodb/engine/AggregationEngine.js +0 -189
- package/dist_ts/congodb/engine/IndexEngine.js +0 -376
- package/dist_ts/congodb/engine/QueryEngine.js +0 -271
- package/dist_ts/congodb/engine/TransactionEngine.js +0 -287
- package/dist_ts/congodb/engine/UpdateEngine.js +0 -461
- package/dist_ts/congodb/errors/CongoErrors.js +0 -155
- package/dist_ts/congodb/index.js +0 -26
- package/dist_ts/congodb/server/CommandRouter.js +0 -132
- package/dist_ts/congodb/server/CongoServer.js +0 -227
- package/dist_ts/congodb/server/WireProtocol.js +0 -298
- package/dist_ts/congodb/server/handlers/AdminHandler.js +0 -568
- package/dist_ts/congodb/server/handlers/AggregateHandler.js +0 -277
- package/dist_ts/congodb/server/handlers/DeleteHandler.js +0 -83
- package/dist_ts/congodb/server/handlers/FindHandler.js +0 -261
- package/dist_ts/congodb/server/handlers/IndexHandler.js +0 -183
- package/dist_ts/congodb/server/handlers/InsertHandler.js +0 -76
- package/dist_ts/congodb/server/handlers/UpdateHandler.js +0 -270
- package/dist_ts/congodb/server/handlers/index.js +0 -10
- package/dist_ts/congodb/server/index.js +0 -7
- package/dist_ts/congodb/storage/FileStorageAdapter.js +0 -396
- package/dist_ts/congodb/storage/MemoryStorageAdapter.js +0 -367
- package/dist_ts/congodb/storage/OpLog.js +0 -221
- /package/dist_ts/{congodb → tsmdb}/engine/AggregationEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/IndexEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/QueryEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/UpdateEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/server/handlers/index.d.ts +0 -0
- /package/dist_ts/{congodb/congodb.plugins.d.ts → tsmdb/tsmdb.plugins.d.ts} +0 -0
- /package/ts/{congodb → tsmdb}/server/handlers/index.ts +0 -0
- /package/ts/{congodb/congodb.plugins.ts → tsmdb/tsmdb.plugins.ts} +0 -0
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../congodb.plugins.js';
|
|
2
|
-
import { QueryEngine } from './QueryEngine.js';
|
|
3
|
-
/**
|
|
4
|
-
* Update engine for MongoDB-compatible update operations
|
|
5
|
-
*/
|
|
6
|
-
export class UpdateEngine {
|
|
7
|
-
/**
|
|
8
|
-
* Apply an update specification to a document
|
|
9
|
-
* Returns the updated document or null if no update was applied
|
|
10
|
-
*/
|
|
11
|
-
static applyUpdate(document, update, arrayFilters) {
|
|
12
|
-
// Check if this is an aggregation pipeline update
|
|
13
|
-
if (Array.isArray(update)) {
|
|
14
|
-
// Aggregation pipeline updates are not yet supported
|
|
15
|
-
throw new Error('Aggregation pipeline updates are not yet supported');
|
|
16
|
-
}
|
|
17
|
-
// Check if this is a replacement (no $ operators at top level)
|
|
18
|
-
const hasOperators = Object.keys(update).some(k => k.startsWith('$'));
|
|
19
|
-
if (!hasOperators) {
|
|
20
|
-
// This is a replacement - preserve _id
|
|
21
|
-
return {
|
|
22
|
-
_id: document._id,
|
|
23
|
-
...update,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
// Apply update operators
|
|
27
|
-
const result = this.deepClone(document);
|
|
28
|
-
for (const [operator, operand] of Object.entries(update)) {
|
|
29
|
-
switch (operator) {
|
|
30
|
-
case '$set':
|
|
31
|
-
this.applySet(result, operand);
|
|
32
|
-
break;
|
|
33
|
-
case '$unset':
|
|
34
|
-
this.applyUnset(result, operand);
|
|
35
|
-
break;
|
|
36
|
-
case '$inc':
|
|
37
|
-
this.applyInc(result, operand);
|
|
38
|
-
break;
|
|
39
|
-
case '$mul':
|
|
40
|
-
this.applyMul(result, operand);
|
|
41
|
-
break;
|
|
42
|
-
case '$min':
|
|
43
|
-
this.applyMin(result, operand);
|
|
44
|
-
break;
|
|
45
|
-
case '$max':
|
|
46
|
-
this.applyMax(result, operand);
|
|
47
|
-
break;
|
|
48
|
-
case '$rename':
|
|
49
|
-
this.applyRename(result, operand);
|
|
50
|
-
break;
|
|
51
|
-
case '$currentDate':
|
|
52
|
-
this.applyCurrentDate(result, operand);
|
|
53
|
-
break;
|
|
54
|
-
case '$setOnInsert':
|
|
55
|
-
// Only applied during upsert insert, handled elsewhere
|
|
56
|
-
break;
|
|
57
|
-
case '$push':
|
|
58
|
-
this.applyPush(result, operand, arrayFilters);
|
|
59
|
-
break;
|
|
60
|
-
case '$pop':
|
|
61
|
-
this.applyPop(result, operand);
|
|
62
|
-
break;
|
|
63
|
-
case '$pull':
|
|
64
|
-
this.applyPull(result, operand, arrayFilters);
|
|
65
|
-
break;
|
|
66
|
-
case '$pullAll':
|
|
67
|
-
this.applyPullAll(result, operand);
|
|
68
|
-
break;
|
|
69
|
-
case '$addToSet':
|
|
70
|
-
this.applyAddToSet(result, operand);
|
|
71
|
-
break;
|
|
72
|
-
case '$bit':
|
|
73
|
-
this.applyBit(result, operand);
|
|
74
|
-
break;
|
|
75
|
-
default:
|
|
76
|
-
throw new Error(`Unknown update operator: ${operator}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Apply $setOnInsert for upsert operations
|
|
83
|
-
*/
|
|
84
|
-
static applySetOnInsert(document, setOnInsert) {
|
|
85
|
-
const result = this.deepClone(document);
|
|
86
|
-
this.applySet(result, setOnInsert);
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Deep clone a document
|
|
91
|
-
*/
|
|
92
|
-
static deepClone(obj) {
|
|
93
|
-
if (obj === null || typeof obj !== 'object') {
|
|
94
|
-
return obj;
|
|
95
|
-
}
|
|
96
|
-
if (obj instanceof plugins.bson.ObjectId) {
|
|
97
|
-
return new plugins.bson.ObjectId(obj.toHexString());
|
|
98
|
-
}
|
|
99
|
-
if (obj instanceof Date) {
|
|
100
|
-
return new Date(obj.getTime());
|
|
101
|
-
}
|
|
102
|
-
if (obj instanceof plugins.bson.Timestamp) {
|
|
103
|
-
return new plugins.bson.Timestamp({ t: obj.high, i: obj.low });
|
|
104
|
-
}
|
|
105
|
-
if (Array.isArray(obj)) {
|
|
106
|
-
return obj.map(item => this.deepClone(item));
|
|
107
|
-
}
|
|
108
|
-
const cloned = {};
|
|
109
|
-
for (const key of Object.keys(obj)) {
|
|
110
|
-
cloned[key] = this.deepClone(obj[key]);
|
|
111
|
-
}
|
|
112
|
-
return cloned;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Set a nested value
|
|
116
|
-
*/
|
|
117
|
-
static setNestedValue(obj, path, value) {
|
|
118
|
-
const parts = path.split('.');
|
|
119
|
-
let current = obj;
|
|
120
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
121
|
-
const part = parts[i];
|
|
122
|
-
// Handle array index notation
|
|
123
|
-
const arrayMatch = part.match(/^(\w+)\[(\d+)\]$/);
|
|
124
|
-
if (arrayMatch) {
|
|
125
|
-
const [, fieldName, indexStr] = arrayMatch;
|
|
126
|
-
const index = parseInt(indexStr, 10);
|
|
127
|
-
if (!(fieldName in current)) {
|
|
128
|
-
current[fieldName] = [];
|
|
129
|
-
}
|
|
130
|
-
if (!current[fieldName][index]) {
|
|
131
|
-
current[fieldName][index] = {};
|
|
132
|
-
}
|
|
133
|
-
current = current[fieldName][index];
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
// Handle numeric index (array positional)
|
|
137
|
-
const numIndex = parseInt(part, 10);
|
|
138
|
-
if (!isNaN(numIndex) && Array.isArray(current)) {
|
|
139
|
-
if (!current[numIndex]) {
|
|
140
|
-
current[numIndex] = {};
|
|
141
|
-
}
|
|
142
|
-
current = current[numIndex];
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (!(part in current) || current[part] === null) {
|
|
146
|
-
current[part] = {};
|
|
147
|
-
}
|
|
148
|
-
current = current[part];
|
|
149
|
-
}
|
|
150
|
-
const lastPart = parts[parts.length - 1];
|
|
151
|
-
const numIndex = parseInt(lastPart, 10);
|
|
152
|
-
if (!isNaN(numIndex) && Array.isArray(current)) {
|
|
153
|
-
current[numIndex] = value;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
current[lastPart] = value;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Get a nested value
|
|
161
|
-
*/
|
|
162
|
-
static getNestedValue(obj, path) {
|
|
163
|
-
return QueryEngine.getNestedValue(obj, path);
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Delete a nested value
|
|
167
|
-
*/
|
|
168
|
-
static deleteNestedValue(obj, path) {
|
|
169
|
-
const parts = path.split('.');
|
|
170
|
-
let current = obj;
|
|
171
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
172
|
-
const part = parts[i];
|
|
173
|
-
if (!(part in current)) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
current = current[part];
|
|
177
|
-
}
|
|
178
|
-
delete current[parts[parts.length - 1]];
|
|
179
|
-
}
|
|
180
|
-
// ============================================================================
|
|
181
|
-
// Field Update Operators
|
|
182
|
-
// ============================================================================
|
|
183
|
-
static applySet(doc, fields) {
|
|
184
|
-
for (const [path, value] of Object.entries(fields)) {
|
|
185
|
-
this.setNestedValue(doc, path, this.deepClone(value));
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
static applyUnset(doc, fields) {
|
|
189
|
-
for (const path of Object.keys(fields)) {
|
|
190
|
-
this.deleteNestedValue(doc, path);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
static applyInc(doc, fields) {
|
|
194
|
-
for (const [path, value] of Object.entries(fields)) {
|
|
195
|
-
const current = this.getNestedValue(doc, path) || 0;
|
|
196
|
-
if (typeof current !== 'number') {
|
|
197
|
-
throw new Error(`Cannot apply $inc to non-numeric field: ${path}`);
|
|
198
|
-
}
|
|
199
|
-
this.setNestedValue(doc, path, current + value);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
static applyMul(doc, fields) {
|
|
203
|
-
for (const [path, value] of Object.entries(fields)) {
|
|
204
|
-
const current = this.getNestedValue(doc, path) || 0;
|
|
205
|
-
if (typeof current !== 'number') {
|
|
206
|
-
throw new Error(`Cannot apply $mul to non-numeric field: ${path}`);
|
|
207
|
-
}
|
|
208
|
-
this.setNestedValue(doc, path, current * value);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
static applyMin(doc, fields) {
|
|
212
|
-
for (const [path, value] of Object.entries(fields)) {
|
|
213
|
-
const current = this.getNestedValue(doc, path);
|
|
214
|
-
if (current === undefined || this.compareValues(value, current) < 0) {
|
|
215
|
-
this.setNestedValue(doc, path, this.deepClone(value));
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
static applyMax(doc, fields) {
|
|
220
|
-
for (const [path, value] of Object.entries(fields)) {
|
|
221
|
-
const current = this.getNestedValue(doc, path);
|
|
222
|
-
if (current === undefined || this.compareValues(value, current) > 0) {
|
|
223
|
-
this.setNestedValue(doc, path, this.deepClone(value));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
static applyRename(doc, fields) {
|
|
228
|
-
for (const [oldPath, newPath] of Object.entries(fields)) {
|
|
229
|
-
const value = this.getNestedValue(doc, oldPath);
|
|
230
|
-
if (value !== undefined) {
|
|
231
|
-
this.deleteNestedValue(doc, oldPath);
|
|
232
|
-
this.setNestedValue(doc, newPath, value);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
static applyCurrentDate(doc, fields) {
|
|
237
|
-
for (const [path, spec] of Object.entries(fields)) {
|
|
238
|
-
if (spec === true) {
|
|
239
|
-
this.setNestedValue(doc, path, new Date());
|
|
240
|
-
}
|
|
241
|
-
else if (typeof spec === 'object' && spec.$type === 'date') {
|
|
242
|
-
this.setNestedValue(doc, path, new Date());
|
|
243
|
-
}
|
|
244
|
-
else if (typeof spec === 'object' && spec.$type === 'timestamp') {
|
|
245
|
-
this.setNestedValue(doc, path, new plugins.bson.Timestamp({ t: Math.floor(Date.now() / 1000), i: 0 }));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// ============================================================================
|
|
250
|
-
// Array Update Operators
|
|
251
|
-
// ============================================================================
|
|
252
|
-
static applyPush(doc, fields, arrayFilters) {
|
|
253
|
-
for (const [path, spec] of Object.entries(fields)) {
|
|
254
|
-
let arr = this.getNestedValue(doc, path);
|
|
255
|
-
if (arr === undefined) {
|
|
256
|
-
arr = [];
|
|
257
|
-
this.setNestedValue(doc, path, arr);
|
|
258
|
-
}
|
|
259
|
-
if (!Array.isArray(arr)) {
|
|
260
|
-
throw new Error(`Cannot apply $push to non-array field: ${path}`);
|
|
261
|
-
}
|
|
262
|
-
if (spec && typeof spec === 'object' && '$each' in spec) {
|
|
263
|
-
// $push with modifiers
|
|
264
|
-
let elements = spec.$each.map(e => this.deepClone(e));
|
|
265
|
-
const position = spec.$position;
|
|
266
|
-
const slice = spec.$slice;
|
|
267
|
-
const sortSpec = spec.$sort;
|
|
268
|
-
if (position !== undefined) {
|
|
269
|
-
arr.splice(position, 0, ...elements);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
arr.push(...elements);
|
|
273
|
-
}
|
|
274
|
-
if (sortSpec !== undefined) {
|
|
275
|
-
if (typeof sortSpec === 'number') {
|
|
276
|
-
arr.sort((a, b) => (a - b) * sortSpec);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
// Sort by field(s)
|
|
280
|
-
const entries = Object.entries(sortSpec);
|
|
281
|
-
arr.sort((a, b) => {
|
|
282
|
-
for (const [field, dir] of entries) {
|
|
283
|
-
const av = this.getNestedValue(a, field);
|
|
284
|
-
const bv = this.getNestedValue(b, field);
|
|
285
|
-
const cmp = this.compareValues(av, bv) * dir;
|
|
286
|
-
if (cmp !== 0)
|
|
287
|
-
return cmp;
|
|
288
|
-
}
|
|
289
|
-
return 0;
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (slice !== undefined) {
|
|
294
|
-
if (slice >= 0) {
|
|
295
|
-
arr.splice(slice);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
arr.splice(0, arr.length + slice);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
// Simple push
|
|
304
|
-
arr.push(this.deepClone(spec));
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
static applyPop(doc, fields) {
|
|
309
|
-
for (const [path, direction] of Object.entries(fields)) {
|
|
310
|
-
const arr = this.getNestedValue(doc, path);
|
|
311
|
-
if (!Array.isArray(arr)) {
|
|
312
|
-
throw new Error(`Cannot apply $pop to non-array field: ${path}`);
|
|
313
|
-
}
|
|
314
|
-
if (direction === 1) {
|
|
315
|
-
arr.pop();
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
arr.shift();
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
static applyPull(doc, fields, arrayFilters) {
|
|
323
|
-
for (const [path, condition] of Object.entries(fields)) {
|
|
324
|
-
const arr = this.getNestedValue(doc, path);
|
|
325
|
-
if (!Array.isArray(arr)) {
|
|
326
|
-
continue; // Skip if not an array
|
|
327
|
-
}
|
|
328
|
-
if (typeof condition === 'object' && condition !== null && !Array.isArray(condition)) {
|
|
329
|
-
// Condition is a query filter
|
|
330
|
-
const hasOperators = Object.keys(condition).some(k => k.startsWith('$'));
|
|
331
|
-
if (hasOperators) {
|
|
332
|
-
// Filter using query operators
|
|
333
|
-
const remaining = arr.filter(item => !QueryEngine.matches(item, condition));
|
|
334
|
-
arr.length = 0;
|
|
335
|
-
arr.push(...remaining);
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
// Match documents with all specified fields
|
|
339
|
-
const remaining = arr.filter(item => {
|
|
340
|
-
if (typeof item !== 'object' || item === null) {
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
return !Object.entries(condition).every(([k, v]) => {
|
|
344
|
-
const itemVal = this.getNestedValue(item, k);
|
|
345
|
-
return this.valuesEqual(itemVal, v);
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
arr.length = 0;
|
|
349
|
-
arr.push(...remaining);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
// Direct value match
|
|
354
|
-
const remaining = arr.filter(item => !this.valuesEqual(item, condition));
|
|
355
|
-
arr.length = 0;
|
|
356
|
-
arr.push(...remaining);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
static applyPullAll(doc, fields) {
|
|
361
|
-
for (const [path, values] of Object.entries(fields)) {
|
|
362
|
-
const arr = this.getNestedValue(doc, path);
|
|
363
|
-
if (!Array.isArray(arr)) {
|
|
364
|
-
continue;
|
|
365
|
-
}
|
|
366
|
-
if (!Array.isArray(values)) {
|
|
367
|
-
throw new Error(`$pullAll requires an array argument`);
|
|
368
|
-
}
|
|
369
|
-
const valueSet = new Set(values.map(v => JSON.stringify(v)));
|
|
370
|
-
const remaining = arr.filter(item => !valueSet.has(JSON.stringify(item)));
|
|
371
|
-
arr.length = 0;
|
|
372
|
-
arr.push(...remaining);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
static applyAddToSet(doc, fields) {
|
|
376
|
-
for (const [path, spec] of Object.entries(fields)) {
|
|
377
|
-
let arr = this.getNestedValue(doc, path);
|
|
378
|
-
if (arr === undefined) {
|
|
379
|
-
arr = [];
|
|
380
|
-
this.setNestedValue(doc, path, arr);
|
|
381
|
-
}
|
|
382
|
-
if (!Array.isArray(arr)) {
|
|
383
|
-
throw new Error(`Cannot apply $addToSet to non-array field: ${path}`);
|
|
384
|
-
}
|
|
385
|
-
const existingSet = new Set(arr.map(v => JSON.stringify(v)));
|
|
386
|
-
if (spec && typeof spec === 'object' && '$each' in spec) {
|
|
387
|
-
for (const item of spec.$each) {
|
|
388
|
-
const key = JSON.stringify(item);
|
|
389
|
-
if (!existingSet.has(key)) {
|
|
390
|
-
arr.push(this.deepClone(item));
|
|
391
|
-
existingSet.add(key);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
const key = JSON.stringify(spec);
|
|
397
|
-
if (!existingSet.has(key)) {
|
|
398
|
-
arr.push(this.deepClone(spec));
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
static applyBit(doc, fields) {
|
|
404
|
-
for (const [path, operations] of Object.entries(fields)) {
|
|
405
|
-
let current = this.getNestedValue(doc, path) || 0;
|
|
406
|
-
if (typeof current !== 'number') {
|
|
407
|
-
throw new Error(`Cannot apply $bit to non-numeric field: ${path}`);
|
|
408
|
-
}
|
|
409
|
-
for (const [op, value] of Object.entries(operations)) {
|
|
410
|
-
switch (op) {
|
|
411
|
-
case 'and':
|
|
412
|
-
current = current & value;
|
|
413
|
-
break;
|
|
414
|
-
case 'or':
|
|
415
|
-
current = current | value;
|
|
416
|
-
break;
|
|
417
|
-
case 'xor':
|
|
418
|
-
current = current ^ value;
|
|
419
|
-
break;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
this.setNestedValue(doc, path, current);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
// ============================================================================
|
|
426
|
-
// Helper Methods
|
|
427
|
-
// ============================================================================
|
|
428
|
-
static compareValues(a, b) {
|
|
429
|
-
if (a === b)
|
|
430
|
-
return 0;
|
|
431
|
-
if (a === null || a === undefined)
|
|
432
|
-
return -1;
|
|
433
|
-
if (b === null || b === undefined)
|
|
434
|
-
return 1;
|
|
435
|
-
if (typeof a === 'number' && typeof b === 'number') {
|
|
436
|
-
return a - b;
|
|
437
|
-
}
|
|
438
|
-
if (a instanceof Date && b instanceof Date) {
|
|
439
|
-
return a.getTime() - b.getTime();
|
|
440
|
-
}
|
|
441
|
-
if (typeof a === 'string' && typeof b === 'string') {
|
|
442
|
-
return a.localeCompare(b);
|
|
443
|
-
}
|
|
444
|
-
return String(a).localeCompare(String(b));
|
|
445
|
-
}
|
|
446
|
-
static valuesEqual(a, b) {
|
|
447
|
-
if (a === b)
|
|
448
|
-
return true;
|
|
449
|
-
if (a instanceof plugins.bson.ObjectId && b instanceof plugins.bson.ObjectId) {
|
|
450
|
-
return a.equals(b);
|
|
451
|
-
}
|
|
452
|
-
if (a instanceof Date && b instanceof Date) {
|
|
453
|
-
return a.getTime() === b.getTime();
|
|
454
|
-
}
|
|
455
|
-
if (typeof a === 'object' && typeof b === 'object' && a !== null && b !== null) {
|
|
456
|
-
return JSON.stringify(a) === JSON.stringify(b);
|
|
457
|
-
}
|
|
458
|
-
return false;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlRW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY29uZ29kYi9lbmdpbmUvVXBkYXRlRW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDdkI7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUF5QixFQUFFLE1BQWdCLEVBQUUsWUFBeUI7UUFDdkYsa0RBQWtEO1FBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLHFEQUFxRDtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV0RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsdUNBQXVDO1lBQ3ZDLE9BQU87Z0JBQ0wsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO2dCQUNqQixHQUFHLE1BQU07YUFDVixDQUFDO1FBQ0osQ0FBQztRQUVELHlCQUF5QjtRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhDLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxNQUFN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QUUsQ0FBTTtRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0UsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiJ9
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base error class for all CongoDB errors
|
|
3
|
-
* Mirrors MongoDB driver error hierarchy
|
|
4
|
-
*/
|
|
5
|
-
export class CongoError extends Error {
|
|
6
|
-
code;
|
|
7
|
-
codeName;
|
|
8
|
-
constructor(message, code, codeName) {
|
|
9
|
-
super(message);
|
|
10
|
-
this.name = 'CongoError';
|
|
11
|
-
this.code = code;
|
|
12
|
-
this.codeName = codeName;
|
|
13
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Error thrown during connection issues
|
|
18
|
-
*/
|
|
19
|
-
export class CongoConnectionError extends CongoError {
|
|
20
|
-
constructor(message) {
|
|
21
|
-
super(message);
|
|
22
|
-
this.name = 'CongoConnectionError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Error thrown when an operation times out
|
|
27
|
-
*/
|
|
28
|
-
export class CongoTimeoutError extends CongoError {
|
|
29
|
-
constructor(message) {
|
|
30
|
-
super(message, 50, 'MaxTimeMSExpired');
|
|
31
|
-
this.name = 'CongoTimeoutError';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Error thrown during write operations
|
|
36
|
-
*/
|
|
37
|
-
export class CongoWriteError extends CongoError {
|
|
38
|
-
writeErrors;
|
|
39
|
-
result;
|
|
40
|
-
constructor(message, code, writeErrors) {
|
|
41
|
-
super(message, code);
|
|
42
|
-
this.name = 'CongoWriteError';
|
|
43
|
-
this.writeErrors = writeErrors;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Error thrown for duplicate key violations
|
|
48
|
-
*/
|
|
49
|
-
export class CongoDuplicateKeyError extends CongoWriteError {
|
|
50
|
-
keyPattern;
|
|
51
|
-
keyValue;
|
|
52
|
-
constructor(message, keyPattern, keyValue) {
|
|
53
|
-
super(message, 11000);
|
|
54
|
-
this.name = 'CongoDuplicateKeyError';
|
|
55
|
-
this.codeName = 'DuplicateKey';
|
|
56
|
-
this.keyPattern = keyPattern;
|
|
57
|
-
this.keyValue = keyValue;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Error thrown for bulk write failures
|
|
62
|
-
*/
|
|
63
|
-
export class CongoBulkWriteError extends CongoError {
|
|
64
|
-
writeErrors;
|
|
65
|
-
result;
|
|
66
|
-
constructor(message, writeErrors, result) {
|
|
67
|
-
super(message, 65);
|
|
68
|
-
this.name = 'CongoBulkWriteError';
|
|
69
|
-
this.writeErrors = writeErrors;
|
|
70
|
-
this.result = result;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Error thrown during transaction operations
|
|
75
|
-
*/
|
|
76
|
-
export class CongoTransactionError extends CongoError {
|
|
77
|
-
constructor(message, code) {
|
|
78
|
-
super(message, code);
|
|
79
|
-
this.name = 'CongoTransactionError';
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Error thrown when a transaction is aborted due to conflict
|
|
84
|
-
*/
|
|
85
|
-
export class CongoWriteConflictError extends CongoTransactionError {
|
|
86
|
-
constructor(message = 'Write conflict during transaction') {
|
|
87
|
-
super(message, 112);
|
|
88
|
-
this.name = 'CongoWriteConflictError';
|
|
89
|
-
this.codeName = 'WriteConflict';
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Error thrown for invalid arguments
|
|
94
|
-
*/
|
|
95
|
-
export class CongoArgumentError extends CongoError {
|
|
96
|
-
constructor(message) {
|
|
97
|
-
super(message);
|
|
98
|
-
this.name = 'CongoArgumentError';
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Error thrown when an operation is not supported
|
|
103
|
-
*/
|
|
104
|
-
export class CongoNotSupportedError extends CongoError {
|
|
105
|
-
constructor(message) {
|
|
106
|
-
super(message, 115);
|
|
107
|
-
this.name = 'CongoNotSupportedError';
|
|
108
|
-
this.codeName = 'CommandNotSupported';
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Error thrown when cursor is exhausted or closed
|
|
113
|
-
*/
|
|
114
|
-
export class CongoCursorError extends CongoError {
|
|
115
|
-
constructor(message) {
|
|
116
|
-
super(message);
|
|
117
|
-
this.name = 'CongoCursorError';
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Error thrown when a namespace (database.collection) is invalid
|
|
122
|
-
*/
|
|
123
|
-
export class CongoNamespaceError extends CongoError {
|
|
124
|
-
constructor(message) {
|
|
125
|
-
super(message, 73);
|
|
126
|
-
this.name = 'CongoNamespaceError';
|
|
127
|
-
this.codeName = 'InvalidNamespace';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Error thrown when an index operation fails
|
|
132
|
-
*/
|
|
133
|
-
export class CongoIndexError extends CongoError {
|
|
134
|
-
constructor(message, code) {
|
|
135
|
-
super(message, code || 86);
|
|
136
|
-
this.name = 'CongoIndexError';
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Convert any error to a CongoError
|
|
141
|
-
*/
|
|
142
|
-
export function toCongoError(error) {
|
|
143
|
-
if (error instanceof CongoError) {
|
|
144
|
-
return error;
|
|
145
|
-
}
|
|
146
|
-
const congoError = new CongoError(error.message || String(error));
|
|
147
|
-
if (error.code) {
|
|
148
|
-
congoError.code = error.code;
|
|
149
|
-
}
|
|
150
|
-
if (error.codeName) {
|
|
151
|
-
congoError.codeName = error.codeName;
|
|
152
|
-
}
|
|
153
|
-
return congoError;
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZ29FcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25nb2RiL2Vycm9ycy9Db25nb0Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLEtBQUs7SUFDNUIsSUFBSSxDQUFVO0lBQ2QsUUFBUSxDQUFVO0lBRXpCLFlBQVksT0FBZSxFQUFFLElBQWEsRUFBRSxRQUFpQjtRQUMzRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFVBQVU7SUFDbEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsVUFBVTtJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsVUFBVTtJQUN0QyxXQUFXLENBQWlCO0lBQzVCLE1BQU0sQ0FBTztJQUVwQixZQUFZLE9BQWUsRUFBRSxJQUFhLEVBQUUsV0FBMkI7UUFDckUsS0FBSyxD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
|