diff --git a/packages/fets/src/types.ts b/packages/fets/src/types.ts index afd7e3fcd..49d5ecca7 100644 --- a/packages/fets/src/types.ts +++ b/packages/fets/src/types.ts @@ -165,7 +165,9 @@ export type Circular = TJSONSchema extends { ? TJSONSchema extends PropertyValue> ? true : Circular>> - : false; + : TJSONSchema extends { items: JSONSchema } + ? true + : false; export type Property = keyof TJSONSchema['properties']; export type PropertyValue< diff --git a/packages/fets/tests/client/circular-ref-test.ts b/packages/fets/tests/client/circular-ref-test.ts index aa21ce40c..4d6ccdf17 100644 --- a/packages/fets/tests/client/circular-ref-test.ts +++ b/packages/fets/tests/client/circular-ref-test.ts @@ -12,12 +12,12 @@ import type treeOAS from './fixtures/example-circular-ref-oas'; type NormalizedOAS = NormalizeOAS; // So it does handle circular reference actually -type SchemaInOAS = +type TreeSchemaInOAS = NormalizedOAS['paths']['/tree']['get']['responses']['200']['content']['application/json']['schema']; -type Test = FromSchema; +type TreeTest = FromSchema; -const a: Test = { +const a: TreeTest = { number: 1, child: { number: 2, @@ -33,9 +33,9 @@ if (a.child?.child?.child) { a.child.child.child.number = 1; } -type Test2 = FromSchema>; +type TreeTest2 = FromSchema>; -const b: Test2 = { +const b: TreeTest2 = { number: 1, child: { number: 2, @@ -45,9 +45,9 @@ const b: Test2 = { }, }; -type Test3 = OASOutput; +type TreeTest3 = OASOutput; -const c: Test3 = { +const c: TreeTest3 = { number: 1, child: { number: 2, @@ -57,6 +57,57 @@ const c: Test3 = { }, }; +type TreeListSchemaInOAS = + NormalizedOAS['paths']['/tree-list']['get']['responses']['200']['content']['application/json']['schema']; + +type TreeListTest = FromSchema; + +const d: TreeListTest = { + number: 1, + children: [ + { + number: 2, + get children() { + return [d]; + }, + }, + ], +}; + +if (d.children?.[0].children?.[0]?.children?.[0].number) { + // @ts-expect-error number is a number + d.children[0].children[0].children[0].number = 'a'; + d.children[0].children[0].children[0].number = 1; +} + +type TreeListTest2 = FromSchema>; + +const e: TreeListTest2 = { + number: 1, + children: [ + { + number: 2, + get children() { + return [e]; + }, + }, + ], +}; + +type TreeListTest3 = OASOutput; + +const f: TreeListTest3 = { + number: 1, + children: [ + { + number: 2, + get children() { + return [f]; + }, + }, + ], +}; + const client = createClient({}); // Somehow here is a problem diff --git a/packages/fets/tests/client/fixtures/example-circular-ref-oas.ts b/packages/fets/tests/client/fixtures/example-circular-ref-oas.ts index e8be4c2a9..6049abb7b 100644 --- a/packages/fets/tests/client/fixtures/example-circular-ref-oas.ts +++ b/packages/fets/tests/client/fixtures/example-circular-ref-oas.ts @@ -30,9 +30,48 @@ export default { }, }, }, + '/tree-list': { + get: { + tags: ['tree-list'], + summary: 'Get tree list', + description: '', + operationId: 'getTreeList', + responses: { + '200': { + description: 'successful operation', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TreeNode', + }, + }, + }, + }, + '404': { + description: 'Tree not found', + }, + }, + }, + }, }, components: { schemas: { + TreeNode: { + type: 'object', + properties: { + number: { + type: 'integer', + format: 'int64', + example: 10, + }, + children: { + type: 'array', + items: { + $ref: '#/components/schemas/TreeNode', + }, + }, + }, + }, Node: { type: 'object', properties: {