@nymphjs/nymph 1.0.0-beta.13 → 1.0.0-beta.130
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 +644 -0
- package/README.md +34 -24
- package/dist/Entity.d.ts +304 -15
- package/dist/Entity.js +609 -154
- package/dist/Entity.js.map +1 -1
- package/dist/Entity.test.js +75 -29
- package/dist/Entity.test.js.map +1 -1
- package/dist/Entity.types.d.ts +275 -28
- package/dist/Entity.types.js +1 -2
- package/dist/Nymph.d.ts +575 -11
- package/dist/Nymph.js +825 -288
- package/dist/Nymph.js.map +1 -1
- package/dist/Nymph.types.d.ts +117 -7
- package/dist/Nymph.types.js +47 -5
- package/dist/Nymph.types.js.map +1 -1
- package/dist/conf/defaults.d.ts +1 -1
- package/dist/conf/defaults.js +26 -3
- package/dist/conf/defaults.js.map +1 -1
- package/dist/conf/index.d.ts +50 -2
- package/dist/conf/index.js +2 -8
- package/dist/conf/index.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +2 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/transactional.d.ts +12 -0
- package/dist/decorators/transactional.js +45 -0
- package/dist/decorators/transactional.js.map +1 -0
- package/dist/driver/NymphDriver.d.ts +209 -41
- package/dist/driver/NymphDriver.js +737 -242
- package/dist/driver/NymphDriver.js.map +1 -1
- package/dist/driver/index.d.ts +1 -2
- package/dist/driver/index.js +2 -23
- package/dist/driver/index.js.map +1 -1
- package/dist/driver/testArtifacts.d.ts +4 -4
- package/dist/driver/testArtifacts.js +2016 -1086
- package/dist/driver/testArtifacts.js.map +1 -1
- package/dist/errors/ClassNotAvailableError.js +1 -5
- package/dist/errors/ClassNotAvailableError.js.map +1 -1
- package/dist/errors/EntityConflictError.js +1 -5
- package/dist/errors/EntityConflictError.js.map +1 -1
- package/dist/errors/EntityInvalidDataError.d.ts +6 -0
- package/dist/errors/EntityInvalidDataError.js +8 -6
- package/dist/errors/EntityInvalidDataError.js.map +1 -1
- package/dist/errors/EntityIsSleepingReferenceError.js +1 -5
- package/dist/errors/EntityIsSleepingReferenceError.js.map +1 -1
- package/dist/errors/EntityUniqueConstraintError.d.ts +3 -0
- package/dist/errors/EntityUniqueConstraintError.js +7 -0
- package/dist/errors/EntityUniqueConstraintError.js.map +1 -0
- package/dist/errors/HttpError.d.ts +5 -0
- package/dist/errors/HttpError.js +11 -0
- package/dist/errors/HttpError.js.map +1 -0
- package/dist/errors/InvalidParametersError.js +1 -5
- package/dist/errors/InvalidParametersError.js.map +1 -1
- package/dist/errors/InvalidStateError.d.ts +3 -0
- package/dist/errors/InvalidStateError.js +7 -0
- package/dist/errors/InvalidStateError.js.map +1 -0
- package/dist/errors/MethodFailedError.d.ts +3 -0
- package/dist/errors/MethodFailedError.js +7 -0
- package/dist/errors/MethodFailedError.js.map +1 -0
- package/dist/errors/NotConfiguredError.js +1 -5
- package/dist/errors/NotConfiguredError.js.map +1 -1
- package/dist/errors/QueryFailedError.d.ts +2 -1
- package/dist/errors/QueryFailedError.js +5 -6
- package/dist/errors/QueryFailedError.js.map +1 -1
- package/dist/errors/UnableToConnectError.js +1 -5
- package/dist/errors/UnableToConnectError.js.map +1 -1
- package/dist/errors/index.d.ts +12 -8
- package/dist/errors/index.js +12 -24
- package/dist/errors/index.js.map +1 -1
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/transaction.d.ts +15 -0
- package/dist/helpers/transaction.js +47 -0
- package/dist/helpers/transaction.js.map +1 -0
- package/dist/index.d.ts +13 -11
- package/dist/index.js +16 -34
- package/dist/index.js.map +1 -1
- package/dist/nymphJoiProps.d.ts +1 -1
- package/dist/nymphJoiProps.js +10 -15
- package/dist/nymphJoiProps.js.map +1 -1
- package/dist/testArtifacts.d.ts +21 -6
- package/dist/testArtifacts.js +124 -50
- package/dist/testArtifacts.js.map +1 -1
- package/dist/testMocks.d.ts +27 -12
- package/dist/testMocks.js +44 -33
- package/dist/testMocks.js.map +1 -1
- package/dist/utils.d.ts +5 -5
- package/dist/utils.js +106 -68
- package/dist/utils.js.map +1 -1
- package/jest.config.js +31 -5
- package/package.json +43 -24
- package/src/Entity.test.ts +73 -23
- package/src/Entity.ts +555 -169
- package/src/Entity.types.ts +102 -90
- package/src/Nymph.ts +930 -517
- package/src/Nymph.types.ts +145 -39
- package/src/conf/defaults.ts +34 -1
- package/src/conf/index.ts +50 -2
- package/src/decorators/index.ts +1 -0
- package/src/decorators/transactional.ts +63 -0
- package/src/driver/NymphDriver.ts +987 -417
- package/src/driver/index.ts +1 -3
- package/src/driver/testArtifacts.ts +2699 -1628
- package/src/errors/EntityUniqueConstraintError.ts +6 -0
- package/src/errors/HttpError.ts +12 -0
- package/src/errors/InvalidStateError.ts +6 -0
- package/src/errors/MethodFailedError.ts +6 -0
- package/src/errors/QueryFailedError.ts +3 -1
- package/src/errors/index.ts +16 -8
- package/src/helpers/index.ts +1 -0
- package/src/helpers/transaction.ts +65 -0
- package/src/index.ts +13 -11
- package/src/nymphJoiProps.ts +2 -2
- package/src/testArtifacts.ts +69 -20
- package/src/testMocks.ts +107 -41
- package/src/utils.ts +102 -67
- package/tsconfig.json +6 -3
- package/typedoc.json +4 -0
- package/dist/conf/d.d.ts +0 -6
- package/dist/conf/d.js +0 -3
- package/dist/conf/d.js.map +0 -1
- 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
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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) =>
|
|
133
|
+
return item.map((entry) =>
|
|
134
|
+
referencesToEntities(entry, nymph, useSkipAc, enforceRestEnabledFlag),
|
|
135
|
+
);
|
|
114
136
|
}
|
|
115
|
-
} else if (
|
|
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
|
-
|
|
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
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"types": ["node", "jest"],
|
|
6
|
+
"module": "nodenext",
|
|
7
|
+
"moduleResolution": "nodenext",
|
|
8
|
+
"lib": ["es2024"],
|
|
9
|
+
"target": "es2024",
|
|
7
10
|
"noImplicitAny": true,
|
|
8
|
-
"removeComments":
|
|
11
|
+
"removeComments": false,
|
|
9
12
|
"sourceMap": true,
|
|
10
13
|
"outDir": "dist",
|
|
11
14
|
"resolveJsonModule": true,
|
package/typedoc.json
ADDED
package/dist/conf/d.d.ts
DELETED
package/dist/conf/d.js
DELETED
package/dist/conf/d.js.map
DELETED
|
@@ -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
|
-
}
|