import type { OperationNode, SchemaNode } from '@kubb/ast/types' import type { Config, Plugin, PluginFactoryOptions } from '@kubb/core' import type { Operation, SchemaObject } from '@kubb/oas' import { createReactFabric, Fabric } from '@kubb/react-fabric' import type { Fabric as FabricType } from '@kubb/react-fabric/types' import type { ReactGenerator } from './generators/createReactGenerator.ts' import type { OperationGenerator } from './OperationGenerator.ts' import type { SchemaGenerator, SchemaGeneratorOptions } from './SchemaGenerator.ts' import type { Schema } from './SchemaMapper.ts' type BuildOperationsBaseOptions = { config: Config fabric: FabricType plugin: Plugin } type BuildOperationsV1Options = BuildOperationsBaseOptions & { version?: '1' Component: ReactGenerator['Operations'] generator: Omit, 'build'> } type BuildOperationsV2Options = BuildOperationsBaseOptions & { version: '2' Component: ReactGenerator['Operations'] } function isBuildOperationsV1Options( options: BuildOperationsV1Options | BuildOperationsV2Options, ): options is BuildOperationsV1Options { return (options.version ?? '1') === '1' } export async function buildOperations( operations: Array, options: BuildOperationsV1Options, ): Promise export async function buildOperations( nodes: Array, options: BuildOperationsV2Options, ): Promise export async function buildOperations( operationsOrNodes: Array | Array, options: BuildOperationsV1Options | BuildOperationsV2Options, ): Promise { const { config, fabric, plugin } = options if (!options.Component) { return undefined } const fabricChild = createReactFabric() if (isBuildOperationsV1Options(options)) { const { generator, Component } = options const { pluginManager, oas, mode } = generator.context await fabricChild.render( } generator={generator} plugin={plugin} /> , ) } else { const { Component } = options await fabricChild.render( } plugin={plugin} /> , ) } await fabric.context.fileManager.upsert(...fabricChild.files) fabricChild.unmount() } type BuildOperationBaseOptions = { config: Config fabric: FabricType plugin: Plugin } type BuildOperationV1Options = BuildOperationBaseOptions & { version?: '1' Component: ReactGenerator['Operation'] generator: Omit, 'build'> } type BuildOperationV2Options = BuildOperationBaseOptions & { version: '2' Component: ReactGenerator['Operation'] } function isBuildOperationV1Options( options: BuildOperationV1Options | BuildOperationV2Options, ): options is BuildOperationV1Options { return (options.version ?? '1') === '1' } export async function buildOperation(operation: Operation, options: BuildOperationV1Options): Promise export async function buildOperation(node: OperationNode, options: BuildOperationV2Options): Promise export async function buildOperation( operationOrNode: Operation | OperationNode, options: BuildOperationV1Options | BuildOperationV2Options, ): Promise { const { config, fabric, plugin } = options if (!options.Component) { return undefined } const fabricChild = createReactFabric() if (isBuildOperationV1Options(options)) { const { generator, Component } = options const { pluginManager, oas, mode } = generator.context await fabricChild.render( , ) } else { const { Component } = options await fabricChild.render( , ) } await fabric.context.fileManager.upsert(...fabricChild.files) fabricChild.unmount() } type BuildSchemaBaseOptions = { config: Config fabric: FabricType plugin: Plugin } type BuildSchemaV1Options = BuildSchemaBaseOptions & { version?: '1' Component: ReactGenerator['Schema'] generator: Omit, 'build'> } type BuildSchemaV2Options = BuildSchemaBaseOptions & { version: '2' Component: ReactGenerator['Schema'] } function isBuildSchemaV1Options( options: BuildSchemaV1Options | BuildSchemaV2Options, ): options is BuildSchemaV1Options { return (options.version ?? '1') === '1' } export async function buildSchema( schema: { name: string; tree: Array; value: SchemaObject }, options: BuildSchemaV1Options, ): Promise export async function buildSchema(schema: SchemaNode, options: BuildSchemaV2Options): Promise export async function buildSchema( schema: { name: string; tree: Array; value: SchemaObject } | SchemaNode, options: BuildSchemaV1Options | BuildSchemaV2Options, ): Promise { const { config, fabric, plugin } = options if (!options.Component) { return undefined } const fabricChild = createReactFabric() if (isBuildSchemaV1Options(options)) { const { generator, Component } = options const { pluginManager, oas, mode } = generator.context await fabricChild.render( ; value: SchemaObject }} plugin={plugin} generator={generator} /> , ) } else { const { Component } = options await fabricChild.render( , ) } await fabric.context.fileManager.upsert(...fabricChild.files) fabricChild.unmount() }