diff --git a/src/client/interfaces/ModelComposition.d.ts b/src/client/interfaces/ModelComposition.d.ts new file mode 100644 index 00000000..f17fc5e6 --- /dev/null +++ b/src/client/interfaces/ModelComposition.d.ts @@ -0,0 +1,8 @@ +import type { Model } from './Model'; + +export interface ModelComposition { + type: 'one-of' | 'any-of' | 'all-of'; + imports: string[]; + enums: Model[]; + properties: Model[]; +} diff --git a/src/openApi/v2/parser/getModelComposition.ts b/src/openApi/v2/parser/getModelComposition.ts new file mode 100644 index 00000000..2bcdd633 --- /dev/null +++ b/src/openApi/v2/parser/getModelComposition.ts @@ -0,0 +1,25 @@ +import type { ModelComposition } from '../../../client/interfaces/ModelComposition'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export function getModelComposition(openApi: OpenApi, definitions: OpenApiSchema[], type: 'one-of' | 'any-of' | 'all-of', getModel: GetModelFn): ModelComposition { + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; + + const modes = definitions.map(definition => getModel(openApi, definition)); + modes.forEach(model => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); + + return composition; +} diff --git a/src/openApi/v3/parser/getModelComposition.ts b/src/openApi/v3/parser/getModelComposition.ts new file mode 100644 index 00000000..2bcdd633 --- /dev/null +++ b/src/openApi/v3/parser/getModelComposition.ts @@ -0,0 +1,25 @@ +import type { ModelComposition } from '../../../client/interfaces/ModelComposition'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export function getModelComposition(openApi: OpenApi, definitions: OpenApiSchema[], type: 'one-of' | 'any-of' | 'all-of', getModel: GetModelFn): ModelComposition { + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; + + const modes = definitions.map(definition => getModel(openApi, definition)); + modes.forEach(model => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); + + return composition; +}