@akanjs/constant 0.9.48 → 0.9.49
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/cjs/src/baseGql.js +124 -122
- package/cjs/src/classMeta.js +12 -117
- package/cjs/src/constantInfo.js +145 -0
- package/cjs/src/crystalize.js +89 -0
- package/cjs/src/default.js +67 -0
- package/cjs/src/fieldInfo.js +98 -0
- package/cjs/src/immerify.js +35 -0
- package/cjs/src/index.js +6 -11
- package/cjs/src/purify.js +110 -0
- package/cjs/src/scalar.js +8 -12
- package/cjs/src/serialize.js +116 -0
- package/esm/src/baseGql.js +129 -132
- package/esm/src/classMeta.js +13 -118
- package/esm/src/constantInfo.js +126 -0
- package/esm/src/crystalize.js +78 -0
- package/esm/src/default.js +48 -0
- package/esm/src/fieldInfo.js +88 -0
- package/esm/src/immerify.js +16 -0
- package/esm/src/index.js +6 -7
- package/esm/src/purify.js +99 -0
- package/esm/src/scalar.js +8 -12
- package/esm/src/serialize.js +106 -0
- package/package.json +2 -1
- package/src/baseGql.d.ts +8 -4
- package/src/classMeta.d.ts +5 -21
- package/src/constantInfo.d.ts +69 -0
- package/src/crystalize.d.ts +6 -0
- package/src/default.d.ts +6 -0
- package/src/fieldInfo.d.ts +37 -0
- package/src/immerify.d.ts +2 -0
- package/src/index.d.ts +6 -5
- package/src/purify.d.ts +14 -0
- package/src/scalar.d.ts +16 -46
- package/src/serialize.d.ts +7 -0
- package/src/types.d.ts +3 -23
- package/cjs/src/constantDecorator.js +0 -67
- package/cjs/src/fieldMeta.js +0 -82
- package/cjs/src/filterMeta.js +0 -196
- package/esm/src/constantDecorator.js +0 -48
- package/esm/src/fieldMeta.js +0 -67
- package/esm/src/filterMeta.js +0 -181
- package/src/constantDecorator.d.ts +0 -30
- package/src/fieldMeta.d.ts +0 -7
- package/src/filterMeta.d.ts +0 -61
package/esm/src/baseGql.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import { ID } from "@akanjs/base";
|
|
2
|
+
import { ID, Int } from "@akanjs/base";
|
|
3
3
|
import { applyMixins } from "@akanjs/common";
|
|
4
|
-
import {
|
|
4
|
+
import { setExtendRef } from "./classMeta";
|
|
5
|
+
import { constantInfo } from "./constantInfo";
|
|
5
6
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
setFilterArgMetasOnPrototype,
|
|
11
|
-
setFilterKeyMetaMapOnPrototype,
|
|
12
|
-
setFilterMeta
|
|
13
|
-
} from "./filterMeta";
|
|
14
|
-
import { getClassMeta, getFieldMetaMap, setFieldMetaMap } from "./scalar";
|
|
7
|
+
field,
|
|
8
|
+
resolve
|
|
9
|
+
} from "./fieldInfo";
|
|
10
|
+
import { getFieldMetaMap, setFieldMetaMap } from "./scalar";
|
|
15
11
|
const defaultFieldMeta = {
|
|
16
12
|
fieldType: "property",
|
|
17
13
|
immutable: false,
|
|
@@ -26,166 +22,167 @@ const defaultFieldMeta = {
|
|
|
26
22
|
isMap: false,
|
|
27
23
|
meta: {}
|
|
28
24
|
};
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
...defaultFieldMeta,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
modelRef:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const extendModel = (modelRef) => {
|
|
41
|
-
class BaseModel {
|
|
42
|
-
}
|
|
43
|
-
const metadataMap = getFieldMetaMap(modelRef);
|
|
44
|
-
setFieldMetaMap(BaseModel, metadataMap);
|
|
45
|
-
return BaseModel;
|
|
46
|
-
};
|
|
47
|
-
const as = extendModel;
|
|
48
|
-
const baseModelOf = (modelRef) => {
|
|
49
|
-
class BaseModel {
|
|
50
|
-
__ModelType__ = "full";
|
|
25
|
+
const baseFieldMetaMap = /* @__PURE__ */ new Map([
|
|
26
|
+
["id", { ...defaultFieldMeta, key: "id", modelRef: ID }],
|
|
27
|
+
["createdAt", { ...defaultFieldMeta, key: "createdAt", modelRef: Date }],
|
|
28
|
+
["updatedAt", { ...defaultFieldMeta, key: "updatedAt", modelRef: Date }],
|
|
29
|
+
["removedAt", { ...defaultFieldMeta, key: "removedAt", modelRef: Date, nullable: true, default: null }]
|
|
30
|
+
]);
|
|
31
|
+
const baseInsightFieldMetaMap = /* @__PURE__ */ new Map([
|
|
32
|
+
["count", { ...defaultFieldMeta, key: "count", modelRef: Int, default: 0, accumulate: { $sum: 1 } }]
|
|
33
|
+
]);
|
|
34
|
+
const objectModelOf = (inputRef, fieldMap) => {
|
|
35
|
+
class ObjectModel {
|
|
51
36
|
}
|
|
52
|
-
const metadataMap = new Map(getFieldMetaMap(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
37
|
+
const metadataMap = new Map([...baseFieldMetaMap, ...getFieldMetaMap(inputRef)]);
|
|
38
|
+
setFieldMetaMap(ObjectModel, metadataMap);
|
|
39
|
+
setExtendRef(ObjectModel, inputRef);
|
|
40
|
+
constantInfo.setModelType(ObjectModel, "object");
|
|
41
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
42
|
+
fieldInfo.applyFieldMeta(ObjectModel, key);
|
|
43
|
+
});
|
|
44
|
+
return ObjectModel;
|
|
59
45
|
};
|
|
60
|
-
const lightModelOf = (objectRef, fields, ...libLightModelRefs) => {
|
|
46
|
+
const lightModelOf = (objectRef, fields, fieldMap, ...libLightModelRefs) => {
|
|
61
47
|
const objectFieldMetaMap = getFieldMetaMap(objectRef);
|
|
62
48
|
const baseLightModelRef = libLightModelRefs.at(0);
|
|
63
|
-
const fieldMetaMap = baseLightModelRef ? getFieldMetaMap(baseLightModelRef) :
|
|
49
|
+
const fieldMetaMap = baseLightModelRef ? getFieldMetaMap(baseLightModelRef) : new Map([...baseFieldMetaMap]);
|
|
64
50
|
class BaseLightModel {
|
|
65
|
-
__ModelType__ = "light";
|
|
66
51
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
fieldMetaMap.set("updatedAt", updatedAtFieldMeta);
|
|
70
|
-
fieldMetaMap.set("removedAt", removedAtFieldMeta);
|
|
71
|
-
for (const field of fields) {
|
|
72
|
-
const fieldMeta = objectFieldMetaMap.get(field);
|
|
52
|
+
for (const field2 of fields) {
|
|
53
|
+
const fieldMeta = objectFieldMetaMap.get(field2);
|
|
73
54
|
if (!fieldMeta)
|
|
74
|
-
throw new Error(`Field ${
|
|
75
|
-
fieldMetaMap.set(
|
|
55
|
+
throw new Error(`Field ${field2} not found in objectRef`);
|
|
56
|
+
fieldMetaMap.set(field2, fieldMeta);
|
|
76
57
|
}
|
|
77
58
|
applyMixins(BaseLightModel, libLightModelRefs);
|
|
78
|
-
|
|
59
|
+
setFieldMetaMap(BaseLightModel, fieldMetaMap);
|
|
60
|
+
setExtendRef(BaseLightModel, objectRef);
|
|
61
|
+
constantInfo.setModelType(BaseLightModel, "light");
|
|
62
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
63
|
+
fieldInfo.applyFieldMeta(BaseLightModel, key);
|
|
64
|
+
});
|
|
79
65
|
return BaseLightModel;
|
|
80
66
|
};
|
|
81
|
-
const fullModelOf = (
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
67
|
+
const fullModelOf = (objectRef, lightRef, fieldMap, ...libFullModelRefs) => {
|
|
68
|
+
const fullRef = libFullModelRefs.at(0) ?? class FullModel {
|
|
69
|
+
};
|
|
70
|
+
const fieldMetaMap = new Map([...getFieldMetaMap(objectRef), ...getFieldMetaMap(lightRef)]);
|
|
71
|
+
applyMixins(fullRef, [objectRef, lightRef, ...libFullModelRefs]);
|
|
85
72
|
libFullModelRefs.forEach((libFullModelRef) => {
|
|
86
|
-
applyMixins(libFullModelRef, [
|
|
73
|
+
applyMixins(libFullModelRef, [objectRef, lightRef]);
|
|
74
|
+
});
|
|
75
|
+
setFieldMetaMap(fullRef, fieldMetaMap);
|
|
76
|
+
setExtendRef(fullRef, objectRef);
|
|
77
|
+
constantInfo.setModelType(fullRef, "full");
|
|
78
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
79
|
+
fieldInfo.applyFieldMeta(fullRef, key);
|
|
87
80
|
});
|
|
88
|
-
|
|
89
|
-
return modelRef;
|
|
81
|
+
return fullRef;
|
|
90
82
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (!fieldsOrLightModelRef) {
|
|
94
|
-
if (classMeta.type === "input") {
|
|
95
|
-
const objectRefName = classMeta.refName.slice(0, -5) + "Object";
|
|
96
|
-
const isFullModelRefDefined = getFullModelRefs(objectRefName).length > 0;
|
|
97
|
-
if (isFullModelRefDefined)
|
|
98
|
-
return extendModelInputs(modelRef);
|
|
99
|
-
else
|
|
100
|
-
return baseModelOf(modelRef);
|
|
101
|
-
} else if (classMeta.modelType === "insight")
|
|
102
|
-
return extendModelInsights(modelRef);
|
|
103
|
-
else
|
|
104
|
-
throw new Error("Invalid modelRef args");
|
|
83
|
+
const makeBaseScalar = (fieldMap) => {
|
|
84
|
+
class BaseScalar {
|
|
105
85
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
86
|
+
constantInfo.setModelType(BaseScalar, "scalar");
|
|
87
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
88
|
+
fieldInfo.applyFieldMeta(BaseScalar, key);
|
|
89
|
+
});
|
|
90
|
+
return BaseScalar;
|
|
91
|
+
};
|
|
92
|
+
function via(firstRefOrBuildField, secondRefOrFieldsOrBuildField, thirdRefOrResolveField, ...extendRefs) {
|
|
93
|
+
if (!firstRefOrBuildField.prototype || !constantInfo.getModelType(firstRefOrBuildField, { allowEmpty: true })) {
|
|
94
|
+
const buildField = firstRefOrBuildField;
|
|
95
|
+
const fieldMap = buildField(field);
|
|
96
|
+
const extendInputRefs = [
|
|
97
|
+
...secondRefOrFieldsOrBuildField ? [secondRefOrFieldsOrBuildField] : [],
|
|
98
|
+
...thirdRefOrResolveField ? [thirdRefOrResolveField] : [],
|
|
99
|
+
...extendRefs
|
|
100
|
+
];
|
|
101
|
+
if (!secondRefOrFieldsOrBuildField)
|
|
102
|
+
return makeBaseScalar(fieldMap);
|
|
120
103
|
else
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
104
|
+
return extendModelInputs(fieldMap, ...extendInputRefs);
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(secondRefOrFieldsOrBuildField)) {
|
|
107
|
+
const resolveField = thirdRefOrResolveField;
|
|
108
|
+
const fieldMap = resolveField(resolve);
|
|
109
|
+
return lightModelOf(
|
|
110
|
+
firstRefOrBuildField,
|
|
111
|
+
secondRefOrFieldsOrBuildField,
|
|
112
|
+
fieldMap,
|
|
113
|
+
...extendRefs
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if (!secondRefOrFieldsOrBuildField.prototype || !constantInfo.getModelType(secondRefOrFieldsOrBuildField, { allowEmpty: true })) {
|
|
117
|
+
const buildField = secondRefOrFieldsOrBuildField;
|
|
118
|
+
const fieldMap = buildField(field);
|
|
119
|
+
if (constantInfo.isScalar(firstRefOrBuildField)) {
|
|
120
|
+
if (!thirdRefOrResolveField)
|
|
121
|
+
return objectModelOf(firstRefOrBuildField, fieldMap);
|
|
122
|
+
else
|
|
123
|
+
return extendModelObjects(
|
|
124
|
+
firstRefOrBuildField,
|
|
125
|
+
fieldMap,
|
|
126
|
+
thirdRefOrResolveField,
|
|
127
|
+
...extendRefs
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
if (constantInfo.isFull(firstRefOrBuildField)) {
|
|
131
|
+
const extendInsightRefs = [
|
|
132
|
+
...thirdRefOrResolveField ? [thirdRefOrResolveField] : [],
|
|
133
|
+
...extendRefs
|
|
134
|
+
];
|
|
135
|
+
return extendModelInsights(fieldMap, ...extendInsightRefs);
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
const objectRef = firstRefOrBuildField;
|
|
139
|
+
const lightRef = secondRefOrFieldsOrBuildField;
|
|
140
|
+
const resolveField = thirdRefOrResolveField;
|
|
141
|
+
const fieldMap = resolveField(resolve);
|
|
142
|
+
return fullModelOf(objectRef, lightRef, fieldMap, ...extendRefs);
|
|
143
|
+
}
|
|
144
|
+
throw new Error(
|
|
145
|
+
`Invalid modelRef args ${firstRefOrBuildField} ${secondRefOrFieldsOrBuildField} ${extendRefs.join(", ")}`
|
|
146
|
+
);
|
|
126
147
|
}
|
|
127
|
-
const extendModelInputs = (...libInputModelRefs) => {
|
|
148
|
+
const extendModelInputs = (fieldMap, ...libInputModelRefs) => {
|
|
128
149
|
const baseInputModelRef = libInputModelRefs.at(0);
|
|
129
150
|
const fieldMetaMap = baseInputModelRef ? getFieldMetaMap(baseInputModelRef) : /* @__PURE__ */ new Map();
|
|
130
151
|
class BaseInput {
|
|
131
|
-
__ModelType__ = "input";
|
|
132
152
|
}
|
|
133
153
|
setFieldMetaMap(BaseInput, fieldMetaMap);
|
|
154
|
+
constantInfo.setModelType(BaseInput, "scalar");
|
|
155
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
156
|
+
fieldInfo.applyFieldMeta(BaseInput, key);
|
|
157
|
+
});
|
|
134
158
|
return BaseInput;
|
|
135
159
|
};
|
|
136
|
-
const extendModelObjects = (inputRef, ...libObjectModelRefs) => {
|
|
160
|
+
const extendModelObjects = (inputRef, fieldMap, ...libObjectModelRefs) => {
|
|
137
161
|
const baseObjectModelRef = libObjectModelRefs.at(0);
|
|
138
162
|
const inputFieldMetaMap = getFieldMetaMap(inputRef);
|
|
139
163
|
const fieldMetaMap = baseObjectModelRef ? getFieldMetaMap(baseObjectModelRef) : /* @__PURE__ */ new Map();
|
|
140
164
|
class BaseInput {
|
|
141
|
-
__ModelType__ = "object";
|
|
142
165
|
}
|
|
143
166
|
inputFieldMetaMap.forEach((value, key) => fieldMetaMap.set(key, value));
|
|
144
167
|
setFieldMetaMap(BaseInput, fieldMetaMap);
|
|
168
|
+
constantInfo.setModelType(BaseInput, "object");
|
|
169
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
170
|
+
fieldInfo.applyFieldMeta(BaseInput, key);
|
|
171
|
+
});
|
|
145
172
|
return BaseInput;
|
|
146
173
|
};
|
|
147
|
-
const extendModelInsights = (...insightModelRefs) => {
|
|
174
|
+
const extendModelInsights = (fieldMap, ...insightModelRefs) => {
|
|
148
175
|
const baseInsightModelRef = insightModelRefs.at(0);
|
|
149
|
-
const insightFieldMetaMap = baseInsightModelRef ? getFieldMetaMap(baseInsightModelRef) :
|
|
176
|
+
const insightFieldMetaMap = baseInsightModelRef ? getFieldMetaMap(baseInsightModelRef) : new Map([...baseInsightFieldMetaMap]);
|
|
150
177
|
class BaseInsight {
|
|
151
|
-
__ModelType__ = "insight";
|
|
152
178
|
}
|
|
153
179
|
setFieldMetaMap(BaseInsight, insightFieldMetaMap);
|
|
180
|
+
constantInfo.setModelType(BaseInsight, "insight");
|
|
181
|
+
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
182
|
+
fieldInfo.applyFieldMeta(BaseInsight, key);
|
|
183
|
+
});
|
|
154
184
|
return BaseInsight;
|
|
155
185
|
};
|
|
156
|
-
const addModelOf = (modelRef, ...types) => {
|
|
157
|
-
const modelMetadataMap = getFieldMetaMap(modelRef);
|
|
158
|
-
const metadataMap = types.reduce((acc, writeRef) => {
|
|
159
|
-
const writeMetadataMap = getFieldMetaMap(writeRef);
|
|
160
|
-
applyMixins(modelRef, [writeRef]);
|
|
161
|
-
return new Map([...acc, ...writeMetadataMap]);
|
|
162
|
-
}, modelMetadataMap);
|
|
163
|
-
setFieldMetaMap(modelRef, metadataMap);
|
|
164
|
-
return modelRef;
|
|
165
|
-
};
|
|
166
|
-
const addFilterOf = (filterRef, ...types) => {
|
|
167
|
-
const filterMeta = getFilterMeta(filterRef);
|
|
168
|
-
const filterQueryMap = getFilterQueryMap(filterRef);
|
|
169
|
-
const metadataMap = new Map(
|
|
170
|
-
types.reduce((acc, writeRef) => {
|
|
171
|
-
const writeMetadataMap = getFilterQueryMap(writeRef);
|
|
172
|
-
applyMixins(filterRef, [writeRef]);
|
|
173
|
-
writeMetadataMap.forEach((value, key) => {
|
|
174
|
-
const filterArgMetas = getFilterArgMetas(writeRef, key);
|
|
175
|
-
setFilterArgMetasOnPrototype(filterRef.prototype, key, filterArgMetas);
|
|
176
|
-
});
|
|
177
|
-
return new Map([...acc, ...writeMetadataMap]);
|
|
178
|
-
}, filterQueryMap)
|
|
179
|
-
);
|
|
180
|
-
const filterSort = types.filter(Boolean).map((t) => getFilterSortMap(t)).reduce((acc, sort) => {
|
|
181
|
-
Object.assign(acc, sort);
|
|
182
|
-
return acc;
|
|
183
|
-
}, filterMeta.sort);
|
|
184
|
-
setFilterKeyMetaMapOnPrototype(filterRef.prototype, metadataMap);
|
|
185
|
-
setFilterMeta(filterRef, { ...filterMeta, sort: filterSort });
|
|
186
|
-
return filterRef;
|
|
187
|
-
};
|
|
188
186
|
export {
|
|
189
|
-
as,
|
|
190
187
|
via
|
|
191
188
|
};
|
package/esm/src/classMeta.js
CHANGED
|
@@ -1,49 +1,14 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
class LightModelStorage {
|
|
8
|
-
}
|
|
9
|
-
class FullModelStorage {
|
|
10
|
-
}
|
|
11
|
-
class ScalarModelStorage {
|
|
12
|
-
}
|
|
13
|
-
class FilterModelStorage {
|
|
14
|
-
}
|
|
15
|
-
const getFullModelRef = (refName) => {
|
|
16
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), FullModelStorage.prototype);
|
|
17
|
-
const modelRef = modelRefs?.[0];
|
|
18
|
-
if (!modelRef)
|
|
19
|
-
throw new Error(`FullModel not found - ${refName}`);
|
|
20
|
-
return modelRef;
|
|
2
|
+
import { constantInfo } from "./constantInfo";
|
|
3
|
+
import { getFieldMetas } from "./scalar";
|
|
4
|
+
const setExtendRef = (modelRef, extendRef) => {
|
|
5
|
+
Reflect.defineMetadata("akan:extend", extendRef, modelRef.prototype);
|
|
21
6
|
};
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), InputModelStorage.prototype);
|
|
28
|
-
const modelRef = modelRefs?.[0];
|
|
29
|
-
if (!modelRef)
|
|
30
|
-
throw new Error(`InputModel not found - ${refName}`);
|
|
31
|
-
return modelRef;
|
|
32
|
-
};
|
|
33
|
-
const getInputModelRefs = (refName) => {
|
|
34
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), InputModelStorage.prototype);
|
|
35
|
-
return modelRefs ?? [];
|
|
36
|
-
};
|
|
37
|
-
const getScalarModelRef = (refName) => {
|
|
38
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), ScalarModelStorage.prototype);
|
|
39
|
-
const modelRef = modelRefs?.[0];
|
|
40
|
-
if (!modelRef)
|
|
41
|
-
throw new Error(`ScalarModel not found - ${refName}`);
|
|
42
|
-
return modelRef;
|
|
43
|
-
};
|
|
44
|
-
const getScalarModelRefs = (refName) => {
|
|
45
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), ScalarModelStorage.prototype);
|
|
46
|
-
return modelRefs ?? [];
|
|
7
|
+
const getExtendRef = (modelRef, { allowEmpty } = {}) => {
|
|
8
|
+
const extendRef = Reflect.getMetadata("akan:extend", modelRef.prototype);
|
|
9
|
+
if (!extendRef && !allowEmpty)
|
|
10
|
+
throw new Error(`ExtendRef not found - ${modelRef.name}`);
|
|
11
|
+
return extendRef;
|
|
47
12
|
};
|
|
48
13
|
const getChildClassRefs = (target) => {
|
|
49
14
|
const metadatas = getFieldMetas(target);
|
|
@@ -51,7 +16,7 @@ const getChildClassRefs = (target) => {
|
|
|
51
16
|
const childRefs = metadatas.filter((metadata) => metadata.isClass).reduce((acc, metadata) => {
|
|
52
17
|
return [...acc, metadata.modelRef, ...getChildClassRefs(metadata.modelRef)];
|
|
53
18
|
}, []);
|
|
54
|
-
childRefs.filter((modelRef, idx) => childRefs.findIndex((ref) => ref.prototype === modelRef.prototype) === idx).map((modelRef) => refMap.set(
|
|
19
|
+
childRefs.filter((modelRef, idx) => childRefs.findIndex((ref) => ref.prototype === modelRef.prototype) === idx).map((modelRef) => refMap.set(constantInfo.getRefName(modelRef), modelRef));
|
|
55
20
|
return [...refMap.values()];
|
|
56
21
|
};
|
|
57
22
|
const getFieldEnumMetas = (modelRef) => {
|
|
@@ -64,80 +29,10 @@ const hasTextField = (modelRef) => {
|
|
|
64
29
|
(fieldMeta) => !!fieldMeta.text || fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField(fieldMeta.modelRef)
|
|
65
30
|
);
|
|
66
31
|
};
|
|
67
|
-
const applyClassMeta = (type, modelType, storage) => {
|
|
68
|
-
return function(refName) {
|
|
69
|
-
return function(target) {
|
|
70
|
-
const modelRef = target;
|
|
71
|
-
const classMeta = { refName, type, modelType, modelRef, hasTextField: hasTextField(modelRef) };
|
|
72
|
-
Reflect.defineMetadata("class", classMeta, modelRef.prototype);
|
|
73
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), storage.prototype);
|
|
74
|
-
if (modelRefs)
|
|
75
|
-
modelRefs.push(modelRef);
|
|
76
|
-
else
|
|
77
|
-
Reflect.defineMetadata(refName, [modelRef], storage.prototype);
|
|
78
|
-
};
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
const applyFilterMeta = (storage) => {
|
|
82
|
-
return function(refName) {
|
|
83
|
-
return function(target) {
|
|
84
|
-
const modelRef = target;
|
|
85
|
-
setFilterMeta(modelRef, { refName, sort: {} });
|
|
86
|
-
const modelRefs = Reflect.getMetadata(capitalize(refName), storage.prototype);
|
|
87
|
-
if (modelRefs)
|
|
88
|
-
modelRefs.push(modelRef);
|
|
89
|
-
else
|
|
90
|
-
Reflect.defineMetadata(refName, [modelRef], storage.prototype);
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
|
-
const Model = {
|
|
95
|
-
Light: applyClassMeta("light", "data", LightModelStorage),
|
|
96
|
-
Object: applyClassMeta("full", "ephemeral", FullModelStorage),
|
|
97
|
-
Full: applyClassMeta("full", "data", FullModelStorage),
|
|
98
|
-
Input: applyClassMeta("input", "data", InputModelStorage),
|
|
99
|
-
Scalar: applyClassMeta("scalar", "data", ScalarModelStorage),
|
|
100
|
-
Insight: applyClassMeta("scalar", "insight", ScalarModelStorage),
|
|
101
|
-
Filter: applyFilterMeta(FilterModelStorage)
|
|
102
|
-
};
|
|
103
|
-
const getLightModelRef = (modelRef) => {
|
|
104
|
-
const classMeta = getClassMeta(modelRef);
|
|
105
|
-
if (classMeta.type !== "full")
|
|
106
|
-
return modelRef;
|
|
107
|
-
const lightModelRefs = Reflect.getMetadata(`Light${classMeta.refName}`, LightModelStorage.prototype);
|
|
108
|
-
const lightModelRef = lightModelRefs?.at(-1);
|
|
109
|
-
if (!lightModelRef)
|
|
110
|
-
throw new Error(`LightModel not found - ${classMeta.refName}`);
|
|
111
|
-
return lightModelRef;
|
|
112
|
-
};
|
|
113
|
-
const getAllFullModelRefs = () => {
|
|
114
|
-
const modelNames = Reflect.getMetadataKeys(FullModelStorage.prototype);
|
|
115
|
-
const modelRefs = modelNames.map((modelName) => Reflect.getMetadata(modelName, FullModelStorage.prototype)).flat();
|
|
116
|
-
return modelRefs;
|
|
117
|
-
};
|
|
118
|
-
const getAllScalarModelRefs = () => {
|
|
119
|
-
const modelNames = Reflect.getMetadataKeys(ScalarModelStorage.prototype);
|
|
120
|
-
const modelRefs = modelNames.map((modelName) => Reflect.getMetadata(modelName, ScalarModelStorage.prototype)).flat();
|
|
121
|
-
return modelRefs;
|
|
122
|
-
};
|
|
123
|
-
const getAllFilterModelRefs = () => {
|
|
124
|
-
const modelNames = Reflect.getMetadataKeys(FilterModelStorage.prototype);
|
|
125
|
-
const modelRefs = modelNames.map((modelName) => Reflect.getMetadata(modelName, FilterModelStorage.prototype)).flat();
|
|
126
|
-
return modelRefs;
|
|
127
|
-
};
|
|
128
32
|
export {
|
|
129
|
-
Model,
|
|
130
|
-
getAllFilterModelRefs,
|
|
131
|
-
getAllFullModelRefs,
|
|
132
|
-
getAllScalarModelRefs,
|
|
133
33
|
getChildClassRefs,
|
|
34
|
+
getExtendRef,
|
|
134
35
|
getFieldEnumMetas,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
getInputModelRef,
|
|
138
|
-
getInputModelRefs,
|
|
139
|
-
getLightModelRef,
|
|
140
|
-
getScalarModelRef,
|
|
141
|
-
getScalarModelRefs,
|
|
142
|
-
hasTextField
|
|
36
|
+
hasTextField,
|
|
37
|
+
setExtendRef
|
|
143
38
|
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { gqlScalarMap } from "@akanjs/base";
|
|
3
|
+
import { makeCrystalize, makeDefault, makePurify } from ".";
|
|
4
|
+
import { immerify } from "./immerify";
|
|
5
|
+
const constantInfo = {
|
|
6
|
+
database: /* @__PURE__ */ new Map(),
|
|
7
|
+
scalar: /* @__PURE__ */ new Map(),
|
|
8
|
+
modelRefNameMap: /* @__PURE__ */ new Map(),
|
|
9
|
+
getRefName(modelRef, { allowEmpty } = {}) {
|
|
10
|
+
const refName = constantInfo.modelRefNameMap.get(modelRef);
|
|
11
|
+
if (!refName && !allowEmpty)
|
|
12
|
+
throw new Error(`No ref name for modelRef: ${modelRef}`);
|
|
13
|
+
return refName;
|
|
14
|
+
},
|
|
15
|
+
getModelType(modelRef, { allowEmpty } = {}) {
|
|
16
|
+
const modelType = Reflect.getMetadata("akan:modeltype", modelRef.prototype);
|
|
17
|
+
if (!modelType && !allowEmpty)
|
|
18
|
+
throw new Error(`No model type for modelRef: ${modelRef}`);
|
|
19
|
+
return modelType;
|
|
20
|
+
},
|
|
21
|
+
setModelType(modelRef, modelType) {
|
|
22
|
+
Reflect.defineMetadata("akan:modeltype", modelType, modelRef.prototype);
|
|
23
|
+
},
|
|
24
|
+
isObject(modelRef) {
|
|
25
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "object";
|
|
26
|
+
},
|
|
27
|
+
isFull(modelRef) {
|
|
28
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "full";
|
|
29
|
+
},
|
|
30
|
+
isLight(modelRef) {
|
|
31
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "light";
|
|
32
|
+
},
|
|
33
|
+
isInsight(modelRef) {
|
|
34
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "insight";
|
|
35
|
+
},
|
|
36
|
+
isFilter(modelRef) {
|
|
37
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "filter";
|
|
38
|
+
},
|
|
39
|
+
isScalar(modelRef) {
|
|
40
|
+
return constantInfo.getModelType(modelRef, { allowEmpty: true }) === "scalar";
|
|
41
|
+
},
|
|
42
|
+
setDatabase(refName, cnst) {
|
|
43
|
+
constantInfo.database.set(refName, cnst);
|
|
44
|
+
},
|
|
45
|
+
getDatabase(refName, { allowEmpty } = {}) {
|
|
46
|
+
const info = constantInfo.database.get(refName);
|
|
47
|
+
if (!info && !allowEmpty)
|
|
48
|
+
throw new Error(`No database constant model info for ${refName}`);
|
|
49
|
+
return info;
|
|
50
|
+
},
|
|
51
|
+
setScalar(refName, cnst) {
|
|
52
|
+
if (constantInfo.scalar.has(refName))
|
|
53
|
+
return;
|
|
54
|
+
constantInfo.scalar.set(refName, cnst);
|
|
55
|
+
},
|
|
56
|
+
getScalar(refName, { allowEmpty } = {}) {
|
|
57
|
+
const model = constantInfo.scalar.get(refName);
|
|
58
|
+
if (!model && !allowEmpty)
|
|
59
|
+
throw new Error(`No scalar constant model for ${refName}`);
|
|
60
|
+
return model;
|
|
61
|
+
},
|
|
62
|
+
getModelRef(refName, modelType) {
|
|
63
|
+
if (modelType === "scalar") {
|
|
64
|
+
if (gqlScalarMap.has(refName))
|
|
65
|
+
return gqlScalarMap.get(refName);
|
|
66
|
+
else
|
|
67
|
+
return constantInfo.getScalar(refName).model;
|
|
68
|
+
} else
|
|
69
|
+
return constantInfo.getDatabase(refName)[modelType];
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const cnstOf = (refName, Input, Full, Light, Insight, option = {}) => {
|
|
73
|
+
[Input, Full, Light, Insight].forEach((modelRef) => {
|
|
74
|
+
constantInfo.modelRefNameMap.set(modelRef, refName);
|
|
75
|
+
});
|
|
76
|
+
constantInfo.setModelType(Input, "input");
|
|
77
|
+
constantInfo.setModelType(Full, "full");
|
|
78
|
+
constantInfo.setModelType(Light, "light");
|
|
79
|
+
constantInfo.setModelType(Insight, "insight");
|
|
80
|
+
const cnst = {
|
|
81
|
+
refName,
|
|
82
|
+
input: Input,
|
|
83
|
+
full: Full,
|
|
84
|
+
light: Light,
|
|
85
|
+
insight: Insight,
|
|
86
|
+
crystalize: makeCrystalize(Full, option),
|
|
87
|
+
lightCrystalize: makeCrystalize(Light, option),
|
|
88
|
+
crystalizeInsight: makeCrystalize(Insight, option),
|
|
89
|
+
purify: makePurify(Input, option),
|
|
90
|
+
getDefault: () => immerify(Full, Object.assign(new Full(), makeDefault(Full, option))),
|
|
91
|
+
getDefaultInsight: () => immerify(Insight, Object.assign(new Insight(), makeDefault(Insight, option))),
|
|
92
|
+
_CapitalizedT: null,
|
|
93
|
+
_Default: null,
|
|
94
|
+
_DefaultInput: null,
|
|
95
|
+
_DefaultState: null,
|
|
96
|
+
_DefaultStateInput: null,
|
|
97
|
+
_DefaultInsight: null,
|
|
98
|
+
_PurifiedInput: null,
|
|
99
|
+
_Doc: null,
|
|
100
|
+
_DocInput: null,
|
|
101
|
+
_QueryOfDoc: null
|
|
102
|
+
};
|
|
103
|
+
constantInfo.setDatabase(refName, cnst);
|
|
104
|
+
return cnst;
|
|
105
|
+
};
|
|
106
|
+
const scalarCnstOf = (refName, Model) => {
|
|
107
|
+
constantInfo.setModelType(Model, "scalar");
|
|
108
|
+
constantInfo.modelRefNameMap.set(Model, refName);
|
|
109
|
+
const cnst = {
|
|
110
|
+
refName,
|
|
111
|
+
model: Model,
|
|
112
|
+
crystalize: makeCrystalize(Model),
|
|
113
|
+
purify: makePurify(Model),
|
|
114
|
+
getDefault: () => immerify(Model, Object.assign(new Model(), makeDefault(Model))),
|
|
115
|
+
_Default: null,
|
|
116
|
+
_Doc: null,
|
|
117
|
+
_PurifiedInput: null
|
|
118
|
+
};
|
|
119
|
+
constantInfo.setScalar(refName, cnst);
|
|
120
|
+
return cnst;
|
|
121
|
+
};
|
|
122
|
+
export {
|
|
123
|
+
cnstOf,
|
|
124
|
+
constantInfo,
|
|
125
|
+
scalarCnstOf
|
|
126
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyFnToArrayObjects,
|
|
3
|
+
dayjs,
|
|
4
|
+
Float,
|
|
5
|
+
getNonArrayModel,
|
|
6
|
+
ID,
|
|
7
|
+
Int,
|
|
8
|
+
JSON as GqlJSON
|
|
9
|
+
} from "@akanjs/base";
|
|
10
|
+
import { capitalize } from "@akanjs/common";
|
|
11
|
+
import { constantInfo, getFieldMetaMap } from ".";
|
|
12
|
+
class CrystalizeStorage {
|
|
13
|
+
}
|
|
14
|
+
const scalarCrystalizeMap = /* @__PURE__ */ new Map([
|
|
15
|
+
[Date, (value) => dayjs(value)],
|
|
16
|
+
[String, (value) => value],
|
|
17
|
+
[ID, (value) => value],
|
|
18
|
+
[Boolean, (value) => value],
|
|
19
|
+
[Int, (value) => value],
|
|
20
|
+
[Float, (value) => value],
|
|
21
|
+
[GqlJSON, (value) => value]
|
|
22
|
+
]);
|
|
23
|
+
const crystalize = (metadata, value) => {
|
|
24
|
+
if (value === void 0 || value === null)
|
|
25
|
+
return value;
|
|
26
|
+
if (metadata.isArray && Array.isArray(value))
|
|
27
|
+
return value.map((v) => crystalize({ ...metadata, isArray: false }, v));
|
|
28
|
+
if (metadata.isMap) {
|
|
29
|
+
const [valueRef] = getNonArrayModel(metadata.of);
|
|
30
|
+
const crystalizeValue = scalarCrystalizeMap.get(valueRef) ?? ((value2) => value2);
|
|
31
|
+
return new Map(
|
|
32
|
+
Object.entries(value).map(([key, val]) => [key, applyFnToArrayObjects(val, crystalizeValue)])
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (metadata.isClass)
|
|
36
|
+
return makeCrystalize(metadata.modelRef)(value, true);
|
|
37
|
+
if (metadata.modelRef === Date)
|
|
38
|
+
return dayjs(value);
|
|
39
|
+
return (scalarCrystalizeMap.get(metadata.modelRef) ?? ((value2) => value2))(value);
|
|
40
|
+
};
|
|
41
|
+
const getPredefinedCrystalizeFn = (refName) => {
|
|
42
|
+
const crystalize2 = Reflect.getMetadata(refName, CrystalizeStorage.prototype);
|
|
43
|
+
return crystalize2;
|
|
44
|
+
};
|
|
45
|
+
const setPredefinedCrystalizeFn = (refName, crystalize2) => {
|
|
46
|
+
Reflect.defineMetadata(refName, crystalize2, CrystalizeStorage.prototype);
|
|
47
|
+
};
|
|
48
|
+
const makeCrystalize = (modelRef, option = {}) => {
|
|
49
|
+
const refName = constantInfo.getRefName(modelRef);
|
|
50
|
+
const crystalName = `${constantInfo.isLight(modelRef) ? "Light" : ""}${capitalize(refName)}${constantInfo.isInsight(modelRef) ? "Insight" : ""}`;
|
|
51
|
+
const crystalizeFn = getPredefinedCrystalizeFn(crystalName);
|
|
52
|
+
if (crystalizeFn && !option.overwrite && !option.partial?.length)
|
|
53
|
+
return crystalizeFn;
|
|
54
|
+
const fieldMetaMap = getFieldMetaMap(modelRef);
|
|
55
|
+
const fieldKeys = option.partial?.length ? constantInfo.isScalar(modelRef) ? option.partial : ["id", ...option.partial, "updatedAt"] : [...fieldMetaMap.keys()];
|
|
56
|
+
const metadatas = fieldKeys.map((key) => fieldMetaMap.get(key));
|
|
57
|
+
const fn = (self, isChild) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = Object.assign(new modelRef(), self);
|
|
60
|
+
for (const metadata of metadatas.filter((m) => !!self[m.key])) {
|
|
61
|
+
if (metadata.fieldType === "hidden")
|
|
62
|
+
continue;
|
|
63
|
+
result[metadata.key] = crystalize(metadata, self[metadata.key]);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (isChild)
|
|
68
|
+
throw new Error(err);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
if (!option.partial?.length)
|
|
73
|
+
setPredefinedCrystalizeFn(crystalName, fn);
|
|
74
|
+
return fn;
|
|
75
|
+
};
|
|
76
|
+
export {
|
|
77
|
+
makeCrystalize
|
|
78
|
+
};
|