@nymphjs/nymph 1.0.0-beta.13 → 1.0.0-beta.131

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.
Files changed (123) hide show
  1. package/CHANGELOG.md +650 -0
  2. package/README.md +34 -24
  3. package/dist/Entity.d.ts +306 -15
  4. package/dist/Entity.js +688 -226
  5. package/dist/Entity.js.map +1 -1
  6. package/dist/Entity.test.js +75 -29
  7. package/dist/Entity.test.js.map +1 -1
  8. package/dist/Entity.types.d.ts +275 -28
  9. package/dist/Entity.types.js +1 -2
  10. package/dist/Nymph.d.ts +575 -11
  11. package/dist/Nymph.js +825 -288
  12. package/dist/Nymph.js.map +1 -1
  13. package/dist/Nymph.types.d.ts +117 -7
  14. package/dist/Nymph.types.js +47 -5
  15. package/dist/Nymph.types.js.map +1 -1
  16. package/dist/conf/defaults.d.ts +1 -1
  17. package/dist/conf/defaults.js +26 -3
  18. package/dist/conf/defaults.js.map +1 -1
  19. package/dist/conf/index.d.ts +50 -2
  20. package/dist/conf/index.js +2 -8
  21. package/dist/conf/index.js.map +1 -1
  22. package/dist/decorators/index.d.ts +1 -0
  23. package/dist/decorators/index.js +2 -0
  24. package/dist/decorators/index.js.map +1 -0
  25. package/dist/decorators/transactional.d.ts +12 -0
  26. package/dist/decorators/transactional.js +45 -0
  27. package/dist/decorators/transactional.js.map +1 -0
  28. package/dist/driver/NymphDriver.d.ts +209 -41
  29. package/dist/driver/NymphDriver.js +737 -242
  30. package/dist/driver/NymphDriver.js.map +1 -1
  31. package/dist/driver/index.d.ts +1 -2
  32. package/dist/driver/index.js +2 -23
  33. package/dist/driver/index.js.map +1 -1
  34. package/dist/driver/testArtifacts.d.ts +4 -4
  35. package/dist/driver/testArtifacts.js +2016 -1086
  36. package/dist/driver/testArtifacts.js.map +1 -1
  37. package/dist/errors/ClassNotAvailableError.js +1 -5
  38. package/dist/errors/ClassNotAvailableError.js.map +1 -1
  39. package/dist/errors/EntityConflictError.js +1 -5
  40. package/dist/errors/EntityConflictError.js.map +1 -1
  41. package/dist/errors/EntityInvalidDataError.d.ts +6 -0
  42. package/dist/errors/EntityInvalidDataError.js +8 -6
  43. package/dist/errors/EntityInvalidDataError.js.map +1 -1
  44. package/dist/errors/EntityIsSleepingReferenceError.js +1 -5
  45. package/dist/errors/EntityIsSleepingReferenceError.js.map +1 -1
  46. package/dist/errors/EntityUniqueConstraintError.d.ts +3 -0
  47. package/dist/errors/EntityUniqueConstraintError.js +7 -0
  48. package/dist/errors/EntityUniqueConstraintError.js.map +1 -0
  49. package/dist/errors/HttpError.d.ts +5 -0
  50. package/dist/errors/HttpError.js +11 -0
  51. package/dist/errors/HttpError.js.map +1 -0
  52. package/dist/errors/InvalidParametersError.js +1 -5
  53. package/dist/errors/InvalidParametersError.js.map +1 -1
  54. package/dist/errors/InvalidStateError.d.ts +3 -0
  55. package/dist/errors/InvalidStateError.js +7 -0
  56. package/dist/errors/InvalidStateError.js.map +1 -0
  57. package/dist/errors/MethodFailedError.d.ts +3 -0
  58. package/dist/errors/MethodFailedError.js +7 -0
  59. package/dist/errors/MethodFailedError.js.map +1 -0
  60. package/dist/errors/NotConfiguredError.js +1 -5
  61. package/dist/errors/NotConfiguredError.js.map +1 -1
  62. package/dist/errors/QueryFailedError.d.ts +2 -1
  63. package/dist/errors/QueryFailedError.js +5 -6
  64. package/dist/errors/QueryFailedError.js.map +1 -1
  65. package/dist/errors/UnableToConnectError.js +1 -5
  66. package/dist/errors/UnableToConnectError.js.map +1 -1
  67. package/dist/errors/index.d.ts +12 -8
  68. package/dist/errors/index.js +12 -24
  69. package/dist/errors/index.js.map +1 -1
  70. package/dist/helpers/index.d.ts +1 -0
  71. package/dist/helpers/index.js +2 -0
  72. package/dist/helpers/index.js.map +1 -0
  73. package/dist/helpers/transaction.d.ts +15 -0
  74. package/dist/helpers/transaction.js +47 -0
  75. package/dist/helpers/transaction.js.map +1 -0
  76. package/dist/index.d.ts +13 -11
  77. package/dist/index.js +16 -34
  78. package/dist/index.js.map +1 -1
  79. package/dist/nymphJoiProps.d.ts +1 -1
  80. package/dist/nymphJoiProps.js +10 -15
  81. package/dist/nymphJoiProps.js.map +1 -1
  82. package/dist/testArtifacts.d.ts +21 -6
  83. package/dist/testArtifacts.js +124 -50
  84. package/dist/testArtifacts.js.map +1 -1
  85. package/dist/testMocks.d.ts +27 -12
  86. package/dist/testMocks.js +44 -33
  87. package/dist/testMocks.js.map +1 -1
  88. package/dist/utils.d.ts +5 -5
  89. package/dist/utils.js +106 -68
  90. package/dist/utils.js.map +1 -1
  91. package/jest.config.js +31 -5
  92. package/package.json +43 -24
  93. package/src/Entity.test.ts +73 -23
  94. package/src/Entity.ts +646 -252
  95. package/src/Entity.types.ts +102 -90
  96. package/src/Nymph.ts +930 -517
  97. package/src/Nymph.types.ts +145 -39
  98. package/src/conf/defaults.ts +34 -1
  99. package/src/conf/index.ts +50 -2
  100. package/src/decorators/index.ts +1 -0
  101. package/src/decorators/transactional.ts +63 -0
  102. package/src/driver/NymphDriver.ts +987 -417
  103. package/src/driver/index.ts +1 -3
  104. package/src/driver/testArtifacts.ts +2699 -1628
  105. package/src/errors/EntityUniqueConstraintError.ts +6 -0
  106. package/src/errors/HttpError.ts +12 -0
  107. package/src/errors/InvalidStateError.ts +6 -0
  108. package/src/errors/MethodFailedError.ts +6 -0
  109. package/src/errors/QueryFailedError.ts +3 -1
  110. package/src/errors/index.ts +16 -8
  111. package/src/helpers/index.ts +1 -0
  112. package/src/helpers/transaction.ts +65 -0
  113. package/src/index.ts +13 -11
  114. package/src/nymphJoiProps.ts +2 -2
  115. package/src/testArtifacts.ts +69 -20
  116. package/src/testMocks.ts +107 -41
  117. package/src/utils.ts +102 -67
  118. package/tsconfig.json +6 -3
  119. package/typedoc.json +4 -0
  120. package/dist/conf/d.d.ts +0 -6
  121. package/dist/conf/d.js +0 -3
  122. package/dist/conf/d.js.map +0 -1
  123. package/src/conf/d.ts +0 -24
package/src/utils.ts CHANGED
@@ -1,7 +1,6 @@
1
- import Entity from './Entity';
2
- import { EntityReference } from './Entity.types';
3
- import Nymph from './Nymph';
4
- import { Options, Selector } from './Nymph.types';
1
+ import Entity from './Entity.js';
2
+ import { EntityReference } from './Entity.types.js';
3
+ import Nymph from './Nymph.js';
5
4
 
6
5
  export function xor(a: any, b: any): boolean {
7
6
  return !!(a && !b) || (!a && b);
@@ -15,75 +14,90 @@ export function uniqueStrings(array: string[]) {
15
14
  return Object.keys(obj);
16
15
  }
17
16
 
18
- export function classNamesToEntityConstructors(
19
- nymph: Nymph,
20
- selectors: Selector[]
21
- ): Selector[] {
22
- const newSelectors: Selector[] = [];
23
-
24
- for (const curSelector of selectors) {
25
- const newSelector: Selector = { type: curSelector.type };
26
-
27
- for (const k in curSelector) {
28
- const key = k as keyof Selector;
29
- const value = curSelector[key];
30
-
31
- if (key === 'type') {
32
- continue;
33
- }
34
-
35
- if (value === undefined) {
36
- continue;
37
- }
38
-
39
- if (key === 'qref' || key === '!qref') {
40
- const tmpArr = (
41
- Array.isArray(((value as Selector['qref']) ?? [])[0])
42
- ? value
43
- : [value]
44
- ) as [string, [Options, ...Selector[]]][];
45
- for (let i = 0; i < tmpArr.length; i++) {
46
- const name = tmpArr[i][0];
47
- const [qrefOptions, ...selectors] = tmpArr[i][1];
48
- const QrefEntityClass =
49
- typeof qrefOptions.class === 'string'
50
- ? nymph.getEntityClass(qrefOptions.class)
51
- : qrefOptions.class ?? nymph.getEntityClass('Entity');
52
- const options = { ...qrefOptions, class: QrefEntityClass };
53
- if (!newSelector[key]) {
54
- newSelector[key] = [];
55
- }
56
- (newSelector[key] as [string, [Options, ...Selector[]]][]).push([
57
- name,
58
- [options, ...classNamesToEntityConstructors(nymph, selectors)],
59
- ]);
60
- }
61
- } else if (key === 'selector' || key === '!selector') {
62
- const tmpArr = (Array.isArray(value) ? value : [value]) as Selector[];
63
- newSelector[key] = classNamesToEntityConstructors(nymph, tmpArr);
64
- } else {
65
- // @ts-ignore: ts doesn't know what value is here.
66
- newSelector[key] = value;
67
- }
17
+ export function entityConstructorsToClassNames(item: any): any {
18
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
19
+ return item;
20
+ } else if (typeof item === 'function' && item.prototype instanceof Entity) {
21
+ // Convert entity classes to class references.
22
+ return ['nymph_class_reference', item.class];
23
+ } else if (item instanceof Entity) {
24
+ // Don't touch entities.
25
+ return item;
26
+ } else if (Array.isArray(item)) {
27
+ // Recurse into lower arrays.
28
+ return item.map((entry) => entityConstructorsToClassNames(entry));
29
+ } else if (item instanceof Object) {
30
+ let newObj = Object.create(item);
31
+ for (let [key, value] of Object.entries(item)) {
32
+ newObj[key] = entityConstructorsToClassNames(value);
68
33
  }
69
-
70
- newSelectors.push(newSelector);
34
+ return newObj;
71
35
  }
36
+ // Not an entity or array, just return it.
37
+ return item;
38
+ }
72
39
 
73
- return newSelectors;
40
+ export function classNamesToEntityConstructors<T extends any>(
41
+ nymph: Nymph,
42
+ item: T,
43
+ enforceRestEnabledFlag = false,
44
+ ): T {
45
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
46
+ return item;
47
+ } else if (
48
+ Array.isArray(item) &&
49
+ item.length === 2 &&
50
+ item[0] === 'nymph_class_reference' &&
51
+ typeof item[1] === 'string'
52
+ ) {
53
+ // Convert class references to entity classes.
54
+ const EntityClass = nymph.getEntityClass(item[1]);
55
+ if (enforceRestEnabledFlag && !EntityClass.restEnabled) {
56
+ throw new Error('Not accessible.');
57
+ }
58
+ return EntityClass as T;
59
+ } else if (item instanceof Entity) {
60
+ // Don't touch entities.
61
+ return item;
62
+ } else if (typeof item === 'function' && item.prototype instanceof Entity) {
63
+ // Don't touch Entity classes.
64
+ return item;
65
+ } else if (Array.isArray(item)) {
66
+ // Recurse into lower arrays.
67
+ return item.map((entry) =>
68
+ classNamesToEntityConstructors(nymph, entry, enforceRestEnabledFlag),
69
+ ) as T;
70
+ } else if (item instanceof Object) {
71
+ let newObj = Object.create(item);
72
+ for (let [key, value] of Object.entries(item)) {
73
+ newObj[key] = classNamesToEntityConstructors(
74
+ nymph,
75
+ value,
76
+ enforceRestEnabledFlag,
77
+ );
78
+ }
79
+ return newObj;
80
+ }
81
+ // Not an entity or array, just return it.
82
+ return item;
74
83
  }
75
84
 
76
- export function entitiesToReferences(item: any): any {
77
- if (item instanceof Entity && typeof item.$toReference === 'function') {
85
+ export function entitiesToReferences(item: any, existingOnly?: boolean): any {
86
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
87
+ return item;
88
+ } else if (item instanceof Entity) {
78
89
  // Convert entities to references.
79
- return item.$toReference();
90
+ return item.$toReference(existingOnly);
91
+ } else if (typeof item === 'function' && item.prototype instanceof Entity) {
92
+ // Don't touch Entity classes.
93
+ return item;
80
94
  } else if (Array.isArray(item)) {
81
95
  // Recurse into lower arrays.
82
- return item.map((entry) => entitiesToReferences(entry));
96
+ return item.map((entry) => entitiesToReferences(entry, existingOnly));
83
97
  } else if (item instanceof Object) {
84
98
  let newObj = Object.create(item);
85
99
  for (let [key, value] of Object.entries(item)) {
86
- newObj[key] = entitiesToReferences(value);
100
+ newObj[key] = entitiesToReferences(value, existingOnly);
87
101
  }
88
102
  return newObj;
89
103
  }
@@ -94,13 +108,19 @@ export function entitiesToReferences(item: any): any {
94
108
  export function referencesToEntities(
95
109
  item: any,
96
110
  nymph: Nymph,
97
- useSkipAc = false
111
+ useSkipAc = false,
112
+ enforceRestEnabledFlag = false,
98
113
  ): any {
99
- if (Array.isArray(item)) {
114
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
115
+ return item;
116
+ } else if (Array.isArray(item)) {
100
117
  // Check if it's a reference.
101
118
  if (item[0] === 'nymph_entity_reference') {
102
119
  try {
103
120
  const EntityClass = nymph.getEntityClass(item[2]);
121
+ if (enforceRestEnabledFlag && !EntityClass.restEnabled) {
122
+ throw new Error('Not accessible.');
123
+ }
104
124
  const entity = EntityClass.factoryReference(item as EntityReference);
105
125
  entity.$useSkipAc(useSkipAc);
106
126
  entity.$nymph = nymph;
@@ -110,12 +130,27 @@ export function referencesToEntities(
110
130
  }
111
131
  } else {
112
132
  // Recurse into lower arrays.
113
- return item.map((entry) => referencesToEntities(entry, nymph, useSkipAc));
133
+ return item.map((entry) =>
134
+ referencesToEntities(entry, nymph, useSkipAc, enforceRestEnabledFlag),
135
+ );
114
136
  }
115
- } else if (Entity && item instanceof Object && !(item instanceof Entity)) {
137
+ } else if (item instanceof Entity) {
138
+ // Don't touch entities.
139
+ return item;
140
+ } else if (typeof item === 'function' && item.prototype instanceof Entity) {
141
+ // Don't touch Entity classes.
142
+ return item;
143
+ } else if (item instanceof Object) {
144
+ let newObj = Object.create(item);
116
145
  for (let [key, value] of Object.entries(item)) {
117
- item[key] = referencesToEntities(value, nymph);
146
+ newObj[key] = referencesToEntities(
147
+ value,
148
+ nymph,
149
+ useSkipAc,
150
+ enforceRestEnabledFlag,
151
+ );
118
152
  }
153
+ return newObj;
119
154
  }
120
155
  // Not an array, just return it.
121
156
  return item;
package/tsconfig.json CHANGED
@@ -2,10 +2,13 @@
2
2
  "extends": "@tsconfig/recommended/tsconfig.json",
3
3
 
4
4
  "compilerOptions": {
5
- "lib": ["ES2021"],
6
- "target": "ES2021",
5
+ "types": ["node", "jest"],
6
+ "module": "nodenext",
7
+ "moduleResolution": "nodenext",
8
+ "lib": ["es2024"],
9
+ "target": "es2024",
7
10
  "noImplicitAny": true,
8
- "removeComments": true,
11
+ "removeComments": false,
9
12
  "sourceMap": true,
10
13
  "outDir": "dist",
11
14
  "resolveJsonModule": true,
package/typedoc.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": ["../../typedoc.base.json"],
3
+ "entryPoints": ["src/index.ts"]
4
+ }
package/dist/conf/d.d.ts DELETED
@@ -1,6 +0,0 @@
1
- export interface Config {
2
- cache: boolean;
3
- cacheThreshold: number;
4
- cacheLimit: number;
5
- emptyListError: boolean;
6
- }
package/dist/conf/d.js DELETED
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=d.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"d.js","sourceRoot":"","sources":["../../src/conf/d.ts"],"names":[],"mappings":""}
package/src/conf/d.ts DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * Nymph Config
3
- */
4
- export interface Config {
5
- /**
6
- * Cache recently retrieved entities to speed up database queries. Uses more
7
- * memory.
8
- */
9
- cache: boolean;
10
- /**
11
- * Cache entities after they're accessed this many times.
12
- */
13
- cacheThreshold: number;
14
- /**
15
- * The number of recently retrieved entities to cache. If you're running out
16
- * of memory, try lowering this value. 0 means unlimited.
17
- */
18
- cacheLimit: number;
19
- /**
20
- * When querying for multiple entities with NymphREST, if the list is empty,
21
- * return a 404 error.
22
- */
23
- emptyListError: boolean;
24
- }