Skip to content

Commit fa85eda

Browse files
committed
fix: adjust typings for relationship deserializers
1 parent b4cd1ce commit fa85eda

File tree

1 file changed

+41
-30
lines changed

1 file changed

+41
-30
lines changed

src/deserializer.ts

+41-30
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,37 @@ import type { AttributesSchema, DefaultLinks, DefaultMeta, RootLinks } from "./s
44

55
export type RelationshipType = "one" | "one_nullable" | "many";
66

7-
export type RelationshipDeserializer<
7+
export type ReferenceRelationshipDeserializer<
8+
TRelationshipType extends RelationshipType,
89
TResourceType extends string,
10+
> = {
11+
relationshipType: TRelationshipType;
12+
resourceType: TResourceType;
13+
};
14+
15+
export type AnyReferenceRelationshipDeserializer = ReferenceRelationshipDeserializer<
16+
RelationshipType,
17+
string
18+
>;
19+
20+
export type IncludedRelationshipDeserializer<
921
TRelationshipType extends RelationshipType,
10-
TInclude extends AnyResourceDeserializer | undefined,
11-
> = TInclude extends undefined
12-
? {
13-
relationshipType: TRelationshipType;
14-
resourceType: TResourceType;
15-
}
16-
: {
17-
relationshipType: TRelationshipType;
18-
include: TInclude;
19-
};
22+
TInclude extends AnyResourceDeserializer,
23+
> = {
24+
relationshipType: TRelationshipType;
25+
include: TInclude;
26+
};
2027

21-
export type AnyRelationshipDeserializer = RelationshipDeserializer<
22-
string,
28+
export type AnyIncludedRelationshipDeserializer = IncludedRelationshipDeserializer<
2329
RelationshipType,
24-
// biome-ignore lint/suspicious/noExplicitAny: required to avoid circular dependency error
25-
ResourceDeserializer<string, AttributesSchema | undefined, any> | undefined
30+
// biome-ignore lint/suspicious/noExplicitAny: required to avoid circular dependency
31+
any
2632
>;
2733

34+
export type AnyRelationshipDeserializer =
35+
| AnyReferenceRelationshipDeserializer
36+
| AnyIncludedRelationshipDeserializer;
37+
2838
export type Relationships = Record<string, AnyRelationshipDeserializer>;
2939

3040
export type ResourceDeserializer<
@@ -43,21 +53,22 @@ export type AnyResourceDeserializer = ResourceDeserializer<
4353
Relationships | undefined
4454
>;
4555

46-
export type InferResourceType<T> = T extends RelationshipDeserializer<
47-
infer U,
56+
export type InferResourceType<T> = T extends ReferenceRelationshipDeserializer<
4857
RelationshipType,
49-
AnyResourceDeserializer | undefined
58+
infer U
5059
>
5160
? U
52-
: never;
53-
export type InferRelationshipType<T> = T extends RelationshipDeserializer<
54-
string,
55-
infer U,
56-
AnyResourceDeserializer | undefined
57-
>
61+
: T extends IncludedRelationshipDeserializer<infer U, AnyResourceDeserializer>
62+
? U extends AnyResourceDeserializer
63+
? U["type"]
64+
: never
65+
: never;
66+
export type InferRelationshipType<T> = T extends ReferenceRelationshipDeserializer<infer U, string>
5867
? U
59-
: never;
60-
export type InferInclude<T> = T extends RelationshipDeserializer<string, RelationshipType, infer U>
68+
: T extends IncludedRelationshipDeserializer<infer U, AnyResourceDeserializer>
69+
? U
70+
: never;
71+
export type InferInclude<T> = T extends IncludedRelationshipDeserializer<RelationshipType, infer U>
6172
? U
6273
: never;
6374
export type InferType<T> = T extends ResourceDeserializer<
@@ -82,10 +93,10 @@ export type InferRelationships<T> = T extends ResourceDeserializer<
8293
? U
8394
: never;
8495

85-
type IncludeResult<
86-
TDeserializer extends AnyRelationshipDeserializer,
87-
TInclude extends AnyResourceDeserializer | undefined = InferInclude<TDeserializer>,
88-
> = TInclude extends AnyResourceDeserializer ? ResourceResult<TInclude> : { id: string };
96+
type IncludeResult<TDeserializer extends AnyRelationshipDeserializer> =
97+
TDeserializer extends AnyReferenceRelationshipDeserializer
98+
? { id: string }
99+
: InferInclude<TDeserializer>;
89100

90101
export type RelationshipResult<
91102
TDeserializer extends AnyRelationshipDeserializer,

0 commit comments

Comments
 (0)