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.
- package/base/base.ts +6 -2
- package/base/primitiveRegistry.ts +50 -46
- package/base/symbols.ts +16 -11
- package/base/types.ts +11 -0
- package/constant/constantRegistry.ts +3 -9
- package/constant/deserialize.ts +7 -7
- package/constant/fieldInfo.ts +173 -31
- package/constant/getDefault.ts +2 -2
- package/constant/immerify.ts +2 -2
- package/constant/purify.ts +19 -4
- package/constant/serialize.ts +5 -4
- package/constant/types.ts +9 -1
- package/constant/via.ts +302 -53
- package/dictionary/dictInfo.ts +28 -38
- package/dictionary/locale.ts +36 -38
- package/document/by.ts +56 -13
- package/document/database.ts +53 -18
- package/document/databaseRegistry.ts +7 -3
- package/document/filterMeta.ts +26 -14
- package/document/into.ts +71 -76
- package/document/types.ts +4 -2
- package/fetch/fetchType/endpointFetch.type.ts +6 -3
- package/fetch/fetchType/sliceFetch.type.ts +24 -13
- package/package.json +1 -1
- package/service/predefinedAdaptor/compress.adaptor.ts +9 -9
- package/service/predefinedAdaptor/database.adaptor.ts +3 -7
- package/service/serve.ts +17 -52
- package/service/types.ts +61 -21
- package/signal/endpoint.ts +2 -1
- package/signal/endpointInfo.ts +53 -23
- package/signal/internal.ts +2 -1
- package/signal/internalInfo.ts +70 -22
- package/signal/serverSignal.ts +21 -58
- package/signal/slice.ts +35 -35
- package/signal/sliceInfo.ts +63 -47
- package/signal/types.ts +23 -17
- package/store/action.ts +57 -44
- package/store/state.ts +47 -36
- package/store/stateBuilder.ts +3 -3
- package/store/store.ts +61 -15
- package/store/types.ts +20 -6
- package/types/base/base.d.ts +5 -1
- package/types/base/primitiveRegistry.d.ts +43 -38
- package/types/base/symbols.d.ts +5 -0
- package/types/base/types.d.ts +4 -0
- package/types/constant/constantRegistry.d.ts +3 -8
- package/types/constant/deserialize.d.ts +2 -2
- package/types/constant/fieldInfo.d.ts +41 -20
- package/types/constant/immerify.d.ts +2 -2
- package/types/constant/purify.d.ts +3 -2
- package/types/constant/serialize.d.ts +2 -2
- package/types/constant/types.d.ts +6 -1
- package/types/constant/via.d.ts +141 -20
- package/types/dictionary/dictInfo.d.ts +18 -11
- package/types/dictionary/locale.d.ts +23 -16
- package/types/document/by.d.ts +36 -5
- package/types/document/database.d.ts +9 -7
- package/types/document/databaseRegistry.d.ts +5 -4
- package/types/document/filterMeta.d.ts +18 -11
- package/types/document/into.d.ts +46 -19
- package/types/document/types.d.ts +3 -2
- package/types/fetch/fetchType/endpointFetch.type.d.ts +2 -2
- package/types/fetch/fetchType/sliceFetch.type.d.ts +11 -11
- package/types/service/serve.d.ts +4 -5
- package/types/service/types.d.ts +23 -5
- package/types/signal/endpoint.d.ts +2 -1
- package/types/signal/endpointInfo.d.ts +40 -15
- package/types/signal/internal.d.ts +2 -1
- package/types/signal/internalInfo.d.ts +43 -11
- package/types/signal/serverSignal.d.ts +14 -13
- package/types/signal/slice.d.ts +8 -6
- package/types/signal/sliceInfo.d.ts +41 -20
- package/types/signal/types.d.ts +23 -17
- package/types/store/action.d.ts +25 -22
- package/types/store/baseSt.d.ts +42 -13
- package/types/store/state.d.ts +23 -26
- package/types/store/stateBuilder.d.ts +2 -2
- package/types/store/store.d.ts +17 -5
- package/types/store/types.d.ts +9 -3
- package/ui/Signal/makeExample.ts +3 -3
package/constant/immerify.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { FIELD_META } from "akanjs/base";
|
|
2
2
|
import { immerable } from "immer";
|
|
3
|
-
import type {
|
|
3
|
+
import type { ConstantModelRef } from ".";
|
|
4
4
|
|
|
5
|
-
export const immerify = <T extends object>(modelRef:
|
|
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,
|
package/constant/purify.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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:
|
|
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)) {
|
package/constant/serialize.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
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> =
|
|
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 {
|
|
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>(
|
|
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
|
|
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
|
-
):
|
|
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
|
|
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
|
-
):
|
|
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
|
|
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
|
-
):
|
|
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
|
|
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
|
-
):
|
|
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
|
|
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
|
-
):
|
|
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
|
|
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<
|
|
129
|
-
static relations: 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
|
-
):
|
|
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
|
|
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:
|
|
248
|
+
set<Self extends Schema & ConstantMethods<Schema>>(this: Self, obj: Partial<Schema>): ConstantSetReturn<Self, Schema>;
|
|
164
249
|
}
|
|
165
250
|
|
|
166
|
-
|
|
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<
|
|
172
|
-
relations: Set<
|
|
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
|
-
|
|
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<
|
|
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
|
|
191
|
-
interface StringConstructor extends
|
|
192
|
-
interface BooleanConstructor extends
|
|
193
|
-
interface MapConstructor extends
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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),
|