@@ -72,9 +72,9 @@ export type EntitySerializer<TEntity, TReference, TContext = undefined, TSideloa
72
72
} ;
73
73
74
74
// biome-ignore lint/suspicious/noExplicitAny: required for inference
75
- type AnySerializeManager = SerializeManager < any , any > ;
75
+ type AnySerializeManager = SerializeManager < any > ;
76
76
// biome-ignore lint/suspicious/noExplicitAny: required for inference
77
- type Serializers < TContext > = Record < string , EntitySerializer < any , any , TContext , any > > ;
77
+ type Serializers = Record < string , EntitySerializer < any , any , any , any > > ;
78
78
// biome-ignore lint/suspicious/noExplicitAny: required for inference
79
79
type InferEntity < TSerializer > = TSerializer extends EntitySerializer < infer T , any , any , any >
80
80
? T
@@ -84,18 +84,29 @@ type InferReference<TSerializer> = TSerializer extends EntitySerializer<any, inf
84
84
? T
85
85
: never ;
86
86
// biome-ignore lint/suspicious/noExplicitAny: required for inference
87
- type InferSideloaded < TSerializer > = TSerializer extends EntitySerializer < any , any , any , infer T >
87
+ type InferContext < TSerializer > = TSerializer extends EntitySerializer < any , any , infer T , any >
88
88
? T | undefined
89
89
: never ;
90
90
// biome-ignore lint/suspicious/noExplicitAny: required for inference
91
- type InferKeys < TSerializers extends Serializers < any > > = keyof TSerializers & string ;
92
- // biome-ignore lint/suspicious/noExplicitAny: required for inference
93
- type InferSerializers < TSerializeManager > = TSerializeManager extends SerializeManager < any , infer T >
91
+ type InferSideloaded < TSerializer > = TSerializer extends EntitySerializer < any , any , any , infer T >
92
+ ? T | undefined
93
+ : never ;
94
+ type InferKeys < TSerializers extends Serializers > = keyof TSerializers & string ;
95
+ type InferSerializers < TSerializeManager > = TSerializeManager extends SerializeManager < infer T >
94
96
? T
95
97
: never ;
98
+ type ManagerContext < TSerializers extends Serializers > = {
99
+ [ K in keyof TSerializers ] ?: InferContext < TSerializers [ K ] > ;
100
+ } ;
101
+ export type InferManagerContext < TSerializeManager extends AnySerializeManager > = ManagerContext <
102
+ InferSerializers < TSerializeManager >
103
+ > ;
96
104
97
- export type SerializeManagerOptions < TContext = undefined , TSideloaded = undefined > = {
98
- context ?: TContext ;
105
+ export type SerializeManagerOptions <
106
+ TSerializers extends Serializers = Serializers ,
107
+ TSideloaded = undefined ,
108
+ > = {
109
+ context ?: ManagerContext < TSerializers > ;
99
110
fields ?: Record < string , string [ ] > ;
100
111
include ?: string [ ] ;
101
112
meta ?: Meta ;
@@ -110,21 +121,18 @@ type SerializeEntityResult = {
110
121
entityRelationships ?: EntityRelationships ;
111
122
} ;
112
123
113
- export class SerializeManager <
114
- TContext = undefined ,
115
- TSerializers extends Serializers < TContext > = Serializers < TContext > ,
116
- > {
124
+ export class SerializeManager < TSerializers extends Serializers = Serializers > {
117
125
public constructor ( private readonly serializers : TSerializers ) {
118
126
this . serializers = serializers ;
119
127
}
120
128
121
129
public createResourceDocument < TType extends InferKeys < TSerializers > > (
122
130
type : TType ,
123
131
entity : InferEntity < TSerializers [ TType ] > ,
124
- options ?: SerializeManagerOptions < TContext , InferSideloaded < TSerializers [ TType ] > > ,
132
+ options ?: SerializeManagerOptions < TSerializers , InferSideloaded < TSerializers [ TType ] > > ,
125
133
) : JsonApiBody {
126
134
const serializeEntityResult = this . serializeEntity ( type , entity , options ) ;
127
- let included : IncludedCollection < TContext , typeof this > | undefined = undefined ;
135
+ let included : IncludedCollection < TSerializers , typeof this > | undefined = undefined ;
128
136
129
137
if ( options ?. include && serializeEntityResult . entityRelationships ) {
130
138
included = new IncludedCollection ( this ) ;
@@ -140,12 +148,12 @@ export class SerializeManager<
140
148
public createMultiResourceDocument < TType extends InferKeys < TSerializers > > (
141
149
type : TType ,
142
150
entities : InferEntity < TSerializers [ TType ] > [ ] ,
143
- options ?: SerializeManagerOptions < TContext , InferSideloaded < TSerializers [ TType ] > > ,
151
+ options ?: SerializeManagerOptions < TSerializers , InferSideloaded < TSerializers [ TType ] > > ,
144
152
) : JsonApiBody {
145
153
const serializeEntityResults = entities . map ( ( entity ) =>
146
154
this . serializeEntity ( type , entity , options ) ,
147
155
) ;
148
- let included : IncludedCollection < TContext , typeof this > | undefined = undefined ;
156
+ let included : IncludedCollection < TSerializers , typeof this > | undefined = undefined ;
149
157
150
158
if ( options ?. include ) {
151
159
included = new IncludedCollection ( this ) ;
@@ -171,8 +179,8 @@ export class SerializeManager<
171
179
172
180
private createJsonApiBody (
173
181
data : Resource | Resource [ ] | null ,
174
- options ?: SerializeManagerOptions < TContext , unknown > ,
175
- included ?: IncludedCollection < TContext , this> ,
182
+ options ?: SerializeManagerOptions < TSerializers , unknown > ,
183
+ included ?: IncludedCollection < TSerializers , this> ,
176
184
) : JsonApiBody {
177
185
return new JsonApiBody (
178
186
{
@@ -205,13 +213,13 @@ export class SerializeManager<
205
213
public serializeEntity < TType extends InferKeys < TSerializers > > (
206
214
type : TType ,
207
215
entity : InferEntity < TSerializers [ TType ] > ,
208
- options ?: SerializeManagerOptions < TContext , InferSideloaded < TSerializers [ TType ] > > ,
216
+ options ?: SerializeManagerOptions < TSerializers , InferSideloaded < TSerializers [ TType ] > > ,
209
217
) : SerializeEntityResult {
210
218
const serializerOptions : SerializerOptions <
211
- TContext ,
219
+ TSerializers ,
212
220
InferSideloaded < TSerializers [ TType ] >
213
221
> = {
214
- context : options ?. context ,
222
+ context : options ?. context ?. [ type ] ,
215
223
sideloaded : options ?. sideloaded ,
216
224
} ;
217
225
@@ -307,19 +315,22 @@ export class SerializeManager<
307
315
}
308
316
}
309
317
310
- type AddToIncludedCollectionOptions < TContext > = SerializeManagerOptions < TContext > & {
311
- include : string [ ] ;
312
- } ;
318
+ type AddToIncludedCollectionOptions < TSerializers extends Serializers > =
319
+ SerializeManagerOptions < TSerializers > & {
320
+ include : string [ ] ;
321
+ } ;
313
322
314
- // biome-ignore lint/suspicious/noExplicitAny: required for inference
315
- class IncludedCollection < TContext , TSerializeManager extends SerializeManager < TContext , any > > {
323
+ class IncludedCollection <
324
+ TSerializers extends Serializers ,
325
+ TSerializeManager extends AnySerializeManager ,
326
+ > {
316
327
private included = new Map < string , Resource > ( ) ;
317
328
318
329
public constructor ( private readonly serializeManager : TSerializeManager ) { }
319
330
320
331
public add (
321
332
entityRelationships : EntityRelationships < TSerializeManager > ,
322
- options : AddToIncludedCollectionOptions < TContext > ,
333
+ options : AddToIncludedCollectionOptions < TSerializers > ,
323
334
parentFieldPath = "" ,
324
335
) : void {
325
336
for ( const [ field , entityRelationship ] of Object . entries ( entityRelationships ) ) {
@@ -360,7 +371,7 @@ class IncludedCollection<TContext, TSerializeManager extends SerializeManager<TC
360
371
private addSingle (
361
372
entityRelationship : EntityRelationship < TSerializeManager > ,
362
373
field : string ,
363
- options : AddToIncludedCollectionOptions < TContext > ,
374
+ options : AddToIncludedCollectionOptions < TSerializers > ,
364
375
) : void {
365
376
const id = this . serializeManager . getEntityRelationshipId ( entityRelationship ) ;
366
377
const compositeKey = `${ entityRelationship . type } :${ id } ` ;
0 commit comments