akanjs 2.3.5-rc.11 → 2.3.5-rc.13

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 (80) hide show
  1. package/base/base.ts +6 -2
  2. package/base/primitiveRegistry.ts +50 -46
  3. package/base/symbols.ts +16 -11
  4. package/base/types.ts +11 -0
  5. package/constant/constantRegistry.ts +3 -9
  6. package/constant/deserialize.ts +7 -7
  7. package/constant/fieldInfo.ts +173 -31
  8. package/constant/getDefault.ts +2 -2
  9. package/constant/immerify.ts +2 -2
  10. package/constant/purify.ts +19 -4
  11. package/constant/serialize.ts +5 -4
  12. package/constant/types.ts +9 -1
  13. package/constant/via.ts +302 -53
  14. package/dictionary/dictInfo.ts +28 -38
  15. package/dictionary/locale.ts +36 -38
  16. package/document/by.ts +56 -13
  17. package/document/database.ts +53 -18
  18. package/document/databaseRegistry.ts +7 -3
  19. package/document/filterMeta.ts +26 -14
  20. package/document/into.ts +71 -76
  21. package/document/types.ts +4 -2
  22. package/fetch/fetchType/endpointFetch.type.ts +6 -3
  23. package/fetch/fetchType/sliceFetch.type.ts +24 -13
  24. package/package.json +1 -1
  25. package/service/predefinedAdaptor/compress.adaptor.ts +9 -9
  26. package/service/predefinedAdaptor/database.adaptor.ts +3 -7
  27. package/service/serve.ts +17 -52
  28. package/service/types.ts +61 -21
  29. package/signal/endpoint.ts +2 -1
  30. package/signal/endpointInfo.ts +53 -23
  31. package/signal/internal.ts +2 -1
  32. package/signal/internalInfo.ts +70 -22
  33. package/signal/serverSignal.ts +21 -58
  34. package/signal/slice.ts +35 -35
  35. package/signal/sliceInfo.ts +63 -47
  36. package/signal/types.ts +23 -17
  37. package/store/action.ts +57 -44
  38. package/store/state.ts +47 -36
  39. package/store/stateBuilder.ts +3 -3
  40. package/store/store.ts +61 -15
  41. package/store/types.ts +20 -6
  42. package/types/base/base.d.ts +5 -1
  43. package/types/base/primitiveRegistry.d.ts +43 -38
  44. package/types/base/symbols.d.ts +5 -0
  45. package/types/base/types.d.ts +4 -0
  46. package/types/constant/constantRegistry.d.ts +3 -8
  47. package/types/constant/deserialize.d.ts +2 -2
  48. package/types/constant/fieldInfo.d.ts +41 -20
  49. package/types/constant/immerify.d.ts +2 -2
  50. package/types/constant/purify.d.ts +3 -2
  51. package/types/constant/serialize.d.ts +2 -2
  52. package/types/constant/types.d.ts +6 -1
  53. package/types/constant/via.d.ts +141 -20
  54. package/types/dictionary/dictInfo.d.ts +18 -11
  55. package/types/dictionary/locale.d.ts +23 -16
  56. package/types/document/by.d.ts +36 -5
  57. package/types/document/database.d.ts +9 -7
  58. package/types/document/databaseRegistry.d.ts +5 -4
  59. package/types/document/filterMeta.d.ts +18 -11
  60. package/types/document/into.d.ts +46 -19
  61. package/types/document/types.d.ts +3 -2
  62. package/types/fetch/fetchType/endpointFetch.type.d.ts +2 -2
  63. package/types/fetch/fetchType/sliceFetch.type.d.ts +11 -11
  64. package/types/service/serve.d.ts +4 -5
  65. package/types/service/types.d.ts +23 -5
  66. package/types/signal/endpoint.d.ts +2 -1
  67. package/types/signal/endpointInfo.d.ts +40 -15
  68. package/types/signal/internal.d.ts +2 -1
  69. package/types/signal/internalInfo.d.ts +43 -11
  70. package/types/signal/serverSignal.d.ts +14 -13
  71. package/types/signal/slice.d.ts +8 -6
  72. package/types/signal/sliceInfo.d.ts +41 -20
  73. package/types/signal/types.d.ts +23 -17
  74. package/types/store/action.d.ts +25 -22
  75. package/types/store/baseSt.d.ts +42 -13
  76. package/types/store/state.d.ts +23 -26
  77. package/types/store/stateBuilder.d.ts +2 -2
  78. package/types/store/store.d.ts +17 -5
  79. package/types/store/types.d.ts +9 -3
  80. package/ui/Signal/makeExample.ts +3 -3
@@ -1,8 +1,8 @@
1
1
  import { FIELD_META } from "akanjs/base";
2
2
  import { immerable } from "immer";
3
- import type { ConstantCls } from ".";
3
+ import type { ConstantModelRef } from ".";
4
4
 
5
- export const immerify = <T extends object>(modelRef: ConstantCls, objOrArr: T): T => {
5
+ export const immerify = <T extends object>(modelRef: ConstantModelRef, objOrArr: T): T => {
6
6
  if (Array.isArray(objOrArr)) return objOrArr.map((val) => immerify(modelRef, val as object)) as T;
7
7
  const immeredObj = Object.assign({}, objOrArr, {
8
8
  [immerable]: true,
@@ -1,4 +1,5 @@
1
1
  import {
2
+ Any,
2
3
  applyFnToArrayObjects,
3
4
  type Cls,
4
5
  type Dayjs,
@@ -13,7 +14,14 @@ import {
13
14
  } from "akanjs/base";
14
15
  import { Logger } from "akanjs/common";
15
16
 
16
- import { type BaseObject, type ConstantCls, ConstantRegistry, type DefaultOf, type FieldProps } from ".";
17
+ import {
18
+ type BaseObject,
19
+ type ConstantModelRef,
20
+ ConstantRegistry,
21
+ type DefaultOf,
22
+ type DefaultOfSchema,
23
+ type FieldProps,
24
+ } from ".";
17
25
 
18
26
  type Purified<O> = O extends BaseObject
19
27
  ? string
@@ -44,6 +52,13 @@ export type PurifyFunc<Input, _DefaultInput = DefaultOf<Input>, _PurifiedInput =
44
52
  isChild?: boolean,
45
53
  ) => _PurifiedInput | null;
46
54
 
55
+ export type PurifyFuncV2<
56
+ Input,
57
+ RelationKey extends string = never,
58
+ _DefaultInput = DefaultOfSchema<Input, RelationKey>,
59
+ _PurifiedInput = PurifiedModel<Input>,
60
+ > = (self: _DefaultInput, isChild?: boolean) => _PurifiedInput | null;
61
+
47
62
  const getPurifyFn = (modelRef: Cls): ((value: unknown) => unknown) => {
48
63
  const [valueRef] = getNonArrayModel(modelRef);
49
64
  const purifyFn = PrimitiveRegistry.has(valueRef)
@@ -75,7 +90,7 @@ const purify = (field: FieldProps, key: string, value: unknown, self: Record<str
75
90
  if (field.isMap && field.of) {
76
91
  const purifyFn = PrimitiveRegistry.has(field.of as Cls)
77
92
  ? getPurifyFn(field.of as Cls)
78
- : (value: unknown) => makePurify(field.of as ConstantCls)(value as object);
93
+ : (value: unknown) => makePurify(field.of as ConstantModelRef)(value as object);
79
94
  return Object.fromEntries(
80
95
  [...(value as Map<string, unknown>).entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, purifyFn)]),
81
96
  );
@@ -87,14 +102,14 @@ const purify = (field: FieldProps, key: string, value: unknown, self: Record<str
87
102
  throw new Error(`Invalid String Value (Default) in ${key} for value ${value}`);
88
103
  if (field.validate && !field.validate(value, self))
89
104
  throw new Error(`Invalid Value (Failed to pass validation) / ${value} in ${key}`);
90
- if (!field.nullable && !value && value !== 0 && value !== false)
105
+ if (!field.nullable && !value && value !== 0 && value !== false && (field.modelRef as Cls) !== Any)
91
106
  throw new Error(`Invalid Value (Nullable) in ${key} for value ${value}`);
92
107
 
93
108
  const purifyFn = getPurifyFn(field.modelRef);
94
109
  return purifyFn(value);
95
110
  };
96
111
 
97
- export const makePurify = <I>(modelRef: ConstantCls<I>): PurifyFunc<I> => {
112
+ export const makePurify = <I>(modelRef: ConstantModelRef<I>): PurifyFunc<I> => {
98
113
  const fn = ((self: Record<string, unknown>, isChild?: boolean): unknown => {
99
114
  try {
100
115
  if (isChild && !ConstantRegistry.isScalar(modelRef)) {
@@ -1,4 +1,5 @@
1
1
  import {
2
+ Any,
2
3
  applyFnToArrayObjects,
3
4
  type Cls,
4
5
  type Dayjs,
@@ -9,7 +10,7 @@ import {
9
10
  type PrimitiveScalar,
10
11
  } from "akanjs/base";
11
12
 
12
- import type { ConstantCls } from ".";
13
+ import type { ConstantCls, ConstantModelRef } from ".";
13
14
 
14
15
  export type Serialized<O> = O extends (infer V)[]
15
16
  ? Serialized<V>[]
@@ -29,7 +30,7 @@ const getSerializeFn = (inputRef: Cls, { optional = false }: { optional?: boolea
29
30
  };
30
31
  const serializeInput = <Input = unknown>(
31
32
  value: Input | Input[],
32
- inputRef: ConstantCls<Input> | PrimitiveScalar,
33
+ inputRef: ConstantModelRef<Input> | PrimitiveScalar,
33
34
  arrDepth: number,
34
35
  serializeType: "input" | "object" = "object",
35
36
  { optional = false }: { optional?: boolean } = {},
@@ -74,14 +75,14 @@ const getRelationId = (value: unknown): unknown => {
74
75
  };
75
76
 
76
77
  export const serialize = (
77
- argRef: ConstantCls | PrimitiveScalar,
78
+ argRef: ConstantModelRef | PrimitiveScalar,
78
79
  arrDepth: number,
79
80
  value: unknown,
80
81
  serializeType: "input" | "object" = "object",
81
82
  { nullable = false, key }: { nullable?: boolean; key?: string },
82
83
  ) => {
83
84
  if (nullable && (value === null || value === undefined)) return null;
84
- else if (!nullable && (value === null || value === undefined))
85
+ else if (!nullable && (value === null || value === undefined) && argRef !== Any)
85
86
  throw new Error(`Invalid Value (Nullable) in ${argRef} for value ${value}${key ? ` in ${key}` : ""}`);
86
87
  return serializeInput(value, argRef, arrDepth, serializeType, { optional: nullable }) as object[];
87
88
  };
package/constant/types.ts CHANGED
@@ -30,6 +30,12 @@ export type DocumentModel<T> = T extends (infer S)[]
30
30
  export type FieldState<T> = T extends { id: string } ? T | null : T;
31
31
  export type DefaultOf<S> = GetStateObject<{ [K in keyof S]: FieldState<S[K]> }>;
32
32
 
33
+ export type DefaultOfSchema<Schema, RelationKey = never> = [RelationKey] extends [never]
34
+ ? Schema
35
+ : {
36
+ [K in keyof Schema]: Schema[K] | (K extends RelationKey ? null : never);
37
+ };
38
+
33
39
  export type GetPlainObject<T, O extends string> = Omit<
34
40
  {
35
41
  [K in keyof T as T[K] extends (...args: never[]) => unknown
@@ -96,7 +102,9 @@ export interface TextDoc {
96
102
  [key: string]: string | TextDoc;
97
103
  }
98
104
 
99
- export type NonFunctionalKeys<T> = keyof T extends (...args: never[]) => unknown ? never : keyof T;
105
+ export type NonFunctionalKeys<T> = {
106
+ [K in keyof T]: T[K] extends (...args: never[]) => unknown ? never : K;
107
+ }[keyof T];
100
108
 
101
109
  export const unsetDate = dayjs(new Date("0000"));
102
110
  export const MAX_INT = 2147483647;
package/constant/via.ts CHANGED
@@ -1,4 +1,14 @@
1
- import { type Cls, type EnumInstance, FIELD_META, type MergeAllKeyOfObjects, type MergeAllTypes } from "akanjs/base";
1
+ import {
2
+ CLIENT_VALUE,
3
+ type Cls,
4
+ DEFAULT_VALUE,
5
+ type EnumInstance,
6
+ FIELD_META,
7
+ type ObjectAssign,
8
+ type ObjectAssignKeyOfObjects,
9
+ PURIFIED_VALUE,
10
+ SERVER_VALUE,
11
+ } from "akanjs/base";
2
12
  import { applyMixins } from "akanjs/common";
3
13
  import { immerable } from "immer";
4
14
 
@@ -15,22 +25,44 @@ import {
15
25
  field,
16
26
  resolve,
17
27
  } from "./fieldInfo";
18
- import { makePurify, type PurifyFunc } from "./purify";
19
- import type { BaseInsight, BaseObject, ConstantType, DefaultOf, NonFunctionalKeys } from "./types";
28
+ import { makePurify, type PurifiedModel, type PurifyFunc } from "./purify";
29
+ import type { BaseInsight, BaseObject, ConstantType, DefaultOf, DefaultOfSchema, NonFunctionalKeys } from "./types";
20
30
 
21
31
  type BaseFields = "id" | "createdAt" | "updatedAt" | "removedAt";
22
32
  type WithBase<T> = T & BaseObject;
23
33
  type OmitBase<T> = Omit<T, BaseFields>;
24
34
  type Merge<A, B> = B & Omit<A, keyof B>;
35
+ type MergeOwnSchemas<Models extends object[]> = ObjectAssignKeyOfObjects<Models, "_OwnSchema">;
36
+ type MergeOwnFieldObjects<Models extends object[]> = ObjectAssignKeyOfObjects<Models, "_OwnFieldObj">;
37
+ type MergeWithOwnSchemas<Models extends object[], OwnSchema extends object> = ObjectAssign<
38
+ [MergeOwnSchemas<Models>, OwnSchema]
39
+ >;
40
+ type MergeWithOwnFieldObjects<Models extends object[], OwnFieldObj extends object> = ObjectAssign<
41
+ [MergeOwnFieldObjects<Models>, OwnFieldObj]
42
+ >;
43
+ type BuiltSchema<BuildField extends (builder: FieldBuilder) => FieldInfoObject> = ExtractFieldInfoObject<
44
+ ReturnType<BuildField>
45
+ >;
46
+ type BuiltFieldObject<BuildField extends (builder: FieldBuilder) => FieldInfoObject> = FieldInfoObjectToFieldObject<
47
+ ReturnType<BuildField>
48
+ >;
49
+ type ResolvedSchema<ResolveField extends (resolve: FieldResolver) => FieldInfoObject> = ExtractFieldInfoObject<
50
+ ReturnType<ResolveField>
51
+ >;
52
+ type ResolvedFieldObject<ResolveField extends (resolve: FieldResolver) => FieldInfoObject> =
53
+ FieldInfoObjectToFieldObject<ReturnType<ResolveField>>;
25
54
 
26
- const objectModelOf = <T>(inputRef: ConstantCls<T>, fieldMap: FieldInfoObject): Cls<WithBase<T>> => {
55
+ const objectModelOf = <T>(
56
+ inputRef: ConstantCls<T>,
57
+ fieldMap: FieldInfoObject,
58
+ ): ConstantCls<WithBase<T>, FieldObject, WithBase<T>, FieldObject, "object"> => {
27
59
  const fieldObject = Object.fromEntries(Object.entries(fieldMap).map(([key, field]) => [key, field.toField()]));
28
60
  const applyFieldObject = { ...inputRef[FIELD_META], ...fieldObject };
29
61
  const field = Object.assign(ConstantField.getBaseModelField(), applyFieldObject);
30
62
  const baseObjectModelRef = getBaseConstantClass(field);
31
63
  applyConstantStatics(baseObjectModelRef, applyFieldObject);
32
64
  baseObjectModelRef.modelType = "object";
33
- return baseObjectModelRef as unknown as Cls<WithBase<T>>;
65
+ return baseObjectModelRef as unknown as ConstantCls<WithBase<T>, FieldObject, WithBase<T>, FieldObject, "object">;
34
66
  };
35
67
 
36
68
  const lightModelOf = <T, F extends keyof OmitBase<T>>(
@@ -38,7 +70,13 @@ const lightModelOf = <T, F extends keyof OmitBase<T>>(
38
70
  fields: readonly F[],
39
71
  fieldMap: FieldInfoObject,
40
72
  ...libLightModelRefs: ConstantCls[]
41
- ): Cls<Pick<OmitBase<T>, F> & BaseObject> => {
73
+ ): ConstantCls<
74
+ Pick<OmitBase<T>, F> & BaseObject,
75
+ FieldObject,
76
+ Pick<OmitBase<T>, F> & BaseObject,
77
+ FieldObject,
78
+ "light"
79
+ > => {
42
80
  const libLightModelRef = libLightModelRefs.at(0);
43
81
  const applyFieldObject = {
44
82
  ...Object.fromEntries(Object.entries(fieldMap).map(([key, field]) => [key, field.toField()])),
@@ -49,7 +87,13 @@ const lightModelOf = <T, F extends keyof OmitBase<T>>(
49
87
  applyConstantStatics(baseLightModelRef, applyFieldObject);
50
88
  applyMixins(baseLightModelRef, libLightModelRefs);
51
89
  baseLightModelRef.modelType = "light";
52
- return baseLightModelRef as unknown as Cls<Pick<OmitBase<T>, F> & BaseObject>;
90
+ return baseLightModelRef as unknown as ConstantCls<
91
+ Pick<OmitBase<T>, F> & BaseObject,
92
+ FieldObject,
93
+ Pick<OmitBase<T>, F> & BaseObject,
94
+ FieldObject,
95
+ "light"
96
+ >;
53
97
  };
54
98
 
55
99
  const fullModelOf = <A, B = undefined>(
@@ -57,7 +101,7 @@ const fullModelOf = <A, B = undefined>(
57
101
  lightRef: ConstantCls<B>,
58
102
  fieldMap: FieldInfoObject,
59
103
  ...libFullModelRefs: ConstantCls[]
60
- ): Cls<Merge<A, B>> => {
104
+ ): ConstantCls<Merge<A, B>, FieldObject, Merge<A, B>, FieldObject, "full"> => {
61
105
  const fullRef = libFullModelRefs.at(0) ?? getBaseConstantClass(ConstantField.getBaseModelField());
62
106
  const applyFieldObject = {
63
107
  ...objectRef[FIELD_META],
@@ -72,26 +116,38 @@ const fullModelOf = <A, B = undefined>(
72
116
 
73
117
  applyConstantStatics(fullRef, applyFieldObject);
74
118
  fullRef.modelType = "full";
75
- return fullRef as unknown as Cls<Omit<A, keyof B> & B>;
119
+ return fullRef as unknown as ConstantCls<Merge<A, B>, FieldObject, Merge<A, B>, FieldObject, "full">;
76
120
  };
77
121
 
78
122
  const extendModelInputs = <T extends ConstantCls[]>(
79
123
  fieldMap: FieldInfoObject,
80
124
  ...libInputModelRefs: T
81
- ): Cls<MergeAllTypes<T>> => {
125
+ ): ConstantCls<MergeOwnSchemas<T>, FieldObject, MergeOwnSchemas<T>, FieldObject, "input"> => {
82
126
  const baseInputModelRef = libInputModelRefs.at(0);
83
127
  const applyFieldObject = Object.fromEntries(Object.entries(fieldMap).map(([key, field]) => [key, field.toField()]));
84
128
  const fieldObject = Object.assign(baseInputModelRef?.[FIELD_META] ?? {}, applyFieldObject);
85
129
  const baseInputRef = getBaseConstantClass(fieldObject);
86
130
  applyConstantStatics(baseInputRef, applyFieldObject);
87
- return baseInputRef as unknown as Cls<MergeAllTypes<T>>;
131
+ return baseInputRef as unknown as ConstantCls<
132
+ MergeOwnSchemas<T>,
133
+ FieldObject,
134
+ MergeOwnSchemas<T>,
135
+ FieldObject,
136
+ "input"
137
+ >;
88
138
  };
89
139
 
90
140
  const extendModelObjects = <Input, ObjectModels extends ConstantCls[]>(
91
141
  inputRef: ConstantCls<Input>,
92
142
  fieldMap: FieldInfoObject,
93
143
  ...libObjectModelRefs: ObjectModels
94
- ): Cls<MergeAllTypes<ObjectModels> & Input> => {
144
+ ): ConstantCls<
145
+ MergeWithOwnSchemas<ObjectModels, Input & object>,
146
+ FieldObject,
147
+ MergeWithOwnSchemas<ObjectModels, Input & object>,
148
+ FieldObject,
149
+ "object"
150
+ > => {
95
151
  const baseObjectModelRef = libObjectModelRefs.at(0);
96
152
  const applyFieldObject = {
97
153
  ...inputRef[FIELD_META],
@@ -100,13 +156,19 @@ const extendModelObjects = <Input, ObjectModels extends ConstantCls[]>(
100
156
  const field = Object.assign(baseObjectModelRef?.[FIELD_META] ?? {}, applyFieldObject);
101
157
  const baseInputRef = getBaseConstantClass(field, "object");
102
158
  applyConstantStatics(baseInputRef, applyFieldObject);
103
- return baseInputRef as unknown as Cls<MergeAllTypes<ObjectModels> & Input>;
159
+ return baseInputRef as unknown as ConstantCls<
160
+ MergeWithOwnSchemas<ObjectModels, Input & object>,
161
+ FieldObject,
162
+ MergeWithOwnSchemas<ObjectModels, Input & object>,
163
+ FieldObject,
164
+ "object"
165
+ >;
104
166
  };
105
167
 
106
168
  const extendModelInsights = <InsightModels extends ConstantCls[]>(
107
169
  fieldMap: FieldInfoObject,
108
170
  ...insightModelRefs: InsightModels
109
- ): Cls<MergeAllTypes<InsightModels>> => {
171
+ ): ConstantCls<MergeOwnSchemas<InsightModels>, FieldObject, MergeOwnSchemas<InsightModels>, FieldObject, "insight"> => {
110
172
  const baseInsightModelRef = insightModelRefs.at(0);
111
173
  const applyFieldObject = Object.fromEntries(Object.entries(fieldMap).map(([key, field]) => [key, field.toField()]));
112
174
  const field = Object.assign(
@@ -116,7 +178,13 @@ const extendModelInsights = <InsightModels extends ConstantCls[]>(
116
178
  const baseInsightRef = getBaseConstantClass(field, "insight");
117
179
 
118
180
  applyConstantStatics(baseInsightRef, applyFieldObject);
119
- return baseInsightRef as unknown as Cls<MergeAllTypes<InsightModels>>;
181
+ return baseInsightRef as unknown as ConstantCls<
182
+ MergeOwnSchemas<InsightModels>,
183
+ FieldObject,
184
+ MergeOwnSchemas<InsightModels>,
185
+ FieldObject,
186
+ "insight"
187
+ >;
120
188
  };
121
189
 
122
190
  const getBaseConstantClass = (field: FieldObject, modelType: ConstantType = "scalar") => {
@@ -125,8 +193,8 @@ const getBaseConstantClass = (field: FieldObject, modelType: ConstantType = "sca
125
193
  static modelType: ConstantType = modelType;
126
194
  static text: { search: Set<string>; filter: Set<string>; children: { search: Set<string>; filter: Set<string> } } =
127
195
  { search: new Set(), filter: new Set(), children: { search: new Set(), filter: new Set() } };
128
- static children: Set<ConstantCls> = new Set();
129
- static relations: Set<ConstantCls> = new Set();
196
+ static children: Set<ConstantModelRef> = new Set();
197
+ static relations: Set<ConstantModelRef> = new Set();
130
198
  static enums: Set<EnumInstance> = new Set();
131
199
  [immerable] = true;
132
200
  constructor(obj?: Partial<unknown>) {
@@ -152,24 +220,85 @@ const getBaseConstantClass = (field: FieldObject, modelType: ConstantType = "sca
152
220
 
153
221
  const makeBaseScalar = <FieldMap extends FieldInfoObject>(
154
222
  fieldMap: FieldMap,
155
- ): Cls<ExtractFieldInfoObject<FieldMap>> => {
223
+ ): ConstantCls<
224
+ ExtractFieldInfoObject<FieldMap>,
225
+ FieldObject,
226
+ ExtractFieldInfoObject<FieldMap>,
227
+ FieldObject,
228
+ "scalar"
229
+ > => {
156
230
  const fieldObject = Object.fromEntries(Object.entries(fieldMap).map(([key, field]) => [key, field.toField()]));
157
231
  const baseScalarRef = getBaseConstantClass(fieldObject, "scalar");
158
232
  applyConstantStatics(baseScalarRef, fieldObject);
159
- return baseScalarRef as unknown as Cls<ExtractFieldInfoObject<FieldMap>>;
233
+ return baseScalarRef as unknown as ConstantCls<
234
+ ExtractFieldInfoObject<FieldMap>,
235
+ FieldObject,
236
+ ExtractFieldInfoObject<FieldMap>,
237
+ FieldObject,
238
+ "scalar"
239
+ >;
160
240
  };
161
241
 
242
+ type ConstantSetReturn<Self, Schema> = Self extends Schema & ConstantMethods<Schema> & infer Model
243
+ ? unknown extends Model
244
+ ? Self
245
+ : Model
246
+ : Self;
162
247
  export interface ConstantMethods<Schema = any> {
163
- set: (obj: Partial<Schema>) => this;
248
+ set<Self extends Schema & ConstantMethods<Schema>>(this: Self, obj: Partial<Schema>): ConstantSetReturn<Self, Schema>;
164
249
  }
165
250
 
166
- export interface ConstantStatics<Schema = any, FieldObj extends FieldObject = FieldObject> {
251
+ type DatabaseSchemaOf<Schema, HiddenKey> = {
252
+ [K in keyof Schema]: K extends HiddenKey ? NonNullable<Schema[K]> : Schema[K];
253
+ };
254
+
255
+ export interface ConstantStatics<
256
+ Schema = any,
257
+ OwnSchema = Schema,
258
+ OwnFieldObj extends FieldObject = FieldObject,
259
+ OptionalKey = never,
260
+ RelationKey = never,
261
+ PrimitiveKey = never,
262
+ ScalarKey = never,
263
+ EnumKey = never,
264
+ MapKey = never,
265
+ HiddenKey = never,
266
+ SecretKey = never,
267
+ ModelType extends ConstantType = ConstantType,
268
+ > {
269
+ [FIELD_META]: FieldObject;
270
+ getDefault: () => DefaultOfSchema<Schema, RelationKey>;
271
+ purify: PurifyFunc<Schema>;
272
+ modelType: ConstantType;
273
+ children: Set<ConstantModelRef>;
274
+ relations: Set<ConstantModelRef>;
275
+ enums: Set<EnumInstance>;
276
+ text: { search: Set<string>; filter: Set<string>; children: { search: Set<string>; filter: Set<string> } };
277
+ _OptionalKey: OptionalKey;
278
+ _RelationKey: RelationKey;
279
+ _PrimitiveKey: PrimitiveKey;
280
+ _ScalarKey: ScalarKey;
281
+ _EnumKey: EnumKey;
282
+ _MapKey: MapKey;
283
+ _HiddenKey: HiddenKey;
284
+ _SecretKey: SecretKey;
285
+ _OwnSchema: OwnSchema;
286
+ _OwnFieldObj: OwnFieldObj;
287
+ _DatabaseSchema: DatabaseSchemaOf<Schema, HiddenKey>;
288
+ _ModelType: ModelType;
289
+ [SERVER_VALUE]: Schema;
290
+ [CLIENT_VALUE]: Schema;
291
+ [DEFAULT_VALUE]: DefaultOfSchema<Schema, RelationKey>;
292
+ [PURIFIED_VALUE]: PurifiedModel<Schema>;
293
+ }
294
+
295
+ export interface DatabaseConstantStatics<Schema = any, FieldObj extends FieldObject = FieldObject> {
167
296
  [FIELD_META]: FieldObj;
168
297
  getDefault: () => DefaultOf<Schema>;
169
298
  purify: PurifyFunc<Schema>;
170
299
  modelType: ConstantType;
171
- children: Set<ConstantCls>;
172
- relations: Set<ConstantCls>;
300
+ children: Set<ConstantModelRef>;
301
+ relations: Set<ConstantModelRef>;
173
302
  enums: Set<EnumInstance>;
174
303
  text: { search: Set<string>; filter: Set<string>; children: { search: Set<string>; filter: Set<string> } };
175
304
  _DatabaseSchema: {
@@ -180,17 +309,116 @@ export interface ConstantStatics<Schema = any, FieldObj extends FieldObject = Fi
180
309
  : Schema[K];
181
310
  };
182
311
  }
183
- export type ConstantCls<Schema = any, FieldObj extends FieldObject = FieldObject> = (new (
312
+
313
+ export type ConstantModelRef<
314
+ Schema = any,
315
+ FieldObj extends FieldObject = FieldObject,
316
+ ModelType extends ConstantType = ConstantType,
317
+ > = Cls<
318
+ Schema,
319
+ {
320
+ [FIELD_META]: FieldObj;
321
+ modelType: ModelType;
322
+ children: Set<ConstantModelRef>;
323
+ relations: Set<ConstantModelRef>;
324
+ enums: Set<EnumInstance>;
325
+ text: { search: Set<string>; filter: Set<string>; children: { search: Set<string>; filter: Set<string> } };
326
+ }
327
+ >;
328
+
329
+ export type DocumentConstantModelRef<
330
+ Schema = any,
331
+ FieldObj extends FieldObject = FieldObject,
332
+ ModelType extends ConstantType = ConstantType,
333
+ DatabaseSchema = DatabaseSchemaOf<Schema, never>,
334
+ > = Cls<
335
+ Schema,
336
+ {
337
+ [FIELD_META]: FieldObj;
338
+ modelType: ModelType;
339
+ _DatabaseSchema: DatabaseSchema;
340
+ _ModelType: ModelType;
341
+ }
342
+ >;
343
+
344
+ type FieldFlag = "nullable" | "_isRelation" | "_isPrimitive" | "_isScalar" | "_isEnum" | "_isHidden" | "_isSecret" | "_isMap";
345
+ type TrueFieldFlag<Flag extends FieldFlag> = { readonly [K in Flag]: true };
346
+ type KeysByFlag<FieldObj extends FieldObject, Flag extends FieldFlag> = {
347
+ [K in keyof FieldObj]: FieldObj[K] extends TrueFieldFlag<Flag> ? K : never;
348
+ }[keyof FieldObj];
349
+ type OptionalKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "nullable">;
350
+ type RelationKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isRelation">;
351
+ type PrimitiveKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isPrimitive">;
352
+ type ScalarKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isScalar">;
353
+ type EnumKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isEnum">;
354
+ type HiddenKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isHidden">;
355
+ type SecretKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isSecret">;
356
+ type MapKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isMap">;
357
+ type ConstantKeyChannelMap = {
358
+ optional: unknown;
359
+ relation: unknown;
360
+ primitive: unknown;
361
+ scalar: unknown;
362
+ enum: unknown;
363
+ map: unknown;
364
+ hidden: unknown;
365
+ secret: unknown;
366
+ };
367
+ type IsBroadFieldObject<FieldObj extends FieldObject> = string extends keyof FieldObj ? true : false;
368
+ type ConstantKeyChannels<FieldObj extends FieldObject> =
369
+ IsBroadFieldObject<FieldObj> extends true
370
+ ? {
371
+ optional: never;
372
+ relation: never;
373
+ primitive: never;
374
+ scalar: never;
375
+ enum: never;
376
+ map: never;
377
+ hidden: never;
378
+ secret: never;
379
+ }
380
+ : {
381
+ optional: OptionalKeys<FieldObj>;
382
+ relation: RelationKeys<FieldObj>;
383
+ primitive: PrimitiveKeys<FieldObj>;
384
+ scalar: ScalarKeys<FieldObj>;
385
+ enum: EnumKeys<FieldObj>;
386
+ map: MapKeys<FieldObj>;
387
+ hidden: HiddenKeys<FieldObj>;
388
+ secret: SecretKeys<FieldObj>;
389
+ };
390
+
391
+ export type ConstantCls<
392
+ Schema = any,
393
+ FieldObj extends FieldObject = FieldObject,
394
+ OwnSchema = Schema,
395
+ OwnFieldObj extends FieldObject = FieldObj,
396
+ ModelType extends ConstantType = ConstantType,
397
+ _Channels extends ConstantKeyChannelMap = ConstantKeyChannels<FieldObj>,
398
+ > = (new (
184
399
  obj?: Partial<Schema>,
185
400
  ) => Schema & ConstantMethods<Schema>) &
186
- ConstantStatics<Schema, FieldObj>;
401
+ ConstantStatics<
402
+ Schema,
403
+ OwnSchema,
404
+ OwnFieldObj,
405
+ _Channels["optional"],
406
+ _Channels["relation"],
407
+ _Channels["primitive"],
408
+ _Channels["scalar"],
409
+ _Channels["enum"],
410
+ _Channels["map"],
411
+ _Channels["hidden"],
412
+ _Channels["secret"],
413
+ ModelType
414
+ >;
187
415
 
188
416
  declare global {
189
417
 
190
- interface DateConstructor extends ConstantStatics<unknown> {}
191
- interface StringConstructor extends ConstantStatics<unknown> {}
192
- interface BooleanConstructor extends ConstantStatics<unknown> {}
193
- interface MapConstructor extends ConstantStatics<unknown> {}
418
+ interface DateConstructor extends DatabaseConstantStatics<unknown> {}
419
+ interface StringConstructor extends DatabaseConstantStatics<unknown> {}
420
+ interface BooleanConstructor extends DatabaseConstantStatics<unknown> {}
421
+ interface MapConstructor extends DatabaseConstantStatics<unknown> {}
194
422
  }
195
423
 
196
424
  const applyConstantStatics = <Model>(model: ConstantCls<Model>, fieldMap: FieldObject): ConstantCls<Model> => {
@@ -234,48 +462,70 @@ export function via<
234
462
  K extends NonFunctionalKeys<OmitBase<Obj>>,
235
463
  ResolveField extends (resolve: FieldResolver) => FieldInfoObject,
236
464
  LightModels extends Cls[],
237
- _Schema = MergeAllTypes<LightModels> & Pick<Obj, K> & BaseObject & ExtractFieldInfoObject<ReturnType<ResolveField>>,
238
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<LightModels, typeof FIELD_META> &
239
- Pick<ObjFieldObj, K & keyof ObjFieldObj> &
240
- FieldInfoObjectToFieldObject<ReturnType<ResolveField>>,
465
+ _DirectSchema extends object = ObjectAssign<[Pick<Obj, K> & BaseObject, ResolvedSchema<ResolveField>]>,
466
+ _Schema extends object = MergeWithOwnSchemas<LightModels, _DirectSchema>,
467
+ _DirectFieldObj extends FieldObject = ObjectAssign<
468
+ [Pick<ObjFieldObj, K & keyof ObjFieldObj>, ResolvedFieldObject<ResolveField>]
469
+ >,
470
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<LightModels, _DirectFieldObj> & FieldObject,
241
471
  >(
242
472
  modelRef: Cls<Obj, { [FIELD_META]: ObjFieldObj }>,
243
473
  fields: readonly K[],
244
474
  resolveField: ResolveField,
245
475
  ...lightModelRefs: LightModels
246
- ): ConstantCls<_Schema, _FieldObj>;
476
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "light">;
247
477
 
248
478
  export function via<
249
479
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
480
+ _DirectSchema extends object = BuiltSchema<BuildField>,
481
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
482
+ >(
483
+ buildField: BuildField,
484
+ ): ConstantCls<_DirectSchema, _DirectFieldObj, _DirectSchema, _DirectFieldObj, "input" | "scalar">;
485
+
486
+ export function via<
487
+ BuildField extends (builder: FieldBuilder) => FieldInfoObject,
488
+ FirstInput extends Cls,
250
489
  Inputs extends Cls[],
251
- _Schema = MergeAllTypes<Inputs> & ExtractFieldInfoObject<ReturnType<BuildField>>,
252
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<Inputs, typeof FIELD_META> &
253
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
254
- >(buildField: BuildField, ...extendInputRefs: Inputs): ConstantCls<_Schema, _FieldObj>;
490
+ _DirectSchema extends object = BuiltSchema<BuildField>,
491
+ _InputRefs extends Cls[] = [FirstInput, ...Inputs],
492
+ _Schema extends object = MergeWithOwnSchemas<_InputRefs, _DirectSchema>,
493
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
494
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<_InputRefs, _DirectFieldObj> & FieldObject,
495
+ >(
496
+ buildField: BuildField,
497
+ firstExtendInputRef: FirstInput,
498
+ ...extendInputRefs: Inputs
499
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "input">;
255
500
 
256
501
  export function via<
257
502
  Full extends BaseObject,
258
503
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
259
504
  Insights extends Cls[],
260
- _Schema = MergeAllTypes<Insights> & BaseInsight & ExtractFieldInfoObject<ReturnType<BuildField>>,
261
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<Insights, typeof FIELD_META> &
262
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
263
- >(modelRef: Cls<Full>, buildField: BuildField, ...extendInsightRefs: Insights): ConstantCls<_Schema, _FieldObj>;
505
+ _DirectSchema extends object = ObjectAssign<[BaseInsight, BuiltSchema<BuildField>]>,
506
+ _Schema extends object = MergeWithOwnSchemas<Insights, _DirectSchema>,
507
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
508
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<Insights, _DirectFieldObj> & FieldObject,
509
+ >(
510
+ modelRef: Cls<Full>,
511
+ buildField: BuildField,
512
+ ...extendInsightRefs: Insights
513
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "insight">;
264
514
 
265
515
  export function via<
266
516
  Input,
267
517
  InputFieldObj extends FieldObject,
268
518
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
269
519
  ObjectModels extends Cls[],
270
- _Schema = MergeAllTypes<ObjectModels> & Input & BaseObject & ExtractFieldInfoObject<ReturnType<BuildField>>,
271
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<ObjectModels, typeof FIELD_META> &
272
- InputFieldObj &
273
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
520
+ _DirectSchema extends object = ObjectAssign<[Input & object, BaseObject, BuiltSchema<BuildField>]>,
521
+ _Schema extends object = MergeWithOwnSchemas<ObjectModels, _DirectSchema>,
522
+ _DirectFieldObj extends FieldObject = ObjectAssign<[InputFieldObj, BuiltFieldObject<BuildField>]>,
523
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<ObjectModels, _DirectFieldObj> & FieldObject,
274
524
  >(
275
525
  inputRef: Cls<Input, { [FIELD_META]: InputFieldObj }>,
276
526
  buildField: BuildField,
277
527
  ...extendObjectRefs: ObjectModels
278
- ): ConstantCls<_Schema, _FieldObj>;
528
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "object">;
279
529
 
280
530
  export function via<
281
531
  Obj,
@@ -284,17 +534,16 @@ export function via<
284
534
  LightFieldObj extends FieldObject,
285
535
  ResolveField extends (resolve: FieldResolver) => FieldInfoObject,
286
536
  FullModels extends Cls[],
287
- _Schema = MergeAllTypes<FullModels> & Obj & Light & ExtractFieldInfoObject<ReturnType<ResolveField>>,
288
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<FullModels, typeof FIELD_META> &
289
- ObjFieldObj &
290
- LightFieldObj &
291
- FieldInfoObjectToFieldObject<ReturnType<ResolveField>>,
537
+ _DirectSchema extends object = ObjectAssign<[Obj & object, Light & object, ResolvedSchema<ResolveField>]>,
538
+ _Schema extends object = MergeWithOwnSchemas<FullModels, _DirectSchema>,
539
+ _DirectFieldObj extends FieldObject = ObjectAssign<[ObjFieldObj, LightFieldObj, ResolvedFieldObject<ResolveField>]>,
540
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<FullModels, _DirectFieldObj> & FieldObject,
292
541
  >(
293
542
  objectRef: Cls<Obj, { [FIELD_META]: ObjFieldObj }>,
294
543
  lightModelRef: Cls<Light, { [FIELD_META]: LightFieldObj }>,
295
544
  resolveField: ResolveField,
296
545
  ...fullModelRefs: FullModels
297
- ): ConstantCls<_Schema, _FieldObj>;
546
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "full">;
298
547
 
299
548
  export function via(
300
549
  firstRefOrBuildField: Cls | ((builder: FieldBuilder) => FieldInfoObject),