@@ -32,6 +32,7 @@ export type MetaType = {
32
32
docPath : string
33
33
read : Record < string , unknown >
34
34
write : Record < string , unknown >
35
+ writeMerge : Record < string , unknown >
35
36
writeFlatten : Record < string , unknown >
36
37
compare : Record < string , unknown >
37
38
base : Record < string , unknown >
@@ -61,78 +62,57 @@ export type MetaTypeCreator<
61
62
allFieldsPossiblyReadAsUndefined ?: boolean
62
63
banNull ?: boolean
63
64
} = { allFieldsPossiblyReadAsUndefined : false ; banNull : false }
64
- > = {
65
- base : Base
66
- read : {
67
- [ J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg < Base > ] -?: ReadConverter <
68
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg < Base > [ J ] ,
69
- Settings [ 'allFieldsPossiblyReadAsUndefined' ] extends true
70
- ? undefined
71
- : never ,
72
- Settings [ 'banNull' ] extends true ? null : never
73
- >
74
- }
75
- // so it looks more explicit in typescript hint
76
- write : {
77
- [ J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
78
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
79
- > ] -?: WriteConverter <
80
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
81
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
82
- > [ J ] ,
83
- Settings [ 'banNull' ] extends true ? null : never
84
- >
85
- }
86
- writeFlatten : {
87
- [ J in keyof ObjectFlatten <
88
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
89
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
90
- >
91
- > ] -?: WriteConverter <
92
- ObjectFlatten <
93
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
94
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
95
- >
96
- > [ J ] ,
97
- Settings [ 'banNull' ] extends true ? null : never
98
- >
99
- }
100
- compare : {
101
- [ J in keyof ObjectFlatten <
102
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
103
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
104
- >
105
- > ] -?: CompareConverter <
106
- ObjectFlatten <
107
- RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg <
108
- RecursiveExcludePossiblyUndefinedFieldValue < Base >
109
- >
110
- > [ J ] ,
111
- Settings [ 'banNull' ] extends true ? null : never
112
- >
113
- }
65
+ > = RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg < Base > extends infer Q
66
+ ? RecursiveExcludePossiblyUndefinedFieldValue < Q > extends infer P
67
+ ? ObjectFlatten < P > extends infer R
68
+ ? ( Settings [ 'banNull' ] extends true ? null : never ) extends infer S
69
+ ? {
70
+ base : Base
71
+ read : Exclude <
72
+ ReadConverter <
73
+ Q ,
74
+ Settings [ 'allFieldsPossiblyReadAsUndefined' ] extends true
75
+ ? undefined
76
+ : never ,
77
+ S
78
+ > ,
79
+ undefined
80
+ >
114
81
115
- collectionID : NoUndefinedAndBannedTypes <
116
- string extends CollectionID
117
- ? ErrorCollectionIDString
118
- : IsValidID < CollectionID , 'Collection' , 'ID' > ,
119
- never
120
- >
121
- collectionPath : Parent extends MetaType
122
- ? `${Parent [ 'collectionPath' ] } /${Parent [ 'docID' ] } /${CollectionID } `
123
- : CollectionID
124
- docID : IsValidID < DocID , 'Document' , 'ID' >
125
- docPath : Parent extends MetaType
126
- ? `${Parent [ 'collectionPath' ] } /${Parent [ 'docID' ] } /${CollectionID } /${DocID } `
127
- : `${CollectionID } /${DocID } `
128
- parent : Parent
129
- ancestors : Parent extends MetaType
130
- ? [
131
- ...Parent [ 'ancestors' ] ,
132
- MetaTypeCreator < Base , CollectionID , DocID , Parent , Settings >
133
- ]
134
- : [ MetaTypeCreator < Base , CollectionID , DocID , Parent , Settings > ]
135
- }
82
+ // so it looks more explicit in typescript hint
83
+ write : WriteConverter < P , S >
84
+
85
+ writeMerge : WriteUpdateConverter < P , S >
86
+
87
+ writeFlatten : WriteUpdateConverter < R , S >
88
+
89
+ compare : CompareConverter < R , S >
90
+
91
+ collectionID : NoUndefinedAndBannedTypes <
92
+ string extends CollectionID
93
+ ? ErrorCollectionIDString
94
+ : IsValidID < CollectionID , 'Collection' , 'ID' > ,
95
+ never
96
+ >
97
+ collectionPath : Parent extends MetaType
98
+ ? `${Parent [ 'collectionPath' ] } /${Parent [ 'docID' ] } /${CollectionID } `
99
+ : CollectionID
100
+ docID : IsValidID < DocID , 'Document' , 'ID' >
101
+ docPath : Parent extends MetaType
102
+ ? `${Parent [ 'collectionPath' ] } /${Parent [ 'docID' ] } /${CollectionID } /${DocID } `
103
+ : `${CollectionID } /${DocID } `
104
+ parent : Parent
105
+ ancestors : Parent extends MetaType
106
+ ? [
107
+ ...Parent [ 'ancestors' ] ,
108
+ MetaTypeCreator < Base , CollectionID , DocID , Parent , Settings >
109
+ ]
110
+ : [ MetaTypeCreator < Base , CollectionID , DocID , Parent , Settings > ]
111
+ }
112
+ : never
113
+ : never
114
+ : never
115
+ : never
136
116
137
117
type ReadConverterArray <
138
118
T ,
@@ -271,6 +251,31 @@ type ArrayWriteConverter<T, BannedTypes> = NoDirectNestedArray<
271
251
>
272
252
273
253
type WriteConverter < T , BannedTypes > = NoDirectNestedArray <
254
+ T ,
255
+ T extends ( infer A ) [ ]
256
+ ?
257
+ | readonly ArrayWriteConverter < A , BannedTypes > [ ]
258
+ | ArrayUnionOrRemove < ArrayWriteConverter < A , BannedTypes > >
259
+ : T extends DocumentReference < any > | ServerTimestamp | GeoPoint
260
+ ? T
261
+ : T extends number
262
+ ? number extends T
263
+ ? T | Increment
264
+ : T
265
+ : T extends UnassignedAbleFieldValue
266
+ ? ErrorUnassignedAbleFieldValue
267
+ : T extends Timestamp | Date
268
+ ? Timestamp | Date
269
+ : T extends PossiblyReadAsUndefined | DeleteField
270
+ ? never
271
+ : T extends Record < string , unknown >
272
+ ? {
273
+ [ K in keyof T ] -?: WriteConverter < T [ K ] , BannedTypes >
274
+ }
275
+ : NoUndefinedAndBannedTypes < T , BannedTypes >
276
+ >
277
+
278
+ type WriteUpdateConverter < T , BannedTypes > = NoDirectNestedArray <
274
279
T ,
275
280
T extends ( infer A ) [ ]
276
281
?
@@ -294,7 +299,7 @@ type WriteConverter<T, BannedTypes> = NoDirectNestedArray<
294
299
? never
295
300
: T extends Record < string , unknown >
296
301
? {
297
- [ K in keyof T ] -?: WriteConverter < T [ K ] , BannedTypes >
302
+ [ K in keyof T ] -?: WriteUpdateConverter < T [ K ] , BannedTypes >
298
303
}
299
304
: NoUndefinedAndBannedTypes < T , BannedTypes >
300
305
>
0 commit comments