akanjs 2.3.5-rc.12 → 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.
package/constant/via.ts CHANGED
@@ -239,8 +239,13 @@ const makeBaseScalar = <FieldMap extends FieldInfoObject>(
239
239
  >;
240
240
  };
241
241
 
242
+ type ConstantSetReturn<Self, Schema> = Self extends Schema & ConstantMethods<Schema> & infer Model
243
+ ? unknown extends Model
244
+ ? Self
245
+ : Model
246
+ : Self;
242
247
  export interface ConstantMethods<Schema = any> {
243
- set: (obj: Partial<Schema>) => this;
248
+ set<Self extends Schema & ConstantMethods<Schema>>(this: Self, obj: Partial<Schema>): ConstantSetReturn<Self, Schema>;
244
249
  }
245
250
 
246
251
  type DatabaseSchemaOf<Schema, HiddenKey> = {
@@ -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";
4
+ import type { BaseFilterQueryKey, BaseFilterSortKey, FilterCls, FilterInfo, FilterInstance } from "akanjs/document";
5
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,
@@ -1,6 +1,6 @@
1
1
  import type { GetStateObject, MergedValues } from "akanjs/base";
2
2
  import type { BaseInsight, BaseObject } from "akanjs/constant";
3
- import type { FilterInfo, FilterInstance } from "akanjs/document";
3
+ import type { FilterCls, FilterInfo, FilterInstance } from "akanjs/document";
4
4
  import type { EndpInfoArgNames, EndpointInfo, SliceInfo, SliceInfoArgNames, SliceInfoRefName } from "akanjs/signal";
5
5
  import type { ModelDictInfo, ScalarDictInfo, ServiceDictInfo } from ".";
6
6
 
@@ -16,16 +16,26 @@ interface FnTrans<ArgKey extends string> {
16
16
  desc?: string;
17
17
  arg?: { [key in ArgKey]: FieldTrans };
18
18
  }
19
- type FilterTranslatorKey<Filter extends FilterInstance> = {
20
- [Key in keyof Filter["query"] & string]:
19
+ type AnyFilterShape = FilterInstance<Record<string, FilterInfo>, Record<string, unknown>>;
20
+ type DictFilterShape<Filter> = Filter extends FilterInstance
21
+ ? Filter
22
+ : Filter extends FilterCls<infer FilterShape>
23
+ ? FilterShape
24
+ : Filter extends { query: Record<string, FilterInfo>; sort: Record<string, unknown> }
25
+ ? Filter
26
+ : AnyFilterShape;
27
+ type DictFilterQuery<Filter> = DictFilterShape<Filter>["query"];
28
+ type DictFilterSort<Filter> = DictFilterShape<Filter>["sort"];
29
+ type FilterTranslatorKey<Filter> = {
30
+ [Key in keyof DictFilterQuery<Filter> & string]:
21
31
  | `${Key}`
22
32
  | `${Key}.desc`
23
- | (Filter["query"][Key] extends FilterInfo<infer ArgNames, any>
33
+ | (DictFilterQuery<Filter>[Key] extends FilterInfo<infer ArgNames, any>
24
34
  ? ArgNames[number] extends string
25
35
  ? `${Key}.arg.${ArgNames[number]}` | `${Key}.arg.${ArgNames[number]}.desc`
26
36
  : never
27
37
  : never);
28
- }[keyof Filter["query"] & string];
38
+ }[keyof DictFilterQuery<Filter> & string];
29
39
  type EndpointTranslatorKey<Endpoint extends { [key: string]: EndpointInfo }> = {
30
40
  [Key in keyof Endpoint & string]:
31
41
  | `${Key}`
@@ -73,7 +83,7 @@ export type ModelTrans<
73
83
  T extends string,
74
84
  Model extends BaseObject,
75
85
  Insight extends BaseInsight,
76
- Filter extends FilterInstance,
86
+ Filter,
77
87
  Slice extends { [key: string]: SliceInfo },
78
88
  Endpoint extends { [key: string]: EndpointInfo },
79
89
  ErrorKey extends string,
@@ -84,11 +94,11 @@ export type ModelTrans<
84
94
  model: { [K in keyof GetStateObject<Model>]: FieldTrans };
85
95
  insight: { [K in keyof GetStateObject<Insight>]: FieldTrans };
86
96
  query: {
87
- [K in keyof Filter["query"]]: Filter["query"][K] extends FilterInfo<infer ArgNames, any>
97
+ [K in keyof DictFilterQuery<Filter>]: DictFilterQuery<Filter>[K] extends FilterInfo<infer ArgNames, any>
88
98
  ? FnTrans<ArgNames[number]>
89
99
  : never;
90
100
  };
91
- sort: { [K in keyof Filter["sort"]]: FieldTrans };
101
+ sort: { [K in keyof DictFilterSort<Filter>]: FieldTrans };
92
102
  api: {
93
103
  [K in keyof Endpoint]: FnTrans<EndpInfoArgNames<Endpoint[K]>[number]>;
94
104
  } & BaseModelCrudGetApiTrans<T> &
@@ -101,7 +111,7 @@ export type ModelTranslatorKey<
101
111
  T extends string,
102
112
  Model,
103
113
  Insight,
104
- Filter extends FilterInstance,
114
+ Filter,
105
115
  Slice extends { [key: string]: SliceInfo },
106
116
  Endpoint extends { [key: string]: EndpointInfo },
107
117
  EtcKey extends string,
@@ -111,7 +121,7 @@ export type ModelTranslatorKey<
111
121
  | `${T}.${keyof GetStateObject<Model> & string}${"" | ".desc"}`
112
122
  | `${T}.insight.${keyof GetStateObject<Insight> & string}${"" | ".desc"}`
113
123
  | `${T}.query.${FilterTranslatorKey<Filter>}`
114
- | `${T}.sort.${keyof Filter["sort"] & string}${"" | ".desc"}`
124
+ | `${T}.sort.${keyof DictFilterSort<Filter> & string}${"" | ".desc"}`
115
125
  | `${T}.signal.${EndpointTranslatorKey<Endpoint> | SliceTranslatorKey<Slice>}`
116
126
  | `${T}.${EtcKey}`;
117
127
 
@@ -159,7 +169,7 @@ export const registerModelTrans = <
159
169
  RefName extends string,
160
170
  Model extends BaseObject,
161
171
  Insight extends BaseInsight,
162
- Filter extends FilterInstance,
172
+ Filter,
163
173
  Slice extends { [key: string]: SliceInfo },
164
174
  Endpoint extends { [key: string]: EndpointInfo },
165
175
  ModelDict extends ModelDictInfo<any>,
package/document/into.ts CHANGED
@@ -90,6 +90,7 @@ interface IntoConstantModel<T extends string, _CapitalizedRefName extends string
90
90
  _CapitalizedRefName: _CapitalizedRefName;
91
91
  _Full: Raw;
92
92
  }
93
+ type NoInferType<T> = [T][T extends unknown ? 0 : never];
93
94
  type IntoModelActions<
94
95
  T extends string,
95
96
  _CapitalizedRefName extends string,
@@ -119,19 +120,18 @@ type IntoModelActions<
119
120
  } & QueryMethodPart<_Query, _Sort, Raw, Doc, unknown, unknown, unknown, _QueryOfDoc>;
120
121
 
121
122
  export const into = <
122
- DocRef extends Cls,
123
+ Doc,
123
124
  FilterRef extends FilterCls,
124
125
  T extends string,
125
126
  Raw,
126
127
  AddDbModels extends ModelCls[],
127
128
  _CapitalizedRefName extends string,
128
- Doc = InstanceType<DocRef>,
129
129
  _QueryOfDoc = QueryOf<Doc>,
130
130
  _Query = FilterQueryOf<FilterRef>,
131
131
  _Sort = FilterSortOf<FilterRef>,
132
- _LoaderBuilder extends LoaderBuilder<Doc> = LoaderBuilder<Doc>,
132
+ _LoaderBuilder extends LoaderBuilder<NoInferType<Doc>> = LoaderBuilder<Doc>,
133
133
  >(
134
- docRef: DocRef,
134
+ docRef: Cls<Doc>,
135
135
  filterRef: FilterRef,
136
136
  cnst: IntoConstantModel<T, _CapitalizedRefName, Raw>,
137
137
  loaderBuilder: _LoaderBuilder,
@@ -140,7 +140,7 @@ export const into = <
140
140
  IntoModelActions<T, _CapitalizedRefName, Doc, Raw, _Query, _Sort, _QueryOfDoc>,
141
141
  ReturnType<_LoaderBuilder>
142
142
  > => {
143
- const loaderInfoMap = loaderBuilder(makeLoaderBuilder());
143
+ const loaderInfoMap = loaderBuilder(makeLoaderBuilder<Doc>());
144
144
  const libsOnSchemaFns = addMdls.map((mdl) => mdl._onSchema);
145
145
  const DefaultModel = Object.assign(class DefaultModel {}, {
146
146
  [LOADER_META]: Object.assign({}, ...addMdls.map((mdl) => mdl[LOADER_META]), loaderInfoMap),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akanjs",
3
- "version": "2.3.5-rc.12",
3
+ "version": "2.3.5-rc.13",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
package/service/types.ts CHANGED
@@ -4,9 +4,7 @@ import type { QueryOf } from "akanjs/constant";
4
4
  import type {
5
5
  CRUDEventType,
6
6
  DatabaseModel,
7
- DatabaseInstance,
8
7
  DataInputOf,
9
- Doc as HydratedDoc,
10
8
  FilterInstance,
11
9
  FindQueryOption,
12
10
  GetDocObject,
@@ -44,19 +42,25 @@ type DatabaseQueryMethods<Query, Sort, Obj, Doc, Insight, FindQueryOption, ListQ
44
42
  DocQuery
45
43
  >;
46
44
 
45
+ type DocumentLike = {
46
+ id: string;
47
+ set: (...args: never[]) => unknown;
48
+ save: (...args: never[]) => unknown;
49
+ };
50
+ type MixedLibServiceReturn<Value, Doc, DocObjectOfDoc> = Value extends (infer SingleValue)[]
51
+ ? SingleValue extends DocumentLike
52
+ ? GetDocObject<SingleValue> extends DocObjectOfDoc
53
+ ? Doc[]
54
+ : Value
55
+ : Value
56
+ : Value extends DocumentLike
57
+ ? GetDocObject<Value> extends DocObjectOfDoc
58
+ ? Doc
59
+ : Value
60
+ : Value;
47
61
  type MixedLibServiceMethods<MixedLibSrv, Doc, DocObjectOfDoc> = {
48
62
  [K in keyof MixedLibSrv]: MixedLibSrv[K] extends (...args: infer Args) => Promise<infer Value>
49
- ? Value extends (infer SingleValue)[]
50
- ? SingleValue extends DatabaseInstance
51
- ? DocObjectOfDoc extends GetDocObject<SingleValue>
52
- ? (...args: Args) => Promise<Doc[]>
53
- : MixedLibSrv[K]
54
- : MixedLibSrv[K]
55
- : Value extends HydratedDoc<any>
56
- ? DocObjectOfDoc extends GetDocObject<Value>
57
- ? (...args: Args) => Promise<Doc>
58
- : MixedLibSrv[K]
59
- : MixedLibSrv[K]
63
+ ? (...args: Args) => Promise<MixedLibServiceReturn<Value, Doc, DocObjectOfDoc>>
60
64
  : MixedLibSrv[K];
61
65
  };
62
66
 
@@ -194,17 +194,19 @@ export type InternalBuilder<
194
194
  },
195
195
  > = (builder: BuildInternal<SrvModule>) => [_Cnst] extends [never]
196
196
  ? { [key: string]: InternalInfo<Exclude<InternalType, "resolveField">> }
197
- : {
198
- [K in keyof _ResolveFieldObj]: _ResolveFieldObj[K] extends ConstantField<
199
- "resolve",
200
- infer Value,
201
- any,
202
- any,
203
- infer Nullable
204
- >
205
- ? InternalInfo<"resolveField", any, any, any, any, NonNullable<Value>, Nullable>
206
- : InternalInfo<Exclude<InternalType, "resolveField">>;
207
- };
197
+ : [_FullCls] extends [never]
198
+ ? { [key: string]: InternalInfo<Exclude<InternalType, "resolveField">> }
199
+ : {
200
+ [K in keyof _ResolveFieldObj]: _ResolveFieldObj[K] extends ConstantField<
201
+ "resolve",
202
+ infer Value,
203
+ any,
204
+ any,
205
+ infer Nullable
206
+ >
207
+ ? InternalInfo<"resolveField", any, any, any, any, NonNullable<Value>, Nullable>
208
+ : InternalInfo<Exclude<InternalType, "resolveField">>;
209
+ };
208
210
 
209
211
  export const buildInternal = {
210
212
  resolveField: (returnRef: Cls, signalOption?: SignalOption) =>
@@ -1,5 +1,4 @@
1
1
  import { ENDPOINT_META, INJECT_META, INTERNAL_META } from "akanjs/base";
2
- import type { DocumentModel } from "akanjs/constant";
3
2
  import {
4
3
  type Adaptor,
5
4
  type AdaptorCls,
@@ -13,41 +12,44 @@ import type { ServerWebSocket } from "bun";
13
12
  import type { EndpointCls } from "./endpoint";
14
13
  import type { EndpInfoClientReturns, EndpInfoReqType, EndpInfoServerArgs, EndpointInfo } from "./endpointInfo";
15
14
  import type { InternalCls } from "./internal";
16
- import type { InternalInfo, InternalInfoReqType, InternalInfoServerArgs, InternalInfoServerReturns } from "./internalInfo";
15
+ import type { InternalInfo, InternalInfoReqType, InternalInfoServerArgs } from "./internalInfo";
17
16
 
18
17
  export interface ServerSignal extends Adaptor {
19
18
  readonly websocket: ServerWebSocket;
20
19
  readonly queue: QueueAdaptor;
21
20
  }
22
21
 
23
- type EndpointServerSignalMethods<EnpCls> = EnpCls extends { [ENDPOINT_META]: infer EndpointInfoObj }
22
+ type EndpointServerSignalMethods<EnpCls> = [EnpCls] extends [{ [ENDPOINT_META]: infer EndpointInfoObj }]
24
23
  ? {
25
24
  [K in keyof EndpointInfoObj as EndpInfoReqType<EndpointInfoObj[K]> extends "pubsub" ? K : never]: (
26
- ...args: [
27
- ...EndpInfoServerArgs<EndpointInfoObj[K]>,
28
- data: DocumentModel<EndpInfoClientReturns<EndpointInfoObj[K]>>,
29
- ]
25
+ ...args: [...EndpInfoServerArgs<EndpointInfoObj[K]>, data: EndpInfoClientReturns<EndpointInfoObj[K]>]
30
26
  ) => void;
31
27
  }
32
- : never;
28
+ : Record<never, never>;
33
29
 
34
- type InternalServerSignalMethods<IntCls> = IntCls extends { [INTERNAL_META]: infer InternalInfoObj }
30
+ type InternalServerSignalMethods<IntCls> = [IntCls] extends [{ [INTERNAL_META]: infer InternalInfoObj }]
35
31
  ? {
36
32
  [K in keyof InternalInfoObj as InternalInfoReqType<InternalInfoObj[K]> extends "process" ? K : never]: (
37
33
  ...args: [...args: InternalInfoServerArgs<InternalInfoObj[K]>, jobOptions?: AkanJobOptions]
38
- ) => Promise<AkanJob<any, InternalInfoServerReturns<InternalInfoObj[K]>>>;
34
+ ) => Promise<AkanJob<unknown, unknown>>;
39
35
  }
40
- : never;
36
+ : Record<never, never>;
41
37
 
42
- type ServerSignalClsStatics = {
38
+ export type ServerSignalClsStatics = {
43
39
  readonly refName: string;
44
40
  readonly [INJECT_META]: { queue: QueueAdaptor };
45
41
  readonly [ENDPOINT_META]: { [key: string]: EndpointInfo };
46
42
  readonly [INTERNAL_META]: { [key: string]: InternalInfo };
47
43
  };
48
44
 
49
- export type ServerSignalCls<EnpCls = any, IntCls = any> = AdaptorCls<
50
- EndpointServerSignalMethods<EnpCls> & InternalServerSignalMethods<IntCls> & ServerSignal
45
+ export type ServerSignalMethods<EnpCls, IntCls> = EndpointServerSignalMethods<EnpCls> &
46
+ InternalServerSignalMethods<IntCls>;
47
+
48
+ export type TypedServerSignalCls<EnpCls, IntCls> = AdaptorCls<ServerSignalMethods<EnpCls, IntCls> & ServerSignal> &
49
+ ServerSignalClsStatics;
50
+
51
+ export type ServerSignalCls<EnpCls = unknown, IntCls = unknown> = AdaptorCls<
52
+ ServerSignalMethods<EnpCls, IntCls> & ServerSignal
51
53
  > &
52
54
  ServerSignalClsStatics;
53
55
 
package/signal/slice.ts CHANGED
@@ -146,7 +146,7 @@ export function slice<
146
146
  .search<"query", object>("query", Any)
147
147
  .exec((query) => query ?? {}),
148
148
  },
149
- sliceBuilder(init),
149
+ sliceBuilder(init as Parameters<BuildSlice>[0]),
150
150
  );
151
151
  };
152
152
  libSlices.forEach((libSlice) => {
@@ -262,22 +262,9 @@ export type SliceBuilder<
262
262
  _Light = CnstLight<SrvModule>,
263
263
  _Insight = CnstInsight<SrvModule>,
264
264
  _Filter extends FilterInstance = DbFilter<SrvModule>,
265
+ _SliceInfo = SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>>,
265
266
  > = (
266
267
  init: (
267
268
  signalOption?: SignalOption,
268
- ) => SliceInfo<
269
- SrvRefName<SrvModule>,
270
- _Input,
271
- _Full,
272
- _Light,
273
- _Insight,
274
- _Filter,
275
- SrvMap<SrvModule>,
276
- [],
277
- [],
278
- [],
279
- []
280
- >,
281
- ) => {
282
- [key: string]: SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>>;
283
- };
269
+ ) => SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>, [], [], [], []>,
270
+ ) => Record<string, _SliceInfo>;
package/signal/types.ts CHANGED
@@ -12,9 +12,9 @@ export type SrvMap<S extends ServiceModel> = S["srvMap"];
12
12
 
13
13
  export type CnstRefName<S extends ServiceModel> = CnstOf<S>["refName"];
14
14
  export type CnstInput<S extends ServiceModel> = CnstOf<S>["_Input"];
15
- export type CnstFull<S extends ServiceModel> = CnstOf<S>["_Full"];
16
- export type CnstLight<S extends ServiceModel> = CnstOf<S>["_Light"];
17
- export type CnstInsight<S extends ServiceModel> = CnstOf<S>["_Insight"];
15
+ export type CnstFull<S extends ServiceModel> = UnCls<CnstOf<S>["full"]> & CnstOf<S>["_Full"];
16
+ export type CnstLight<S extends ServiceModel> = UnCls<CnstOf<S>["light"]> & CnstOf<S>["_Light"];
17
+ export type CnstInsight<S extends ServiceModel> = UnCls<CnstOf<S>["insight"]> & CnstOf<S>["_Insight"];
18
18
  export type CnstDefault<S extends ServiceModel> = CnstOf<S>["_Default"];
19
19
  export type CnstDefaultInput<S extends ServiceModel> = CnstOf<S>["_DefaultInput"];
20
20
  export type CnstDefaultState<S extends ServiceModel> = CnstOf<S>["_DefaultState"];
@@ -18,8 +18,9 @@ type BuiltSchema<BuildField extends (builder: FieldBuilder) => FieldInfoObject>
18
18
  type BuiltFieldObject<BuildField extends (builder: FieldBuilder) => FieldInfoObject> = FieldInfoObjectToFieldObject<ReturnType<BuildField>>;
19
19
  type ResolvedSchema<ResolveField extends (resolve: FieldResolver) => FieldInfoObject> = ExtractFieldInfoObject<ReturnType<ResolveField>>;
20
20
  type ResolvedFieldObject<ResolveField extends (resolve: FieldResolver) => FieldInfoObject> = FieldInfoObjectToFieldObject<ReturnType<ResolveField>>;
21
+ type ConstantSetReturn<Self, Schema> = Self extends Schema & ConstantMethods<Schema> & infer Model ? unknown extends Model ? Self : Model : Self;
21
22
  export interface ConstantMethods<Schema = any> {
22
- set: (obj: Partial<Schema>) => this;
23
+ set<Self extends Schema & ConstantMethods<Schema>>(this: Self, obj: Partial<Schema>): ConstantSetReturn<Self, Schema>;
23
24
  }
24
25
  type DatabaseSchemaOf<Schema, HiddenKey> = {
25
26
  [K in keyof Schema]: K extends HiddenKey ? NonNullable<Schema[K]> : Schema[K];
@@ -1,9 +1,16 @@
1
1
  import type { GetStateObject } from "akanjs/base";
2
2
  import type { BaseInsight, BaseObject } from "akanjs/constant";
3
- import type { BaseFilterQueryKey, BaseFilterSortKey, FilterInfo, FilterInstance } from "akanjs/document";
3
+ import type { BaseFilterQueryKey, BaseFilterSortKey, FilterCls, FilterInfo, FilterInstance } from "akanjs/document";
4
4
  import type { EndpInfoArgNames, EndpointInfo, SliceInfo, SliceInfoArgNames } from "akanjs/signal";
5
5
  import type { RootDictionary } from "./trans.d.ts";
6
6
  type EnumValueKey = string | number;
7
+ type AnyFilterShape = FilterInstance<Record<string, FilterInfo>, Record<string, unknown>>;
8
+ type DictFilterShape<Filter> = Filter extends FilterInstance ? Filter : Filter extends FilterCls<infer FilterShape> ? FilterShape : Filter extends {
9
+ query: Record<string, FilterInfo>;
10
+ sort: Record<string, unknown>;
11
+ } ? Filter : AnyFilterShape;
12
+ type DictFilterQuery<Filter> = DictFilterShape<Filter>["query"];
13
+ type DictFilterSort<Filter> = DictFilterShape<Filter>["sort"];
7
14
  declare class FieldTranslation<Languages extends [string, ...string[]]> {
8
15
  static translate: <Languages_1 extends [string, ...string[]]>(trans: Languages_1) => FieldTranslation<Languages_1>;
9
16
  trans: Languages;
@@ -95,12 +102,12 @@ export declare class ModelDictInfo<Languages extends [string, ...string[]] = [st
95
102
  insight<Insight extends object>(translate: (t: (trans: Languages) => FieldTranslation<Languages>) => {
96
103
  [K in Exclude<keyof GetStateObject<Insight>, InsightKey>]: FieldTranslation<Languages>;
97
104
  }): ModelDictInfo<Languages, ModelKey, keyof GetStateObject<Insight> & string, QueryKey, SortKey, EnumKey, BaseSignalKey, SliceKey, EndpointKey, ErrorKey, EtcKey>;
98
- query<Filter extends FilterInstance>(translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
99
- [K in Exclude<keyof Filter["query"], QueryKey>]: Filter["query"][K] extends FilterInfo<infer ArgNames, any> ? FunctionTranslation<Languages, ArgNames[number]> : never;
100
- }): ModelDictInfo<Languages, ModelKey, InsightKey, keyof Filter["query"] & string, SortKey, EnumKey, BaseSignalKey, SliceKey, EndpointKey, ErrorKey, EtcKey>;
101
- sort<Filter extends FilterInstance>(translate: (t: (trans: Languages) => FieldTranslation<Languages>) => {
102
- [K in Exclude<keyof Filter["sort"], SortKey>]: FieldTranslation<Languages>;
103
- }): ModelDictInfo<Languages, ModelKey, InsightKey, QueryKey, keyof Filter["sort"] & string, EnumKey, BaseSignalKey, SliceKey, EndpointKey, ErrorKey, EtcKey>;
105
+ query<Filter>(translate: (fn: (trans: Languages) => FunctionTranslation<Languages>) => {
106
+ [K in Exclude<keyof DictFilterQuery<Filter>, QueryKey>]: DictFilterQuery<Filter>[K] extends FilterInfo<infer ArgNames, any> ? FunctionTranslation<Languages, ArgNames[number]> : never;
107
+ }): ModelDictInfo<Languages, ModelKey, InsightKey, keyof DictFilterQuery<Filter> & string, SortKey, EnumKey, BaseSignalKey, SliceKey, EndpointKey, ErrorKey, EtcKey>;
108
+ sort<Filter>(translate: (t: (trans: Languages) => FieldTranslation<Languages>) => {
109
+ [K in Exclude<keyof DictFilterSort<Filter>, SortKey>]: FieldTranslation<Languages>;
110
+ }): ModelDictInfo<Languages, ModelKey, InsightKey, QueryKey, keyof DictFilterSort<Filter> & string, EnumKey, BaseSignalKey, SliceKey, EndpointKey, ErrorKey, EtcKey>;
104
111
  enum<Enum extends {
105
112
  refName: string;
106
113
  value: EnumValueKey;
@@ -1,6 +1,6 @@
1
1
  import type { GetStateObject, MergedValues } from "akanjs/base";
2
2
  import type { BaseInsight, BaseObject } from "akanjs/constant";
3
- import type { FilterInfo, FilterInstance } from "akanjs/document";
3
+ import type { FilterCls, FilterInfo, FilterInstance } from "akanjs/document";
4
4
  import type { EndpInfoArgNames, EndpointInfo, SliceInfo, SliceInfoArgNames, SliceInfoRefName } from "akanjs/signal";
5
5
  import type { ModelDictInfo, ScalarDictInfo, ServiceDictInfo } from ".";
6
6
  interface Trans {
@@ -17,9 +17,16 @@ interface FnTrans<ArgKey extends string> {
17
17
  [key in ArgKey]: FieldTrans;
18
18
  };
19
19
  }
20
- type FilterTranslatorKey<Filter extends FilterInstance> = {
21
- [Key in keyof Filter["query"] & string]: `${Key}` | `${Key}.desc` | (Filter["query"][Key] extends FilterInfo<infer ArgNames, any> ? ArgNames[number] extends string ? `${Key}.arg.${ArgNames[number]}` | `${Key}.arg.${ArgNames[number]}.desc` : never : never);
22
- }[keyof Filter["query"] & string];
20
+ type AnyFilterShape = FilterInstance<Record<string, FilterInfo>, Record<string, unknown>>;
21
+ type DictFilterShape<Filter> = Filter extends FilterInstance ? Filter : Filter extends FilterCls<infer FilterShape> ? FilterShape : Filter extends {
22
+ query: Record<string, FilterInfo>;
23
+ sort: Record<string, unknown>;
24
+ } ? Filter : AnyFilterShape;
25
+ type DictFilterQuery<Filter> = DictFilterShape<Filter>["query"];
26
+ type DictFilterSort<Filter> = DictFilterShape<Filter>["sort"];
27
+ type FilterTranslatorKey<Filter> = {
28
+ [Key in keyof DictFilterQuery<Filter> & string]: `${Key}` | `${Key}.desc` | (DictFilterQuery<Filter>[Key] extends FilterInfo<infer ArgNames, any> ? ArgNames[number] extends string ? `${Key}.arg.${ArgNames[number]}` | `${Key}.arg.${ArgNames[number]}.desc` : never : never);
29
+ }[keyof DictFilterQuery<Filter> & string];
23
30
  type EndpointTranslatorKey<Endpoint extends {
24
31
  [key: string]: EndpointInfo;
25
32
  }> = {
@@ -44,7 +51,7 @@ type BaseModelCrudGetApiTrans<T extends string> = {
44
51
  } & {
45
52
  [K in `remove${T}`]: FnTrans<`${T}Id`>;
46
53
  };
47
- export type ModelTrans<T extends string, Model extends BaseObject, Insight extends BaseInsight, Filter extends FilterInstance, Slice extends {
54
+ export type ModelTrans<T extends string, Model extends BaseObject, Insight extends BaseInsight, Filter, Slice extends {
48
55
  [key: string]: SliceInfo;
49
56
  }, Endpoint extends {
50
57
  [key: string]: EndpointInfo;
@@ -58,10 +65,10 @@ export type ModelTrans<T extends string, Model extends BaseObject, Insight exten
58
65
  [K in keyof GetStateObject<Insight>]: FieldTrans;
59
66
  };
60
67
  query: {
61
- [K in keyof Filter["query"]]: Filter["query"][K] extends FilterInfo<infer ArgNames, any> ? FnTrans<ArgNames[number]> : never;
68
+ [K in keyof DictFilterQuery<Filter>]: DictFilterQuery<Filter>[K] extends FilterInfo<infer ArgNames, any> ? FnTrans<ArgNames[number]> : never;
62
69
  };
63
70
  sort: {
64
- [K in keyof Filter["sort"]]: FieldTrans;
71
+ [K in keyof DictFilterSort<Filter>]: FieldTrans;
65
72
  };
66
73
  api: {
67
74
  [K in keyof Endpoint]: FnTrans<EndpInfoArgNames<Endpoint[K]>[number]>;
@@ -74,11 +81,11 @@ export type ModelTrans<T extends string, Model extends BaseObject, Insight exten
74
81
  } & {
75
82
  [K in EtcKey]: Trans;
76
83
  };
77
- export type ModelTranslatorKey<T extends string, Model, Insight, Filter extends FilterInstance, Slice extends {
84
+ export type ModelTranslatorKey<T extends string, Model, Insight, Filter, Slice extends {
78
85
  [key: string]: SliceInfo;
79
86
  }, Endpoint extends {
80
87
  [key: string]: EndpointInfo;
81
- }, EtcKey extends string> = `${T}.modelName` | `${T}.modelDesc` | `${T}.${keyof GetStateObject<Model> & string}${"" | ".desc"}` | `${T}.insight.${keyof GetStateObject<Insight> & string}${"" | ".desc"}` | `${T}.query.${FilterTranslatorKey<Filter>}` | `${T}.sort.${keyof Filter["sort"] & string}${"" | ".desc"}` | `${T}.signal.${EndpointTranslatorKey<Endpoint> | SliceTranslatorKey<Slice>}` | `${T}.${EtcKey}`;
88
+ }, EtcKey extends string> = `${T}.modelName` | `${T}.modelDesc` | `${T}.${keyof GetStateObject<Model> & string}${"" | ".desc"}` | `${T}.insight.${keyof GetStateObject<Insight> & string}${"" | ".desc"}` | `${T}.query.${FilterTranslatorKey<Filter>}` | `${T}.sort.${keyof DictFilterSort<Filter> & string}${"" | ".desc"}` | `${T}.signal.${EndpointTranslatorKey<Endpoint> | SliceTranslatorKey<Slice>}` | `${T}.${EtcKey}`;
82
89
  export type ScalarTrans<T extends string, Model, ErrorKey extends string, EtcKey extends string> = {
83
90
  name: Trans;
84
91
  desc: Trans;
@@ -116,7 +123,7 @@ export interface DictModule<DictKey extends string, ErrorKey extends string> {
116
123
  __Error_Key__: ErrorKey;
117
124
  dict: ModelDictInfo<any> | ScalarDictInfo<any> | ServiceDictInfo<any>;
118
125
  }
119
- export declare const registerModelTrans: <RefName extends string, Model extends BaseObject, Insight extends BaseInsight, Filter extends FilterInstance, Slice extends {
126
+ export declare const registerModelTrans: <RefName extends string, Model extends BaseObject, Insight extends BaseInsight, Filter, Slice extends {
120
127
  [key: string]: SliceInfo;
121
128
  }, Endpoint extends {
122
129
  [key: string]: EndpointInfo;
@@ -68,6 +68,7 @@ interface IntoConstantModel<T extends string, _CapitalizedRefName extends string
68
68
  _CapitalizedRefName: _CapitalizedRefName;
69
69
  _Full: Raw;
70
70
  }
71
+ type NoInferType<T> = [T][T extends unknown ? 0 : never];
71
72
  type IntoModelActions<T extends string, _CapitalizedRefName extends string, Doc, Raw, _Query, _Sort, _QueryOfDoc = QueryOf<Doc>> = {
72
73
  [key in _CapitalizedRefName]: Mdl<Doc, Raw>;
73
74
  } & {
@@ -87,5 +88,5 @@ type IntoModelActions<T extends string, _CapitalizedRefName extends string, Doc,
87
88
  } & {
88
89
  [K in `remove${_CapitalizedRefName}`]: (id: string) => Promise<Doc>;
89
90
  } & QueryMethodPart<_Query, _Sort, Raw, Doc, unknown, unknown, unknown, _QueryOfDoc>;
90
- export declare const into: <DocRef extends Cls, FilterRef extends FilterCls, T extends string, Raw, AddDbModels extends ModelCls[], _CapitalizedRefName extends string, Doc = InstanceType<DocRef>, _QueryOfDoc = QueryOf<Doc>, _Query = FilterQueryOf<FilterRef>, _Sort = FilterSortOf<FilterRef>, _LoaderBuilder extends LoaderBuilder<Doc> = LoaderBuilder<Doc>>(docRef: DocRef, filterRef: FilterRef, cnst: IntoConstantModel<T, _CapitalizedRefName, Raw>, loaderBuilder: _LoaderBuilder, ...addMdls: [...AddDbModels]) => ModelCls<IntoModelActions<T, _CapitalizedRefName, Doc, Raw, _Query, _Sort, _QueryOfDoc>, ReturnType<_LoaderBuilder>>;
91
+ export declare const into: <Doc, FilterRef extends FilterCls, T extends string, Raw, AddDbModels extends ModelCls[], _CapitalizedRefName extends string, _QueryOfDoc = QueryOf<Doc>, _Query = FilterQueryOf<FilterRef>, _Sort = FilterSortOf<FilterRef>, _LoaderBuilder extends LoaderBuilder<NoInferType<Doc>> = LoaderBuilder<Doc>>(docRef: Cls<Doc>, filterRef: FilterRef, cnst: IntoConstantModel<T, _CapitalizedRefName, Raw>, loaderBuilder: _LoaderBuilder, ...addMdls: [...AddDbModels]) => ModelCls<IntoModelActions<T, _CapitalizedRefName, Doc, Raw, _Query, _Sort, _QueryOfDoc>, ReturnType<_LoaderBuilder>>;
91
92
  export {};
@@ -1,11 +1,17 @@
1
1
  import type { Cls, MergeAllTypes, PromiseOrObject } from "akanjs/base";
2
2
  import type { Logger } from "akanjs/common";
3
3
  import type { QueryOf } from "akanjs/constant";
4
- import type { CRUDEventType, DatabaseModel, DatabaseInstance, DataInputOf, Doc as HydratedDoc, FilterInstance, FindQueryOption, GetDocObject, ListQueryOption, QueryMethodPart, SaveEventType } from "akanjs/document";
4
+ import type { CRUDEventType, DatabaseModel, DataInputOf, FilterInstance, FindQueryOption, GetDocObject, ListQueryOption, QueryMethodPart, SaveEventType } from "akanjs/document";
5
5
  type ServiceMixinOmitKey = "onInit" | "onDestroy" | "_libsOnInit" | "_libsOnDestroy" | "_preCreate" | "_postCreate" | "_preUpdate" | "_postUpdate" | "_preRemove" | "_postRemove" | "_libsPreCreate" | "_libsPostCreate" | "_libsPreUpdate" | "_libsPostUpdate" | "_libsPreRemove" | "_libsPostRemove";
6
6
  type DatabaseQueryMethods<Query, Sort, Obj, Doc, Insight, FindQueryOption, ListQueryOption, DocQuery> = QueryMethodPart<Query, Sort, Obj, Doc, Insight, FindQueryOption, ListQueryOption, DocQuery>;
7
+ type DocumentLike = {
8
+ id: string;
9
+ set: (...args: never[]) => unknown;
10
+ save: (...args: never[]) => unknown;
11
+ };
12
+ type MixedLibServiceReturn<Value, Doc, DocObjectOfDoc> = Value extends (infer SingleValue)[] ? SingleValue extends DocumentLike ? GetDocObject<SingleValue> extends DocObjectOfDoc ? Doc[] : Value : Value : Value extends DocumentLike ? GetDocObject<Value> extends DocObjectOfDoc ? Doc : Value : Value;
7
13
  type MixedLibServiceMethods<MixedLibSrv, Doc, DocObjectOfDoc> = {
8
- [K in keyof MixedLibSrv]: MixedLibSrv[K] extends (...args: infer Args) => Promise<infer Value> ? Value extends (infer SingleValue)[] ? SingleValue extends DatabaseInstance ? DocObjectOfDoc extends GetDocObject<SingleValue> ? (...args: Args) => Promise<Doc[]> : MixedLibSrv[K] : MixedLibSrv[K] : Value extends HydratedDoc<any> ? DocObjectOfDoc extends GetDocObject<Value> ? (...args: Args) => Promise<Doc> : MixedLibSrv[K] : MixedLibSrv[K] : MixedLibSrv[K];
14
+ [K in keyof MixedLibSrv]: MixedLibSrv[K] extends (...args: infer Args) => Promise<infer Value> ? (...args: Args) => Promise<MixedLibServiceReturn<Value, Doc, DocObjectOfDoc>> : MixedLibSrv[K];
9
15
  };
10
16
  export type DbRefName<Db extends DatabaseModel> = Db["refName"];
11
17
  export type DbInput<Db extends DatabaseModel> = Db["_Input"];
@@ -68,6 +68,8 @@ export type InternalBuilder<SrvModule extends ServiceModel, _Cnst = CnstOf<SrvMo
68
68
  [K in keyof _FieldObj as _FieldObj[K] extends ConstantField<"resolve", any, any, any, any, any> ? K : never]: _FieldObj[K];
69
69
  }> = (builder: BuildInternal<SrvModule>) => [_Cnst] extends [never] ? {
70
70
  [key: string]: InternalInfo<Exclude<InternalType, "resolveField">>;
71
+ } : [_FullCls] extends [never] ? {
72
+ [key: string]: InternalInfo<Exclude<InternalType, "resolveField">>;
71
73
  } : {
72
74
  [K in keyof _ResolveFieldObj]: _ResolveFieldObj[K] extends ConstantField<"resolve", infer Value, any, any, infer Nullable> ? InternalInfo<"resolveField", any, any, any, any, NonNullable<Value>, Nullable> : InternalInfo<Exclude<InternalType, "resolveField">>;
73
75
  };
@@ -1,27 +1,23 @@
1
1
  import { ENDPOINT_META, INJECT_META, INTERNAL_META } from "akanjs/base";
2
- import type { DocumentModel } from "akanjs/constant";
3
2
  import { type Adaptor, type AdaptorCls, type AkanJob, type AkanJobOptions, type QueueAdaptor } from "akanjs/service";
4
3
  import type { ServerWebSocket } from "bun";
5
4
  import type { EndpInfoClientReturns, EndpInfoReqType, EndpInfoServerArgs, EndpointInfo } from "./endpointInfo.d.ts";
6
- import type { InternalInfo, InternalInfoReqType, InternalInfoServerArgs, InternalInfoServerReturns } from "./internalInfo.d.ts";
5
+ import type { InternalInfo, InternalInfoReqType, InternalInfoServerArgs } from "./internalInfo.d.ts";
7
6
  export interface ServerSignal extends Adaptor {
8
7
  readonly websocket: ServerWebSocket;
9
8
  readonly queue: QueueAdaptor;
10
9
  }
11
- type EndpointServerSignalMethods<EnpCls> = EnpCls extends {
10
+ type EndpointServerSignalMethods<EnpCls> = [EnpCls] extends [{
12
11
  [ENDPOINT_META]: infer EndpointInfoObj;
13
- } ? {
14
- [K in keyof EndpointInfoObj as EndpInfoReqType<EndpointInfoObj[K]> extends "pubsub" ? K : never]: (...args: [
15
- ...EndpInfoServerArgs<EndpointInfoObj[K]>,
16
- data: DocumentModel<EndpInfoClientReturns<EndpointInfoObj[K]>>
17
- ]) => void;
18
- } : never;
19
- type InternalServerSignalMethods<IntCls> = IntCls extends {
12
+ }] ? {
13
+ [K in keyof EndpointInfoObj as EndpInfoReqType<EndpointInfoObj[K]> extends "pubsub" ? K : never]: (...args: [...EndpInfoServerArgs<EndpointInfoObj[K]>, data: EndpInfoClientReturns<EndpointInfoObj[K]>]) => void;
14
+ } : Record<never, never>;
15
+ type InternalServerSignalMethods<IntCls> = [IntCls] extends [{
20
16
  [INTERNAL_META]: infer InternalInfoObj;
21
- } ? {
22
- [K in keyof InternalInfoObj as InternalInfoReqType<InternalInfoObj[K]> extends "process" ? K : never]: (...args: [...args: InternalInfoServerArgs<InternalInfoObj[K]>, jobOptions?: AkanJobOptions]) => Promise<AkanJob<any, InternalInfoServerReturns<InternalInfoObj[K]>>>;
23
- } : never;
24
- type ServerSignalClsStatics = {
17
+ }] ? {
18
+ [K in keyof InternalInfoObj as InternalInfoReqType<InternalInfoObj[K]> extends "process" ? K : never]: (...args: [...args: InternalInfoServerArgs<InternalInfoObj[K]>, jobOptions?: AkanJobOptions]) => Promise<AkanJob<unknown, unknown>>;
19
+ } : Record<never, never>;
20
+ export type ServerSignalClsStatics = {
25
21
  readonly refName: string;
26
22
  readonly [INJECT_META]: {
27
23
  queue: QueueAdaptor;
@@ -33,7 +29,9 @@ type ServerSignalClsStatics = {
33
29
  [key: string]: InternalInfo;
34
30
  };
35
31
  };
36
- export type ServerSignalCls<EnpCls = any, IntCls = any> = AdaptorCls<EndpointServerSignalMethods<EnpCls> & InternalServerSignalMethods<IntCls> & ServerSignal> & ServerSignalClsStatics;
32
+ export type ServerSignalMethods<EnpCls, IntCls> = EndpointServerSignalMethods<EnpCls> & InternalServerSignalMethods<IntCls>;
33
+ export type TypedServerSignalCls<EnpCls, IntCls> = AdaptorCls<ServerSignalMethods<EnpCls, IntCls> & ServerSignal> & ServerSignalClsStatics;
34
+ export type ServerSignalCls<EnpCls = unknown, IntCls = unknown> = AdaptorCls<ServerSignalMethods<EnpCls, IntCls> & ServerSignal> & ServerSignalClsStatics;
37
35
  /** Composes endpoint and internal classes into a server-side signal class. */
38
36
  export declare const serverSignal: <EnpCls, IntCls>(endpointRef: EnpCls, internalRef: IntCls) => ServerSignalCls<EnpCls, IntCls>;
39
37
  export {};
@@ -68,11 +68,5 @@ export type SliceInfoArgNames<S> = SliceInfoParts<S>["argNames"];
68
68
  export type SliceInfoArgs<S> = SliceInfoParts<S>["args"];
69
69
  export type SliceInfoInternalArgs<S> = SliceInfoParts<S>["internalArgs"];
70
70
  export type SliceInfoServerArgs<S> = SliceInfoParts<S>["serverArgs"];
71
- export type SliceBuilder<SrvModule extends ServiceModel, _Input = CnstInput<SrvModule>, _Full = CnstFull<SrvModule>, _Light = CnstLight<SrvModule>, _Insight = CnstInsight<SrvModule>, _Filter extends FilterInstance = DbFilter<SrvModule>> = (init: (signalOption?: SignalOption) => SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>, [
72
- ], [
73
- ], [
74
- ], [
75
- ]>) => {
76
- [key: string]: SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>>;
77
- };
71
+ export type SliceBuilder<SrvModule extends ServiceModel, _Input = CnstInput<SrvModule>, _Full = CnstFull<SrvModule>, _Light = CnstLight<SrvModule>, _Insight = CnstInsight<SrvModule>, _Filter extends FilterInstance = DbFilter<SrvModule>, _SliceInfo = SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>>> = (init: (signalOption?: SignalOption) => SliceInfo<SrvRefName<SrvModule>, _Input, _Full, _Light, _Insight, _Filter, SrvMap<SrvModule>, [], [], [], []>) => Record<string, _SliceInfo>;
78
72
  export {};
@@ -10,9 +10,9 @@ export type SrvRefName<S extends ServiceModel> = SrvOf<S>["refName"];
10
10
  export type SrvMap<S extends ServiceModel> = S["srvMap"];
11
11
  export type CnstRefName<S extends ServiceModel> = CnstOf<S>["refName"];
12
12
  export type CnstInput<S extends ServiceModel> = CnstOf<S>["_Input"];
13
- export type CnstFull<S extends ServiceModel> = CnstOf<S>["_Full"];
14
- export type CnstLight<S extends ServiceModel> = CnstOf<S>["_Light"];
15
- export type CnstInsight<S extends ServiceModel> = CnstOf<S>["_Insight"];
13
+ export type CnstFull<S extends ServiceModel> = UnCls<CnstOf<S>["full"]> & CnstOf<S>["_Full"];
14
+ export type CnstLight<S extends ServiceModel> = UnCls<CnstOf<S>["light"]> & CnstOf<S>["_Light"];
15
+ export type CnstInsight<S extends ServiceModel> = UnCls<CnstOf<S>["insight"]> & CnstOf<S>["_Insight"];
16
16
  export type CnstDefault<S extends ServiceModel> = CnstOf<S>["_Default"];
17
17
  export type CnstDefaultInput<S extends ServiceModel> = CnstOf<S>["_DefaultInput"];
18
18
  export type CnstDefaultState<S extends ServiceModel> = CnstOf<S>["_DefaultState"];