vona-module-a-orm 5.1.40 → 5.1.41

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.
@@ -25,8 +25,33 @@ import type {
25
25
  TypeUtilPrepareColumns,
26
26
  } from '../relations.ts';
27
27
 
28
+ export const SymbolDtoMutateRelations = Symbol('SymbolDtoMutateRelations');
29
+
28
30
  export type TypeDtoMutateType = 'create' | 'update' | 'mutate';
29
31
 
32
+ // Static phantom metadata survives ordinary subclassing without becoming a DTO field.
33
+ // Runtime stores the corresponding resolved relation plans as mapped-class metadata.
34
+ export type TypeDtoMutateClass<
35
+ ModelLike extends BeanModelMeta | keyof IModelClassRecord,
36
+ TOptionsRelation,
37
+ TMutateTypeTopLevel extends TypeDtoMutateType,
38
+ TColumnsOmitDefault extends string | string[] | undefined = undefined,
39
+ TTopLevel extends boolean | undefined = undefined,
40
+ > = Constructable<
41
+ TypeDtoMutateResult<
42
+ ModelLike,
43
+ TOptionsRelation,
44
+ TMutateTypeTopLevel,
45
+ TColumnsOmitDefault,
46
+ TTopLevel
47
+ >
48
+ > & {
49
+ [SymbolDtoMutateRelations]?: TypeDtoMutateOwnedRelations<
50
+ TypeModelOfModelLike<ModelLike>,
51
+ TOptionsRelation
52
+ >;
53
+ };
54
+
30
55
  export type IDtoMutateParams<ModelLike extends BeanModelMeta | keyof IModelClassRecord> =
31
56
  IBuildDtoMutateParams<
32
57
  TypeModelOfModelLike<ModelLike>[TypeSymbolKeyEntity],
@@ -65,100 +90,112 @@ export type TypeDtoMutateRelationResult<
65
90
  TTopLevel extends boolean | undefined = undefined,
66
91
  TColumns = undefined,
67
92
  REFKEY = undefined,
68
- > = (TOptionsRelation extends { dtoClass: Constructable<infer TDto> }
69
- ? TypeDtoMutateRelationResultDto<TDto, TMutateTypeTopLevel, TTopLevel, REFKEY>
70
- : TypeDtoMutateRelationResultEntity<
71
- TRecord,
72
- TColumns extends string | string[] ? TColumns : TypeUtilGetParamsColumns<TOptionsRelation>,
73
- TMutateTypeTopLevel,
74
- TColumnsOmitDefault,
75
- TTopLevel,
76
- REFKEY
77
- >) &
78
- (TModel extends BeanModelMeta
79
- ? OmitNever<
80
- TypeDtoMutateRelationResultMergeInclude<
81
- TMutateTypeTopLevel,
82
- TypeUtilGetModelOptions<TModel>,
83
- TypeUtilGetParamsInlcude<TOptionsRelation>
84
- >
85
- > &
86
- OmitNever<
87
- TypeDtoMutateModelRelationResultMergeWith<
88
- TMutateTypeTopLevel,
89
- TypeUtilGetParamsWith<TOptionsRelation>
90
- >
91
- >
92
- : {});
93
-
94
- type TypeDtoMutateRelationResultMergeInclude<
95
- TMutateTypeTopLevel extends TypeDtoMutateType,
96
- TModelOptions extends IDecoratorModelOptions,
97
- TInclude extends {} | undefined | unknown,
98
- > = {
99
- [RelationName in keyof TModelOptions['relations']]: TInclude extends {}
100
- ? TInclude[RelationName] extends {} | boolean
101
- ? TypeDtoMutateRelationResultMergeIncludeWrapper<
102
- TMutateTypeTopLevel,
103
- TModelOptions['relations'][RelationName],
104
- TInclude[RelationName]
105
- >
106
- : TypeDtoMutateRelationResultMergeAutoload<
107
- TMutateTypeTopLevel,
108
- TModelOptions['relations'][RelationName]
109
- >
110
- : TypeDtoMutateRelationResultMergeAutoload<
93
+ > = TypeDtoMutateMergeRelations<
94
+ TOptionsRelation extends { dtoClass: Constructable<infer TDto> }
95
+ ? TypeDtoMutateRelationResultDto<TDto, TMutateTypeTopLevel, TTopLevel, REFKEY>
96
+ : TypeDtoMutateRelationResultEntity<
97
+ TRecord,
98
+ TColumns extends string | string[] ? TColumns : TypeUtilGetParamsColumns<TOptionsRelation>,
111
99
  TMutateTypeTopLevel,
112
- TModelOptions['relations'][RelationName]
113
- >;
114
- };
100
+ TColumnsOmitDefault,
101
+ TTopLevel,
102
+ REFKEY
103
+ >,
104
+ TypeDtoMutateRelationPlans<TModel, TOptionsRelation>,
105
+ TMutateTypeTopLevel
106
+ >;
115
107
 
116
- type TypeDtoMutateModelRelationResultMergeWith<
117
- TMutateTypeTopLevel extends TypeDtoMutateType,
118
- TWith extends {} | undefined | unknown,
119
- > = TWith extends {}
120
- ? {
121
- [RelationName in keyof TWith]: TypeDtoMutateRelationResultMergeWithRelation<
122
- TMutateTypeTopLevel,
123
- TWith[RelationName]
124
- >;
125
- }
108
+ // Plans describe only declared relations, never arbitrary object/array schema fields.
109
+ // A fresh include/with/autoload selection replaces the whole retained plan of that name.
110
+ type TypeDtoMutateIncludePlans<TModelOptions extends IDecoratorModelOptions, TInclude> = OmitNever<{
111
+ [Name in keyof TModelOptions['relations']]: TInclude extends {}
112
+ ? TInclude[Name] extends false
113
+ ? false
114
+ : TInclude[Name] extends true
115
+ ? [TModelOptions['relations'][Name], undefined]
116
+ : TInclude[Name] extends {}
117
+ ? [TModelOptions['relations'][Name], TInclude[Name]]
118
+ : TypeDtoMutateAutoloadPlan<TModelOptions['relations'][Name]>
119
+ : TypeDtoMutateAutoloadPlan<TModelOptions['relations'][Name]>;
120
+ }>;
121
+
122
+ type TypeDtoMutateAutoloadPlan<Relation> =
123
+ TypeUtilGetRelationOptionsAutoload<Relation> extends true ? [Relation, undefined] : never;
124
+
125
+ type TypeDtoMutateWithPlans<TWith> = TWith extends {}
126
+ ? OmitNever<{
127
+ [Name in keyof TWith]: TWith[Name] extends boolean
128
+ ? never
129
+ : TWith[Name] extends {}
130
+ ? [TWith[Name], TypeUtilGetRelationOptions<TWith[Name]>]
131
+ : never;
132
+ }>
126
133
  : {};
127
134
 
128
- type TypeDtoMutateRelationResultMergeIncludeWrapper<
129
- TMutateTypeTopLevel extends TypeDtoMutateType,
130
- Relation,
131
- IncludeWrapper,
132
- > = IncludeWrapper extends false
133
- ? never
134
- : IncludeWrapper extends true
135
- ? TypeUtilGetDtoMutateRelationEntityByType<TMutateTypeTopLevel, Relation, undefined>
136
- : IncludeWrapper extends {}
137
- ? TypeUtilGetDtoMutateRelationEntityByType<TMutateTypeTopLevel, Relation, IncludeWrapper>
138
- : never;
135
+ type TypeDtoMutateFreshPlans<
136
+ TModel extends BeanModelMeta | undefined,
137
+ TOptionsRelation,
138
+ TWith = TypeDtoMutateWithPlans<TypeUtilGetParamsWith<TOptionsRelation>>,
139
+ > = Omit<
140
+ TModel extends BeanModelMeta
141
+ ? TypeDtoMutateIncludePlans<
142
+ TypeUtilGetModelOptions<TModel>,
143
+ TypeUtilGetParamsInlcude<TOptionsRelation>
144
+ >
145
+ : {},
146
+ keyof TWith
147
+ > &
148
+ TWith;
139
149
 
140
- type TypeDtoMutateRelationResultMergeAutoload<
141
- TMutateTypeTopLevel extends TypeDtoMutateType,
142
- Relation,
143
- > =
144
- TypeUtilGetRelationOptionsAutoload<Relation> extends true
145
- ? TypeUtilGetDtoMutateRelationEntityByType<TMutateTypeTopLevel, Relation, undefined>
150
+ type TypeDtoMutateRetainedPlans<TOptionsRelation> = TOptionsRelation extends {
151
+ dtoClass: infer TClass extends Constructable<unknown>;
152
+ }
153
+ ? typeof SymbolDtoMutateRelations extends keyof TClass
154
+ ? Pick<
155
+ NonNullable<TClass[typeof SymbolDtoMutateRelations]>,
156
+ Extract<
157
+ keyof NonNullable<TClass[typeof SymbolDtoMutateRelations]>,
158
+ keyof InstanceType<TClass>
159
+ >
160
+ >
161
+ : {}
162
+ : {};
163
+
164
+ type TypeDtoMutateRelationPlans<
165
+ TModel extends BeanModelMeta | undefined,
166
+ TOptionsRelation,
167
+ TFresh = TypeDtoMutateFreshPlans<TModel, TOptionsRelation>,
168
+ > = Omit<TypeDtoMutateRetainedPlans<TOptionsRelation>, keyof TFresh> & TFresh;
169
+
170
+ type TypeDtoMutateOwnedRelations<
171
+ TModel extends BeanModelMeta | undefined,
172
+ TOptionsRelation,
173
+ TPlans = TypeDtoMutateRelationPlans<TModel, TOptionsRelation>,
174
+ > = OmitNever<{
175
+ [Name in keyof TPlans]: TPlans[Name] extends [infer Relation, unknown]
176
+ ? TypeUtilGetRelationType<Relation> extends 'hasOne' | 'hasMany'
177
+ ? TPlans[Name]
178
+ : never
146
179
  : never;
180
+ }>;
147
181
 
148
- type TypeDtoMutateRelationResultMergeWithRelation<
149
- TMutateTypeTopLevel extends TypeDtoMutateType,
150
- WithRelation,
151
- > = WithRelation extends false
152
- ? never
153
- : WithRelation extends true
154
- ? never
155
- : WithRelation extends {}
156
- ? TypeUtilGetDtoMutateRelationEntityByType<
157
- TMutateTypeTopLevel,
158
- WithRelation,
159
- TypeUtilGetRelationOptions<WithRelation>
160
- >
161
- : never;
182
+ type TypeDtoMutateProjectRelations<TPlans, TMutateType extends TypeDtoMutateType> = OmitNever<{
183
+ [Name in keyof TPlans]: TPlans[Name] extends [infer Relation, infer IncludeWrapper]
184
+ ? TypeUtilGetDtoMutateRelationEntityByType<TMutateType, Relation, IncludeWrapper>
185
+ : never;
186
+ }>;
187
+
188
+ type TypeDtoMutateDisabledRelations<TPlans> = {
189
+ [Name in keyof TPlans]: TPlans[Name] extends false ? Name : never;
190
+ }[keyof TPlans];
191
+
192
+ type TypeDtoMutateMergeRelations<
193
+ TBase,
194
+ TPlans,
195
+ TMutateType extends TypeDtoMutateType,
196
+ TRelations = TypeDtoMutateProjectRelations<TPlans, TMutateType>,
197
+ TDisabled extends keyof TBase = Extract<keyof TBase, TypeDtoMutateDisabledRelations<TPlans>>,
198
+ > = Omit<TBase, keyof TRelations | TDisabled> & Partial<Pick<TBase, TDisabled>> & TRelations;
162
199
 
163
200
  // Relation options supply the default dtoClass; an include wrapper may override it.
164
201
  type TypeUtilGetDtoMutateRelationParams<Relation, IncludeWrapper> = IncludeWrapper extends {