fork of hey-api/openapi-ts because I need some additional things

Fix infinite recursion in transformers plugin for self-referential schemas

Co-authored-by: mrlubos <12529395+mrlubos@users.noreply.github.com>

+41 -38
+14 -14
packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/transformers-all-of/transformers.gen.ts
··· 2 2 3 3 import type { GetFooResponse } from './types.gen'; 4 4 5 - const quxSchemaResponseTransformer = (data: any) => { 6 - if (data.baz) { 7 - data.baz = new Date(data.baz); 8 - } 9 - return data; 10 - }; 11 - 12 - const bazSchemaResponseTransformer = (data: any) => { 13 - data = quxSchemaResponseTransformer(data); 14 - data.bar = new Date(data.bar); 5 + const fooSchemaResponseTransformer = (data: any) => { 6 + data.foo = data.foo.map((item: any) => { 7 + return barSchemaResponseTransformer(item); 8 + }); 15 9 return data; 16 10 }; 17 11 ··· 22 16 return data; 23 17 }; 24 18 25 - const fooSchemaResponseTransformer = (data: any) => { 26 - data.foo = data.foo.map((item: any) => { 27 - return barSchemaResponseTransformer(item); 28 - }); 19 + const bazSchemaResponseTransformer = (data: any) => { 20 + data = quxSchemaResponseTransformer(data); 21 + data.bar = new Date(data.bar); 22 + return data; 23 + }; 24 + 25 + const quxSchemaResponseTransformer = (data: any) => { 26 + if (data.baz) { 27 + data.baz = new Date(data.baz); 28 + } 29 29 return data; 30 30 }; 31 31
+14 -14
packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/transformers-all-of/transformers.gen.ts
··· 2 2 3 3 import type { GetFooResponse } from './types.gen'; 4 4 5 - const quxSchemaResponseTransformer = (data: any) => { 6 - if (data.baz) { 7 - data.baz = new Date(data.baz); 8 - } 9 - return data; 10 - }; 11 - 12 - const bazSchemaResponseTransformer = (data: any) => { 13 - data = quxSchemaResponseTransformer(data); 14 - data.bar = new Date(data.bar); 5 + const fooSchemaResponseTransformer = (data: any) => { 6 + data.foo = data.foo.map((item: any) => { 7 + return barSchemaResponseTransformer(item); 8 + }); 15 9 return data; 16 10 }; 17 11 ··· 22 16 return data; 23 17 }; 24 18 25 - const fooSchemaResponseTransformer = (data: any) => { 26 - data.foo = data.foo.map((item: any) => { 27 - return barSchemaResponseTransformer(item); 28 - }); 19 + const bazSchemaResponseTransformer = (data: any) => { 20 + data = quxSchemaResponseTransformer(data); 21 + data.bar = new Date(data.bar); 22 + return data; 23 + }; 24 + 25 + const quxSchemaResponseTransformer = (data: any) => { 26 + if (data.baz) { 27 + data.baz = new Date(data.baz); 28 + } 29 29 return data; 30 30 }; 31 31
+13 -10
packages/openapi-ts/src/plugins/@hey-api/transformers/plugin.ts
··· 63 63 if (!plugin.getSymbol(selector)) { 64 64 // TODO: remove 65 65 // create each schema response transformer only once 66 + 67 + // Register symbol early to prevent infinite recursion with self-referential schemas 68 + const symbol = plugin.registerSymbol({ 69 + name: buildName({ 70 + config: { 71 + case: 'camelCase', 72 + name: '{{name}}SchemaResponseTransformer', 73 + }, 74 + name: refToName(schema.$ref), 75 + }), 76 + selector, 77 + }); 78 + 66 79 const refSchema = plugin.context.resolveIrRef<IR.SchemaObject>( 67 80 schema.$ref, 68 81 ); ··· 71 84 schema: refSchema, 72 85 }); 73 86 if (nodes.length) { 74 - const symbol = plugin.registerSymbol({ 75 - name: buildName({ 76 - config: { 77 - case: 'camelCase', 78 - name: '{{name}}SchemaResponseTransformer', 79 - }, 80 - name: refToName(schema.$ref), 81 - }), 82 - selector, 83 - }); 84 87 const node = tsc.constVariable({ 85 88 expression: tsc.arrowFunction({ 86 89 async: false,