@akanjs/constant 0.9.48 → 0.9.50

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.
Files changed (44) hide show
  1. package/cjs/src/baseGql.js +124 -122
  2. package/cjs/src/classMeta.js +12 -117
  3. package/cjs/src/constantInfo.js +145 -0
  4. package/cjs/src/crystalize.js +89 -0
  5. package/cjs/src/default.js +67 -0
  6. package/cjs/src/fieldInfo.js +98 -0
  7. package/cjs/src/immerify.js +35 -0
  8. package/cjs/src/index.js +6 -11
  9. package/cjs/src/purify.js +110 -0
  10. package/cjs/src/scalar.js +8 -12
  11. package/cjs/src/serialize.js +116 -0
  12. package/esm/src/baseGql.js +129 -132
  13. package/esm/src/classMeta.js +13 -118
  14. package/esm/src/constantInfo.js +126 -0
  15. package/esm/src/crystalize.js +78 -0
  16. package/esm/src/default.js +48 -0
  17. package/esm/src/fieldInfo.js +88 -0
  18. package/esm/src/immerify.js +16 -0
  19. package/esm/src/index.js +6 -7
  20. package/esm/src/purify.js +99 -0
  21. package/esm/src/scalar.js +8 -12
  22. package/esm/src/serialize.js +106 -0
  23. package/package.json +2 -1
  24. package/src/baseGql.d.ts +8 -4
  25. package/src/classMeta.d.ts +5 -21
  26. package/src/constantInfo.d.ts +69 -0
  27. package/src/crystalize.d.ts +6 -0
  28. package/src/default.d.ts +6 -0
  29. package/src/fieldInfo.d.ts +37 -0
  30. package/src/immerify.d.ts +2 -0
  31. package/src/index.d.ts +6 -5
  32. package/src/purify.d.ts +14 -0
  33. package/src/scalar.d.ts +16 -46
  34. package/src/serialize.d.ts +7 -0
  35. package/src/types.d.ts +3 -23
  36. package/cjs/src/constantDecorator.js +0 -67
  37. package/cjs/src/fieldMeta.js +0 -82
  38. package/cjs/src/filterMeta.js +0 -196
  39. package/esm/src/constantDecorator.js +0 -48
  40. package/esm/src/fieldMeta.js +0 -67
  41. package/esm/src/filterMeta.js +0 -181
  42. package/src/constantDecorator.d.ts +0 -30
  43. package/src/fieldMeta.d.ts +0 -7
  44. package/src/filterMeta.d.ts +0 -61
@@ -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 { getFullModelRefs } from "./classMeta";
4
+ import { setExtendRef } from "./classMeta";
5
+ import { constantInfo } from "./constantInfo";
5
6
  import {
6
- getFilterArgMetas,
7
- getFilterMeta,
8
- getFilterQueryMap,
9
- getFilterSortMap,
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 idFieldMeta = { ...defaultFieldMeta, key: "id", name: "ID", modelRef: ID };
30
- const createdAtFieldMeta = { ...defaultFieldMeta, key: "createdAt", name: "Date", modelRef: Date };
31
- const updatedAtFieldMeta = { ...defaultFieldMeta, key: "updatedAt", name: "Date", modelRef: Date };
32
- const removedAtFieldMeta = {
33
- ...defaultFieldMeta,
34
- key: "removedAt",
35
- name: "Date",
36
- modelRef: Date,
37
- nullable: true,
38
- default: null
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(modelRef));
53
- metadataMap.set("id", idFieldMeta);
54
- metadataMap.set("createdAt", createdAtFieldMeta);
55
- metadataMap.set("updatedAt", updatedAtFieldMeta);
56
- metadataMap.set("removedAt", removedAtFieldMeta);
57
- Reflect.defineMetadata("fields", metadataMap, BaseModel.prototype);
58
- return BaseModel;
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) : /* @__PURE__ */ new Map();
49
+ const fieldMetaMap = baseLightModelRef ? getFieldMetaMap(baseLightModelRef) : new Map([...baseFieldMetaMap]);
64
50
  class BaseLightModel {
65
- __ModelType__ = "light";
66
51
  }
67
- fieldMetaMap.set("id", idFieldMeta);
68
- fieldMetaMap.set("createdAt", createdAtFieldMeta);
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 ${field} not found in objectRef`);
75
- fieldMetaMap.set(field, fieldMeta);
55
+ throw new Error(`Field ${field2} not found in objectRef`);
56
+ fieldMetaMap.set(field2, fieldMeta);
76
57
  }
77
58
  applyMixins(BaseLightModel, libLightModelRefs);
78
- Reflect.defineMetadata("fields", fieldMetaMap, BaseLightModel.prototype);
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 = (modelRef, lightRef, ...libFullModelRefs) => {
82
- const modelFieldMetaMap = getFieldMetaMap(modelRef);
83
- const lightFieldMetaMap = getFieldMetaMap(lightRef);
84
- applyMixins(modelRef, [...libFullModelRefs, lightRef]);
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, [lightRef, modelRef]);
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
- lightFieldMetaMap.forEach((value, key) => modelFieldMetaMap.set(key, value));
89
- return modelRef;
81
+ return fullRef;
90
82
  };
91
- function via(modelRef, fieldsOrLightModelRef, ...fullOrLightModelRefs) {
92
- const classMeta = getClassMeta(modelRef);
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
- if (Array.isArray(fieldsOrLightModelRef))
107
- return lightModelOf(modelRef, fieldsOrLightModelRef, ...fullOrLightModelRefs);
108
- const secondArgModelRef = fieldsOrLightModelRef;
109
- const secondArgClassMeta = getClassMeta(secondArgModelRef);
110
- if (classMeta.type === "input") {
111
- if (secondArgClassMeta.type === "input")
112
- return extendModelInputs(modelRef, secondArgModelRef, ...fullOrLightModelRefs);
113
- else if (secondArgClassMeta.type === "full")
114
- return extendModelObjects(modelRef, secondArgModelRef, ...fullOrLightModelRefs);
115
- else
116
- throw new Error("Invalid modelRef args");
117
- } else if (classMeta.type === "full") {
118
- if (secondArgClassMeta.type === "light")
119
- return fullModelOf(modelRef, secondArgModelRef, ...fullOrLightModelRefs);
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
- throw new Error("Invalid modelRef args");
122
- } else if (classMeta.modelType === "insight")
123
- return extendModelInsights(modelRef, secondArgModelRef, ...fullOrLightModelRefs);
124
- else
125
- throw new Error("Invalid modelRef");
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) : /* @__PURE__ */ new Map();
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
  };
@@ -1,49 +1,14 @@
1
1
  import "reflect-metadata";
2
- import { capitalize } from "@akanjs/common";
3
- import { setFilterMeta } from "./filterMeta";
4
- import { getClassMeta, getFieldMetas } from "./scalar";
5
- class InputModelStorage {
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 getFullModelRefs = (refName) => {
23
- const modelRefs = Reflect.getMetadata(capitalize(refName), FullModelStorage.prototype);
24
- return modelRefs ?? [];
25
- };
26
- const getInputModelRef = (refName) => {
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(getClassMeta(modelRef).refName, modelRef));
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
- getFullModelRef,
136
- getFullModelRefs,
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
+ };