akanjs 2.3.5-rc.8 → 2.3.5

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 (81) 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 +12 -0
  5. package/constant/constantRegistry.ts +10 -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 +6 -5
  12. package/constant/types.ts +9 -1
  13. package/constant/via.ts +312 -57
  14. package/dictionary/dictInfo.ts +28 -38
  15. package/dictionary/locale.ts +36 -38
  16. package/document/by.ts +84 -21
  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 +71 -23
  33. package/signal/serverSignal.ts +23 -57
  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 +16 -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 +1 -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 +143 -22
  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 +44 -7
  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/serviceModule.d.ts +5 -5
  66. package/types/service/types.d.ts +23 -5
  67. package/types/signal/endpoint.d.ts +2 -1
  68. package/types/signal/endpointInfo.d.ts +40 -15
  69. package/types/signal/internal.d.ts +2 -1
  70. package/types/signal/internalInfo.d.ts +46 -12
  71. package/types/signal/serverSignal.d.ts +15 -12
  72. package/types/signal/slice.d.ts +8 -6
  73. package/types/signal/sliceInfo.d.ts +41 -20
  74. package/types/signal/types.d.ts +23 -17
  75. package/types/store/action.d.ts +25 -22
  76. package/types/store/baseSt.d.ts +42 -13
  77. package/types/store/state.d.ts +23 -26
  78. package/types/store/stateBuilder.d.ts +2 -2
  79. package/types/store/store.d.ts +17 -5
  80. package/types/store/types.d.ts +9 -3
  81. package/ui/Signal/makeExample.ts +3 -3
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,47 +220,213 @@ 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: {
176
305
  [K in keyof Schema]: K extends keyof FieldObj
177
- ? FieldObj[K] extends ConstantField<infer FieldType, any, any, any, any, any>
178
- ? FieldType extends "hidden"
179
- ? NonNullable<Schema[K]>
180
- : Schema[K]
306
+ ? FieldObj[K]["fieldType"] extends "hidden"
307
+ ? NonNullable<Schema[K]>
181
308
  : Schema[K]
182
309
  : Schema[K];
183
310
  };
184
311
  }
185
- 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 =
345
+ | "nullable"
346
+ | "_isRelation"
347
+ | "_isPrimitive"
348
+ | "_isScalar"
349
+ | "_isEnum"
350
+ | "_isHidden"
351
+ | "_isSecret"
352
+ | "_isMap";
353
+ type TrueFieldFlag<Flag extends FieldFlag> = { readonly [K in Flag]: true };
354
+ type KeysByFlag<FieldObj extends FieldObject, Flag extends FieldFlag> = {
355
+ [K in keyof FieldObj]: FieldObj[K] extends TrueFieldFlag<Flag> ? K : never;
356
+ }[keyof FieldObj];
357
+ type OptionalKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "nullable">;
358
+ type RelationKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isRelation">;
359
+ type PrimitiveKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isPrimitive">;
360
+ type ScalarKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isScalar">;
361
+ type EnumKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isEnum">;
362
+ type HiddenKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isHidden">;
363
+ type SecretKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isSecret">;
364
+ type MapKeys<FieldObj extends FieldObject> = KeysByFlag<FieldObj, "_isMap">;
365
+ type ConstantKeyChannelMap = {
366
+ optional: unknown;
367
+ relation: unknown;
368
+ primitive: unknown;
369
+ scalar: unknown;
370
+ enum: unknown;
371
+ map: unknown;
372
+ hidden: unknown;
373
+ secret: unknown;
374
+ };
375
+ type IsBroadFieldObject<FieldObj extends FieldObject> = string extends keyof FieldObj ? true : false;
376
+ type ConstantKeyChannels<FieldObj extends FieldObject> =
377
+ IsBroadFieldObject<FieldObj> extends true
378
+ ? {
379
+ optional: never;
380
+ relation: never;
381
+ primitive: never;
382
+ scalar: never;
383
+ enum: never;
384
+ map: never;
385
+ hidden: never;
386
+ secret: never;
387
+ }
388
+ : {
389
+ optional: OptionalKeys<FieldObj>;
390
+ relation: RelationKeys<FieldObj>;
391
+ primitive: PrimitiveKeys<FieldObj>;
392
+ scalar: ScalarKeys<FieldObj>;
393
+ enum: EnumKeys<FieldObj>;
394
+ map: MapKeys<FieldObj>;
395
+ hidden: HiddenKeys<FieldObj>;
396
+ secret: SecretKeys<FieldObj>;
397
+ };
398
+
399
+ export type ConstantCls<
400
+ Schema = any,
401
+ FieldObj extends FieldObject = FieldObject,
402
+ OwnSchema = Schema,
403
+ OwnFieldObj extends FieldObject = FieldObj,
404
+ ModelType extends ConstantType = ConstantType,
405
+ _Channels extends ConstantKeyChannelMap = ConstantKeyChannels<FieldObj>,
406
+ > = (new (
186
407
  obj?: Partial<Schema>,
187
408
  ) => Schema & ConstantMethods<Schema>) &
188
- ConstantStatics<Schema, FieldObj>;
409
+ ConstantStatics<
410
+ Schema,
411
+ OwnSchema,
412
+ OwnFieldObj,
413
+ _Channels["optional"],
414
+ _Channels["relation"],
415
+ _Channels["primitive"],
416
+ _Channels["scalar"],
417
+ _Channels["enum"],
418
+ _Channels["map"],
419
+ _Channels["hidden"],
420
+ _Channels["secret"],
421
+ ModelType
422
+ >;
189
423
 
190
424
  declare global {
191
425
 
192
- interface DateConstructor extends ConstantStatics<unknown> {}
193
- interface StringConstructor extends ConstantStatics<unknown> {}
194
- interface BooleanConstructor extends ConstantStatics<unknown> {}
195
- interface MapConstructor extends ConstantStatics<unknown> {}
426
+ interface DateConstructor extends DatabaseConstantStatics<unknown> {}
427
+ interface StringConstructor extends DatabaseConstantStatics<unknown> {}
428
+ interface BooleanConstructor extends DatabaseConstantStatics<unknown> {}
429
+ interface MapConstructor extends DatabaseConstantStatics<unknown> {}
196
430
  }
197
431
 
198
432
  const applyConstantStatics = <Model>(model: ConstantCls<Model>, fieldMap: FieldObject): ConstantCls<Model> => {
@@ -236,48 +470,70 @@ export function via<
236
470
  K extends NonFunctionalKeys<OmitBase<Obj>>,
237
471
  ResolveField extends (resolve: FieldResolver) => FieldInfoObject,
238
472
  LightModels extends Cls[],
239
- _Schema = MergeAllTypes<LightModels> & Pick<Obj, K> & BaseObject & ExtractFieldInfoObject<ReturnType<ResolveField>>,
240
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<LightModels, typeof FIELD_META> &
241
- Pick<ObjFieldObj, K & keyof ObjFieldObj> &
242
- FieldInfoObjectToFieldObject<ReturnType<ResolveField>>,
473
+ _DirectSchema extends object = ObjectAssign<[Pick<Obj, K> & BaseObject, ResolvedSchema<ResolveField>]>,
474
+ _Schema extends object = MergeWithOwnSchemas<LightModels, _DirectSchema>,
475
+ _DirectFieldObj extends FieldObject = ObjectAssign<
476
+ [Pick<ObjFieldObj, K & keyof ObjFieldObj>, ResolvedFieldObject<ResolveField>]
477
+ >,
478
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<LightModels, _DirectFieldObj> & FieldObject,
243
479
  >(
244
480
  modelRef: Cls<Obj, { [FIELD_META]: ObjFieldObj }>,
245
481
  fields: readonly K[],
246
482
  resolveField: ResolveField,
247
483
  ...lightModelRefs: LightModels
248
- ): ConstantCls<_Schema, _FieldObj>;
484
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "light">;
249
485
 
250
486
  export function via<
251
487
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
488
+ _DirectSchema extends object = BuiltSchema<BuildField>,
489
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
490
+ >(
491
+ buildField: BuildField,
492
+ ): ConstantCls<_DirectSchema, _DirectFieldObj, _DirectSchema, _DirectFieldObj, "input" | "scalar">;
493
+
494
+ export function via<
495
+ BuildField extends (builder: FieldBuilder) => FieldInfoObject,
496
+ FirstInput extends Cls,
252
497
  Inputs extends Cls[],
253
- _Schema = MergeAllTypes<Inputs> & ExtractFieldInfoObject<ReturnType<BuildField>>,
254
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<Inputs, typeof FIELD_META> &
255
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
256
- >(buildField: BuildField, ...extendInputRefs: Inputs): ConstantCls<_Schema, _FieldObj>;
498
+ _DirectSchema extends object = BuiltSchema<BuildField>,
499
+ _InputRefs extends Cls[] = [FirstInput, ...Inputs],
500
+ _Schema extends object = MergeWithOwnSchemas<_InputRefs, _DirectSchema>,
501
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
502
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<_InputRefs, _DirectFieldObj> & FieldObject,
503
+ >(
504
+ buildField: BuildField,
505
+ firstExtendInputRef: FirstInput,
506
+ ...extendInputRefs: Inputs
507
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "input">;
257
508
 
258
509
  export function via<
259
510
  Full extends BaseObject,
260
511
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
261
512
  Insights extends Cls[],
262
- _Schema = MergeAllTypes<Insights> & BaseInsight & ExtractFieldInfoObject<ReturnType<BuildField>>,
263
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<Insights, typeof FIELD_META> &
264
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
265
- >(modelRef: Cls<Full>, buildField: BuildField, ...extendInsightRefs: Insights): ConstantCls<_Schema, _FieldObj>;
513
+ _DirectSchema extends object = ObjectAssign<[BaseInsight, BuiltSchema<BuildField>]>,
514
+ _Schema extends object = MergeWithOwnSchemas<Insights, _DirectSchema>,
515
+ _DirectFieldObj extends FieldObject = BuiltFieldObject<BuildField>,
516
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<Insights, _DirectFieldObj> & FieldObject,
517
+ >(
518
+ modelRef: Cls<Full>,
519
+ buildField: BuildField,
520
+ ...extendInsightRefs: Insights
521
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "insight">;
266
522
 
267
523
  export function via<
268
524
  Input,
269
525
  InputFieldObj extends FieldObject,
270
526
  BuildField extends (builder: FieldBuilder) => FieldInfoObject,
271
527
  ObjectModels extends Cls[],
272
- _Schema = MergeAllTypes<ObjectModels> & Input & BaseObject & ExtractFieldInfoObject<ReturnType<BuildField>>,
273
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<ObjectModels, typeof FIELD_META> &
274
- InputFieldObj &
275
- FieldInfoObjectToFieldObject<ReturnType<BuildField>>,
528
+ _DirectSchema extends object = ObjectAssign<[Input & object, BaseObject, BuiltSchema<BuildField>]>,
529
+ _Schema extends object = MergeWithOwnSchemas<ObjectModels, _DirectSchema>,
530
+ _DirectFieldObj extends FieldObject = ObjectAssign<[InputFieldObj, BuiltFieldObject<BuildField>]>,
531
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<ObjectModels, _DirectFieldObj> & FieldObject,
276
532
  >(
277
533
  inputRef: Cls<Input, { [FIELD_META]: InputFieldObj }>,
278
534
  buildField: BuildField,
279
535
  ...extendObjectRefs: ObjectModels
280
- ): ConstantCls<_Schema, _FieldObj>;
536
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "object">;
281
537
 
282
538
  export function via<
283
539
  Obj,
@@ -286,17 +542,16 @@ export function via<
286
542
  LightFieldObj extends FieldObject,
287
543
  ResolveField extends (resolve: FieldResolver) => FieldInfoObject,
288
544
  FullModels extends Cls[],
289
- _Schema = MergeAllTypes<FullModels> & Obj & Light & ExtractFieldInfoObject<ReturnType<ResolveField>>,
290
- _FieldObj extends FieldObject = MergeAllKeyOfObjects<FullModels, typeof FIELD_META> &
291
- ObjFieldObj &
292
- LightFieldObj &
293
- FieldInfoObjectToFieldObject<ReturnType<ResolveField>>,
545
+ _DirectSchema extends object = ObjectAssign<[Obj & object, Light & object, ResolvedSchema<ResolveField>]>,
546
+ _Schema extends object = MergeWithOwnSchemas<FullModels, _DirectSchema>,
547
+ _DirectFieldObj extends FieldObject = ObjectAssign<[ObjFieldObj, LightFieldObj, ResolvedFieldObject<ResolveField>]>,
548
+ _FieldObj extends FieldObject = MergeWithOwnFieldObjects<FullModels, _DirectFieldObj> & FieldObject,
294
549
  >(
295
550
  objectRef: Cls<Obj, { [FIELD_META]: ObjFieldObj }>,
296
551
  lightModelRef: Cls<Light, { [FIELD_META]: LightFieldObj }>,
297
552
  resolveField: ResolveField,
298
553
  ...fullModelRefs: FullModels
299
- ): ConstantCls<_Schema, _FieldObj>;
554
+ ): ConstantCls<_Schema, _FieldObj, _Schema, _FieldObj, "full">;
300
555
 
301
556
  export function via(
302
557
  firstRefOrBuildField: Cls | ((builder: FieldBuilder) => FieldInfoObject),
@@ -1,12 +1,22 @@
1
1
  import type { GetStateObject } from "akanjs/base";
2
2
  import { capitalize } from "akanjs/common";
3
3
  import type { BaseInsight, BaseObject } from "akanjs/constant";
4
- import type { BaseFilterQueryKey, BaseFilterSortKey, FilterInfo, FilterInstance } from "akanjs/document";
5
- import type { EndpointInfo, SliceInfo } from "akanjs/signal";
4
+ import type { BaseFilterQueryKey, BaseFilterSortKey, FilterCls, FilterInfo, FilterInstance } from "akanjs/document";
5
+ import type { EndpInfoArgNames, EndpointInfo, SliceInfo, SliceInfoArgNames } from "akanjs/signal";
6
6
  import type { DictionaryNode, RootDictionary } from "./trans";
7
7
 
8
8
  type MutableDictionaryNode = DictionaryNode & { t?: string; desc?: DictionaryNode };
9
9
  type EnumValueKey = string | number;
10
+ type AnyFilterShape = FilterInstance<Record<string, FilterInfo>, Record<string, unknown>>;
11
+ type DictFilterShape<Filter> = Filter extends FilterInstance
12
+ ? Filter
13
+ : Filter extends FilterCls<infer FilterShape>
14
+ ? FilterShape
15
+ : Filter extends { query: Record<string, FilterInfo>; sort: Record<string, unknown> }
16
+ ? Filter
17
+ : AnyFilterShape;
18
+ type DictFilterQuery<Filter> = DictFilterShape<Filter>["query"];
19
+ type DictFilterSort<Filter> = DictFilterShape<Filter>["sort"];
10
20
 
11
21
  const ensureNode = (target: DictionaryNode, key: string): MutableDictionaryNode => {
12
22
  target[key] ??= {};
@@ -250,24 +260,27 @@ export class ModelDictInfo<
250
260
  EtcKey
251
261
  >;
252
262
  }
253
- query<Filter extends FilterInstance>(
263
+ query<Filter>(
254
264
  translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
255
- [K in Exclude<keyof Filter["query"], QueryKey>]: Filter["query"][K] extends FilterInfo<infer ArgNames, any>
265
+ [K in Exclude<keyof DictFilterQuery<Filter>, QueryKey>]: DictFilterQuery<Filter>[K] extends FilterInfo<
266
+ infer ArgNames,
267
+ any
268
+ >
256
269
  ? FunctionTranslation<Languages, ArgNames[number]>
257
270
  : never;
258
271
  },
259
272
  ) {
260
273
  Object.assign(this.queryDictionary, translate(fn), ModelDictInfo.baseQueryDictionary) as unknown as {
261
- [K in keyof Filter["query"]]: FunctionTranslation<
274
+ [K in keyof DictFilterQuery<Filter>]: FunctionTranslation<
262
275
  Languages,
263
- Filter["query"][K] extends FilterInfo<infer ArgNames, any> ? ArgNames[number] : never
276
+ DictFilterQuery<Filter>[K] extends FilterInfo<infer ArgNames, any> ? ArgNames[number] : never
264
277
  >;
265
278
  };
266
279
  return this as unknown as ModelDictInfo<
267
280
  Languages,
268
281
  ModelKey,
269
282
  InsightKey,
270
- keyof Filter["query"] & string,
283
+ keyof DictFilterQuery<Filter> & string,
271
284
  SortKey,
272
285
  EnumKey,
273
286
  BaseSignalKey,
@@ -277,9 +290,9 @@ export class ModelDictInfo<
277
290
  EtcKey
278
291
  >;
279
292
  }
280
- sort<Filter extends FilterInstance>(
293
+ sort<Filter>(
281
294
  translate: (t: (trans: Languages) => FieldTranslation<Languages>) => {
282
- [K in Exclude<keyof Filter["sort"], SortKey>]: FieldTranslation<Languages>;
295
+ [K in Exclude<keyof DictFilterSort<Filter>, SortKey>]: FieldTranslation<Languages>;
283
296
  },
284
297
  ) {
285
298
  Object.assign(
@@ -292,7 +305,7 @@ export class ModelDictInfo<
292
305
  ModelKey,
293
306
  InsightKey,
294
307
  QueryKey,
295
- keyof Filter["sort"] & string,
308
+ keyof DictFilterSort<Filter> & string,
296
309
  EnumKey,
297
310
  BaseSignalKey,
298
311
  SliceKey,
@@ -327,20 +340,8 @@ export class ModelDictInfo<
327
340
  }
328
341
  slice<Slice>(
329
342
  translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
330
- [K in Exclude<keyof Slice, SliceKey>]: Slice[K] extends SliceInfo<
331
- any,
332
- any,
333
- any,
334
- any,
335
- any,
336
- any,
337
- any,
338
- infer ArgNames,
339
- any,
340
- any,
341
- any
342
- >
343
- ? FunctionTranslation<Languages, ArgNames[number]>
343
+ [K in Exclude<keyof Slice, SliceKey>]: Slice[K] extends infer Info extends SliceInfo
344
+ ? FunctionTranslation<Languages, SliceInfoArgNames<Info>[number]>
344
345
  : never;
345
346
  },
346
347
  ) {
@@ -363,19 +364,8 @@ export class ModelDictInfo<
363
364
  }
364
365
  endpoint<Endpoint>(
365
366
  translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
366
- [K in Exclude<keyof Endpoint, EndpointKey>]: Endpoint[K] extends EndpointInfo<
367
- any,
368
- any,
369
- infer ArgNames,
370
- any,
371
- any,
372
- any,
373
- any,
374
- any,
375
- any,
376
- any
377
- >
378
- ? FunctionTranslation<Languages, ArgNames[number]>
367
+ [K in Exclude<keyof Endpoint, EndpointKey>]: Endpoint[K] extends infer Info extends EndpointInfo
368
+ ? FunctionTranslation<Languages, EndpInfoArgNames<Info>[number]>
379
369
  : never;
380
370
  },
381
371
  ) {
@@ -992,7 +982,7 @@ export class ServiceDictInfo<
992
982
  }
993
983
  endpoint<Endpoint extends { [key: string]: EndpointInfo }>(
994
984
  translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
995
- [K in keyof Endpoint]: FunctionTranslation<Languages, Endpoint[K]["argNames"][number]>;
985
+ [K in keyof Endpoint]: FunctionTranslation<Languages, EndpInfoArgNames<Endpoint[K]>[number]>;
996
986
  },
997
987
  ) {
998
988
  Object.assign(this.endpointDictionary, translate(fn)) as unknown as {