@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/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 classNamesToEntityConstructors(
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
- selectors: Selector[],
42
+ item: T,
21
43
  enforceRestEnabledFlag = false,
22
- ): Selector[] {
23
- const newSelectors: Selector[] = [];
24
-
25
- for (const curSelector of selectors) {
26
- const newSelector: Selector = { type: curSelector.type };
27
-
28
- for (const k in curSelector) {
29
- const key = k as keyof Selector;
30
- const value = curSelector[key];
31
-
32
- if (key === 'type') {
33
- continue;
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
- newSelectors.push(newSelector);
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 newSelectors;
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) => referencesToEntities(entry, nymph, useSkipAc));
133
+ return item.map((entry) =>
134
+ referencesToEntities(entry, nymph, useSkipAc, enforceRestEnabledFlag),
135
+ );
135
136
  }
136
- } 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);
137
145
  for (let [key, value] of Object.entries(item)) {
138
- item[key] = referencesToEntities(value, nymph);
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;