@nymphjs/nymph 1.0.0-beta.54 → 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.
@@ -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
- const formattedSelectors = this.formatSelectors(selectors).selectors;
278
+ try {
279
+ const formattedSelectors = this.formatSelectors(selectors).selectors;
279
280
 
280
- for (const curSelector of formattedSelectors) {
281
- const type = curSelector.type;
282
- const typeIsNot = type === '!&' || type === '!|';
283
- const typeIsOr = type === '|' || type === '!|';
284
- let pass = !typeIsOr;
285
- for (const k in curSelector) {
286
- const key = k as keyof Selector;
287
- const value = curSelector[key];
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
- if (key === 'type' || value == null) {
290
- continue;
291
- }
290
+ if (key === 'type' || value == null) {
291
+ continue;
292
+ }
292
293
 
293
- const clauseNot = key.substring(0, 1) === '!';
294
- if (key === 'selector' || key === '!selector') {
295
- const tmpArr = (Array.isArray(value) ? value : [value]) as Selector[];
296
- pass = xor(
297
- this.checkData(data, sdata, tmpArr, guid, tags),
298
- xor(typeIsNot, clauseNot),
299
- );
300
- } else {
301
- if (key === 'qref' || key === '!qref') {
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
- // Check if it doesn't pass any for &, check if it passes any for |.
305
- for (const curValue of value) {
306
- if (curValue == null) {
307
- continue;
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
- const propName = (curValue as string[])[0];
313
+ const propName = (curValue as string[])[0];
311
314
 
312
- // Unserialize the data for this variable.
313
- if (propName in sdata) {
314
- data[propName] = JSON.parse(sdata[propName]);
315
- delete sdata[propName];
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
- 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;
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
- if (!xor(typeIsOr, pass)) {
461
- break;
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 (!xor(typeIsOr, pass)) {
467
- break;
478
+ if (!pass) {
479
+ return false;
468
480
  }
469
481
  }
470
- if (!pass) {
471
- return false;
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
  /**
@@ -806,6 +821,7 @@ export default abstract class NymphDriver {
806
821
  if (
807
822
  this.nymph.config.cache &&
808
823
  !options.skipCache &&
824
+ selectors.length &&
809
825
  'guid' in selectors[0] &&
810
826
  typeof selectors[0].guid === 'number'
811
827
  ) {
package/tsconfig.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "lib": ["ES2021"],
6
6
  "target": "ES2021",
7
7
  "noImplicitAny": true,
8
- "removeComments": true,
8
+ "removeComments": false,
9
9
  "sourceMap": true,
10
10
  "outDir": "dist",
11
11
  "resolveJsonModule": true,