@nymphjs/nymph 1.0.0-beta.5 → 1.0.0-beta.50
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/CHANGELOG.md +231 -0
- package/README.md +15 -15
- package/dist/Entity.d.ts +24 -3
- package/dist/Entity.js +194 -86
- package/dist/Entity.js.map +1 -1
- package/dist/Entity.test.js +34 -17
- package/dist/Entity.test.js.map +1 -1
- package/dist/Entity.types.d.ts +3 -1
- package/dist/Nymph.d.ts +22 -7
- package/dist/Nymph.js +214 -68
- package/dist/Nymph.js.map +1 -1
- package/dist/Nymph.types.d.ts +18 -5
- package/dist/Nymph.types.js +1 -1
- package/dist/Nymph.types.js.map +1 -1
- package/dist/driver/NymphDriver.d.ts +1 -22
- package/dist/driver/NymphDriver.js +85 -105
- package/dist/driver/NymphDriver.js.map +1 -1
- package/dist/driver/testArtifacts.js +208 -159
- package/dist/driver/testArtifacts.js.map +1 -1
- package/dist/errors/InvalidStateError.d.ts +3 -0
- package/dist/errors/InvalidStateError.js +11 -0
- package/dist/errors/InvalidStateError.js.map +1 -0
- package/dist/errors/QueryFailedError.js.map +1 -1
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/testArtifacts.d.ts +10 -3
- package/dist/testArtifacts.js +20 -11
- package/dist/testArtifacts.js.map +1 -1
- package/dist/testMocks.d.ts +10 -7
- package/dist/testMocks.js +22 -10
- package/dist/testMocks.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +11 -5
- package/dist/utils.js.map +1 -1
- package/package.json +15 -15
- package/src/Entity.test.ts +33 -11
- package/src/Entity.ts +303 -127
- package/src/Entity.types.ts +13 -1
- package/src/Nymph.ts +392 -88
- package/src/Nymph.types.ts +95 -24
- package/src/driver/NymphDriver.ts +203 -282
- package/src/driver/testArtifacts.ts +238 -157
- package/src/errors/InvalidStateError.ts +6 -0
- package/src/errors/index.ts +2 -0
- package/src/nymphJoiProps.ts +2 -2
- package/src/testArtifacts.ts +28 -10
- package/src/testMocks.ts +42 -25
- package/src/utils.ts +22 -8
- package/typedoc.json +4 -0
|
@@ -28,7 +28,7 @@ export default abstract class NymphDriver {
|
|
|
28
28
|
protected nymph: Nymph = new Proxy({} as Nymph, {
|
|
29
29
|
get() {
|
|
30
30
|
throw new Error(
|
|
31
|
-
'Attempted access of Nymph instance before driver initialization!'
|
|
31
|
+
'Attempted access of Nymph instance before driver initialization!',
|
|
32
32
|
);
|
|
33
33
|
},
|
|
34
34
|
});
|
|
@@ -54,7 +54,18 @@ export default abstract class NymphDriver {
|
|
|
54
54
|
*/
|
|
55
55
|
private putDataCounter = 0;
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* This is used internally by Nymph. Don't call it yourself.
|
|
59
|
+
*
|
|
60
|
+
* @returns A clone of this instance.
|
|
61
|
+
*/
|
|
62
|
+
abstract clone(): NymphDriver;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Connect to the data store.
|
|
66
|
+
*/
|
|
57
67
|
abstract connect(): Promise<boolean>;
|
|
68
|
+
|
|
58
69
|
abstract isConnected(): boolean;
|
|
59
70
|
abstract startTransaction(name: string): Promise<Nymph>;
|
|
60
71
|
abstract commit(name: string): Promise<boolean>;
|
|
@@ -62,13 +73,18 @@ export default abstract class NymphDriver {
|
|
|
62
73
|
abstract inTransaction(): Promise<boolean>;
|
|
63
74
|
abstract deleteEntityByID(
|
|
64
75
|
guid: string,
|
|
65
|
-
classConstructor: EntityConstructor
|
|
76
|
+
classConstructor: EntityConstructor,
|
|
66
77
|
): Promise<boolean>;
|
|
67
78
|
abstract deleteEntityByID(guid: string, className?: string): Promise<boolean>;
|
|
68
79
|
abstract deleteUID(name: string): Promise<boolean>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Disconnect from the data store.
|
|
83
|
+
*/
|
|
69
84
|
abstract disconnect(): Promise<boolean>;
|
|
85
|
+
|
|
70
86
|
protected abstract exportEntities(
|
|
71
|
-
writeLine: (line: string) => void
|
|
87
|
+
writeLine: (line: string) => void,
|
|
72
88
|
): Promise<void>;
|
|
73
89
|
abstract getEntities<T extends EntityConstructor = EntityConstructor>(
|
|
74
90
|
options: Options<T> & { return: 'count' },
|
|
@@ -86,30 +102,6 @@ export default abstract class NymphDriver {
|
|
|
86
102
|
options?: Options<T>,
|
|
87
103
|
...selectors: Selector[]
|
|
88
104
|
): Promise<ReturnType<T['factorySync']>[] | string[] | number>;
|
|
89
|
-
protected abstract getEntitiesSync<
|
|
90
|
-
T extends EntityConstructor = EntityConstructor
|
|
91
|
-
>(
|
|
92
|
-
options: Options<T> & { return: 'count' },
|
|
93
|
-
...selectors: Selector[]
|
|
94
|
-
): number;
|
|
95
|
-
protected abstract getEntitiesSync<
|
|
96
|
-
T extends EntityConstructor = EntityConstructor
|
|
97
|
-
>(
|
|
98
|
-
options: Options<T> & { return: 'guid' },
|
|
99
|
-
...selectors: Selector[]
|
|
100
|
-
): string[];
|
|
101
|
-
protected abstract getEntitiesSync<
|
|
102
|
-
T extends EntityConstructor = EntityConstructor
|
|
103
|
-
>(
|
|
104
|
-
options?: Options<T>,
|
|
105
|
-
...selectors: Selector[]
|
|
106
|
-
): ReturnType<T['factorySync']>[];
|
|
107
|
-
protected abstract getEntitiesSync<
|
|
108
|
-
T extends EntityConstructor = EntityConstructor
|
|
109
|
-
>(
|
|
110
|
-
options?: Options<T>,
|
|
111
|
-
...selectors: Selector[]
|
|
112
|
-
): ReturnType<T['factorySync']>[] | string[] | number;
|
|
113
105
|
abstract getUID(name: string): Promise<number | null>;
|
|
114
106
|
abstract import(filename: string): Promise<boolean>;
|
|
115
107
|
abstract newUID(name: string): Promise<number | null>;
|
|
@@ -131,7 +123,7 @@ export default abstract class NymphDriver {
|
|
|
131
123
|
protected posixRegexMatch(
|
|
132
124
|
pattern: string,
|
|
133
125
|
subject: string,
|
|
134
|
-
caseInsensitive = false
|
|
126
|
+
caseInsensitive = false,
|
|
135
127
|
) {
|
|
136
128
|
const posixClasses = [
|
|
137
129
|
// '[[:<:]]',
|
|
@@ -211,11 +203,11 @@ export default abstract class NymphDriver {
|
|
|
211
203
|
guid: string,
|
|
212
204
|
tags: string[],
|
|
213
205
|
sdata: SerializedEntityData,
|
|
214
|
-
etype: string
|
|
206
|
+
etype: string,
|
|
215
207
|
) => Promise<void>,
|
|
216
208
|
saveUIDCallback: (name: string, value: number) => Promise<void>,
|
|
217
209
|
startTransactionCallback: (() => Promise<void>) | null = null,
|
|
218
|
-
commitTransactionCallback: (() => Promise<void>) | null = null
|
|
210
|
+
commitTransactionCallback: (() => Promise<void>) | null = null,
|
|
219
211
|
) {
|
|
220
212
|
let rl: ReadLines;
|
|
221
213
|
try {
|
|
@@ -237,7 +229,7 @@ export default abstract class NymphDriver {
|
|
|
237
229
|
continue;
|
|
238
230
|
}
|
|
239
231
|
const entityMatch = text.match(
|
|
240
|
-
/^\s*{([0-9A-Fa-f]+)}<([-\w_]+)>\[([^\]]*)\]\s
|
|
232
|
+
/^\s*{([0-9A-Fa-f]+)}<([-\w_]+)>\[([^\]]*)\]\s*$/,
|
|
241
233
|
);
|
|
242
234
|
const propMatch = text.match(/^\s*([^=]+)\s*=\s*(.*\S)\s*$/);
|
|
243
235
|
const uidMatch = text.match(/^\s*<([^>]+)>\[(\d+)\]\s*$/);
|
|
@@ -281,7 +273,7 @@ export default abstract class NymphDriver {
|
|
|
281
273
|
sdata: SerializedEntityData,
|
|
282
274
|
selectors: Selector[],
|
|
283
275
|
guid: string | null = null,
|
|
284
|
-
tags: string[] | null = null
|
|
276
|
+
tags: string[] | null = null,
|
|
285
277
|
) {
|
|
286
278
|
const formattedSelectors = this.formatSelectors(selectors).selectors;
|
|
287
279
|
|
|
@@ -298,186 +290,173 @@ export default abstract class NymphDriver {
|
|
|
298
290
|
continue;
|
|
299
291
|
}
|
|
300
292
|
|
|
301
|
-
const clauseNot = key.
|
|
293
|
+
const clauseNot = key.substring(0, 1) === '!';
|
|
302
294
|
if (key === 'selector' || key === '!selector') {
|
|
303
295
|
const tmpArr = (Array.isArray(value) ? value : [value]) as Selector[];
|
|
304
296
|
pass = xor(
|
|
305
297
|
this.checkData(data, sdata, tmpArr, guid, tags),
|
|
306
|
-
xor(typeIsNot, clauseNot)
|
|
298
|
+
xor(typeIsNot, clauseNot),
|
|
307
299
|
);
|
|
308
300
|
} else {
|
|
309
301
|
if (key === 'qref' || key === '!qref') {
|
|
310
302
|
throw new Error("Can't use checkData on qref clauses.");
|
|
311
303
|
} else {
|
|
312
|
-
// Check if it doesn't pass any for &, check if it
|
|
313
|
-
// passes any for |.
|
|
304
|
+
// Check if it doesn't pass any for &, check if it passes any for |.
|
|
314
305
|
for (const curValue of value) {
|
|
315
306
|
if (curValue == null) {
|
|
316
307
|
continue;
|
|
317
308
|
}
|
|
318
309
|
|
|
319
|
-
|
|
320
|
-
((key === 'guid' || key === '!guid') && guid == null) ||
|
|
321
|
-
((key === 'tag' || key === '!tag') && tags == null)
|
|
322
|
-
) {
|
|
323
|
-
// Skip because it has already been checked (by the query).
|
|
324
|
-
pass = true;
|
|
325
|
-
} else {
|
|
326
|
-
const propName = (curValue as string[])[0];
|
|
310
|
+
const propName = (curValue as string[])[0];
|
|
327
311
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
312
|
+
// Unserialize the data for this variable.
|
|
313
|
+
if (propName in sdata) {
|
|
314
|
+
data[propName] = JSON.parse(sdata[propName]);
|
|
315
|
+
delete sdata[propName];
|
|
316
|
+
}
|
|
333
317
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
)
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
pass = xor(
|
|
475
|
-
propName in data && data[propName] <= testLTEValue,
|
|
476
|
-
xor(typeIsNot, clauseNot)
|
|
477
|
-
);
|
|
478
|
-
break;
|
|
479
|
-
}
|
|
318
|
+
switch (key) {
|
|
319
|
+
case 'guid':
|
|
320
|
+
case '!guid':
|
|
321
|
+
pass = xor(guid == propName, xor(typeIsNot, clauseNot));
|
|
322
|
+
break;
|
|
323
|
+
case 'tag':
|
|
324
|
+
case '!tag':
|
|
325
|
+
pass = xor(
|
|
326
|
+
(tags ?? []).indexOf(propName) !== -1,
|
|
327
|
+
xor(typeIsNot, clauseNot),
|
|
328
|
+
);
|
|
329
|
+
break;
|
|
330
|
+
case 'defined':
|
|
331
|
+
case '!defined':
|
|
332
|
+
pass = xor(propName in data, xor(typeIsNot, clauseNot));
|
|
333
|
+
break;
|
|
334
|
+
case 'truthy':
|
|
335
|
+
case '!truthy':
|
|
336
|
+
pass = xor(
|
|
337
|
+
propName in data && data[propName],
|
|
338
|
+
xor(typeIsNot, clauseNot),
|
|
339
|
+
);
|
|
340
|
+
break;
|
|
341
|
+
case 'ref':
|
|
342
|
+
case '!ref':
|
|
343
|
+
const testRefValue = (curValue as [string, any])[1] as any;
|
|
344
|
+
pass = xor(
|
|
345
|
+
propName in data &&
|
|
346
|
+
this.entityReferenceSearch(data[propName], testRefValue),
|
|
347
|
+
xor(typeIsNot, clauseNot),
|
|
348
|
+
);
|
|
349
|
+
break;
|
|
350
|
+
case 'equal':
|
|
351
|
+
case '!equal':
|
|
352
|
+
const testEqualValue = (curValue as [string, any])[1] as any;
|
|
353
|
+
pass = xor(
|
|
354
|
+
propName in data &&
|
|
355
|
+
JSON.stringify(data[propName]) ===
|
|
356
|
+
JSON.stringify(testEqualValue),
|
|
357
|
+
xor(typeIsNot, clauseNot),
|
|
358
|
+
);
|
|
359
|
+
break;
|
|
360
|
+
case 'contain':
|
|
361
|
+
case '!contain':
|
|
362
|
+
const testContainValue = (
|
|
363
|
+
curValue as [string, any]
|
|
364
|
+
)[1] as any;
|
|
365
|
+
pass = xor(
|
|
366
|
+
propName in data &&
|
|
367
|
+
JSON.stringify(data[propName]).indexOf(
|
|
368
|
+
JSON.stringify(testContainValue),
|
|
369
|
+
) !== -1,
|
|
370
|
+
xor(typeIsNot, clauseNot),
|
|
371
|
+
);
|
|
372
|
+
break;
|
|
373
|
+
case 'like':
|
|
374
|
+
case '!like':
|
|
375
|
+
const testLikeValue = (
|
|
376
|
+
curValue as [string, string]
|
|
377
|
+
)[1] as string;
|
|
378
|
+
pass = xor(
|
|
379
|
+
propName in data &&
|
|
380
|
+
new RegExp(
|
|
381
|
+
'^' +
|
|
382
|
+
escapeRegExp(testLikeValue)
|
|
383
|
+
.replace('%', () => '.*')
|
|
384
|
+
.replace('_', () => '.') +
|
|
385
|
+
'$',
|
|
386
|
+
).test(data[propName]),
|
|
387
|
+
xor(typeIsNot, clauseNot),
|
|
388
|
+
);
|
|
389
|
+
break;
|
|
390
|
+
case 'match':
|
|
391
|
+
case '!match':
|
|
392
|
+
const testMatchValue = (
|
|
393
|
+
curValue as [string, string]
|
|
394
|
+
)[1] as string;
|
|
395
|
+
// Convert a POSIX regex to a JS regex.
|
|
396
|
+
pass = xor(
|
|
397
|
+
propName in data &&
|
|
398
|
+
this.posixRegexMatch(testMatchValue, data[propName]),
|
|
399
|
+
xor(typeIsNot, clauseNot),
|
|
400
|
+
);
|
|
401
|
+
break;
|
|
402
|
+
case 'imatch':
|
|
403
|
+
case '!imatch':
|
|
404
|
+
const testIMatchValue = (
|
|
405
|
+
curValue as [string, string]
|
|
406
|
+
)[1] as string;
|
|
407
|
+
// Convert a POSIX regex to a JS regex.
|
|
408
|
+
pass = xor(
|
|
409
|
+
propName in data &&
|
|
410
|
+
this.posixRegexMatch(
|
|
411
|
+
testIMatchValue,
|
|
412
|
+
data[propName],
|
|
413
|
+
true,
|
|
414
|
+
),
|
|
415
|
+
xor(typeIsNot, clauseNot),
|
|
416
|
+
);
|
|
417
|
+
break;
|
|
418
|
+
case 'gt':
|
|
419
|
+
case '!gt':
|
|
420
|
+
const testGTValue = (
|
|
421
|
+
curValue as [string, number]
|
|
422
|
+
)[1] as number;
|
|
423
|
+
pass = xor(
|
|
424
|
+
propName in data && data[propName] > testGTValue,
|
|
425
|
+
xor(typeIsNot, clauseNot),
|
|
426
|
+
);
|
|
427
|
+
break;
|
|
428
|
+
case 'gte':
|
|
429
|
+
case '!gte':
|
|
430
|
+
const testGTEValue = (
|
|
431
|
+
curValue as [string, number]
|
|
432
|
+
)[1] as number;
|
|
433
|
+
pass = xor(
|
|
434
|
+
propName in data && data[propName] >= testGTEValue,
|
|
435
|
+
xor(typeIsNot, clauseNot),
|
|
436
|
+
);
|
|
437
|
+
break;
|
|
438
|
+
case 'lt':
|
|
439
|
+
case '!lt':
|
|
440
|
+
const testLTValue = (
|
|
441
|
+
curValue as [string, number]
|
|
442
|
+
)[1] as number;
|
|
443
|
+
pass = xor(
|
|
444
|
+
propName in data && data[propName] < testLTValue,
|
|
445
|
+
xor(typeIsNot, clauseNot),
|
|
446
|
+
);
|
|
447
|
+
break;
|
|
448
|
+
case 'lte':
|
|
449
|
+
case '!lte':
|
|
450
|
+
const testLTEValue = (
|
|
451
|
+
curValue as [string, number]
|
|
452
|
+
)[1] as number;
|
|
453
|
+
pass = xor(
|
|
454
|
+
propName in data && data[propName] <= testLTEValue,
|
|
455
|
+
xor(typeIsNot, clauseNot),
|
|
456
|
+
);
|
|
457
|
+
break;
|
|
480
458
|
}
|
|
459
|
+
|
|
481
460
|
if (!xor(typeIsOr, pass)) {
|
|
482
461
|
break;
|
|
483
462
|
}
|
|
@@ -531,7 +510,7 @@ export default abstract class NymphDriver {
|
|
|
531
510
|
| EntityInterface
|
|
532
511
|
| EntityReference
|
|
533
512
|
| string
|
|
534
|
-
| (EntityInterface | EntityReference | string)[]
|
|
513
|
+
| (EntityInterface | EntityReference | string)[],
|
|
535
514
|
) {
|
|
536
515
|
// Get the GUID, if the passed $entity is an object.
|
|
537
516
|
const guids: string[] = [];
|
|
@@ -574,7 +553,7 @@ export default abstract class NymphDriver {
|
|
|
574
553
|
|
|
575
554
|
public formatSelectors(
|
|
576
555
|
selectors: Selector[],
|
|
577
|
-
options: Options = {}
|
|
556
|
+
options: Options = {},
|
|
578
557
|
): {
|
|
579
558
|
selectors: FormattedSelector[];
|
|
580
559
|
qrefs: [Options, ...FormattedSelector[]][];
|
|
@@ -609,10 +588,9 @@ export default abstract class NymphDriver {
|
|
|
609
588
|
for (let i = 0; i < tmpArr.length; i++) {
|
|
610
589
|
const name = tmpArr[i][0];
|
|
611
590
|
const [qrefOptions, ...qrefSelectors] = tmpArr[i][1];
|
|
612
|
-
const QrefEntityClass =
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
: qrefOptions.class ?? this.nymph.getEntityClass('Entity');
|
|
591
|
+
const QrefEntityClass = qrefOptions.class
|
|
592
|
+
? this.nymph.getEntityClass(qrefOptions.class)
|
|
593
|
+
: this.nymph.getEntityClass('Entity');
|
|
616
594
|
const newOptions = {
|
|
617
595
|
...qrefOptions,
|
|
618
596
|
class: QrefEntityClass,
|
|
@@ -621,7 +599,7 @@ export default abstract class NymphDriver {
|
|
|
621
599
|
const newSelectors = this.formatSelectors(qrefSelectors, options);
|
|
622
600
|
qrefs.push(
|
|
623
601
|
[newOptions, ...newSelectors.selectors],
|
|
624
|
-
...newSelectors.qrefs
|
|
602
|
+
...newSelectors.qrefs,
|
|
625
603
|
);
|
|
626
604
|
formatArr[i] = [name, [newOptions, ...newSelectors.selectors]];
|
|
627
605
|
}
|
|
@@ -673,8 +651,8 @@ export default abstract class NymphDriver {
|
|
|
673
651
|
key: string,
|
|
674
652
|
value: any,
|
|
675
653
|
typeIsOr: boolean,
|
|
676
|
-
typeIsNot: boolean
|
|
677
|
-
) => string
|
|
654
|
+
typeIsNot: boolean,
|
|
655
|
+
) => string,
|
|
678
656
|
) {
|
|
679
657
|
const queryParts = [];
|
|
680
658
|
for (const curSelector of selectors) {
|
|
@@ -703,70 +681,13 @@ export default abstract class NymphDriver {
|
|
|
703
681
|
return queryParts;
|
|
704
682
|
}
|
|
705
683
|
|
|
706
|
-
/**
|
|
707
|
-
* Get the first entity to match all options/selectors, synchronously.
|
|
708
|
-
*
|
|
709
|
-
* This should really only be used internally by the Entity class. It's a bad
|
|
710
|
-
* idea to get entities synchronously. The Entity class uses this to load
|
|
711
|
-
* sleeping references.
|
|
712
|
-
*
|
|
713
|
-
* @param options The options.
|
|
714
|
-
* @param selectors Unlimited optional selectors to search for, or a single GUID. If none are given, all entities are searched for the given options.
|
|
715
|
-
* @returns An entity, or null on failure or nothing found.
|
|
716
|
-
*/
|
|
717
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
718
|
-
options: Options<T> & { return: 'count' },
|
|
719
|
-
...selectors: Selector[]
|
|
720
|
-
): number;
|
|
721
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
722
|
-
options: Options<T> & { return: 'guid' },
|
|
723
|
-
...selectors: Selector[]
|
|
724
|
-
): string | null;
|
|
725
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
726
|
-
options: Options<T>,
|
|
727
|
-
...selectors: Selector[]
|
|
728
|
-
): ReturnType<T['factorySync']> | null;
|
|
729
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
730
|
-
options: Options<T> & { return: 'count' },
|
|
731
|
-
guid: string
|
|
732
|
-
): number;
|
|
733
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
734
|
-
options: Options<T> & { return: 'guid' },
|
|
735
|
-
guid: string
|
|
736
|
-
): string | null;
|
|
737
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
738
|
-
options: Options<T>,
|
|
739
|
-
guid: string
|
|
740
|
-
): ReturnType<T['factorySync']> | null;
|
|
741
|
-
public getEntitySync<T extends EntityConstructor = EntityConstructor>(
|
|
742
|
-
options: Options<T> = {},
|
|
743
|
-
...selectors: Selector[] | string[]
|
|
744
|
-
): ReturnType<T['factorySync']> | string | number | null {
|
|
745
|
-
// Set up options and selectors.
|
|
746
|
-
if (typeof selectors[0] === 'string') {
|
|
747
|
-
selectors = [{ type: '&', guid: selectors[0] }];
|
|
748
|
-
}
|
|
749
|
-
options.limit = 1;
|
|
750
|
-
const entities = this.getEntitiesSync(
|
|
751
|
-
options,
|
|
752
|
-
...(selectors as Selector[])
|
|
753
|
-
);
|
|
754
|
-
if (options.return === 'count') {
|
|
755
|
-
return entities as unknown as number;
|
|
756
|
-
}
|
|
757
|
-
if (!entities || !entities.length) {
|
|
758
|
-
return null;
|
|
759
|
-
}
|
|
760
|
-
return entities[0];
|
|
761
|
-
}
|
|
762
|
-
|
|
763
684
|
protected getEntitesRowLike<T extends EntityConstructor = EntityConstructor>(
|
|
764
685
|
options: Options<T> & { return: 'count' },
|
|
765
686
|
selectors: Selector[],
|
|
766
687
|
performQueryCallback: (
|
|
767
688
|
options: Options<T>,
|
|
768
689
|
formattedSelectors: FormattedSelector[],
|
|
769
|
-
etype: string
|
|
690
|
+
etype: string,
|
|
770
691
|
) => {
|
|
771
692
|
result: any;
|
|
772
693
|
},
|
|
@@ -782,7 +703,7 @@ export default abstract class NymphDriver {
|
|
|
782
703
|
getDataNameAndSValueCallback: (row: any) => {
|
|
783
704
|
name: string;
|
|
784
705
|
svalue: string;
|
|
785
|
-
}
|
|
706
|
+
},
|
|
786
707
|
): { result: any; process: () => number | Error };
|
|
787
708
|
protected getEntitesRowLike<T extends EntityConstructor = EntityConstructor>(
|
|
788
709
|
options: Options<T> & { return: 'guid' },
|
|
@@ -790,7 +711,7 @@ export default abstract class NymphDriver {
|
|
|
790
711
|
performQueryCallback: (
|
|
791
712
|
options: Options<T>,
|
|
792
713
|
formattedSelectors: FormattedSelector[],
|
|
793
|
-
etype: string
|
|
714
|
+
etype: string,
|
|
794
715
|
) => {
|
|
795
716
|
result: any;
|
|
796
717
|
},
|
|
@@ -806,7 +727,7 @@ export default abstract class NymphDriver {
|
|
|
806
727
|
getDataNameAndSValueCallback: (row: any) => {
|
|
807
728
|
name: string;
|
|
808
729
|
svalue: string;
|
|
809
|
-
}
|
|
730
|
+
},
|
|
810
731
|
): { result: any; process: () => string[] | Error };
|
|
811
732
|
protected getEntitesRowLike<T extends EntityConstructor = EntityConstructor>(
|
|
812
733
|
options: Options<T>,
|
|
@@ -814,7 +735,7 @@ export default abstract class NymphDriver {
|
|
|
814
735
|
performQueryCallback: (
|
|
815
736
|
options: Options<T>,
|
|
816
737
|
formattedSelectors: FormattedSelector[],
|
|
817
|
-
etype: string
|
|
738
|
+
etype: string,
|
|
818
739
|
) => {
|
|
819
740
|
result: any;
|
|
820
741
|
},
|
|
@@ -830,7 +751,7 @@ export default abstract class NymphDriver {
|
|
|
830
751
|
getDataNameAndSValueCallback: (row: any) => {
|
|
831
752
|
name: string;
|
|
832
753
|
svalue: string;
|
|
833
|
-
}
|
|
754
|
+
},
|
|
834
755
|
): { result: any; process: () => ReturnType<T['factorySync']>[] | Error };
|
|
835
756
|
protected getEntitesRowLike<T extends EntityConstructor = EntityConstructor>(
|
|
836
757
|
options: Options<T>,
|
|
@@ -838,7 +759,7 @@ export default abstract class NymphDriver {
|
|
|
838
759
|
performQueryCallback: (
|
|
839
760
|
options: Options<T>,
|
|
840
761
|
formattedSelectors: FormattedSelector[],
|
|
841
|
-
etype: string
|
|
762
|
+
etype: string,
|
|
842
763
|
) => {
|
|
843
764
|
result: any;
|
|
844
765
|
},
|
|
@@ -854,7 +775,7 @@ export default abstract class NymphDriver {
|
|
|
854
775
|
getDataNameAndSValueCallback: (row: any) => {
|
|
855
776
|
name: string;
|
|
856
777
|
svalue: string;
|
|
857
|
-
}
|
|
778
|
+
},
|
|
858
779
|
): {
|
|
859
780
|
result: any;
|
|
860
781
|
process: () => ReturnType<T['factorySync']>[] | string[] | number | Error;
|
|
@@ -870,7 +791,7 @@ export default abstract class NymphDriver {
|
|
|
870
791
|
['&', '!&', '|', '!|'].indexOf(selector.type) === -1
|
|
871
792
|
) {
|
|
872
793
|
throw new InvalidParametersError(
|
|
873
|
-
'Invalid query selector passed: ' + JSON.stringify(selector)
|
|
794
|
+
'Invalid query selector passed: ' + JSON.stringify(selector),
|
|
874
795
|
);
|
|
875
796
|
}
|
|
876
797
|
}
|
|
@@ -899,7 +820,7 @@ export default abstract class NymphDriver {
|
|
|
899
820
|
const entity = this.pullCache<ReturnType<T['factorySync']>>(
|
|
900
821
|
selectors[0]['guid'],
|
|
901
822
|
EntityClass.class,
|
|
902
|
-
!!options.skipAc
|
|
823
|
+
!!options.skipAc,
|
|
903
824
|
);
|
|
904
825
|
if (
|
|
905
826
|
entity != null &&
|
|
@@ -908,7 +829,7 @@ export default abstract class NymphDriver {
|
|
|
908
829
|
entity.hasTag(
|
|
909
830
|
...(Array.isArray(selectors[0].tag)
|
|
910
831
|
? selectors[0].tag
|
|
911
|
-
: [selectors[0].tag])
|
|
832
|
+
: [selectors[0].tag]),
|
|
912
833
|
))
|
|
913
834
|
) {
|
|
914
835
|
const guid = entity.guid;
|
|
@@ -937,7 +858,7 @@ export default abstract class NymphDriver {
|
|
|
937
858
|
const { result } = performQueryCallback(
|
|
938
859
|
options,
|
|
939
860
|
formattedSelectors.selectors,
|
|
940
|
-
etype
|
|
861
|
+
etype,
|
|
941
862
|
);
|
|
942
863
|
|
|
943
864
|
return {
|
|
@@ -1027,7 +948,7 @@ export default abstract class NymphDriver {
|
|
|
1027
948
|
data: EntityData,
|
|
1028
949
|
sdata: SerializedEntityData,
|
|
1029
950
|
cdate: number,
|
|
1030
|
-
etype: string
|
|
951
|
+
etype: string,
|
|
1031
952
|
) => Promise<boolean>,
|
|
1032
953
|
saveExistingEntityCallback: (
|
|
1033
954
|
entity: EntityInterface,
|
|
@@ -1036,12 +957,12 @@ export default abstract class NymphDriver {
|
|
|
1036
957
|
data: EntityData,
|
|
1037
958
|
sdata: SerializedEntityData,
|
|
1038
959
|
mdate: number,
|
|
1039
|
-
etype: string
|
|
960
|
+
etype: string,
|
|
1040
961
|
) => Promise<boolean>,
|
|
1041
962
|
startTransactionCallback: (() => Promise<void>) | null = null,
|
|
1042
963
|
commitTransactionCallback:
|
|
1043
964
|
| ((success: boolean) => Promise<boolean>)
|
|
1044
|
-
| null = null
|
|
965
|
+
| null = null,
|
|
1045
966
|
) {
|
|
1046
967
|
// Get a modified date.
|
|
1047
968
|
const mdate = Date.now();
|
|
@@ -1064,7 +985,7 @@ export default abstract class NymphDriver {
|
|
|
1064
985
|
data,
|
|
1065
986
|
sdata,
|
|
1066
987
|
cdate,
|
|
1067
|
-
etype
|
|
988
|
+
etype,
|
|
1068
989
|
);
|
|
1069
990
|
if (success) {
|
|
1070
991
|
entity.guid = newId;
|
|
@@ -1083,7 +1004,7 @@ export default abstract class NymphDriver {
|
|
|
1083
1004
|
data,
|
|
1084
1005
|
sdata,
|
|
1085
1006
|
mdate,
|
|
1086
|
-
etype
|
|
1007
|
+
etype,
|
|
1087
1008
|
);
|
|
1088
1009
|
if (success) {
|
|
1089
1010
|
entity.mdate = mdate;
|
|
@@ -1100,7 +1021,7 @@ export default abstract class NymphDriver {
|
|
|
1100
1021
|
entity.mdate as number,
|
|
1101
1022
|
entity.tags,
|
|
1102
1023
|
data,
|
|
1103
|
-
sdata
|
|
1024
|
+
sdata,
|
|
1104
1025
|
);
|
|
1105
1026
|
}
|
|
1106
1027
|
return success;
|
|
@@ -1117,7 +1038,7 @@ export default abstract class NymphDriver {
|
|
|
1117
1038
|
protected pullCache<T extends EntityInterface = EntityInterface>(
|
|
1118
1039
|
guid: string,
|
|
1119
1040
|
className: string,
|
|
1120
|
-
useSkipAc = false
|
|
1041
|
+
useSkipAc = false,
|
|
1121
1042
|
): T | null {
|
|
1122
1043
|
// Increment the entity access count.
|
|
1123
1044
|
if (!(guid in this.entityCount)) {
|
|
@@ -1135,7 +1056,7 @@ export default abstract class NymphDriver {
|
|
|
1135
1056
|
entity.tags = this.entityCache[guid]['tags'];
|
|
1136
1057
|
entity.$putData(
|
|
1137
1058
|
this.entityCache[guid]['data'],
|
|
1138
|
-
this.entityCache[guid]['sdata']
|
|
1059
|
+
this.entityCache[guid]['sdata'],
|
|
1139
1060
|
);
|
|
1140
1061
|
return entity;
|
|
1141
1062
|
}
|
|
@@ -1159,7 +1080,7 @@ export default abstract class NymphDriver {
|
|
|
1159
1080
|
mdate: number,
|
|
1160
1081
|
tags: string[],
|
|
1161
1082
|
data: EntityData,
|
|
1162
|
-
sdata: SerializedEntityData
|
|
1083
|
+
sdata: SerializedEntityData,
|
|
1163
1084
|
) {
|
|
1164
1085
|
if (guid == null) {
|
|
1165
1086
|
return;
|