@nymphjs/nymph 1.0.0-beta.123 → 1.0.0-beta.125
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 +12 -0
- package/dist/Entity.js +15 -9
- package/dist/Entity.js.map +1 -1
- package/dist/Entity.test.js +4 -4
- package/dist/Entity.test.js.map +1 -1
- package/dist/Entity.types.d.ts +9 -2
- package/dist/driver/NymphDriver.js +9 -1
- package/dist/driver/NymphDriver.js.map +1 -1
- package/dist/testMocks.js +1 -2
- package/dist/testMocks.js.map +1 -1
- package/dist/utils.d.ts +3 -3
- package/dist/utils.js +82 -55
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/Entity.test.ts +4 -4
- package/src/Entity.ts +33 -12
- package/src/Entity.types.ts +9 -2
- package/src/driver/NymphDriver.ts +13 -1
- package/src/testMocks.ts +1 -3
- package/src/utils.ts +88 -74
package/src/utils.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import Entity from './Entity.js';
|
|
2
2
|
import { EntityReference } from './Entity.types.js';
|
|
3
3
|
import Nymph from './Nymph.js';
|
|
4
|
-
import { Options, Selector } from './Nymph.types.js';
|
|
5
4
|
|
|
6
5
|
export function xor(a: any, b: any): boolean {
|
|
7
6
|
return !!(a && !b) || (!a && b);
|
|
@@ -15,87 +14,83 @@ export function uniqueStrings(array: string[]) {
|
|
|
15
14
|
return Object.keys(obj);
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
export function
|
|
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);
|
|
33
|
+
}
|
|
34
|
+
return newObj;
|
|
35
|
+
}
|
|
36
|
+
// Not an entity or array, just return it.
|
|
37
|
+
return item;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function classNamesToEntityConstructors<T extends any>(
|
|
19
41
|
nymph: Nymph,
|
|
20
|
-
|
|
42
|
+
item: T,
|
|
21
43
|
enforceRestEnabledFlag = false,
|
|
22
|
-
):
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (value === undefined) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (key === 'qref' || key === '!qref') {
|
|
41
|
-
const tmpArr = (
|
|
42
|
-
Array.isArray(((value as Selector['qref']) ?? [])[0])
|
|
43
|
-
? value
|
|
44
|
-
: [value]
|
|
45
|
-
) as [string, [Options, ...Selector[]]][];
|
|
46
|
-
for (let i = 0; i < tmpArr.length; i++) {
|
|
47
|
-
const name = tmpArr[i][0];
|
|
48
|
-
const [qrefOptions, ...selectors] = tmpArr[i][1];
|
|
49
|
-
const QrefEntityClass = qrefOptions.class
|
|
50
|
-
? nymph.getEntityClass(qrefOptions.class)
|
|
51
|
-
: nymph.getEntityClass('Entity');
|
|
52
|
-
if (enforceRestEnabledFlag && !QrefEntityClass.restEnabled) {
|
|
53
|
-
throw new Error('Not accessible.');
|
|
54
|
-
}
|
|
55
|
-
const options = { ...qrefOptions, class: QrefEntityClass };
|
|
56
|
-
if (!newSelector[key]) {
|
|
57
|
-
newSelector[key] = [];
|
|
58
|
-
}
|
|
59
|
-
(newSelector[key] as [string, [Options, ...Selector[]]][]).push([
|
|
60
|
-
name,
|
|
61
|
-
[
|
|
62
|
-
options,
|
|
63
|
-
...classNamesToEntityConstructors(
|
|
64
|
-
nymph,
|
|
65
|
-
selectors,
|
|
66
|
-
enforceRestEnabledFlag,
|
|
67
|
-
),
|
|
68
|
-
],
|
|
69
|
-
]);
|
|
70
|
-
}
|
|
71
|
-
} else if (key === 'selector' || key === '!selector') {
|
|
72
|
-
const tmpArr = (Array.isArray(value) ? value : [value]) as Selector[];
|
|
73
|
-
newSelector[key] = classNamesToEntityConstructors(
|
|
74
|
-
nymph,
|
|
75
|
-
tmpArr,
|
|
76
|
-
enforceRestEnabledFlag,
|
|
77
|
-
);
|
|
78
|
-
} else {
|
|
79
|
-
// @ts-ignore: ts doesn't know what value is here.
|
|
80
|
-
newSelector[key] = value;
|
|
81
|
-
}
|
|
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.');
|
|
82
57
|
}
|
|
83
|
-
|
|
84
|
-
|
|
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;
|
|
85
80
|
}
|
|
86
|
-
|
|
87
|
-
return
|
|
81
|
+
// Not an entity or array, just return it.
|
|
82
|
+
return item;
|
|
88
83
|
}
|
|
89
84
|
|
|
90
85
|
export function entitiesToReferences(item: any, existingOnly?: boolean): any {
|
|
91
86
|
if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
|
|
92
87
|
return item;
|
|
93
|
-
} else if (
|
|
94
|
-
item instanceof Entity &&
|
|
95
|
-
typeof item.$toReference === 'function'
|
|
96
|
-
) {
|
|
88
|
+
} else if (item instanceof Entity) {
|
|
97
89
|
// Convert entities to references.
|
|
98
90
|
return item.$toReference(existingOnly);
|
|
91
|
+
} else if (typeof item === 'function' && item.prototype instanceof Entity) {
|
|
92
|
+
// Don't touch Entity classes.
|
|
93
|
+
return item;
|
|
99
94
|
} else if (Array.isArray(item)) {
|
|
100
95
|
// Recurse into lower arrays.
|
|
101
96
|
return item.map((entry) => entitiesToReferences(entry, existingOnly));
|
|
@@ -114,6 +109,7 @@ export function referencesToEntities(
|
|
|
114
109
|
item: any,
|
|
115
110
|
nymph: Nymph,
|
|
116
111
|
useSkipAc = false,
|
|
112
|
+
enforceRestEnabledFlag = false,
|
|
117
113
|
): any {
|
|
118
114
|
if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
|
|
119
115
|
return item;
|
|
@@ -122,6 +118,9 @@ export function referencesToEntities(
|
|
|
122
118
|
if (item[0] === 'nymph_entity_reference') {
|
|
123
119
|
try {
|
|
124
120
|
const EntityClass = nymph.getEntityClass(item[2]);
|
|
121
|
+
if (enforceRestEnabledFlag && !EntityClass.restEnabled) {
|
|
122
|
+
throw new Error('Not accessible.');
|
|
123
|
+
}
|
|
125
124
|
const entity = EntityClass.factoryReference(item as EntityReference);
|
|
126
125
|
entity.$useSkipAc(useSkipAc);
|
|
127
126
|
entity.$nymph = nymph;
|
|
@@ -131,12 +130,27 @@ export function referencesToEntities(
|
|
|
131
130
|
}
|
|
132
131
|
} else {
|
|
133
132
|
// Recurse into lower arrays.
|
|
134
|
-
return item.map((entry) =>
|
|
133
|
+
return item.map((entry) =>
|
|
134
|
+
referencesToEntities(entry, nymph, useSkipAc, enforceRestEnabledFlag),
|
|
135
|
+
);
|
|
135
136
|
}
|
|
136
|
-
} 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);
|
|
137
145
|
for (let [key, value] of Object.entries(item)) {
|
|
138
|
-
|
|
146
|
+
newObj[key] = referencesToEntities(
|
|
147
|
+
value,
|
|
148
|
+
nymph,
|
|
149
|
+
useSkipAc,
|
|
150
|
+
enforceRestEnabledFlag,
|
|
151
|
+
);
|
|
139
152
|
}
|
|
153
|
+
return newObj;
|
|
140
154
|
}
|
|
141
155
|
// Not an array, just return it.
|
|
142
156
|
return item;
|