@push.rocks/smartmongo 2.2.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 +25 -25
- 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
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import * as plugins from '../tsmdb.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlRW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdHNtZGIvZW5naW5lL1VwZGF0ZUVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBeUIsRUFBRSxNQUFnQixFQUFFLFlBQXlCO1FBQ3ZGLGtEQUFrRDtRQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixxREFBcUQ7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCwrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLHVDQUF1QztZQUN2QyxPQUFPO2dCQUNMLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsR0FBRyxNQUFNO2FBQ1YsQ0FBQztRQUNKLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4QyxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pELFFBQVEsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssTUFBTTtvQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDL0IsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2pDLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUNSLEtBQUssTUFBTTtvQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDL0IsTUFBTTtnQkFDUixLQUFLLE1BQU07b0JBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9CLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixLQUFLLGNBQWM7b0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1IsS0FBSyxjQUFjO29CQUNqQix1REFBdUQ7b0JBQ3ZELE1BQU07Z0JBQ1IsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDOUMsTUFBTTtnQkFDUixLQUFLLE1BQU07b0JBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9CLE1BQU07Z0JBQ1IsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDOUMsTUFBTTtnQkFDUixLQUFLLFVBQVU7b0JBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1IsS0FBSyxXQUFXO29CQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUNSLEtBQUssTUFBTTtvQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDL0IsTUFBTTtnQkFDUjtvQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQXlCLEVBQUUsV0FBcUI7UUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQVE7UUFDL0IsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELElBQUksR0FBRyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLEdBQUcsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxLQUFVO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV0Qiw4QkFBOEI7WUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xELElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDM0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxDQUFDO2dCQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLFNBQVM7WUFDWCxDQUFDO1lBRUQsMENBQTBDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDbEQsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFFbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPO1lBQ1QsQ0FBQztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELCtFQUErRTtJQUMvRSx5QkFBeUI7SUFDekIsK0VBQStFO0lBRXZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVEsRUFBRSxNQUFnQjtRQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFJLEtBQWdCLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUksS0FBZ0IsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDbkQsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ3hELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwrRUFBK0U7SUFDL0UseUJBQXlCO0lBQ3pCLCtFQUErRTtJQUV2RSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQVEsRUFBRSxNQUFnQixFQUFFLFlBQXlCO1FBQzVFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFFRCxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN4RCx1QkFBdUI7Z0JBQ3ZCLElBQUksUUFBUSxHQUFJLElBQUksQ0FBQyxLQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBK0IsQ0FBQztnQkFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQTRCLENBQUM7Z0JBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBRTVCLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMzQixHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFFRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDakMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO29CQUN6QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sbUJBQW1CO3dCQUNuQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQW9CLENBQUMsQ0FBQzt3QkFDckQsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDaEIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dDQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQ0FDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQWMsQ0FBQztnQ0FDekQsSUFBSSxHQUFHLEtBQUssQ0FBQztvQ0FBRSxPQUFPLEdBQUcsQ0FBQzs0QkFDNUIsQ0FBQzs0QkFDRCxPQUFPLENBQUMsQ0FBQzt3QkFDWCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hCLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sY0FBYztnQkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVEsRUFBRSxNQUFnQjtRQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUVELElBQUssU0FBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBUSxFQUFFLE1BQWdCLEVBQUUsWUFBeUI7UUFDNUUsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixTQUFTLENBQUMsdUJBQXVCO1lBQ25DLENBQUM7WUFFRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNyRiw4QkFBOEI7Z0JBQzlCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUNqQiwrQkFBK0I7b0JBQy9CLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzVFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDekIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLDRDQUE0QztvQkFDNUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDbEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUM5QyxPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDO3dCQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7NEJBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUM3QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDSCxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDZixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04scUJBQXFCO2dCQUNyQixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDcEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVEsRUFBRSxNQUFnQjtRQUNyRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdELElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQWMsRUFBRSxDQUFDO29CQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdkIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLFFBQVEsRUFBRSxFQUFFLENBQUM7b0JBQ1gsS0FBSyxLQUFLO3dCQUNSLE9BQU8sR0FBRyxPQUFPLEdBQUksS0FBZ0IsQ0FBQzt3QkFDdEMsTUFBTTtvQkFDUixLQUFLLElBQUk7d0JBQ1AsT0FBTyxHQUFHLE9BQU8sR0FBSSxLQUFnQixDQUFDO3dCQUN0QyxNQUFNO29CQUNSLEtBQUssS0FBSzt3QkFDUixPQUFPLEdBQUcsT0FBTyxHQUFJLEtBQWdCLENBQUM7d0JBQ3RDLE1BQU07Z0JBQ1YsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsaUJBQWlCO0lBQ2pCLCtFQUErRTtJQUV2RSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVM7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTVDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMvRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YifQ==
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Base error class for all
|
|
2
|
+
* Base error class for all TsmDB errors
|
|
3
3
|
* Mirrors MongoDB driver error hierarchy
|
|
4
4
|
*/
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class TsmdbError extends Error {
|
|
6
6
|
code?: number;
|
|
7
7
|
codeName?: string;
|
|
8
8
|
constructor(message: string, code?: number, codeName?: string);
|
|
@@ -10,19 +10,19 @@ export declare class CongoError extends Error {
|
|
|
10
10
|
/**
|
|
11
11
|
* Error thrown during connection issues
|
|
12
12
|
*/
|
|
13
|
-
export declare class
|
|
13
|
+
export declare class TsmdbConnectionError extends TsmdbError {
|
|
14
14
|
constructor(message: string);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* Error thrown when an operation times out
|
|
18
18
|
*/
|
|
19
|
-
export declare class
|
|
19
|
+
export declare class TsmdbTimeoutError extends TsmdbError {
|
|
20
20
|
constructor(message: string);
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Error thrown during write operations
|
|
24
24
|
*/
|
|
25
|
-
export declare class
|
|
25
|
+
export declare class TsmdbWriteError extends TsmdbError {
|
|
26
26
|
writeErrors?: IWriteError[];
|
|
27
27
|
result?: any;
|
|
28
28
|
constructor(message: string, code?: number, writeErrors?: IWriteError[]);
|
|
@@ -30,7 +30,7 @@ export declare class CongoWriteError extends CongoError {
|
|
|
30
30
|
/**
|
|
31
31
|
* Error thrown for duplicate key violations
|
|
32
32
|
*/
|
|
33
|
-
export declare class
|
|
33
|
+
export declare class TsmdbDuplicateKeyError extends TsmdbWriteError {
|
|
34
34
|
keyPattern?: Record<string, 1>;
|
|
35
35
|
keyValue?: Record<string, any>;
|
|
36
36
|
constructor(message: string, keyPattern?: Record<string, 1>, keyValue?: Record<string, any>);
|
|
@@ -38,7 +38,7 @@ export declare class CongoDuplicateKeyError extends CongoWriteError {
|
|
|
38
38
|
/**
|
|
39
39
|
* Error thrown for bulk write failures
|
|
40
40
|
*/
|
|
41
|
-
export declare class
|
|
41
|
+
export declare class TsmdbBulkWriteError extends TsmdbError {
|
|
42
42
|
writeErrors: IWriteError[];
|
|
43
43
|
result: any;
|
|
44
44
|
constructor(message: string, writeErrors: IWriteError[], result: any);
|
|
@@ -46,43 +46,43 @@ export declare class CongoBulkWriteError extends CongoError {
|
|
|
46
46
|
/**
|
|
47
47
|
* Error thrown during transaction operations
|
|
48
48
|
*/
|
|
49
|
-
export declare class
|
|
49
|
+
export declare class TsmdbTransactionError extends TsmdbError {
|
|
50
50
|
constructor(message: string, code?: number);
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
53
|
* Error thrown when a transaction is aborted due to conflict
|
|
54
54
|
*/
|
|
55
|
-
export declare class
|
|
55
|
+
export declare class TsmdbWriteConflictError extends TsmdbTransactionError {
|
|
56
56
|
constructor(message?: string);
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Error thrown for invalid arguments
|
|
60
60
|
*/
|
|
61
|
-
export declare class
|
|
61
|
+
export declare class TsmdbArgumentError extends TsmdbError {
|
|
62
62
|
constructor(message: string);
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
65
|
* Error thrown when an operation is not supported
|
|
66
66
|
*/
|
|
67
|
-
export declare class
|
|
67
|
+
export declare class TsmdbNotSupportedError extends TsmdbError {
|
|
68
68
|
constructor(message: string);
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
71
|
* Error thrown when cursor is exhausted or closed
|
|
72
72
|
*/
|
|
73
|
-
export declare class
|
|
73
|
+
export declare class TsmdbCursorError extends TsmdbError {
|
|
74
74
|
constructor(message: string);
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
77
|
* Error thrown when a namespace (database.collection) is invalid
|
|
78
78
|
*/
|
|
79
|
-
export declare class
|
|
79
|
+
export declare class TsmdbNamespaceError extends TsmdbError {
|
|
80
80
|
constructor(message: string);
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
83
|
* Error thrown when an index operation fails
|
|
84
84
|
*/
|
|
85
|
-
export declare class
|
|
85
|
+
export declare class TsmdbIndexError extends TsmdbError {
|
|
86
86
|
constructor(message: string, code?: number);
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
@@ -95,6 +95,6 @@ export interface IWriteError {
|
|
|
95
95
|
op: any;
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
|
-
* Convert any error to a
|
|
98
|
+
* Convert any error to a TsmdbError
|
|
99
99
|
*/
|
|
100
|
-
export declare function
|
|
100
|
+
export declare function toTsmdbError(error: any): TsmdbError;
|