Skip to content

Commit 047ecec

Browse files
authored
Fix nested circular references (#1824)
1 parent c23d785 commit 047ecec

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

.changeset/slow-pigs-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'fets': patch
3+
---
4+
5+
Fix nested circular references

packages/fets/src/types.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,20 @@ type RangedJSONSchema<T extends { minimum: number; maximum: number }> = T extend
159159
} ? MIN extends number ? MAX extends number ? IntRange<MIN, MAX> : never : never : never;
160160
*/
161161

162+
export type Circular<TJSONSchema extends JSONSchema> = TJSONSchema extends {
163+
properties: { [key: string]: JSONSchema };
164+
}
165+
? TJSONSchema extends PropertyValue<TJSONSchema, Property<TJSONSchema>>
166+
? true
167+
: Circular<PropertyValue<TJSONSchema, Property<TJSONSchema>>>
168+
: false;
169+
170+
export type Property<TJSONSchema extends JSONSchema> = keyof TJSONSchema['properties'];
171+
export type PropertyValue<
172+
TJSONSchema extends JSONSchema,
173+
TProperty extends keyof TJSONSchema['properties'],
174+
> = TJSONSchema['properties'][TProperty];
175+
162176
export type FromSchema<T> =
163177
/* T extends { type: 'integer'; minimum: number; maximum: number } ? RangedJSONSchema<T> : */ T extends {
164178
static: infer U;
@@ -168,9 +182,8 @@ export type FromSchema<T> =
168182
? FromSchemaOriginal<
169183
T,
170184
{
171-
deserialize: T extends T['properties'][keyof T['properties']]
172-
? false
173-
: [
185+
deserialize: Circular<T> extends false
186+
? [
174187
{
175188
pattern: {
176189
type: 'string';
@@ -192,7 +205,8 @@ export type FromSchema<T> =
192205
};
193206
output: bigint | number;
194207
},
195-
];
208+
]
209+
: false;
196210
}
197211
>
198212
: never;

packages/fets/tests/client/circular-ref-test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
createClient,
33
OASJSONResponseSchema,
4+
OASModel,
45
OASOutput,
56
type FromSchema,
67
type NormalizeOAS,
@@ -72,3 +73,14 @@ if (response.ok) {
7273
} else {
7374
console.log(response.status);
7475
}
76+
77+
type NodeA = OASModel<NormalizedOAS, 'Node'>;
78+
const nodeA = {} as NodeA;
79+
const numberA = nodeA.child?.child?.child?.child?.number;
80+
type NumberA = typeof numberA;
81+
let numberAVar: NumberA;
82+
numberAVar = 2;
83+
// @ts-expect-error - numberAVar is a number
84+
numberAVar = 'a';
85+
86+
console.log(numberAVar);

0 commit comments

Comments
 (0)