@nymphjs/nymph 1.0.0-beta.55 → 1.0.0-beta.56
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 +8 -0
- package/dist/Entity.d.ts +191 -0
- package/dist/Entity.js +179 -0
- package/dist/Entity.js.map +1 -1
- package/dist/Entity.test.js +6 -0
- package/dist/Entity.test.js.map +1 -1
- package/dist/Entity.types.d.ts +258 -0
- package/dist/Nymph.d.ts +389 -0
- package/dist/Nymph.js +501 -179
- package/dist/Nymph.js.map +1 -1
- package/dist/Nymph.types.d.ts +12 -1
- package/dist/Nymph.types.js +1 -0
- package/dist/Nymph.types.js.map +1 -1
- package/dist/conf/d.d.ts +26 -0
- package/dist/conf/defaults.js +22 -0
- package/dist/conf/defaults.js.map +1 -1
- package/dist/driver/NymphDriver.d.ts +61 -1
- package/dist/driver/NymphDriver.js +220 -123
- package/dist/driver/NymphDriver.js.map +1 -1
- package/dist/driver/testArtifacts.js +142 -0
- package/dist/driver/testArtifacts.js.map +1 -1
- package/dist/errors/EntityInvalidDataError.d.ts +6 -0
- package/dist/errors/EntityInvalidDataError.js +6 -0
- package/dist/errors/EntityInvalidDataError.js.map +1 -1
- package/dist/testArtifacts.d.ts +9 -0
- package/dist/testArtifacts.js +9 -0
- package/dist/testArtifacts.js.map +1 -1
- package/dist/testMocks.js +2 -0
- package/dist/testMocks.js.map +1 -1
- package/dist/utils.js +10 -0
- package/dist/utils.js.map +1 -1
- package/package.json +5 -3
- package/src/Nymph.ts +281 -177
- package/src/Nymph.types.ts +1 -1
- package/src/conf/d.ts +8 -0
- package/src/conf/defaults.ts +24 -0
- package/src/driver/NymphDriver.ts +198 -183
- package/tsconfig.json +1 -1
package/src/conf/defaults.ts
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
|
+
import createDebug, { type Debugger } from 'debug';
|
|
1
2
|
import { Config } from './d';
|
|
2
3
|
|
|
4
|
+
const debuggers: { [k: string]: { log: Debugger; error: Debugger } } = {};
|
|
5
|
+
|
|
6
|
+
function getDebuggers(source: string) {
|
|
7
|
+
if (source in debuggers) {
|
|
8
|
+
return debuggers[source];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
debuggers[source] = {
|
|
12
|
+
log: createDebug(`nymphjs:log:${source}`),
|
|
13
|
+
error: createDebug(`nymphjs:error:${source}`),
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
debuggers[source].log.log = console.log.bind(console);
|
|
17
|
+
|
|
18
|
+
return debuggers[source];
|
|
19
|
+
}
|
|
20
|
+
|
|
3
21
|
export default {
|
|
4
22
|
cache: false,
|
|
5
23
|
cacheThreshold: 4,
|
|
6
24
|
cacheLimit: 50,
|
|
7
25
|
emptyListError: false,
|
|
26
|
+
debugLog: (source, message) => {
|
|
27
|
+
getDebuggers(source).log(message);
|
|
28
|
+
},
|
|
29
|
+
debugError: (source, message) => {
|
|
30
|
+
getDebuggers(source).error(message);
|
|
31
|
+
},
|
|
8
32
|
} as Config;
|
|
@@ -103,7 +103,7 @@ export default abstract class NymphDriver {
|
|
|
103
103
|
...selectors: Selector[]
|
|
104
104
|
): Promise<ReturnType<T['factorySync']>[] | string[] | number>;
|
|
105
105
|
abstract getUID(name: string): Promise<number | null>;
|
|
106
|
-
abstract import(filename: string): Promise<boolean>;
|
|
106
|
+
abstract import(filename: string, transaction?: boolean): Promise<boolean>;
|
|
107
107
|
abstract newUID(name: string): Promise<number | null>;
|
|
108
108
|
abstract renameUID(oldName: string, newName: string): Promise<boolean>;
|
|
109
109
|
abstract saveEntity(entity: EntityInterface): Promise<boolean>;
|
|
@@ -275,203 +275,218 @@ export default abstract class NymphDriver {
|
|
|
275
275
|
guid: string | null = null,
|
|
276
276
|
tags: string[] | null = null,
|
|
277
277
|
) {
|
|
278
|
-
|
|
278
|
+
try {
|
|
279
|
+
const formattedSelectors = this.formatSelectors(selectors).selectors;
|
|
279
280
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
281
|
+
for (const curSelector of formattedSelectors) {
|
|
282
|
+
const type = curSelector.type;
|
|
283
|
+
const typeIsNot = type === '!&' || type === '!|';
|
|
284
|
+
const typeIsOr = type === '|' || type === '!|';
|
|
285
|
+
let pass = !typeIsOr;
|
|
286
|
+
for (const k in curSelector) {
|
|
287
|
+
const key = k as keyof Selector;
|
|
288
|
+
const value = curSelector[key];
|
|
288
289
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
if (key === 'type' || value == null) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
292
293
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
xor(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
throw new Error("Can't use checkData on qref clauses.");
|
|
294
|
+
const clauseNot = key.substring(0, 1) === '!';
|
|
295
|
+
if (key === 'selector' || key === '!selector') {
|
|
296
|
+
const tmpArr = (
|
|
297
|
+
Array.isArray(value) ? value : [value]
|
|
298
|
+
) as Selector[];
|
|
299
|
+
pass = xor(
|
|
300
|
+
this.checkData(data, sdata, tmpArr, guid, tags),
|
|
301
|
+
xor(typeIsNot, clauseNot),
|
|
302
|
+
);
|
|
303
303
|
} else {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
304
|
+
if (key === 'qref' || key === '!qref') {
|
|
305
|
+
throw new Error("Can't use checkData on qref clauses.");
|
|
306
|
+
} else {
|
|
307
|
+
// Check if it doesn't pass any for &, check if it passes any for |.
|
|
308
|
+
for (const curValue of value) {
|
|
309
|
+
if (curValue == null) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
309
312
|
|
|
310
|
-
|
|
313
|
+
const propName = (curValue as string[])[0];
|
|
311
314
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
315
|
+
// Unserialize the data for this variable.
|
|
316
|
+
if (propName in sdata) {
|
|
317
|
+
data[propName] = JSON.parse(sdata[propName]);
|
|
318
|
+
delete sdata[propName];
|
|
319
|
+
}
|
|
317
320
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
xor(
|
|
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
|
-
|
|
321
|
+
switch (key) {
|
|
322
|
+
case 'guid':
|
|
323
|
+
case '!guid':
|
|
324
|
+
pass = xor(guid == propName, xor(typeIsNot, clauseNot));
|
|
325
|
+
break;
|
|
326
|
+
case 'tag':
|
|
327
|
+
case '!tag':
|
|
328
|
+
pass = xor(
|
|
329
|
+
(tags ?? []).indexOf(propName) !== -1,
|
|
330
|
+
xor(typeIsNot, clauseNot),
|
|
331
|
+
);
|
|
332
|
+
break;
|
|
333
|
+
case 'defined':
|
|
334
|
+
case '!defined':
|
|
335
|
+
pass = xor(propName in data, xor(typeIsNot, clauseNot));
|
|
336
|
+
break;
|
|
337
|
+
case 'truthy':
|
|
338
|
+
case '!truthy':
|
|
339
|
+
pass = xor(
|
|
340
|
+
propName in data && data[propName],
|
|
341
|
+
xor(typeIsNot, clauseNot),
|
|
342
|
+
);
|
|
343
|
+
break;
|
|
344
|
+
case 'ref':
|
|
345
|
+
case '!ref':
|
|
346
|
+
const testRefValue = (curValue as [string, any])[1] as any;
|
|
347
|
+
pass = xor(
|
|
348
|
+
propName in data &&
|
|
349
|
+
this.entityReferenceSearch(
|
|
350
|
+
data[propName],
|
|
351
|
+
testRefValue,
|
|
352
|
+
),
|
|
353
|
+
xor(typeIsNot, clauseNot),
|
|
354
|
+
);
|
|
355
|
+
break;
|
|
356
|
+
case 'equal':
|
|
357
|
+
case '!equal':
|
|
358
|
+
const testEqualValue = (
|
|
359
|
+
curValue as [string, any]
|
|
360
|
+
)[1] as any;
|
|
361
|
+
pass = xor(
|
|
362
|
+
propName in data &&
|
|
363
|
+
JSON.stringify(data[propName]) ===
|
|
364
|
+
JSON.stringify(testEqualValue),
|
|
365
|
+
xor(typeIsNot, clauseNot),
|
|
366
|
+
);
|
|
367
|
+
break;
|
|
368
|
+
case 'contain':
|
|
369
|
+
case '!contain':
|
|
370
|
+
const testContainValue = (
|
|
371
|
+
curValue as [string, any]
|
|
372
|
+
)[1] as any;
|
|
373
|
+
pass = xor(
|
|
374
|
+
propName in data &&
|
|
375
|
+
JSON.stringify(data[propName]).indexOf(
|
|
376
|
+
JSON.stringify(testContainValue),
|
|
377
|
+
) !== -1,
|
|
378
|
+
xor(typeIsNot, clauseNot),
|
|
379
|
+
);
|
|
380
|
+
break;
|
|
381
|
+
case 'like':
|
|
382
|
+
case '!like':
|
|
383
|
+
const testLikeValue = (
|
|
384
|
+
curValue as [string, string]
|
|
385
|
+
)[1] as string;
|
|
386
|
+
pass = xor(
|
|
387
|
+
propName in data &&
|
|
388
|
+
new RegExp(
|
|
389
|
+
'^' +
|
|
390
|
+
escapeRegExp(testLikeValue)
|
|
391
|
+
.replace('%', () => '.*')
|
|
392
|
+
.replace('_', () => '.') +
|
|
393
|
+
'$',
|
|
394
|
+
).test(data[propName]),
|
|
395
|
+
xor(typeIsNot, clauseNot),
|
|
396
|
+
);
|
|
397
|
+
break;
|
|
398
|
+
case 'match':
|
|
399
|
+
case '!match':
|
|
400
|
+
const testMatchValue = (
|
|
401
|
+
curValue as [string, string]
|
|
402
|
+
)[1] as string;
|
|
403
|
+
// Convert a POSIX regex to a JS regex.
|
|
404
|
+
pass = xor(
|
|
405
|
+
propName in data &&
|
|
406
|
+
this.posixRegexMatch(testMatchValue, data[propName]),
|
|
407
|
+
xor(typeIsNot, clauseNot),
|
|
408
|
+
);
|
|
409
|
+
break;
|
|
410
|
+
case 'imatch':
|
|
411
|
+
case '!imatch':
|
|
412
|
+
const testIMatchValue = (
|
|
413
|
+
curValue as [string, string]
|
|
414
|
+
)[1] as string;
|
|
415
|
+
// Convert a POSIX regex to a JS regex.
|
|
416
|
+
pass = xor(
|
|
417
|
+
propName in data &&
|
|
418
|
+
this.posixRegexMatch(
|
|
419
|
+
testIMatchValue,
|
|
420
|
+
data[propName],
|
|
421
|
+
true,
|
|
422
|
+
),
|
|
423
|
+
xor(typeIsNot, clauseNot),
|
|
424
|
+
);
|
|
425
|
+
break;
|
|
426
|
+
case 'gt':
|
|
427
|
+
case '!gt':
|
|
428
|
+
const testGTValue = (
|
|
429
|
+
curValue as [string, number]
|
|
430
|
+
)[1] as number;
|
|
431
|
+
pass = xor(
|
|
432
|
+
propName in data && data[propName] > testGTValue,
|
|
433
|
+
xor(typeIsNot, clauseNot),
|
|
434
|
+
);
|
|
435
|
+
break;
|
|
436
|
+
case 'gte':
|
|
437
|
+
case '!gte':
|
|
438
|
+
const testGTEValue = (
|
|
439
|
+
curValue as [string, number]
|
|
440
|
+
)[1] as number;
|
|
441
|
+
pass = xor(
|
|
442
|
+
propName in data && data[propName] >= testGTEValue,
|
|
443
|
+
xor(typeIsNot, clauseNot),
|
|
444
|
+
);
|
|
445
|
+
break;
|
|
446
|
+
case 'lt':
|
|
447
|
+
case '!lt':
|
|
448
|
+
const testLTValue = (
|
|
449
|
+
curValue as [string, number]
|
|
450
|
+
)[1] as number;
|
|
451
|
+
pass = xor(
|
|
452
|
+
propName in data && data[propName] < testLTValue,
|
|
453
|
+
xor(typeIsNot, clauseNot),
|
|
454
|
+
);
|
|
455
|
+
break;
|
|
456
|
+
case 'lte':
|
|
457
|
+
case '!lte':
|
|
458
|
+
const testLTEValue = (
|
|
459
|
+
curValue as [string, number]
|
|
460
|
+
)[1] as number;
|
|
461
|
+
pass = xor(
|
|
462
|
+
propName in data && data[propName] <= testLTEValue,
|
|
463
|
+
xor(typeIsNot, clauseNot),
|
|
464
|
+
);
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
459
467
|
|
|
460
|
-
|
|
461
|
-
|
|
468
|
+
if (!xor(typeIsOr, pass)) {
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
462
471
|
}
|
|
463
472
|
}
|
|
464
473
|
}
|
|
474
|
+
if (!xor(typeIsOr, pass)) {
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
465
477
|
}
|
|
466
|
-
if (!
|
|
467
|
-
|
|
478
|
+
if (!pass) {
|
|
479
|
+
return false;
|
|
468
480
|
}
|
|
469
481
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
482
|
+
return true;
|
|
483
|
+
} catch (e: any) {
|
|
484
|
+
this.nymph.config.debugError(
|
|
485
|
+
'nymph',
|
|
486
|
+
`Failed to check entity data: ${e}`,
|
|
487
|
+
);
|
|
488
|
+
throw e;
|
|
473
489
|
}
|
|
474
|
-
return true;
|
|
475
490
|
}
|
|
476
491
|
|
|
477
492
|
/**
|