@akanjs/constant 1.0.5 → 1.0.6
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 +89 -98
- package/cjs/src/classMeta.js +6 -21
- package/cjs/src/constantInfo.js +1 -12
- package/cjs/src/crystalize.js +18 -35
- package/cjs/src/default.js +15 -36
- package/cjs/src/fieldInfo.js +117 -16
- package/cjs/src/immerify.js +3 -5
- package/cjs/src/purify.js +31 -44
- package/cjs/src/scalar.js +1 -30
- package/cjs/src/serialize.js +6 -6
- package/esm/src/baseGql.js +90 -98
- package/esm/src/classMeta.js +6 -21
- package/esm/src/constantInfo.js +1 -12
- package/esm/src/crystalize.js +19 -36
- package/esm/src/default.js +15 -36
- package/esm/src/fieldInfo.js +119 -19
- package/esm/src/immerify.js +3 -5
- package/esm/src/purify.js +32 -45
- package/esm/src/scalar.js +1 -31
- package/esm/src/serialize.js +7 -7
- package/package.json +1 -1
- package/src/baseGql.d.ts +29 -8
- package/src/classMeta.d.ts +5 -8
- package/src/constantInfo.d.ts +18 -23
- package/src/crystalize.d.ts +5 -2
- package/src/default.d.ts +2 -5
- package/src/fieldInfo.d.ts +93 -13
- package/src/immerify.d.ts +4 -1
- package/src/purify.d.ts +4 -4
- package/src/scalar.d.ts +0 -5
- package/src/serialize.d.ts +3 -3
- package/src/types.d.ts +4 -4
package/cjs/src/purify.js
CHANGED
|
@@ -38,65 +38,53 @@ const getPurifyFn = (modelRef) => {
|
|
|
38
38
|
const [valueRef] = (0, import_base.getNonArrayModel)(modelRef);
|
|
39
39
|
return scalarPurifyMap.get(valueRef) ?? ((value) => value);
|
|
40
40
|
};
|
|
41
|
-
const purify = (
|
|
42
|
-
if (
|
|
41
|
+
const purify = (field, key, value, self) => {
|
|
42
|
+
if (field.nullable && (value === null || value === void 0 || typeof value === "number" && isNaN(value) || typeof value === "string" && !value.length))
|
|
43
43
|
return null;
|
|
44
|
-
if (
|
|
44
|
+
if (field.isArray) {
|
|
45
45
|
if (!Array.isArray(value))
|
|
46
|
-
throw new Error(`Invalid Array Value in ${
|
|
47
|
-
if (
|
|
48
|
-
throw new Error(`Invalid Array Length (Min) in ${
|
|
49
|
-
else if (
|
|
50
|
-
throw new Error(`Invalid Array Length (Max) in ${
|
|
51
|
-
else if (
|
|
52
|
-
throw new Error(`Invalid Array Value (Failed to pass validation) in ${
|
|
53
|
-
return value.map((v) => purify({ ...
|
|
46
|
+
throw new Error(`Invalid Array Value in ${key} for value ${value}`);
|
|
47
|
+
if (field.minlength && value.length < field.minlength)
|
|
48
|
+
throw new Error(`Invalid Array Length (Min) in ${key} for value ${value}`);
|
|
49
|
+
else if (field.maxlength && value.length > field.maxlength)
|
|
50
|
+
throw new Error(`Invalid Array Length (Max) in ${key} for value ${value}`);
|
|
51
|
+
else if (field.optArrDepth === 0 && field.validate && !field.validate(value, self))
|
|
52
|
+
throw new Error(`Invalid Array Value (Failed to pass validation) in ${key} for value ${value}`);
|
|
53
|
+
return value.map((v) => purify({ ...field, isArray: false }, key, v, v));
|
|
54
54
|
}
|
|
55
|
-
if (
|
|
56
|
-
const purifyFn2 = getPurifyFn(
|
|
55
|
+
if (field.isMap && field.of) {
|
|
56
|
+
const purifyFn2 = getPurifyFn(field.of);
|
|
57
57
|
return Object.fromEntries(
|
|
58
|
-
[...value.entries()].map(([
|
|
58
|
+
[...value.entries()].map(([key2, val]) => [key2, (0, import_base.applyFnToArrayObjects)(val, purifyFn2)])
|
|
59
59
|
);
|
|
60
60
|
}
|
|
61
|
-
if (
|
|
62
|
-
return makePurify(
|
|
63
|
-
if (
|
|
64
|
-
throw new Error(`Invalid Date Value (Default) in ${
|
|
65
|
-
if ([String, import_base.ID].includes(
|
|
66
|
-
throw new Error(`Invalid String Value (Default) in ${
|
|
67
|
-
if (
|
|
68
|
-
throw new Error(`Invalid Value (Failed to pass validation) / ${value} in ${
|
|
69
|
-
if (!
|
|
70
|
-
throw new Error(`Invalid Value (Nullable) in ${
|
|
71
|
-
const purifyFn = getPurifyFn(
|
|
61
|
+
if (field.isClass)
|
|
62
|
+
return makePurify(field.modelRef)(value, true);
|
|
63
|
+
if (field.modelRef === Date && (0, import_base.dayjs)(value).isBefore((0, import_base.dayjs)(/* @__PURE__ */ new Date("0000"))))
|
|
64
|
+
throw new Error(`Invalid Date Value (Default) in ${key} for value ${value}`);
|
|
65
|
+
if ([String, import_base.ID].includes(field.modelRef) && (value === "" || !value))
|
|
66
|
+
throw new Error(`Invalid String Value (Default) in ${key} for value ${value}`);
|
|
67
|
+
if (field.validate && !field.validate(value, self))
|
|
68
|
+
throw new Error(`Invalid Value (Failed to pass validation) / ${value} in ${key}`);
|
|
69
|
+
if (!field.nullable && !value && value !== 0 && value !== false)
|
|
70
|
+
throw new Error(`Invalid Value (Nullable) in ${key} for value ${value}`);
|
|
71
|
+
const purifyFn = getPurifyFn(field.modelRef);
|
|
72
72
|
return purifyFn(value);
|
|
73
73
|
};
|
|
74
|
-
const
|
|
75
|
-
const purify2 = Reflect.getMetadata(refName, PurifyStorage.prototype);
|
|
76
|
-
return purify2;
|
|
77
|
-
};
|
|
78
|
-
const setPredefinedPurifyFn = (refName, purify2) => {
|
|
79
|
-
Reflect.defineMetadata(refName, purify2, PurifyStorage.prototype);
|
|
80
|
-
};
|
|
81
|
-
const makePurify = (modelRef, option = {}) => {
|
|
82
|
-
const refName = import__.constantInfo.getRefName(modelRef);
|
|
83
|
-
const purifyFn = getPredefinedPurifyFn(refName);
|
|
84
|
-
if (purifyFn && !option.overwrite)
|
|
85
|
-
return purifyFn;
|
|
86
|
-
const metadatas = (0, import__.getFieldMetas)(modelRef);
|
|
74
|
+
const makePurify = (modelRef) => {
|
|
87
75
|
const fn = (self, isChild) => {
|
|
88
76
|
try {
|
|
89
77
|
if (isChild && !import__.constantInfo.isScalar(modelRef)) {
|
|
90
78
|
const id = self.id;
|
|
91
79
|
if (!id)
|
|
92
|
-
throw new Error(`Invalid Value (No ID) for id ${
|
|
80
|
+
throw new Error(`Invalid Value (No ID) for id ${modelRef}`);
|
|
93
81
|
return id;
|
|
94
82
|
}
|
|
95
83
|
const result = {};
|
|
96
|
-
|
|
97
|
-
const value = self[
|
|
98
|
-
result[
|
|
99
|
-
}
|
|
84
|
+
Object.entries(modelRef.field).forEach(([key, field]) => {
|
|
85
|
+
const value = self[key];
|
|
86
|
+
result[key] = purify(field.getProps(), key, value, self);
|
|
87
|
+
});
|
|
100
88
|
return result;
|
|
101
89
|
} catch (err) {
|
|
102
90
|
if (isChild)
|
|
@@ -105,6 +93,5 @@ const makePurify = (modelRef, option = {}) => {
|
|
|
105
93
|
return null;
|
|
106
94
|
}
|
|
107
95
|
};
|
|
108
|
-
setPredefinedPurifyFn(refName, fn);
|
|
109
96
|
return fn;
|
|
110
97
|
};
|
package/cjs/src/scalar.js
CHANGED
|
@@ -18,15 +18,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var scalar_exports = {};
|
|
19
19
|
__export(scalar_exports, {
|
|
20
20
|
fieldPresets: () => fieldPresets,
|
|
21
|
-
getFieldMetaMap: () => getFieldMetaMap,
|
|
22
|
-
getFieldMetaMapOnPrototype: () => getFieldMetaMapOnPrototype,
|
|
23
|
-
getFieldMetas: () => getFieldMetas,
|
|
24
21
|
getGqlTypeStr: () => getGqlTypeStr,
|
|
25
22
|
getScalarExample: () => getScalarExample,
|
|
26
23
|
isConstantModel: () => isConstantModel,
|
|
27
|
-
scalarExampleMap: () => scalarExampleMap
|
|
28
|
-
setFieldMetaMap: () => setFieldMetaMap,
|
|
29
|
-
setFieldMetaMapOnPrototype: () => setFieldMetaMapOnPrototype
|
|
24
|
+
scalarExampleMap: () => scalarExampleMap
|
|
30
25
|
});
|
|
31
26
|
module.exports = __toCommonJS(scalar_exports);
|
|
32
27
|
var import_reflect_metadata = require("reflect-metadata");
|
|
@@ -47,30 +42,6 @@ const scalarExampleMap = /* @__PURE__ */ new Map([
|
|
|
47
42
|
const getScalarExample = (ref) => scalarExampleMap.get(ref) ?? null;
|
|
48
43
|
const getGqlTypeStr = (ref) => import_base.scalarNameMap.get(ref) ?? `${import_constantInfo.constantInfo.isLight(ref) ? "Light" : ""}${(0, import_common.capitalize)(import_constantInfo.constantInfo.getRefName(ref))}${import_constantInfo.constantInfo.isInsight(ref) ? "Insight" : ""}`;
|
|
49
44
|
const fieldPresets = ["email", "password", "url"];
|
|
50
|
-
const getFieldMetas = (modelRef) => {
|
|
51
|
-
const [target] = (0, import_base.getNonArrayModel)(modelRef);
|
|
52
|
-
const metadataMap = Reflect.getMetadata("fields", target.prototype) ?? /* @__PURE__ */ new Map();
|
|
53
|
-
const keySortMap = { id: -1, createdAt: 1, updatedAt: 2, removedAt: 3 };
|
|
54
|
-
return [...metadataMap.values()].sort(
|
|
55
|
-
(a, b) => (keySortMap[a.key] ?? 0) - (keySortMap[b.key] ?? 0)
|
|
56
|
-
);
|
|
57
|
-
};
|
|
58
45
|
const isConstantModel = (modelRef) => {
|
|
59
46
|
return Reflect.getMetadata("class", modelRef.prototype) !== void 0;
|
|
60
47
|
};
|
|
61
|
-
const getFieldMetaMap = (modelRef) => {
|
|
62
|
-
const [target] = (0, import_base.getNonArrayModel)(modelRef);
|
|
63
|
-
const metadataMap = Reflect.getMetadata("fields", target.prototype) ?? /* @__PURE__ */ new Map();
|
|
64
|
-
return metadataMap;
|
|
65
|
-
};
|
|
66
|
-
const setFieldMetaMap = (modelRef, metadataMap) => {
|
|
67
|
-
const [target] = (0, import_base.getNonArrayModel)(modelRef);
|
|
68
|
-
Reflect.defineMetadata("fields", metadataMap, target.prototype);
|
|
69
|
-
};
|
|
70
|
-
const getFieldMetaMapOnPrototype = (prototype) => {
|
|
71
|
-
const metadataMap = Reflect.getMetadata("fields", prototype) ?? /* @__PURE__ */ new Map();
|
|
72
|
-
return metadataMap;
|
|
73
|
-
};
|
|
74
|
-
const setFieldMetaMapOnPrototype = (prototype, metadataMap) => {
|
|
75
|
-
Reflect.defineMetadata("fields", metadataMap, prototype);
|
|
76
|
-
};
|
package/cjs/src/serialize.js
CHANGED
|
@@ -56,9 +56,9 @@ const serializeInput = (value, inputRef, arrDepth) => {
|
|
|
56
56
|
return value;
|
|
57
57
|
else
|
|
58
58
|
return Object.fromEntries(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
serializeInput(value[
|
|
59
|
+
Object.entries(inputRef.field).map(([key, field]) => [
|
|
60
|
+
key,
|
|
61
|
+
serializeInput(value[key], field.modelRef, field.arrDepth)
|
|
62
62
|
])
|
|
63
63
|
);
|
|
64
64
|
};
|
|
@@ -101,9 +101,9 @@ const deserializeInput = (value, inputRef, arrDepth) => {
|
|
|
101
101
|
return value;
|
|
102
102
|
else
|
|
103
103
|
return Object.fromEntries(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
deserializeInput(value[
|
|
104
|
+
Object.entries(inputRef.field).map(([key, field]) => [
|
|
105
|
+
key,
|
|
106
|
+
deserializeInput(value[key], field.modelRef, field.arrDepth)
|
|
107
107
|
])
|
|
108
108
|
);
|
|
109
109
|
};
|
package/esm/src/baseGql.js
CHANGED
|
@@ -1,93 +1,89 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import { ID, Int } from "@akanjs/base";
|
|
3
2
|
import { applyMixins } from "@akanjs/common";
|
|
4
|
-
import {
|
|
3
|
+
import { immerable } from "immer";
|
|
4
|
+
import { crystalize, makeDefault } from ".";
|
|
5
5
|
import { constantInfo } from "./constantInfo";
|
|
6
6
|
import {
|
|
7
|
+
ConstantField,
|
|
7
8
|
field,
|
|
8
9
|
resolve
|
|
9
10
|
} from "./fieldInfo";
|
|
10
|
-
import {
|
|
11
|
-
const defaultFieldMeta = {
|
|
12
|
-
fieldType: "property",
|
|
13
|
-
immutable: false,
|
|
14
|
-
select: true,
|
|
15
|
-
isClass: false,
|
|
16
|
-
isScalar: true,
|
|
17
|
-
nullable: false,
|
|
18
|
-
isArray: false,
|
|
19
|
-
arrDepth: 0,
|
|
20
|
-
optArrDepth: 0,
|
|
21
|
-
default: null,
|
|
22
|
-
isMap: false,
|
|
23
|
-
meta: {}
|
|
24
|
-
};
|
|
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
|
-
]);
|
|
11
|
+
import { makePurify } from "./purify";
|
|
34
12
|
const objectModelOf = (inputRef, fieldMap) => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return ObjectModel;
|
|
13
|
+
const field2 = Object.assign(
|
|
14
|
+
ConstantField.getBaseModelField(),
|
|
15
|
+
inputRef.field,
|
|
16
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, fieldInfo]) => [key, fieldInfo.toField()]))
|
|
17
|
+
);
|
|
18
|
+
const baseObjectModelRef = getBaseConstantClass(field2);
|
|
19
|
+
applyConstantStatics(baseObjectModelRef);
|
|
20
|
+
constantInfo.setModelType(baseObjectModelRef, "object");
|
|
21
|
+
return baseObjectModelRef;
|
|
45
22
|
};
|
|
46
23
|
const lightModelOf = (objectRef, fields, fieldMap, ...libLightModelRefs) => {
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
applyMixins(BaseLightModel, libLightModelRefs);
|
|
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
|
-
});
|
|
65
|
-
return BaseLightModel;
|
|
24
|
+
const libLightModelRef = libLightModelRefs.at(0);
|
|
25
|
+
const field2 = Object.assign(
|
|
26
|
+
libLightModelRef?.field ?? ConstantField.getBaseModelField(),
|
|
27
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, field3]) => [key, field3.toField()])),
|
|
28
|
+
Object.fromEntries(fields.map((field3) => [field3, objectRef.field[field3]]))
|
|
29
|
+
);
|
|
30
|
+
const baseLightModelRef = getBaseConstantClass(field2);
|
|
31
|
+
applyConstantStatics(baseLightModelRef);
|
|
32
|
+
applyMixins(baseLightModelRef, libLightModelRefs);
|
|
33
|
+
constantInfo.setModelType(baseLightModelRef, "light");
|
|
34
|
+
return baseLightModelRef;
|
|
66
35
|
};
|
|
67
36
|
const fullModelOf = (objectRef, lightRef, fieldMap, ...libFullModelRefs) => {
|
|
68
|
-
const fullRef = libFullModelRefs.at(0) ??
|
|
69
|
-
|
|
70
|
-
|
|
37
|
+
const fullRef = libFullModelRefs.at(0) ?? getBaseConstantClass(ConstantField.getBaseModelField());
|
|
38
|
+
Object.assign(
|
|
39
|
+
fullRef.field,
|
|
40
|
+
objectRef.field,
|
|
41
|
+
lightRef.field,
|
|
42
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, field2]) => [key, field2.toField()]))
|
|
43
|
+
);
|
|
71
44
|
applyMixins(fullRef, [objectRef, lightRef, ...libFullModelRefs]);
|
|
72
45
|
libFullModelRefs.forEach((libFullModelRef) => {
|
|
73
46
|
applyMixins(libFullModelRef, [objectRef, lightRef]);
|
|
74
47
|
});
|
|
75
|
-
|
|
76
|
-
setExtendRef(fullRef, objectRef);
|
|
48
|
+
applyConstantStatics(fullRef);
|
|
77
49
|
constantInfo.setModelType(fullRef, "full");
|
|
78
|
-
Object.entries(fieldMap).forEach(([key, fieldInfo]) => {
|
|
79
|
-
fieldInfo.applyFieldMeta(fullRef, key);
|
|
80
|
-
});
|
|
81
50
|
return fullRef;
|
|
82
51
|
};
|
|
83
|
-
const
|
|
84
|
-
class
|
|
52
|
+
const getBaseConstantClass = (field2) => {
|
|
53
|
+
class BaseConstant {
|
|
54
|
+
static field = field2;
|
|
55
|
+
[immerable] = true;
|
|
56
|
+
constructor(obj) {
|
|
57
|
+
Object.assign(this, this.constructor.default);
|
|
58
|
+
if (obj)
|
|
59
|
+
this.set(obj);
|
|
60
|
+
}
|
|
61
|
+
set(obj) {
|
|
62
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
63
|
+
if (!this.constructor.field[key])
|
|
64
|
+
return;
|
|
65
|
+
const fieldProp = this.constructor.field[key].getProps();
|
|
66
|
+
this[key] = crystalize(fieldProp, value);
|
|
67
|
+
});
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
85
70
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
71
|
+
return BaseConstant;
|
|
72
|
+
};
|
|
73
|
+
const makeBaseScalar = (fieldMap) => {
|
|
74
|
+
const fieldObject = Object.fromEntries(Object.entries(fieldMap).map(([key, field2]) => [key, field2.toField()]));
|
|
75
|
+
const baseScalarRef = getBaseConstantClass(fieldObject);
|
|
76
|
+
applyConstantStatics(baseScalarRef);
|
|
77
|
+
constantInfo.setModelType(baseScalarRef, "scalar");
|
|
78
|
+
return baseScalarRef;
|
|
79
|
+
};
|
|
80
|
+
const applyConstantStatics = (model) => {
|
|
81
|
+
Object.assign(model, {
|
|
82
|
+
purify: makePurify(model),
|
|
83
|
+
default: makeDefault(model.field)
|
|
84
|
+
// getDefault: () => immerify(model, Object.assign(new model() as object, defaultFn)),
|
|
89
85
|
});
|
|
90
|
-
return
|
|
86
|
+
return model;
|
|
91
87
|
};
|
|
92
88
|
function via(firstRefOrBuildField, secondRefOrFieldsOrBuildField, thirdRefOrResolveField, ...extendRefs) {
|
|
93
89
|
if (!firstRefOrBuildField.prototype || !constantInfo.getModelType(firstRefOrBuildField, { allowEmpty: true })) {
|
|
@@ -147,41 +143,37 @@ function via(firstRefOrBuildField, secondRefOrFieldsOrBuildField, thirdRefOrReso
|
|
|
147
143
|
}
|
|
148
144
|
const extendModelInputs = (fieldMap, ...libInputModelRefs) => {
|
|
149
145
|
const baseInputModelRef = libInputModelRefs.at(0);
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
return BaseInput;
|
|
146
|
+
const fieldObject = Object.assign(
|
|
147
|
+
baseInputModelRef?.field ?? {},
|
|
148
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, field2]) => [key, field2.toField()]))
|
|
149
|
+
);
|
|
150
|
+
const baseInputRef = getBaseConstantClass(fieldObject);
|
|
151
|
+
applyConstantStatics(baseInputRef);
|
|
152
|
+
constantInfo.setModelType(baseInputRef, "scalar");
|
|
153
|
+
return baseInputRef;
|
|
159
154
|
};
|
|
160
155
|
const extendModelObjects = (inputRef, fieldMap, ...libObjectModelRefs) => {
|
|
161
156
|
const baseObjectModelRef = libObjectModelRefs.at(0);
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
});
|
|
172
|
-
return BaseInput;
|
|
157
|
+
const field2 = Object.assign(
|
|
158
|
+
baseObjectModelRef?.field ?? {},
|
|
159
|
+
inputRef.field,
|
|
160
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, fieldInfo]) => [key, fieldInfo.toField()]))
|
|
161
|
+
);
|
|
162
|
+
const baseInputRef = getBaseConstantClass(field2);
|
|
163
|
+
applyConstantStatics(baseInputRef);
|
|
164
|
+
constantInfo.setModelType(baseInputRef, "object");
|
|
165
|
+
return baseInputRef;
|
|
173
166
|
};
|
|
174
167
|
const extendModelInsights = (fieldMap, ...insightModelRefs) => {
|
|
175
168
|
const baseInsightModelRef = insightModelRefs.at(0);
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return BaseInsight2;
|
|
169
|
+
const field2 = Object.assign(
|
|
170
|
+
baseInsightModelRef?.field ?? ConstantField.getBaseInsightField(),
|
|
171
|
+
Object.fromEntries(Object.entries(fieldMap).map(([key, fieldInfo]) => [key, fieldInfo.toField()]))
|
|
172
|
+
);
|
|
173
|
+
const baseInsightRef = getBaseConstantClass(field2);
|
|
174
|
+
applyConstantStatics(baseInsightRef);
|
|
175
|
+
constantInfo.setModelType(baseInsightRef, "insight");
|
|
176
|
+
return baseInsightRef;
|
|
185
177
|
};
|
|
186
178
|
export {
|
|
187
179
|
via
|
package/esm/src/classMeta.js
CHANGED
|
@@ -1,38 +1,23 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { constantInfo } from "./constantInfo";
|
|
3
|
-
import { getFieldMetas } from "./scalar";
|
|
4
|
-
const setExtendRef = (modelRef, extendRef) => {
|
|
5
|
-
Reflect.defineMetadata("akan:extend", extendRef, modelRef.prototype);
|
|
6
|
-
};
|
|
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;
|
|
12
|
-
};
|
|
13
3
|
const getChildClassRefs = (target) => {
|
|
14
|
-
const metadatas = getFieldMetas(target);
|
|
15
4
|
const refMap = /* @__PURE__ */ new Map();
|
|
16
|
-
const childRefs =
|
|
17
|
-
return [...acc,
|
|
5
|
+
const childRefs = Object.entries(target.field).filter(([_, field]) => field.isClass).reduce((acc, [key, field]) => {
|
|
6
|
+
return [...acc, field.modelRef, ...getChildClassRefs(field.modelRef)];
|
|
18
7
|
}, []);
|
|
19
8
|
childRefs.filter((modelRef, idx) => childRefs.findIndex((ref) => ref.prototype === modelRef.prototype) === idx).map((modelRef) => refMap.set(constantInfo.getRefName(modelRef), modelRef));
|
|
20
9
|
return [...refMap.values()];
|
|
21
10
|
};
|
|
22
11
|
const getFieldEnumMetas = (modelRef) => {
|
|
23
|
-
|
|
24
|
-
return fieldMetas.filter((fieldMeta) => !!fieldMeta.enum).map((fieldMeta) => ({ key: fieldMeta.key, enum: fieldMeta.enum }));
|
|
12
|
+
return Object.entries(modelRef.field).filter(([_, field]) => !!field.enum).map(([key, field]) => ({ key, enum: field.enum }));
|
|
25
13
|
};
|
|
26
14
|
const hasTextField = (modelRef) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
(fieldMeta) => !!fieldMeta.text || fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField(fieldMeta.modelRef)
|
|
15
|
+
return Object.entries(modelRef.field).some(
|
|
16
|
+
([_, field]) => !!field.text || field.isScalar && field.isClass && field.select && hasTextField(field.modelRef)
|
|
30
17
|
);
|
|
31
18
|
};
|
|
32
19
|
export {
|
|
33
20
|
getChildClassRefs,
|
|
34
|
-
getExtendRef,
|
|
35
21
|
getFieldEnumMetas,
|
|
36
|
-
hasTextField
|
|
37
|
-
setExtendRef
|
|
22
|
+
hasTextField
|
|
38
23
|
};
|
package/esm/src/constantInfo.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { gqlScalarMap } from "@akanjs/base";
|
|
3
|
-
import { makeCrystalize, makeDefault, makePurify } from ".";
|
|
4
|
-
import { immerify } from "./immerify";
|
|
5
3
|
const constantInfo = {
|
|
6
4
|
database: /* @__PURE__ */ new Map(),
|
|
7
5
|
scalar: /* @__PURE__ */ new Map(),
|
|
@@ -69,7 +67,7 @@ const constantInfo = {
|
|
|
69
67
|
return constantInfo.getDatabase(refName)[modelType];
|
|
70
68
|
}
|
|
71
69
|
};
|
|
72
|
-
const cnstOf = (refName, inputRef, objectRef, fullRef, lightRef, insightRef
|
|
70
|
+
const cnstOf = (refName, inputRef, objectRef, fullRef, lightRef, insightRef) => {
|
|
73
71
|
[inputRef, objectRef, fullRef, lightRef, insightRef].forEach((modelRef) => {
|
|
74
72
|
constantInfo.modelRefNameMap.set(modelRef, refName);
|
|
75
73
|
});
|
|
@@ -85,12 +83,6 @@ const cnstOf = (refName, inputRef, objectRef, fullRef, lightRef, insightRef, opt
|
|
|
85
83
|
full: fullRef,
|
|
86
84
|
light: lightRef,
|
|
87
85
|
insight: insightRef,
|
|
88
|
-
crystalize: makeCrystalize(fullRef, option),
|
|
89
|
-
lightCrystalize: makeCrystalize(lightRef, option),
|
|
90
|
-
crystalizeInsight: makeCrystalize(insightRef, option),
|
|
91
|
-
purify: makePurify(inputRef, option),
|
|
92
|
-
getDefault: () => immerify(fullRef, Object.assign(new fullRef(), makeDefault(fullRef, option))),
|
|
93
|
-
getDefaultInsight: () => immerify(insightRef, Object.assign(new insightRef(), makeDefault(insightRef, option))),
|
|
94
86
|
_CapitalizedT: null,
|
|
95
87
|
_Default: null,
|
|
96
88
|
_DefaultInput: null,
|
|
@@ -111,9 +103,6 @@ const scalarCnstOf = (refName, Model) => {
|
|
|
111
103
|
const cnst = {
|
|
112
104
|
refName,
|
|
113
105
|
model: Model,
|
|
114
|
-
crystalize: makeCrystalize(Model),
|
|
115
|
-
purify: makePurify(Model),
|
|
116
|
-
getDefault: () => immerify(Model, Object.assign(new Model(), makeDefault(Model))),
|
|
117
106
|
_Default: null,
|
|
118
107
|
_Doc: null,
|
|
119
108
|
_PurifiedInput: null
|
package/esm/src/crystalize.js
CHANGED
|
@@ -7,10 +7,7 @@ import {
|
|
|
7
7
|
Int,
|
|
8
8
|
JSON as GqlJSON
|
|
9
9
|
} from "@akanjs/base";
|
|
10
|
-
import {
|
|
11
|
-
import { constantInfo, getFieldMetaMap } from ".";
|
|
12
|
-
class CrystalizeStorage {
|
|
13
|
-
}
|
|
10
|
+
import { constantInfo } from ".";
|
|
14
11
|
const scalarCrystalizeMap = /* @__PURE__ */ new Map([
|
|
15
12
|
[Date, (value) => dayjs(value)],
|
|
16
13
|
[String, (value) => value],
|
|
@@ -20,13 +17,13 @@ const scalarCrystalizeMap = /* @__PURE__ */ new Map([
|
|
|
20
17
|
[Float, (value) => value],
|
|
21
18
|
[GqlJSON, (value) => value]
|
|
22
19
|
]);
|
|
23
|
-
const crystalize = (
|
|
20
|
+
const crystalize = (field, value) => {
|
|
24
21
|
if (value === void 0 || value === null)
|
|
25
22
|
return value;
|
|
26
|
-
if (
|
|
27
|
-
return value.map((v) => crystalize({ ...
|
|
28
|
-
if (
|
|
29
|
-
const [valueRef] = getNonArrayModel(
|
|
23
|
+
if (field.isArray && Array.isArray(value))
|
|
24
|
+
return value.map((v) => crystalize({ ...field, isArray: false }, v));
|
|
25
|
+
if (field.isMap) {
|
|
26
|
+
const [valueRef] = getNonArrayModel(field.of);
|
|
30
27
|
const crystalizeValue = scalarCrystalizeMap.get(valueRef) ?? ((value2) => value2);
|
|
31
28
|
return new Map(
|
|
32
29
|
Object.entries(value).map(([key, val]) => [
|
|
@@ -35,36 +32,23 @@ const crystalize = (metadata, value) => {
|
|
|
35
32
|
])
|
|
36
33
|
);
|
|
37
34
|
}
|
|
38
|
-
if (
|
|
39
|
-
return
|
|
40
|
-
if (
|
|
35
|
+
if (field.isClass)
|
|
36
|
+
return new field.modelRef().set(value);
|
|
37
|
+
if (field.modelRef === Date)
|
|
41
38
|
return dayjs(value);
|
|
42
|
-
return (scalarCrystalizeMap.get(
|
|
43
|
-
};
|
|
44
|
-
const getPredefinedCrystalizeFn = (refName) => {
|
|
45
|
-
const crystalize2 = Reflect.getMetadata(refName, CrystalizeStorage.prototype);
|
|
46
|
-
return crystalize2;
|
|
47
|
-
};
|
|
48
|
-
const setPredefinedCrystalizeFn = (refName, crystalize2) => {
|
|
49
|
-
Reflect.defineMetadata(refName, crystalize2, CrystalizeStorage.prototype);
|
|
39
|
+
return (scalarCrystalizeMap.get(field.modelRef) ?? ((value2) => value2))(value);
|
|
50
40
|
};
|
|
51
41
|
const makeCrystalize = (modelRef, option = {}) => {
|
|
52
|
-
const
|
|
53
|
-
const crystalName = `${constantInfo.isLight(modelRef) ? "Light" : ""}${capitalize(refName)}${constantInfo.isInsight(modelRef) ? "Insight" : ""}`;
|
|
54
|
-
const crystalizeFn = getPredefinedCrystalizeFn(crystalName);
|
|
55
|
-
if (crystalizeFn && !option.overwrite && !option.partial?.length)
|
|
56
|
-
return crystalizeFn;
|
|
57
|
-
const fieldMetaMap = getFieldMetaMap(modelRef);
|
|
58
|
-
const fieldKeys = option.partial?.length ? constantInfo.isScalar(modelRef) ? option.partial : ["id", ...option.partial, "updatedAt"] : [...fieldMetaMap.keys()];
|
|
59
|
-
const metadatas = fieldKeys.map((key) => fieldMetaMap.get(key));
|
|
42
|
+
const fieldKeys = option.partial?.length ? constantInfo.isScalar(modelRef) ? option.partial : ["id", ...option.partial, "updatedAt"] : Object.keys(modelRef.field);
|
|
60
43
|
const fn = (self, isChild) => {
|
|
61
44
|
try {
|
|
62
|
-
const result =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
45
|
+
const result = new modelRef().set(self);
|
|
46
|
+
fieldKeys.forEach((key) => {
|
|
47
|
+
const field = modelRef.field[key];
|
|
48
|
+
if (field.fieldType === "hidden")
|
|
49
|
+
return;
|
|
50
|
+
result[key] = crystalize(field.getProps(), self[key]);
|
|
51
|
+
});
|
|
68
52
|
return result;
|
|
69
53
|
} catch (err) {
|
|
70
54
|
if (isChild)
|
|
@@ -72,10 +56,9 @@ const makeCrystalize = (modelRef, option = {}) => {
|
|
|
72
56
|
return null;
|
|
73
57
|
}
|
|
74
58
|
};
|
|
75
|
-
if (!option.partial?.length)
|
|
76
|
-
setPredefinedCrystalizeFn(crystalName, fn);
|
|
77
59
|
return fn;
|
|
78
60
|
};
|
|
79
61
|
export {
|
|
62
|
+
crystalize,
|
|
80
63
|
makeCrystalize
|
|
81
64
|
};
|
package/esm/src/default.js
CHANGED
|
@@ -1,44 +1,23 @@
|
|
|
1
1
|
import { scalarDefaultMap } from "@akanjs/base";
|
|
2
|
-
|
|
3
|
-
import { constantInfo } from "./constantInfo";
|
|
4
|
-
import { getFieldMetas } from "./scalar";
|
|
5
|
-
class DefaultStorage {
|
|
6
|
-
}
|
|
7
|
-
const getPredefinedDefault = (refName) => {
|
|
8
|
-
const defaultData = Reflect.getMetadata(refName, DefaultStorage.prototype);
|
|
9
|
-
return defaultData;
|
|
10
|
-
};
|
|
11
|
-
const setPredefinedDefault = (refName, defaultData) => {
|
|
12
|
-
Reflect.defineMetadata(refName, defaultData, DefaultStorage.prototype);
|
|
13
|
-
};
|
|
14
|
-
const makeDefault = (modelRef, option = {}) => {
|
|
15
|
-
const refName = constantInfo.getRefName(modelRef);
|
|
16
|
-
const defaultName = `${capitalize(refName)}${constantInfo.isInsight(modelRef) ? "Insight" : ""}`;
|
|
17
|
-
const predefinedDefault = getPredefinedDefault(defaultName);
|
|
18
|
-
if (predefinedDefault && !option.overwrite)
|
|
19
|
-
return predefinedDefault;
|
|
20
|
-
if (option.isChild && constantInfo.isScalar(modelRef))
|
|
21
|
-
return null;
|
|
22
|
-
const metadatas = getFieldMetas(modelRef);
|
|
2
|
+
const makeDefault = (fieldObj) => {
|
|
23
3
|
const result = {};
|
|
24
|
-
for (const
|
|
25
|
-
if (
|
|
26
|
-
result[
|
|
27
|
-
else if (
|
|
28
|
-
if (typeof
|
|
29
|
-
result[
|
|
4
|
+
for (const [key, field] of Object.entries(fieldObj)) {
|
|
5
|
+
if (field.fieldType === "hidden")
|
|
6
|
+
result[key] = null;
|
|
7
|
+
else if (field.default) {
|
|
8
|
+
if (typeof field.default === "function")
|
|
9
|
+
result[key] = field.default();
|
|
30
10
|
else
|
|
31
|
-
result[
|
|
32
|
-
} else if (
|
|
33
|
-
result[
|
|
34
|
-
else if (
|
|
35
|
-
result[
|
|
36
|
-
else if (
|
|
37
|
-
result[
|
|
11
|
+
result[key] = field.default;
|
|
12
|
+
} else if (field.isArray)
|
|
13
|
+
result[key] = [];
|
|
14
|
+
else if (field.nullable)
|
|
15
|
+
result[key] = null;
|
|
16
|
+
else if (field.isClass)
|
|
17
|
+
result[key] = field.isScalar ? makeDefault(field.modelRef.field) : null;
|
|
38
18
|
else
|
|
39
|
-
result[
|
|
19
|
+
result[key] = scalarDefaultMap.get(field.modelRef);
|
|
40
20
|
}
|
|
41
|
-
setPredefinedDefault(defaultName, result);
|
|
42
21
|
return result;
|
|
43
22
|
};
|
|
44
23
|
export {
|