@kubb/plugin-oas 5.0.0-alpha.31 → 5.0.0-alpha.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SchemaMapper-CeavHZlp.cjs.map +1 -1
- package/dist/SchemaMapper-CqMkO2T1.js.map +1 -1
- package/dist/{SchemaMapper-gGBRHCTB.d.ts → SchemaMapper-KHABtXIZ.d.ts} +2 -3
- package/dist/{createGenerator-eLDSS4c0.d.ts → createGenerator-CRvsKIrl.d.ts} +26 -28
- package/dist/{generators-85sP4GIS.cjs → generators-DGutWnSj.cjs} +5 -4
- package/dist/generators-DGutWnSj.cjs.map +1 -0
- package/dist/{generators-hPE06pZB.js → generators-rtdUsxQh.js} +5 -4
- package/dist/generators-rtdUsxQh.js.map +1 -0
- package/dist/generators.cjs +1 -1
- package/dist/generators.d.ts +1 -1
- package/dist/generators.js +1 -1
- package/dist/hooks.cjs +2 -3
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +8 -7
- package/dist/hooks.js +2 -3
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +9 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +13 -8
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/mocks.d.ts +1 -1
- package/dist/{requestBody-BO3N7fWH.js → requestBody-DMoaqEak.js} +57 -49
- package/dist/requestBody-DMoaqEak.js.map +1 -0
- package/dist/{requestBody-94hwM4b-.cjs → requestBody-h1zQvUgJ.cjs} +57 -49
- package/dist/requestBody-h1zQvUgJ.cjs.map +1 -0
- package/dist/utils.cjs +4 -3
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +5 -5
- package/dist/utils.js +4 -3
- package/dist/utils.js.map +1 -1
- package/package.json +6 -7
- package/src/OperationGenerator.ts +15 -12
- package/src/SchemaGenerator.ts +11 -10
- package/src/SchemaMapper.ts +1 -2
- package/src/generators/createGenerator.ts +8 -7
- package/src/generators/createReactGenerator.ts +7 -7
- package/src/generators/jsonGenerator.ts +4 -3
- package/src/hooks/useOas.ts +2 -5
- package/src/hooks/useOperationManager.ts +5 -4
- package/src/hooks/useSchemaManager.ts +6 -5
- package/src/plugin.ts +0 -2
- package/src/types.ts +5 -4
- package/src/utils/getImports.ts +5 -4
- package/src/utils/getParams.ts +1 -2
- package/src/utils.tsx +48 -37
- package/dist/generators-85sP4GIS.cjs.map +0 -1
- package/dist/generators-hPE06pZB.js.map +0 -1
- package/dist/requestBody-94hwM4b-.cjs.map +0 -1
- package/dist/requestBody-BO3N7fWH.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["SchemaGenerator","schemaKeywords","#options","#context","#matchesPattern","pascalCase","withRequiredRequestBodySchema","#isExcluded","#isIncluded","renderOperation","renderOperations","jsonGenerator","path","camelCase","SchemaGenerator","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../package.json","../src/plugin.ts","../src/index.ts"],"sourcesContent":["import { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper, SchemaTree } from './SchemaMapper.ts'\nimport { schemaKeywords } from './SchemaMapper.ts'\n\n/**\n * Helper type to create a SchemaTree with a specific current schema type\n */\ntype SchemaTreeWithKeyword<K extends keyof SchemaKeywordMapper> = Omit<SchemaTree, 'current'> & {\n current: SchemaKeywordMapper[K]\n}\n\n/**\n * Handler context with parse method available via `this`\n */\nexport type HandlerContext<TOutput, TOptions> = {\n parse: (tree: SchemaTree, options: TOptions) => TOutput | null | undefined\n}\n\n/**\n * Handler function type for custom keyword processing\n * Handlers can access the parse function via `this.parse`\n * The tree.current is typed based on the keyword K\n */\nexport type KeywordHandler<TOutput, TOptions, K extends keyof SchemaKeywordMapper = keyof SchemaKeywordMapper> = (\n this: HandlerContext<TOutput, TOptions>,\n tree: SchemaTreeWithKeyword<K>,\n options: TOptions,\n) => TOutput | null | undefined\n\n/**\n * Configuration for createParser\n */\nexport type CreateParserConfig<TOutput, TOptions> = {\n /**\n * The keyword mapper that maps schema keywords to output generators\n */\n mapper: SchemaMapper<TOutput>\n\n /**\n * Custom handlers for specific schema keywords\n * These provide the implementation for complex types that need special processing\n *\n * Use function syntax (not arrow functions) to enable use of `this` keyword:\n * ```typescript\n * handlers: {\n * enum(tree, options, parse) {\n * // Implementation\n * }\n * }\n * ```\n *\n * Common keywords that typically need handlers:\n * - union: Combine multiple schemas into a union\n * - and: Combine multiple schemas into an intersection\n * - array: Handle array types with items\n * - object: Handle object types with properties\n * - enum: Handle enum types\n * - tuple: Handle tuple types\n * - const: Handle literal/const types\n * - ref: Handle references to other schemas\n * - string/number/integer: Handle primitives with constraints (min/max)\n * - matches: Handle regex patterns\n * - default/describe/optional/nullable: Handle modifiers\n */\n handlers: Partial<{\n [K in keyof SchemaKeywordMapper]: KeywordHandler<TOutput, TOptions, K>\n }>\n}\n\n/**\n * Creates a parser function that converts schema trees to output using the provided mapper and handlers\n *\n * This function provides a framework for building parsers by:\n * 1. Checking for custom handlers for each keyword\n * 2. Falling back to the mapper for simple keywords\n * 3. Providing utilities for common operations (finding siblings, etc.)\n *\n * The generated parser is recursive and can handle nested schemas.\n *\n * **Type Safety**: Each handler receives a `tree` parameter where `tree.current` is automatically\n * typed as the specific schema keyword type (e.g., `SchemaKeywordMapper['ref']` for the `ref` handler).\n * This means you can access `tree.current.args` with full type safety without needing `isKeyword` checks,\n * though such checks can still be used as runtime guards if desired.\n *\n * @template TOutput - The output type (e.g., string for Zod/Faker, ts.TypeNode for TypeScript)\n * @template TOptions - The parser options type\n * @param config - Configuration object containing mapper and handlers\n * @returns A parse function that converts SchemaTree to TOutput\n *\n * @example\n * ```ts\n * // Create a simple string-based parser\n * const parse = createParser({\n * mapper: zodKeywordMapper,\n * handlers: {\n * // tree.current is typed as SchemaKeywordMapper['union']\n * union(tree, options) {\n * const items = tree.current.args // args is correctly typed as Schema[]\n * .map(it => this.parse({ ...tree, current: it }, options))\n * .filter(Boolean)\n * return `z.union([${items.join(', ')}])`\n * },\n * // tree.current is typed as SchemaKeywordMapper['string']\n * string(tree, options) {\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * },\n * // tree.current is typed as SchemaKeywordMapper['ref']\n * ref(tree, options) {\n * // No need for isKeyword check - tree.current.args is already properly typed\n * return `Ref: ${tree.current.args.name}`\n * }\n * }\n * })\n * ```\n */\nexport function createParser<TOutput, TOptions extends Record<string, any>>(\n config: CreateParserConfig<TOutput, TOptions>,\n): (tree: SchemaTree, options: TOptions) => TOutput | null | undefined {\n const { mapper, handlers } = config\n\n function parse(tree: SchemaTree, options: TOptions): TOutput | null | undefined {\n const { current } = tree\n\n // Check if there's a custom handler for this keyword\n const handler = handlers[current.keyword as keyof SchemaKeywordMapper]\n if (handler) {\n // Create context object with parse method accessible via `this`\n const context: HandlerContext<TOutput, TOptions> = { parse }\n // We need to cast tree here because TypeScript can't statically verify\n // that the handler type matches the current keyword at runtime\n return handler.call(context, tree as any, options)\n }\n\n // Fall back to simple mapper lookup\n const value = mapper[current.keyword as keyof typeof mapper]\n\n if (!value) {\n return undefined\n }\n\n // For simple keywords without args, call the mapper directly\n if (current.keyword in mapper) {\n return value()\n }\n\n return undefined\n }\n\n return parse\n}\n\n/**\n * Helper to find a schema keyword in siblings\n * Useful in handlers when you need to find related schemas (e.g., min/max for string)\n *\n * @example\n * ```ts\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * ```\n */\nexport function findSchemaKeyword<K extends keyof SchemaKeywordMapper>(siblings: Schema[], keyword: K): SchemaKeywordMapper[K] | undefined {\n return SchemaGenerator.find(siblings, schemaKeywords[keyword]) as SchemaKeywordMapper[K] | undefined\n}\n","import type { AsyncEventEmitter } from '@internals/utils'\nimport { pascalCase } from '@internals/utils'\nimport type { FileMetaBase, KubbEvents, KubbFile, Plugin, PluginDriver, PluginFactoryOptions } from '@kubb/core'\nimport type { Fabric as FabricType } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { renderOperation, renderOperations } from './utils.tsx'\n\nexport type OperationMethodResult<TFileMeta extends FileMetaBase> = Promise<KubbFile.File<TFileMeta> | Array<KubbFile.File<TFileMeta>> | null>\n\ntype Context<TOptions, TPluginOptions extends PluginFactoryOptions> = {\n fabric: FabricType\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n driver: PluginDriver\n events?: AsyncEventEmitter<KubbEvents>\n /**\n * Current plugin\n */\n plugin: Plugin<TPluginOptions>\n mode: KubbFile.Mode\n UNSTABLE_NAMING?: true\n}\n\nexport class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> {\n #options: TPluginOptions['resolvedOptions']\n #context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>\n\n constructor(options: TPluginOptions['resolvedOptions'], context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>) {\n this.#options = options\n this.#context = context\n }\n\n get options(): TPluginOptions['resolvedOptions'] {\n return this.#options\n }\n\n set options(options: TPluginOptions['resolvedOptions']) {\n this.#options = { ...this.#options, ...options }\n }\n\n get context(): Context<TPluginOptions['resolvedOptions'], TPluginOptions> {\n return this.#context\n }\n #matchesPattern(operation: Operation, method: HttpMethod, type: string, pattern: RegExp | string): boolean {\n switch (type) {\n case 'tag':\n return operation.getTags().some((tag) => tag.name.match(pattern))\n case 'operationId':\n return !!operation.getOperationId({ friendlyCase: true }).match(pattern)\n case 'path':\n return !!operation.path.match(pattern)\n case 'method':\n return !!method.match(pattern)\n case 'contentType':\n return !!operation.getContentType().match(pattern)\n default:\n return false\n }\n }\n\n getOptions(operation: Operation, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']> {\n const { override = [] } = this.context\n\n return override.find(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))?.options || {}\n }\n\n #isExcluded(operation: Operation, method: HttpMethod): boolean {\n const { exclude = [] } = this.context\n\n return exclude.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n #isIncluded(operation: Operation, method: HttpMethod): boolean {\n const { include = [] } = this.context\n\n return include.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n getSchemas(\n operation: Operation,\n {\n resolveName = (name) => name,\n }: {\n resolveName?: (name: string) => string\n } = {},\n ): OperationSchemas {\n const operationId = operation.getOperationId({ friendlyCase: true })\n const operationName = pascalCase(operationId)\n\n const resolveKeys = (schema?: SchemaObject) => (schema?.properties ? Object.keys(schema.properties) : undefined)\n\n const pathParamsSchema = this.context.oas.getParametersSchema(operation, 'path')\n const queryParamsSchema = this.context.oas.getParametersSchema(operation, 'query')\n const headerParamsSchema = this.context.oas.getParametersSchema(operation, 'header')\n const requestSchema = this.context.oas.getRequestSchema(operation)\n const statusCodes = operation.getResponseStatusCodes().map((statusCode) => {\n const name = statusCode === 'default' ? 'error' : statusCode\n const schema = this.context.oas.getResponseSchema(operation, statusCode)\n const keys = resolveKeys(schema)\n\n return {\n name: this.context.UNSTABLE_NAMING ? resolveName(pascalCase(`${operationId} status ${name}`)) : resolveName(pascalCase(`${operationId} ${name}`)),\n description: (operation.getResponseByStatusCode(statusCode) as OasTypes.ResponseObject)?.description,\n schema,\n operation,\n operationName,\n statusCode: name === 'error' ? undefined : Number(statusCode),\n keys,\n keysToOmit: keys?.filter((key) => (schema?.properties?.[key] as OasTypes.SchemaObject)?.writeOnly),\n }\n })\n\n const successful = statusCodes.filter((item) => item.statusCode?.toString().startsWith('2'))\n const errors = statusCodes.filter((item) => item.statusCode?.toString().startsWith('4') || item.statusCode?.toString().startsWith('5'))\n\n const request = withRequiredRequestBodySchema(\n requestSchema\n ? {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} RequestData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),\n description: (operation.schema.requestBody as OasTypes.RequestBodyObject)?.description,\n operation,\n operationName,\n schema: requestSchema,\n keys: resolveKeys(requestSchema),\n keysToOmit: resolveKeys(requestSchema)?.filter((key) => (requestSchema.properties?.[key] as OasTypes.SchemaObject)?.readOnly),\n }\n : undefined,\n )\n\n return {\n pathParams: pathParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} PathParams`)),\n operation,\n operationName,\n schema: pathParamsSchema,\n keys: resolveKeys(pathParamsSchema),\n }\n : undefined,\n queryParams: queryParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} QueryParams`)),\n operation,\n operationName,\n schema: queryParamsSchema,\n keys: resolveKeys(queryParamsSchema) || [],\n }\n : undefined,\n headerParams: headerParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} HeaderParams`)),\n operation,\n operationName,\n schema: headerParamsSchema,\n keys: resolveKeys(headerParamsSchema),\n }\n : undefined,\n request,\n response: {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} ResponseData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),\n operation,\n operationName,\n schema: {\n oneOf: successful.map((item) => ({ ...item.schema, $ref: item.name })) || undefined,\n } as SchemaObject,\n },\n responses: successful,\n errors,\n statusCodes,\n }\n }\n\n async getOperations(): Promise<Array<{ path: string; method: HttpMethod; operation: Operation }>> {\n const { oas } = this.context\n\n const paths = oas.getPaths()\n\n return Object.entries(paths).flatMap(([path, methods]) =>\n Object.entries(methods)\n .map((values) => {\n const [method, operation] = values as [HttpMethod, Operation]\n if (this.#isExcluded(operation, method)) {\n return null\n }\n\n if (this.context.include && !this.#isIncluded(operation, method)) {\n return null\n }\n\n return operation ? { path, method: method as HttpMethod, operation } : null\n })\n .filter((x): x is { path: string; method: HttpMethod; operation: Operation } => x !== null),\n )\n }\n\n async build(...generators: Array<Generator<TPluginOptions>>): Promise<Array<KubbFile.File<TFileMeta>>> {\n const operations = await this.getOperations()\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const results: Array<KubbFile.File<TFileMeta>> = []\n\n for (const generator of generators) {\n if (!('type' in generator)) {\n continue\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions> | CoreGenerator<TPluginOptions>\n\n const opResultsFlat: Array<KubbFile.File<TFileMeta>> = []\n\n for (const { operation, method } of operations) {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await renderOperation(operation, {\n config: this.context.driver.config,\n fabric: this.context.fabric,\n Component: v1Generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n } else {\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.driver.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n\n opResultsFlat.push(...([result ?? []].flat() as Array<KubbFile.File<TFileMeta>>))\n }\n }\n\n if (v1Generator.type === 'react') {\n await renderOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.driver.config,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n continue\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.driver.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n results.push(...opResultsFlat, ...((operationsResult ?? []) as unknown as Array<KubbFile.File<TFileMeta>>))\n }\n\n return results\n }\n}\n","","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, createPlugin, type KubbEvents, type UserGroup } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\nimport { version } from '../package.json'\nimport { jsonGenerator } from './generators'\nimport { OperationGenerator } from './OperationGenerator.ts'\nimport { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { PluginOas } from './types.ts'\n\nexport const pluginOasName = 'plugin-oas' satisfies PluginOas['name']\n\nexport const pluginOas = createPlugin<PluginOas>((options) => {\n const {\n output = {\n path: 'schemas',\n },\n group,\n validate = true,\n generators = [jsonGenerator],\n serverIndex,\n serverVariables,\n contentType,\n oasClass,\n discriminator = 'strict',\n collisionDetection = false,\n } = options\n\n const getOas = async ({ validate, config, events }: { validate: boolean; config: Config; events: AsyncEventEmitter<KubbEvents> }): Promise<Oas> => {\n // needs to be in a different variable or the catch here will not work(return of a promise instead)\n const oas = await parseFromConfig(config, oasClass)\n\n oas.setOptions({\n contentType,\n discriminator,\n collisionDetection,\n })\n\n try {\n if (validate) {\n await oas.validate()\n }\n } catch (er) {\n const caughtError = er as Error\n const errorTimestamp = new Date()\n const error = new Error('OAS Validation failed', {\n cause: caughtError,\n })\n\n events.emit('info', caughtError.message)\n events.emit('debug', {\n date: errorTimestamp,\n logs: [`✗ ${error.message}`, caughtError.message],\n })\n }\n\n return oas\n }\n\n return {\n name: pluginOasName,\n version,\n options: {\n output,\n validate,\n discriminator,\n ...options,\n exclude: [],\n override: [],\n },\n inject() {\n const config = this.config\n const events = this.events\n\n let oas: Oas\n\n return {\n async getOas({ validate = false } = {}) {\n if (!oas) {\n oas = await getOas({ config, events, validate })\n }\n\n return oas\n },\n async getBaseURL() {\n const oas = await getOas({ config, events, validate: false })\n if (serverIndex === undefined) {\n return undefined\n }\n\n const server = oas.api.servers?.at(serverIndex)\n if (!server?.url) {\n return undefined\n }\n\n return resolveServerUrl(\n server as { url: string; variables?: Record<string, { default?: string | number; enum?: (string | number)[] }> },\n serverVariables,\n )\n },\n }\n },\n resolvePath(baseName, pathMode, options) {\n const root = this.root\n const mode = pathMode ?? this.getMode(output)\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: UserGroup['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\n }\n\n return path.resolve(root, output.path, baseName)\n },\n async buildStart() {\n const oas = await this.getOas({ validate })\n\n if (!output || generators.length === 0) {\n return\n }\n\n await oas.dereference()\n\n const schemaGenerator = new SchemaGenerator(\n {\n unknownType: 'unknown',\n emptySchemaType: 'unknown',\n dateType: 'date',\n transformers: {},\n ...this.plugin.options,\n },\n {\n fabric: this.fabric,\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override: undefined,\n mode: 'split',\n output: output.path,\n },\n )\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude: undefined,\n include: undefined,\n override: undefined,\n mode: 'split',\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n\n await this.upsertFile(...operationFiles)\n },\n }\n})\n","import type { PluginFactoryOptions } from '@kubb/core'\nimport { createGenerator as _createGenerator } from './generators/createGenerator.ts'\nimport { createReactGenerator as _createReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator as _Generator } from './generators/types.ts'\n\nexport type { CreateParserConfig, KeywordHandler } from './createParser.ts'\nexport { createParser, findSchemaKeyword } from './createParser.ts'\nexport type { OperationMethodResult } from './OperationGenerator.ts'\nexport { OperationGenerator } from './OperationGenerator.ts'\nexport { pluginOas, pluginOasName } from './plugin.ts'\nexport type {\n GetSchemaGeneratorOptions,\n SchemaGeneratorBuildOptions,\n SchemaGeneratorOptions,\n SchemaMethodResult,\n} from './SchemaGenerator.ts'\nexport { SchemaGenerator } from './SchemaGenerator.ts'\nexport type {\n Schema,\n SchemaKeyword,\n SchemaKeywordBase,\n SchemaKeywordMapper,\n SchemaMapper,\n SchemaTree,\n} from './SchemaMapper.ts'\nexport { isKeyword, schemaKeywords } from './SchemaMapper.ts'\nexport type * from './types.ts'\nexport { renderOperation, renderOperations, renderSchema } from './utils.tsx'\n\n/**\n * @deprecated use `import { createGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createGenerator = _createGenerator\n\n/**\n * @deprecated use `import { createReactGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createReactGenerator = _createReactGenerator\n\n/**\n * @deprecated use `import { Generator } from '@kubb/plugin-oas/generators'`\n */\nexport type Generator<TOptions extends PluginFactoryOptions> = _Generator<TOptions>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["SchemaGenerator","schemaKeywords","#options","#context","#matchesPattern","pascalCase","withRequiredRequestBodySchema","#isExcluded","#isIncluded","renderOperation","renderOperations","jsonGenerator","path","camelCase","SchemaGenerator","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../package.json","../src/plugin.ts","../src/index.ts"],"sourcesContent":["import { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper, SchemaTree } from './SchemaMapper.ts'\nimport { schemaKeywords } from './SchemaMapper.ts'\n\n/**\n * Helper type to create a SchemaTree with a specific current schema type\n */\ntype SchemaTreeWithKeyword<K extends keyof SchemaKeywordMapper> = Omit<SchemaTree, 'current'> & {\n current: SchemaKeywordMapper[K]\n}\n\n/**\n * Handler context with parse method available via `this`\n */\nexport type HandlerContext<TOutput, TOptions> = {\n parse: (tree: SchemaTree, options: TOptions) => TOutput | null | undefined\n}\n\n/**\n * Handler function type for custom keyword processing\n * Handlers can access the parse function via `this.parse`\n * The tree.current is typed based on the keyword K\n */\nexport type KeywordHandler<TOutput, TOptions, K extends keyof SchemaKeywordMapper = keyof SchemaKeywordMapper> = (\n this: HandlerContext<TOutput, TOptions>,\n tree: SchemaTreeWithKeyword<K>,\n options: TOptions,\n) => TOutput | null | undefined\n\n/**\n * Configuration for createParser\n */\nexport type CreateParserConfig<TOutput, TOptions> = {\n /**\n * The keyword mapper that maps schema keywords to output generators\n */\n mapper: SchemaMapper<TOutput>\n\n /**\n * Custom handlers for specific schema keywords\n * These provide the implementation for complex types that need special processing\n *\n * Use function syntax (not arrow functions) to enable use of `this` keyword:\n * ```typescript\n * handlers: {\n * enum(tree, options, parse) {\n * // Implementation\n * }\n * }\n * ```\n *\n * Common keywords that typically need handlers:\n * - union: Combine multiple schemas into a union\n * - and: Combine multiple schemas into an intersection\n * - array: Handle array types with items\n * - object: Handle object types with properties\n * - enum: Handle enum types\n * - tuple: Handle tuple types\n * - const: Handle literal/const types\n * - ref: Handle references to other schemas\n * - string/number/integer: Handle primitives with constraints (min/max)\n * - matches: Handle regex patterns\n * - default/describe/optional/nullable: Handle modifiers\n */\n handlers: Partial<{\n [K in keyof SchemaKeywordMapper]: KeywordHandler<TOutput, TOptions, K>\n }>\n}\n\n/**\n * Creates a parser function that converts schema trees to output using the provided mapper and handlers\n *\n * This function provides a framework for building parsers by:\n * 1. Checking for custom handlers for each keyword\n * 2. Falling back to the mapper for simple keywords\n * 3. Providing utilities for common operations (finding siblings, etc.)\n *\n * The generated parser is recursive and can handle nested schemas.\n *\n * **Type Safety**: Each handler receives a `tree` parameter where `tree.current` is automatically\n * typed as the specific schema keyword type (e.g., `SchemaKeywordMapper['ref']` for the `ref` handler).\n * This means you can access `tree.current.args` with full type safety without needing `isKeyword` checks,\n * though such checks can still be used as runtime guards if desired.\n *\n * @template TOutput - The output type (e.g., string for Zod/Faker, ts.TypeNode for TypeScript)\n * @template TOptions - The parser options type\n * @param config - Configuration object containing mapper and handlers\n * @returns A parse function that converts SchemaTree to TOutput\n *\n * @example\n * ```ts\n * // Create a simple string-based parser\n * const parse = createParser({\n * mapper: zodKeywordMapper,\n * handlers: {\n * // tree.current is typed as SchemaKeywordMapper['union']\n * union(tree, options) {\n * const items = tree.current.args // args is correctly typed as Schema[]\n * .map(it => this.parse({ ...tree, current: it }, options))\n * .filter(Boolean)\n * return `z.union([${items.join(', ')}])`\n * },\n * // tree.current is typed as SchemaKeywordMapper['string']\n * string(tree, options) {\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * },\n * // tree.current is typed as SchemaKeywordMapper['ref']\n * ref(tree, options) {\n * // No need for isKeyword check - tree.current.args is already properly typed\n * return `Ref: ${tree.current.args.name}`\n * }\n * }\n * })\n * ```\n */\nexport function createParser<TOutput, TOptions extends Record<string, any>>(\n config: CreateParserConfig<TOutput, TOptions>,\n): (tree: SchemaTree, options: TOptions) => TOutput | null | undefined {\n const { mapper, handlers } = config\n\n function parse(tree: SchemaTree, options: TOptions): TOutput | null | undefined {\n const { current } = tree\n\n // Check if there's a custom handler for this keyword\n const handler = handlers[current.keyword as keyof SchemaKeywordMapper]\n if (handler) {\n // Create context object with parse method accessible via `this`\n const context: HandlerContext<TOutput, TOptions> = { parse }\n // We need to cast tree here because TypeScript can't statically verify\n // that the handler type matches the current keyword at runtime\n return handler.call(context, tree as any, options)\n }\n\n // Fall back to simple mapper lookup\n const value = mapper[current.keyword as keyof typeof mapper]\n\n if (!value) {\n return undefined\n }\n\n // For simple keywords without args, call the mapper directly\n if (current.keyword in mapper) {\n return value()\n }\n\n return undefined\n }\n\n return parse\n}\n\n/**\n * Helper to find a schema keyword in siblings\n * Useful in handlers when you need to find related schemas (e.g., min/max for string)\n *\n * @example\n * ```ts\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * ```\n */\nexport function findSchemaKeyword<K extends keyof SchemaKeywordMapper>(siblings: Schema[], keyword: K): SchemaKeywordMapper[K] | undefined {\n return SchemaGenerator.find(siblings, schemaKeywords[keyword]) as SchemaKeywordMapper[K] | undefined\n}\n","import type { AsyncEventEmitter } from '@internals/utils'\nimport { pascalCase } from '@internals/utils'\nimport type { FileNode } from '@kubb/ast/types'\nimport type { FileMetaBase, KubbEvents, Plugin, PluginDriver, PluginFactoryOptions } from '@kubb/core'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { renderOperation, renderOperations } from './utils.tsx'\n\nexport type OperationMethodResult<TFileMeta extends FileMetaBase> = Promise<FileNode<TFileMeta> | Array<FileNode<TFileMeta>> | null>\n\ntype Context<TOptions, TPluginOptions extends PluginFactoryOptions> = {\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n driver: PluginDriver\n events?: AsyncEventEmitter<KubbEvents>\n /**\n * Current plugin\n */\n plugin: Plugin<TPluginOptions>\n mode: 'single' | 'split'\n UNSTABLE_NAMING?: true\n}\n\nexport class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> {\n #options: TPluginOptions['resolvedOptions']\n #context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>\n\n constructor(options: TPluginOptions['resolvedOptions'], context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>) {\n this.#options = options\n this.#context = context\n }\n\n get options(): TPluginOptions['resolvedOptions'] {\n return this.#options\n }\n\n set options(options: TPluginOptions['resolvedOptions']) {\n this.#options = { ...this.#options, ...options }\n }\n\n get context(): Context<TPluginOptions['resolvedOptions'], TPluginOptions> {\n return this.#context\n }\n #matchesPattern(operation: Operation, method: HttpMethod, type: string, pattern: RegExp | string): boolean {\n switch (type) {\n case 'tag':\n return operation.getTags().some((tag) => tag.name.match(pattern))\n case 'operationId':\n return !!operation.getOperationId({ friendlyCase: true }).match(pattern)\n case 'path':\n return !!operation.path.match(pattern)\n case 'method':\n return !!method.match(pattern)\n case 'contentType':\n return !!operation.getContentType().match(pattern)\n default:\n return false\n }\n }\n\n getOptions(operation: Operation, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']> {\n const { override = [] } = this.context\n\n return override.find(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))?.options || {}\n }\n\n #isExcluded(operation: Operation, method: HttpMethod): boolean {\n const { exclude = [] } = this.context\n\n return exclude.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n #isIncluded(operation: Operation, method: HttpMethod): boolean {\n const { include = [] } = this.context\n\n return include.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n getSchemas(\n operation: Operation,\n {\n resolveName = (name) => name,\n }: {\n resolveName?: (name: string) => string\n } = {},\n ): OperationSchemas {\n const operationId = operation.getOperationId({ friendlyCase: true })\n const operationName = pascalCase(operationId)\n\n const resolveKeys = (schema?: SchemaObject) => (schema?.properties ? Object.keys(schema.properties) : undefined)\n\n const pathParamsSchema = this.context.oas.getParametersSchema(operation, 'path')\n const queryParamsSchema = this.context.oas.getParametersSchema(operation, 'query')\n const headerParamsSchema = this.context.oas.getParametersSchema(operation, 'header')\n const requestSchema = this.context.oas.getRequestSchema(operation)\n const statusCodes = operation.getResponseStatusCodes().map((statusCode) => {\n const name = statusCode === 'default' ? 'error' : statusCode\n const schema = this.context.oas.getResponseSchema(operation, statusCode)\n const keys = resolveKeys(schema)\n\n return {\n name: this.context.UNSTABLE_NAMING ? resolveName(pascalCase(`${operationId} status ${name}`)) : resolveName(pascalCase(`${operationId} ${name}`)),\n description: (operation.getResponseByStatusCode(statusCode) as OasTypes.ResponseObject)?.description,\n schema,\n operation,\n operationName,\n statusCode: name === 'error' ? undefined : Number(statusCode),\n keys,\n keysToOmit: keys?.filter((key) => (schema?.properties?.[key] as OasTypes.SchemaObject)?.writeOnly),\n }\n })\n\n const successful = statusCodes.filter((item) => item.statusCode?.toString().startsWith('2'))\n const errors = statusCodes.filter((item) => item.statusCode?.toString().startsWith('4') || item.statusCode?.toString().startsWith('5'))\n\n const request = withRequiredRequestBodySchema(\n requestSchema\n ? {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} RequestData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),\n description: (operation.schema.requestBody as OasTypes.RequestBodyObject)?.description,\n operation,\n operationName,\n schema: requestSchema,\n keys: resolveKeys(requestSchema),\n keysToOmit: resolveKeys(requestSchema)?.filter((key) => (requestSchema.properties?.[key] as OasTypes.SchemaObject)?.readOnly),\n }\n : undefined,\n )\n\n return {\n pathParams: pathParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} PathParams`)),\n operation,\n operationName,\n schema: pathParamsSchema,\n keys: resolveKeys(pathParamsSchema),\n }\n : undefined,\n queryParams: queryParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} QueryParams`)),\n operation,\n operationName,\n schema: queryParamsSchema,\n keys: resolveKeys(queryParamsSchema) || [],\n }\n : undefined,\n headerParams: headerParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} HeaderParams`)),\n operation,\n operationName,\n schema: headerParamsSchema,\n keys: resolveKeys(headerParamsSchema),\n }\n : undefined,\n request,\n response: {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} ResponseData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),\n operation,\n operationName,\n schema: {\n oneOf: successful.map((item) => ({ ...item.schema, $ref: item.name })) || undefined,\n } as SchemaObject,\n },\n responses: successful,\n errors,\n statusCodes,\n }\n }\n\n async getOperations(): Promise<Array<{ path: string; method: HttpMethod; operation: Operation }>> {\n const { oas } = this.context\n\n const paths = oas.getPaths()\n\n return Object.entries(paths).flatMap(([path, methods]) =>\n Object.entries(methods)\n .map((values) => {\n const [method, operation] = values as [HttpMethod, Operation]\n if (this.#isExcluded(operation, method)) {\n return null\n }\n\n if (this.context.include && !this.#isIncluded(operation, method)) {\n return null\n }\n\n return operation ? { path, method: method as HttpMethod, operation } : null\n })\n .filter((x): x is { path: string; method: HttpMethod; operation: Operation } => x !== null),\n )\n }\n\n async build(...generators: Array<Generator<TPluginOptions>>): Promise<Array<FileNode<TFileMeta>>> {\n const operations = await this.getOperations()\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const results: Array<FileNode<TFileMeta>> = []\n\n for (const generator of generators) {\n if (!('type' in generator)) {\n continue\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions> | CoreGenerator<TPluginOptions>\n\n const opResultsFlat: Array<FileNode<TFileMeta>> = []\n\n for (const { operation, method } of operations) {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await renderOperation(operation, {\n config: this.context.driver.config,\n driver: this.context.driver,\n oas: this.context.oas,\n mode: this.context.mode,\n Component: v1Generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n } else {\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.driver.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n\n opResultsFlat.push(...([result ?? []].flat() as Array<FileNode<TFileMeta>>))\n }\n }\n\n if (v1Generator.type === 'react') {\n await renderOperations(\n operations.map((op) => op.operation),\n {\n driver: this.context.driver,\n config: this.context.driver.config,\n oas: this.context.oas,\n mode: this.context.mode,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n continue\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.driver.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n results.push(...opResultsFlat, ...((operationsResult ?? []) as unknown as Array<FileNode<TFileMeta>>))\n }\n\n return results\n }\n}\n","","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, createPlugin, type KubbEvents, type UserGroup } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\nimport { version } from '../package.json'\nimport { jsonGenerator } from './generators'\nimport { OperationGenerator } from './OperationGenerator.ts'\nimport { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { PluginOas } from './types.ts'\n\nexport const pluginOasName = 'plugin-oas' satisfies PluginOas['name']\n\nexport const pluginOas = createPlugin<PluginOas>((options) => {\n const {\n output = {\n path: 'schemas',\n },\n group,\n validate = true,\n generators = [jsonGenerator],\n serverIndex,\n serverVariables,\n contentType,\n oasClass,\n discriminator = 'strict',\n collisionDetection = false,\n } = options\n\n const getOas = async ({ validate, config, events }: { validate: boolean; config: Config; events: AsyncEventEmitter<KubbEvents> }): Promise<Oas> => {\n // needs to be in a different variable or the catch here will not work(return of a promise instead)\n const oas = await parseFromConfig(config, oasClass)\n\n oas.setOptions({\n contentType,\n discriminator,\n collisionDetection,\n })\n\n try {\n if (validate) {\n await oas.validate()\n }\n } catch (er) {\n const caughtError = er as Error\n const errorTimestamp = new Date()\n const error = new Error('OAS Validation failed', {\n cause: caughtError,\n })\n\n events.emit('info', caughtError.message)\n events.emit('debug', {\n date: errorTimestamp,\n logs: [`✗ ${error.message}`, caughtError.message],\n })\n }\n\n return oas\n }\n\n return {\n name: pluginOasName,\n version,\n options: {\n output,\n validate,\n discriminator,\n ...options,\n exclude: [],\n override: [],\n },\n inject() {\n const config = this.config\n const events = this.events\n\n let oas: Oas\n\n return {\n async getOas({ validate = false } = {}) {\n if (!oas) {\n oas = await getOas({ config, events, validate })\n }\n\n return oas\n },\n async getBaseURL() {\n const oas = await getOas({ config, events, validate: false })\n if (serverIndex === undefined) {\n return undefined\n }\n\n const server = oas.api.servers?.at(serverIndex)\n if (!server?.url) {\n return undefined\n }\n\n return resolveServerUrl(\n server as { url: string; variables?: Record<string, { default?: string | number; enum?: (string | number)[] }> },\n serverVariables,\n )\n },\n }\n },\n resolvePath(baseName, pathMode, options) {\n const root = this.root\n const mode = pathMode ?? this.getMode(output)\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: UserGroup['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\n }\n\n return path.resolve(root, output.path, baseName)\n },\n async buildStart() {\n const oas = await this.getOas({ validate })\n\n if (!output || generators.length === 0) {\n return\n }\n\n await oas.dereference()\n\n const schemaGenerator = new SchemaGenerator(\n {\n unknownType: 'unknown',\n emptySchemaType: 'unknown',\n dateType: 'date',\n transformers: {},\n ...this.plugin.options,\n },\n {\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override: undefined,\n mode: 'split',\n output: output.path,\n },\n )\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude: undefined,\n include: undefined,\n override: undefined,\n mode: 'split',\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n\n await this.upsertFile(...operationFiles)\n },\n }\n})\n","import type { PluginFactoryOptions } from '@kubb/core'\nimport { createGenerator as _createGenerator } from './generators/createGenerator.ts'\nimport { createReactGenerator as _createReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator as _Generator } from './generators/types.ts'\n\nexport type { CreateParserConfig, KeywordHandler } from './createParser.ts'\nexport { createParser, findSchemaKeyword } from './createParser.ts'\nexport type { OperationMethodResult } from './OperationGenerator.ts'\nexport { OperationGenerator } from './OperationGenerator.ts'\nexport { pluginOas, pluginOasName } from './plugin.ts'\nexport type {\n GetSchemaGeneratorOptions,\n SchemaGeneratorBuildOptions,\n SchemaGeneratorOptions,\n SchemaMethodResult,\n} from './SchemaGenerator.ts'\nexport { SchemaGenerator } from './SchemaGenerator.ts'\nexport type {\n Schema,\n SchemaKeyword,\n SchemaKeywordBase,\n SchemaKeywordMapper,\n SchemaMapper,\n SchemaTree,\n} from './SchemaMapper.ts'\nexport { isKeyword, schemaKeywords } from './SchemaMapper.ts'\nexport type * from './types.ts'\nexport { renderOperation, renderOperations, renderSchema } from './utils.tsx'\n\n/**\n * @deprecated use `import { createGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createGenerator = _createGenerator\n\n/**\n * @deprecated use `import { createReactGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createReactGenerator = _createReactGenerator\n\n/**\n * @deprecated use `import { Generator } from '@kubb/plugin-oas/generators'`\n */\nexport type Generator<TOptions extends PluginFactoryOptions> = _Generator<TOptions>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqHA,SAAgB,aACd,QACqE;CACrE,MAAM,EAAE,QAAQ,aAAa;CAE7B,SAAS,MAAM,MAAkB,SAA+C;EAC9E,MAAM,EAAE,YAAY;EAGpB,MAAM,UAAU,SAAS,QAAQ;AACjC,MAAI,SAAS;GAEX,MAAM,UAA6C,EAAE,OAAO;AAG5D,UAAO,QAAQ,KAAK,SAAS,MAAa,QAAQ;;EAIpD,MAAM,QAAQ,OAAO,QAAQ;AAE7B,MAAI,CAAC,MACH;AAIF,MAAI,QAAQ,WAAW,OACrB,QAAO,OAAO;;AAMlB,QAAO;;;;;;;;;;;;;AAcT,SAAgB,kBAAuD,UAAoB,SAAgD;AACzI,QAAOA,oBAAAA,gBAAgB,KAAK,UAAUC,qBAAAA,eAAe,SAAS;;;;ACvIhE,IAAa,qBAAb,MAAmJ;CACjJ;CACA;CAEA,YAAY,SAA4C,SAAqE;AAC3H,QAAA,UAAgB;AAChB,QAAA,UAAgB;;CAGlB,IAAI,UAA6C;AAC/C,SAAO,MAAA;;CAGT,IAAI,QAAQ,SAA4C;AACtD,QAAA,UAAgB;GAAE,GAAG,MAAA;GAAe,GAAG;GAAS;;CAGlD,IAAI,UAAsE;AACxE,SAAO,MAAA;;CAET,gBAAgB,WAAsB,QAAoB,MAAc,SAAmC;AACzG,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,UAAU,SAAS,CAAC,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,CAAC;GACnE,KAAK,cACH,QAAO,CAAC,CAAC,UAAU,eAAe,EAAE,cAAc,MAAM,CAAC,CAAC,MAAM,QAAQ;GAC1E,KAAK,OACH,QAAO,CAAC,CAAC,UAAU,KAAK,MAAM,QAAQ;GACxC,KAAK,SACH,QAAO,CAAC,CAAC,OAAO,MAAM,QAAQ;GAChC,KAAK,cACH,QAAO,CAAC,CAAC,UAAU,gBAAgB,CAAC,MAAM,QAAQ;GACpD,QACE,QAAO;;;CAIb,WAAW,WAAsB,QAAgE;EAC/F,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK;AAE/B,SAAO,SAAS,MAAM,EAAE,SAAS,WAAW,MAAA,eAAqB,WAAW,QAAQ,MAAM,QAAQ,CAAC,EAAE,WAAW,EAAE;;CAGpH,YAAY,WAAsB,QAA6B;EAC7D,MAAM,EAAE,UAAU,EAAE,KAAK,KAAK;AAE9B,SAAO,QAAQ,MAAM,EAAE,SAAS,WAAW,MAAA,eAAqB,WAAW,QAAQ,MAAM,QAAQ,CAAC;;CAGpG,YAAY,WAAsB,QAA6B;EAC7D,MAAM,EAAE,UAAU,EAAE,KAAK,KAAK;AAE9B,SAAO,QAAQ,MAAM,EAAE,SAAS,WAAW,MAAA,eAAqB,WAAW,QAAQ,MAAM,QAAQ,CAAC;;CAGpG,WACE,WACA,EACE,eAAe,SAAS,SAGtB,EAAE,EACY;EAClB,MAAM,cAAc,UAAU,eAAe,EAAE,cAAc,MAAM,CAAC;EACpE,MAAM,gBAAgBI,kBAAAA,WAAW,YAAY;EAE7C,MAAM,eAAe,WAA2B,QAAQ,aAAa,OAAO,KAAK,OAAO,WAAW,GAAG,KAAA;EAEtG,MAAM,mBAAmB,KAAK,QAAQ,IAAI,oBAAoB,WAAW,OAAO;EAChF,MAAM,oBAAoB,KAAK,QAAQ,IAAI,oBAAoB,WAAW,QAAQ;EAClF,MAAM,qBAAqB,KAAK,QAAQ,IAAI,oBAAoB,WAAW,SAAS;EACpF,MAAM,gBAAgB,KAAK,QAAQ,IAAI,iBAAiB,UAAU;EAClE,MAAM,cAAc,UAAU,wBAAwB,CAAC,KAAK,eAAe;GACzE,MAAM,OAAO,eAAe,YAAY,UAAU;GAClD,MAAM,SAAS,KAAK,QAAQ,IAAI,kBAAkB,WAAW,WAAW;GACxE,MAAM,OAAO,YAAY,OAAO;AAEhC,UAAO;IACL,MAAM,KAAK,QAAQ,kBAAkB,YAAYA,kBAAAA,WAAW,GAAG,YAAY,UAAU,OAAO,CAAC,GAAG,YAAYA,kBAAAA,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACjJ,aAAc,UAAU,wBAAwB,WAAW,EAA8B;IACzF;IACA;IACA;IACA,YAAY,SAAS,UAAU,KAAA,IAAY,OAAO,WAAW;IAC7D;IACA,YAAY,MAAM,QAAQ,SAAS,QAAQ,aAAa,OAAgC,UAAU;IACnG;IACD;EAEF,MAAM,aAAa,YAAY,QAAQ,SAAS,KAAK,YAAY,UAAU,CAAC,WAAW,IAAI,CAAC;EAC5F,MAAM,SAAS,YAAY,QAAQ,SAAS,KAAK,YAAY,UAAU,CAAC,WAAW,IAAI,IAAI,KAAK,YAAY,UAAU,CAAC,WAAW,IAAI,CAAC;EAEvI,MAAM,UAAUC,oBAAAA,8BACd,gBACI;GACE,MAAM,KAAK,QAAQ,kBACf,YAAYD,kBAAAA,WAAW,GAAG,YAAY,cAAc,CAAC,GACrD,YAAYA,kBAAAA,WAAW,GAAG,YAAY,GAAG,UAAU,WAAW,QAAQ,iBAAiB,oBAAoB,CAAC;GAChH,aAAc,UAAU,OAAO,aAA4C;GAC3E;GACA;GACA,QAAQ;GACR,MAAM,YAAY,cAAc;GAChC,YAAY,YAAY,cAAc,EAAE,QAAQ,SAAS,cAAc,aAAa,OAAgC,SAAS;GAC9H,GACD,KAAA,EACL;AAED,SAAO;GACL,YAAY,mBACR;IACE,MAAM,YAAYA,kBAAAA,WAAW,GAAG,YAAY,aAAa,CAAC;IAC1D;IACA;IACA,QAAQ;IACR,MAAM,YAAY,iBAAiB;IACpC,GACD,KAAA;GACJ,aAAa,oBACT;IACE,MAAM,YAAYA,kBAAAA,WAAW,GAAG,YAAY,cAAc,CAAC;IAC3D;IACA;IACA,QAAQ;IACR,MAAM,YAAY,kBAAkB,IAAI,EAAE;IAC3C,GACD,KAAA;GACJ,cAAc,qBACV;IACE,MAAM,YAAYA,kBAAAA,WAAW,GAAG,YAAY,eAAe,CAAC;IAC5D;IACA;IACA,QAAQ;IACR,MAAM,YAAY,mBAAmB;IACtC,GACD,KAAA;GACJ;GACA,UAAU;IACR,MAAM,KAAK,QAAQ,kBACf,YAAYA,kBAAAA,WAAW,GAAG,YAAY,eAAe,CAAC,GACtD,YAAYA,kBAAAA,WAAW,GAAG,YAAY,GAAG,UAAU,WAAW,QAAQ,kBAAkB,qBAAqB,CAAC;IAClH;IACA;IACA,QAAQ,EACN,OAAO,WAAW,KAAK,UAAU;KAAE,GAAG,KAAK;KAAQ,MAAM,KAAK;KAAM,EAAE,IAAI,KAAA,GAC3E;IACF;GACD,WAAW;GACX;GACA;GACD;;CAGH,MAAM,gBAA4F;EAChG,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,QAAQ,IAAI,UAAU;AAE5B,SAAO,OAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM,aAC3C,OAAO,QAAQ,QAAQ,CACpB,KAAK,WAAW;GACf,MAAM,CAAC,QAAQ,aAAa;AAC5B,OAAI,MAAA,WAAiB,WAAW,OAAO,CACrC,QAAO;AAGT,OAAI,KAAK,QAAQ,WAAW,CAAC,MAAA,WAAiB,WAAW,OAAO,CAC9D,QAAO;AAGT,UAAO,YAAY;IAAE;IAAc;IAAsB;IAAW,GAAG;IACvE,CACD,QAAQ,MAAuE,MAAM,KAAK,CAC9F;;CAGH,MAAM,MAAM,GAAG,YAAmF;EAChG,MAAM,aAAa,MAAM,KAAK,eAAe;AAE7C,OAAK,QAAQ,QAAQ,KAAK,SAAS;GACjC,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,YAAY,WAAW,OAAO,cAAc,mBAAmB,WAAW,SAAS;GAC3F,CAAC;EAEF,MAAM,UAAsC,EAAE;AAE9C,OAAK,MAAM,aAAa,YAAY;AAClC,OAAI,EAAE,UAAU,WACd;GAIF,MAAM,cAAc;GAEpB,MAAM,gBAA4C,EAAE;AAEpD,QAAK,MAAM,EAAE,WAAW,YAAY,YAAY;IAC9C,MAAM,UAAU,KAAK,WAAW,WAAW,OAAO;AAElD,QAAI,YAAY,SAAS,QACvB,OAAMI,oBAAAA,gBAAgB,WAAW;KAC/B,QAAQ,KAAK,QAAQ,OAAO;KAC5B,QAAQ,KAAK,QAAQ;KACrB,KAAK,KAAK,QAAQ;KAClB,MAAM,KAAK,QAAQ;KACnB,WAAW,YAAY;KACvB,WAAW;KACX,QAAQ;MACN,GAAG,KAAK,QAAQ;MAChB,SAAS;OACP,GAAG,KAAK;OACR,GAAG;OACJ;MACF;KACF,CAAC;SACG;KACL,MAAM,SAAS,MAAM,YAAY,YAAY;MAC3C,WAAW;MACX,QAAQ,KAAK,QAAQ,OAAO;MAC5B;MACA,QAAQ;OACN,GAAG,KAAK,QAAQ;OAChB,SAAS;QACP,GAAG,KAAK;QACR,GAAG;QACJ;OACF;MACF,CAAC;AAEF,mBAAc,KAAK,GAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAgC;;;AAIhF,OAAI,YAAY,SAAS,SAAS;AAChC,UAAMC,oBAAAA,iBACJ,WAAW,KAAK,OAAO,GAAG,UAAU,EACpC;KACE,QAAQ,KAAK,QAAQ;KACrB,QAAQ,KAAK,QAAQ,OAAO;KAC5B,KAAK,KAAK,QAAQ;KAClB,MAAM,KAAK,QAAQ;KACnB,WAAW,YAAY;KACvB,WAAW;KACX,QAAQ,KAAK,QAAQ;KACtB,CACF;AAED;;GAGF,MAAM,mBAAmB,MAAM,YAAY,aAAa;IACtD,WAAW;IACX,QAAQ,KAAK,QAAQ,OAAO;IAC5B,YAAY,WAAW,KAAK,OAAO,GAAG,UAAU;IAChD,QAAQ,KAAK,QAAQ;IACtB,CAAC;AAEF,WAAQ,KAAK,GAAG,eAAe,GAAK,oBAAoB,EAAE,CAA4C;;AAGxG,SAAO;;;;;;;;AEtRX,MAAa,gBAAgB;AAE7B,MAAa,aAAA,GAAA,WAAA,eAAqC,YAAY;CAC5D,MAAM,EACJ,SAAS,EACP,MAAM,WACP,EACD,OACA,WAAW,MACX,aAAa,CAACC,mBAAAA,cAAc,EAC5B,aACA,iBACA,aACA,UACA,gBAAgB,UAChB,qBAAqB,UACnB;CAEJ,MAAM,SAAS,OAAO,EAAE,UAAU,QAAQ,aAAyG;EAEjJ,MAAM,MAAM,OAAA,GAAA,UAAA,iBAAsB,QAAQ,SAAS;AAEnD,MAAI,WAAW;GACb;GACA;GACA;GACD,CAAC;AAEF,MAAI;AACF,OAAI,SACF,OAAM,IAAI,UAAU;WAEf,IAAI;GACX,MAAM,cAAc;GACpB,MAAM,iCAAiB,IAAI,MAAM;GACjC,MAAM,QAAQ,IAAI,MAAM,yBAAyB,EAC/C,OAAO,aACR,CAAC;AAEF,UAAO,KAAK,QAAQ,YAAY,QAAQ;AACxC,UAAO,KAAK,SAAS;IACnB,MAAM;IACN,MAAM,CAAC,KAAK,MAAM,WAAW,YAAY,QAAQ;IAClD,CAAC;;AAGJ,SAAO;;AAGT,QAAO;EACL,MAAM;EACN;EACA,SAAS;GACP;GACA;GACA;GACA,GAAG;GACH,SAAS,EAAE;GACX,UAAU,EAAE;GACb;EACD,SAAS;GACP,MAAM,SAAS,KAAK;GACpB,MAAM,SAAS,KAAK;GAEpB,IAAI;AAEJ,UAAO;IACL,MAAM,OAAO,EAAE,WAAW,UAAU,EAAE,EAAE;AACtC,SAAI,CAAC,IACH,OAAM,MAAM,OAAO;MAAE;MAAQ;MAAQ;MAAU,CAAC;AAGlD,YAAO;;IAET,MAAM,aAAa;KACjB,MAAM,MAAM,MAAM,OAAO;MAAE;MAAQ;MAAQ,UAAU;MAAO,CAAC;AAC7D,SAAI,gBAAgB,KAAA,EAClB;KAGF,MAAM,SAAS,IAAI,IAAI,SAAS,GAAG,YAAY;AAC/C,SAAI,CAAC,QAAQ,IACX;AAGF,aAAA,GAAA,UAAA,kBACE,QACA,gBACD;;IAEJ;;EAEH,YAAY,UAAU,UAAU,SAAS;GACvC,MAAM,OAAO,KAAK;AAGlB,QAFa,YAAY,KAAK,QAAQ,OAAO,MAEhC;;;;;AAKX,UAAOC,UAAAA,QAAK,QAAQ,MAAM,OAAO,KAAK;AAGxC,OAAI,UAAU,SAAS,OAAO,QAAQ,SAAS,OAAO,MAAM;IAC1D,MAAM,YAA+B,OAAO,OACxC,MAAM,QACL,QAAQ;AACP,SAAI,OAAO,SAAS,OAClB,QAAO,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC;AAEjC,YAAO,GAAGC,kBAAAA,UAAU,IAAI,MAAM,CAAC;;AAGrC,WAAOD,UAAAA,QAAK,QACV,MACA,OAAO,MACP,UAAU,EACR,OAAO,MAAM,SAAS,SAAS,QAAQ,MAAM,OAAQ,QAAQ,MAAM,KACpE,CAAC,EACF,SACD;;AAGH,UAAOA,UAAAA,QAAK,QAAQ,MAAM,OAAO,MAAM,SAAS;;EAElD,MAAM,aAAa;GACjB,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,UAAU,CAAC;AAE3C,OAAI,CAAC,UAAU,WAAW,WAAW,EACnC;AAGF,SAAM,IAAI,aAAa;GAuBvB,MAAM,cAAc,MArBI,IAAIE,oBAAAA,gBAC1B;IACE,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,cAAc,EAAE;IAChB,GAAG,KAAK,OAAO;IAChB,EACD;IACE;IACA,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb;IACA,SAAS,KAAA;IACT,UAAU,KAAA;IACV,MAAM;IACN,QAAQ,OAAO;IAChB,CACF,CAEyC,MAAM,GAAG,WAAW;AAC9D,SAAM,KAAK,WAAW,GAAG,YAAY;GAcrC,MAAM,iBAAiB,MAZI,IAAI,mBAAmB,KAAK,OAAO,SAAS;IACrE;IACA,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb;IACA,SAAS,KAAA;IACT,SAAS,KAAA;IACT,UAAU,KAAA;IACV,MAAM;IACP,CAAC,CAE8C,MAAM,GAAG,WAAW;AAEpE,SAAM,KAAK,WAAW,GAAG,eAAe;;EAE3C;EACD;;;;;;AC5JF,MAAa,kBAAkBC,mBAAAA;;;;AAK/B,MAAa,uBAAuBC,mBAAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { t as __name } from "./chunk--u3MIqq1.js";
|
|
2
|
-
import { C as Resolver, S as ResolvePathOptions, _ as Options, a as createReactGenerator$1, b as Ref, c as SchemaGeneratorBuildOptions, d as OperationGenerator, f as OperationMethodResult, g as OperationSchemas, h as OperationSchema, i as ReactGenerator, l as SchemaGeneratorOptions, m as Include, n as createGenerator$1, o as GetSchemaGeneratorOptions, p as Exclude, r as Generator$2, s as SchemaGenerator, u as SchemaMethodResult, v as Override, x as Refs, y as PluginOas } from "./createGenerator-
|
|
3
|
-
import { a as SchemaMapper, c as schemaKeywords, i as SchemaKeywordMapper, n as SchemaKeyword, o as SchemaTree, r as SchemaKeywordBase, s as isKeyword, t as Schema } from "./SchemaMapper-
|
|
4
|
-
import { Operation, SchemaObject } from "@kubb/oas";
|
|
2
|
+
import { C as Resolver, S as ResolvePathOptions, _ as Options, a as createReactGenerator$1, b as Ref, c as SchemaGeneratorBuildOptions, d as OperationGenerator, f as OperationMethodResult, g as OperationSchemas, h as OperationSchema, i as ReactGenerator, l as SchemaGeneratorOptions, m as Include, n as createGenerator$1, o as GetSchemaGeneratorOptions, p as Exclude, r as Generator$2, s as SchemaGenerator, u as SchemaMethodResult, v as Override, x as Refs, y as PluginOas } from "./createGenerator-CRvsKIrl.js";
|
|
3
|
+
import { a as SchemaMapper, c as schemaKeywords, i as SchemaKeywordMapper, n as SchemaKeyword, o as SchemaTree, r as SchemaKeywordBase, s as isKeyword, t as Schema } from "./SchemaMapper-KHABtXIZ.js";
|
|
4
|
+
import { Oas, Operation, SchemaObject } from "@kubb/oas";
|
|
5
5
|
import * as _$_kubb_core0 from "@kubb/core";
|
|
6
|
-
import { Config, Plugin, PluginFactoryOptions } from "@kubb/core";
|
|
7
|
-
import { Fabric } from "@kubb/react-fabric/types";
|
|
6
|
+
import { Config, Plugin, PluginDriver, PluginFactoryOptions } from "@kubb/core";
|
|
8
7
|
|
|
9
8
|
//#region src/createParser.d.ts
|
|
10
9
|
/**
|
|
@@ -130,8 +129,10 @@ declare const pluginOas: (options?: Options | undefined) => _$_kubb_core0.UserPl
|
|
|
130
129
|
//#region src/utils.d.ts
|
|
131
130
|
type BuildOperationsV1Options<TOptions extends PluginFactoryOptions> = {
|
|
132
131
|
config: Config;
|
|
133
|
-
|
|
132
|
+
driver: PluginDriver;
|
|
134
133
|
plugin: Plugin<TOptions>;
|
|
134
|
+
oas: Oas;
|
|
135
|
+
mode: 'single' | 'split';
|
|
135
136
|
Component: ReactGenerator<TOptions>['Operations'];
|
|
136
137
|
generator: Omit<OperationGenerator<TOptions>, 'build'>;
|
|
137
138
|
};
|
|
@@ -141,8 +142,10 @@ type BuildOperationsV1Options<TOptions extends PluginFactoryOptions> = {
|
|
|
141
142
|
declare function renderOperations<TOptions extends PluginFactoryOptions>(operations: Array<Operation>, options: BuildOperationsV1Options<TOptions>): Promise<void>;
|
|
142
143
|
type BuildOperationV1Options<TOptions extends PluginFactoryOptions> = {
|
|
143
144
|
config: Config;
|
|
144
|
-
|
|
145
|
+
driver: PluginDriver;
|
|
145
146
|
plugin: Plugin<TOptions>;
|
|
147
|
+
oas: Oas;
|
|
148
|
+
mode: 'single' | 'split';
|
|
146
149
|
Component: ReactGenerator<TOptions>['Operation'];
|
|
147
150
|
generator: Omit<OperationGenerator<TOptions>, 'build'>;
|
|
148
151
|
};
|
|
@@ -152,8 +155,10 @@ type BuildOperationV1Options<TOptions extends PluginFactoryOptions> = {
|
|
|
152
155
|
declare function renderOperation<TOptions extends PluginFactoryOptions>(operation: Operation, options: BuildOperationV1Options<TOptions>): Promise<void>;
|
|
153
156
|
type BuildSchemaV1Options<TOptions extends PluginFactoryOptions> = {
|
|
154
157
|
config: Config;
|
|
155
|
-
|
|
158
|
+
driver: PluginDriver;
|
|
156
159
|
plugin: Plugin<TOptions>;
|
|
160
|
+
oas: Oas;
|
|
161
|
+
mode: 'single' | 'split';
|
|
157
162
|
Component: ReactGenerator<TOptions>['Schema'];
|
|
158
163
|
generator: Omit<SchemaGenerator<SchemaGeneratorOptions, TOptions>, 'build'>;
|
|
159
164
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk--u3MIqq1.js";
|
|
2
|
-
import { n as createReactGenerator$1, r as createGenerator$1, t as jsonGenerator } from "./generators-
|
|
2
|
+
import { n as createReactGenerator$1, r as createGenerator$1, t as jsonGenerator } from "./generators-rtdUsxQh.js";
|
|
3
3
|
import { i as pascalCase, r as camelCase } from "./getFooter-Dz4u5Mg4.js";
|
|
4
|
-
import { a as renderOperations, i as renderOperation, n as withRequiredRequestBodySchema, o as renderSchema, r as SchemaGenerator } from "./requestBody-
|
|
4
|
+
import { a as renderOperations, i as renderOperation, n as withRequiredRequestBodySchema, o as renderSchema, r as SchemaGenerator } from "./requestBody-DMoaqEak.js";
|
|
5
5
|
import { n as schemaKeywords, t as isKeyword } from "./SchemaMapper-CqMkO2T1.js";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { parseFromConfig, resolveServerUrl } from "@kubb/oas";
|
|
@@ -227,7 +227,9 @@ var OperationGenerator = class {
|
|
|
227
227
|
const options = this.getOptions(operation, method);
|
|
228
228
|
if (v1Generator.type === "react") await renderOperation(operation, {
|
|
229
229
|
config: this.context.driver.config,
|
|
230
|
-
|
|
230
|
+
driver: this.context.driver,
|
|
231
|
+
oas: this.context.oas,
|
|
232
|
+
mode: this.context.mode,
|
|
231
233
|
Component: v1Generator.Operation,
|
|
232
234
|
generator: this,
|
|
233
235
|
plugin: {
|
|
@@ -256,8 +258,10 @@ var OperationGenerator = class {
|
|
|
256
258
|
}
|
|
257
259
|
if (v1Generator.type === "react") {
|
|
258
260
|
await renderOperations(operations.map((op) => op.operation), {
|
|
259
|
-
|
|
261
|
+
driver: this.context.driver,
|
|
260
262
|
config: this.context.driver.config,
|
|
263
|
+
oas: this.context.oas,
|
|
264
|
+
mode: this.context.mode,
|
|
261
265
|
Component: v1Generator.Operations,
|
|
262
266
|
generator: this,
|
|
263
267
|
plugin: this.context.plugin
|
|
@@ -277,7 +281,7 @@ var OperationGenerator = class {
|
|
|
277
281
|
};
|
|
278
282
|
//#endregion
|
|
279
283
|
//#region package.json
|
|
280
|
-
var version = "5.0.0-alpha.
|
|
284
|
+
var version = "5.0.0-alpha.33";
|
|
281
285
|
//#endregion
|
|
282
286
|
//#region src/plugin.ts
|
|
283
287
|
const pluginOasName = "plugin-oas";
|
|
@@ -369,7 +373,6 @@ const pluginOas = createPlugin((options) => {
|
|
|
369
373
|
transformers: {},
|
|
370
374
|
...this.plugin.options
|
|
371
375
|
}, {
|
|
372
|
-
fabric: this.fabric,
|
|
373
376
|
oas,
|
|
374
377
|
driver: this.driver,
|
|
375
378
|
events: this.events,
|
|
@@ -382,7 +385,6 @@ const pluginOas = createPlugin((options) => {
|
|
|
382
385
|
}).build(...generators);
|
|
383
386
|
await this.upsertFile(...schemaFiles);
|
|
384
387
|
const operationFiles = await new OperationGenerator(this.plugin.options, {
|
|
385
|
-
fabric: this.fabric,
|
|
386
388
|
oas,
|
|
387
389
|
driver: this.driver,
|
|
388
390
|
events: this.events,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#options","#context","#matchesPattern","#isExcluded","#isIncluded","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../package.json","../src/plugin.ts","../src/index.ts"],"sourcesContent":["import { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper, SchemaTree } from './SchemaMapper.ts'\nimport { schemaKeywords } from './SchemaMapper.ts'\n\n/**\n * Helper type to create a SchemaTree with a specific current schema type\n */\ntype SchemaTreeWithKeyword<K extends keyof SchemaKeywordMapper> = Omit<SchemaTree, 'current'> & {\n current: SchemaKeywordMapper[K]\n}\n\n/**\n * Handler context with parse method available via `this`\n */\nexport type HandlerContext<TOutput, TOptions> = {\n parse: (tree: SchemaTree, options: TOptions) => TOutput | null | undefined\n}\n\n/**\n * Handler function type for custom keyword processing\n * Handlers can access the parse function via `this.parse`\n * The tree.current is typed based on the keyword K\n */\nexport type KeywordHandler<TOutput, TOptions, K extends keyof SchemaKeywordMapper = keyof SchemaKeywordMapper> = (\n this: HandlerContext<TOutput, TOptions>,\n tree: SchemaTreeWithKeyword<K>,\n options: TOptions,\n) => TOutput | null | undefined\n\n/**\n * Configuration for createParser\n */\nexport type CreateParserConfig<TOutput, TOptions> = {\n /**\n * The keyword mapper that maps schema keywords to output generators\n */\n mapper: SchemaMapper<TOutput>\n\n /**\n * Custom handlers for specific schema keywords\n * These provide the implementation for complex types that need special processing\n *\n * Use function syntax (not arrow functions) to enable use of `this` keyword:\n * ```typescript\n * handlers: {\n * enum(tree, options, parse) {\n * // Implementation\n * }\n * }\n * ```\n *\n * Common keywords that typically need handlers:\n * - union: Combine multiple schemas into a union\n * - and: Combine multiple schemas into an intersection\n * - array: Handle array types with items\n * - object: Handle object types with properties\n * - enum: Handle enum types\n * - tuple: Handle tuple types\n * - const: Handle literal/const types\n * - ref: Handle references to other schemas\n * - string/number/integer: Handle primitives with constraints (min/max)\n * - matches: Handle regex patterns\n * - default/describe/optional/nullable: Handle modifiers\n */\n handlers: Partial<{\n [K in keyof SchemaKeywordMapper]: KeywordHandler<TOutput, TOptions, K>\n }>\n}\n\n/**\n * Creates a parser function that converts schema trees to output using the provided mapper and handlers\n *\n * This function provides a framework for building parsers by:\n * 1. Checking for custom handlers for each keyword\n * 2. Falling back to the mapper for simple keywords\n * 3. Providing utilities for common operations (finding siblings, etc.)\n *\n * The generated parser is recursive and can handle nested schemas.\n *\n * **Type Safety**: Each handler receives a `tree` parameter where `tree.current` is automatically\n * typed as the specific schema keyword type (e.g., `SchemaKeywordMapper['ref']` for the `ref` handler).\n * This means you can access `tree.current.args` with full type safety without needing `isKeyword` checks,\n * though such checks can still be used as runtime guards if desired.\n *\n * @template TOutput - The output type (e.g., string for Zod/Faker, ts.TypeNode for TypeScript)\n * @template TOptions - The parser options type\n * @param config - Configuration object containing mapper and handlers\n * @returns A parse function that converts SchemaTree to TOutput\n *\n * @example\n * ```ts\n * // Create a simple string-based parser\n * const parse = createParser({\n * mapper: zodKeywordMapper,\n * handlers: {\n * // tree.current is typed as SchemaKeywordMapper['union']\n * union(tree, options) {\n * const items = tree.current.args // args is correctly typed as Schema[]\n * .map(it => this.parse({ ...tree, current: it }, options))\n * .filter(Boolean)\n * return `z.union([${items.join(', ')}])`\n * },\n * // tree.current is typed as SchemaKeywordMapper['string']\n * string(tree, options) {\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * },\n * // tree.current is typed as SchemaKeywordMapper['ref']\n * ref(tree, options) {\n * // No need for isKeyword check - tree.current.args is already properly typed\n * return `Ref: ${tree.current.args.name}`\n * }\n * }\n * })\n * ```\n */\nexport function createParser<TOutput, TOptions extends Record<string, any>>(\n config: CreateParserConfig<TOutput, TOptions>,\n): (tree: SchemaTree, options: TOptions) => TOutput | null | undefined {\n const { mapper, handlers } = config\n\n function parse(tree: SchemaTree, options: TOptions): TOutput | null | undefined {\n const { current } = tree\n\n // Check if there's a custom handler for this keyword\n const handler = handlers[current.keyword as keyof SchemaKeywordMapper]\n if (handler) {\n // Create context object with parse method accessible via `this`\n const context: HandlerContext<TOutput, TOptions> = { parse }\n // We need to cast tree here because TypeScript can't statically verify\n // that the handler type matches the current keyword at runtime\n return handler.call(context, tree as any, options)\n }\n\n // Fall back to simple mapper lookup\n const value = mapper[current.keyword as keyof typeof mapper]\n\n if (!value) {\n return undefined\n }\n\n // For simple keywords without args, call the mapper directly\n if (current.keyword in mapper) {\n return value()\n }\n\n return undefined\n }\n\n return parse\n}\n\n/**\n * Helper to find a schema keyword in siblings\n * Useful in handlers when you need to find related schemas (e.g., min/max for string)\n *\n * @example\n * ```ts\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * ```\n */\nexport function findSchemaKeyword<K extends keyof SchemaKeywordMapper>(siblings: Schema[], keyword: K): SchemaKeywordMapper[K] | undefined {\n return SchemaGenerator.find(siblings, schemaKeywords[keyword]) as SchemaKeywordMapper[K] | undefined\n}\n","import type { AsyncEventEmitter } from '@internals/utils'\nimport { pascalCase } from '@internals/utils'\nimport type { FileMetaBase, KubbEvents, KubbFile, Plugin, PluginDriver, PluginFactoryOptions } from '@kubb/core'\nimport type { Fabric as FabricType } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { renderOperation, renderOperations } from './utils.tsx'\n\nexport type OperationMethodResult<TFileMeta extends FileMetaBase> = Promise<KubbFile.File<TFileMeta> | Array<KubbFile.File<TFileMeta>> | null>\n\ntype Context<TOptions, TPluginOptions extends PluginFactoryOptions> = {\n fabric: FabricType\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n driver: PluginDriver\n events?: AsyncEventEmitter<KubbEvents>\n /**\n * Current plugin\n */\n plugin: Plugin<TPluginOptions>\n mode: KubbFile.Mode\n UNSTABLE_NAMING?: true\n}\n\nexport class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> {\n #options: TPluginOptions['resolvedOptions']\n #context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>\n\n constructor(options: TPluginOptions['resolvedOptions'], context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>) {\n this.#options = options\n this.#context = context\n }\n\n get options(): TPluginOptions['resolvedOptions'] {\n return this.#options\n }\n\n set options(options: TPluginOptions['resolvedOptions']) {\n this.#options = { ...this.#options, ...options }\n }\n\n get context(): Context<TPluginOptions['resolvedOptions'], TPluginOptions> {\n return this.#context\n }\n #matchesPattern(operation: Operation, method: HttpMethod, type: string, pattern: RegExp | string): boolean {\n switch (type) {\n case 'tag':\n return operation.getTags().some((tag) => tag.name.match(pattern))\n case 'operationId':\n return !!operation.getOperationId({ friendlyCase: true }).match(pattern)\n case 'path':\n return !!operation.path.match(pattern)\n case 'method':\n return !!method.match(pattern)\n case 'contentType':\n return !!operation.getContentType().match(pattern)\n default:\n return false\n }\n }\n\n getOptions(operation: Operation, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']> {\n const { override = [] } = this.context\n\n return override.find(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))?.options || {}\n }\n\n #isExcluded(operation: Operation, method: HttpMethod): boolean {\n const { exclude = [] } = this.context\n\n return exclude.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n #isIncluded(operation: Operation, method: HttpMethod): boolean {\n const { include = [] } = this.context\n\n return include.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n getSchemas(\n operation: Operation,\n {\n resolveName = (name) => name,\n }: {\n resolveName?: (name: string) => string\n } = {},\n ): OperationSchemas {\n const operationId = operation.getOperationId({ friendlyCase: true })\n const operationName = pascalCase(operationId)\n\n const resolveKeys = (schema?: SchemaObject) => (schema?.properties ? Object.keys(schema.properties) : undefined)\n\n const pathParamsSchema = this.context.oas.getParametersSchema(operation, 'path')\n const queryParamsSchema = this.context.oas.getParametersSchema(operation, 'query')\n const headerParamsSchema = this.context.oas.getParametersSchema(operation, 'header')\n const requestSchema = this.context.oas.getRequestSchema(operation)\n const statusCodes = operation.getResponseStatusCodes().map((statusCode) => {\n const name = statusCode === 'default' ? 'error' : statusCode\n const schema = this.context.oas.getResponseSchema(operation, statusCode)\n const keys = resolveKeys(schema)\n\n return {\n name: this.context.UNSTABLE_NAMING ? resolveName(pascalCase(`${operationId} status ${name}`)) : resolveName(pascalCase(`${operationId} ${name}`)),\n description: (operation.getResponseByStatusCode(statusCode) as OasTypes.ResponseObject)?.description,\n schema,\n operation,\n operationName,\n statusCode: name === 'error' ? undefined : Number(statusCode),\n keys,\n keysToOmit: keys?.filter((key) => (schema?.properties?.[key] as OasTypes.SchemaObject)?.writeOnly),\n }\n })\n\n const successful = statusCodes.filter((item) => item.statusCode?.toString().startsWith('2'))\n const errors = statusCodes.filter((item) => item.statusCode?.toString().startsWith('4') || item.statusCode?.toString().startsWith('5'))\n\n const request = withRequiredRequestBodySchema(\n requestSchema\n ? {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} RequestData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),\n description: (operation.schema.requestBody as OasTypes.RequestBodyObject)?.description,\n operation,\n operationName,\n schema: requestSchema,\n keys: resolveKeys(requestSchema),\n keysToOmit: resolveKeys(requestSchema)?.filter((key) => (requestSchema.properties?.[key] as OasTypes.SchemaObject)?.readOnly),\n }\n : undefined,\n )\n\n return {\n pathParams: pathParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} PathParams`)),\n operation,\n operationName,\n schema: pathParamsSchema,\n keys: resolveKeys(pathParamsSchema),\n }\n : undefined,\n queryParams: queryParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} QueryParams`)),\n operation,\n operationName,\n schema: queryParamsSchema,\n keys: resolveKeys(queryParamsSchema) || [],\n }\n : undefined,\n headerParams: headerParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} HeaderParams`)),\n operation,\n operationName,\n schema: headerParamsSchema,\n keys: resolveKeys(headerParamsSchema),\n }\n : undefined,\n request,\n response: {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} ResponseData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),\n operation,\n operationName,\n schema: {\n oneOf: successful.map((item) => ({ ...item.schema, $ref: item.name })) || undefined,\n } as SchemaObject,\n },\n responses: successful,\n errors,\n statusCodes,\n }\n }\n\n async getOperations(): Promise<Array<{ path: string; method: HttpMethod; operation: Operation }>> {\n const { oas } = this.context\n\n const paths = oas.getPaths()\n\n return Object.entries(paths).flatMap(([path, methods]) =>\n Object.entries(methods)\n .map((values) => {\n const [method, operation] = values as [HttpMethod, Operation]\n if (this.#isExcluded(operation, method)) {\n return null\n }\n\n if (this.context.include && !this.#isIncluded(operation, method)) {\n return null\n }\n\n return operation ? { path, method: method as HttpMethod, operation } : null\n })\n .filter((x): x is { path: string; method: HttpMethod; operation: Operation } => x !== null),\n )\n }\n\n async build(...generators: Array<Generator<TPluginOptions>>): Promise<Array<KubbFile.File<TFileMeta>>> {\n const operations = await this.getOperations()\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const results: Array<KubbFile.File<TFileMeta>> = []\n\n for (const generator of generators) {\n if (!('type' in generator)) {\n continue\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions> | CoreGenerator<TPluginOptions>\n\n const opResultsFlat: Array<KubbFile.File<TFileMeta>> = []\n\n for (const { operation, method } of operations) {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await renderOperation(operation, {\n config: this.context.driver.config,\n fabric: this.context.fabric,\n Component: v1Generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n } else {\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.driver.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n\n opResultsFlat.push(...([result ?? []].flat() as Array<KubbFile.File<TFileMeta>>))\n }\n }\n\n if (v1Generator.type === 'react') {\n await renderOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.driver.config,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n continue\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.driver.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n results.push(...opResultsFlat, ...((operationsResult ?? []) as unknown as Array<KubbFile.File<TFileMeta>>))\n }\n\n return results\n }\n}\n","","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, createPlugin, type KubbEvents, type UserGroup } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\nimport { version } from '../package.json'\nimport { jsonGenerator } from './generators'\nimport { OperationGenerator } from './OperationGenerator.ts'\nimport { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { PluginOas } from './types.ts'\n\nexport const pluginOasName = 'plugin-oas' satisfies PluginOas['name']\n\nexport const pluginOas = createPlugin<PluginOas>((options) => {\n const {\n output = {\n path: 'schemas',\n },\n group,\n validate = true,\n generators = [jsonGenerator],\n serverIndex,\n serverVariables,\n contentType,\n oasClass,\n discriminator = 'strict',\n collisionDetection = false,\n } = options\n\n const getOas = async ({ validate, config, events }: { validate: boolean; config: Config; events: AsyncEventEmitter<KubbEvents> }): Promise<Oas> => {\n // needs to be in a different variable or the catch here will not work(return of a promise instead)\n const oas = await parseFromConfig(config, oasClass)\n\n oas.setOptions({\n contentType,\n discriminator,\n collisionDetection,\n })\n\n try {\n if (validate) {\n await oas.validate()\n }\n } catch (er) {\n const caughtError = er as Error\n const errorTimestamp = new Date()\n const error = new Error('OAS Validation failed', {\n cause: caughtError,\n })\n\n events.emit('info', caughtError.message)\n events.emit('debug', {\n date: errorTimestamp,\n logs: [`✗ ${error.message}`, caughtError.message],\n })\n }\n\n return oas\n }\n\n return {\n name: pluginOasName,\n version,\n options: {\n output,\n validate,\n discriminator,\n ...options,\n exclude: [],\n override: [],\n },\n inject() {\n const config = this.config\n const events = this.events\n\n let oas: Oas\n\n return {\n async getOas({ validate = false } = {}) {\n if (!oas) {\n oas = await getOas({ config, events, validate })\n }\n\n return oas\n },\n async getBaseURL() {\n const oas = await getOas({ config, events, validate: false })\n if (serverIndex === undefined) {\n return undefined\n }\n\n const server = oas.api.servers?.at(serverIndex)\n if (!server?.url) {\n return undefined\n }\n\n return resolveServerUrl(\n server as { url: string; variables?: Record<string, { default?: string | number; enum?: (string | number)[] }> },\n serverVariables,\n )\n },\n }\n },\n resolvePath(baseName, pathMode, options) {\n const root = this.root\n const mode = pathMode ?? this.getMode(output)\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: UserGroup['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\n }\n\n return path.resolve(root, output.path, baseName)\n },\n async buildStart() {\n const oas = await this.getOas({ validate })\n\n if (!output || generators.length === 0) {\n return\n }\n\n await oas.dereference()\n\n const schemaGenerator = new SchemaGenerator(\n {\n unknownType: 'unknown',\n emptySchemaType: 'unknown',\n dateType: 'date',\n transformers: {},\n ...this.plugin.options,\n },\n {\n fabric: this.fabric,\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override: undefined,\n mode: 'split',\n output: output.path,\n },\n )\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude: undefined,\n include: undefined,\n override: undefined,\n mode: 'split',\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n\n await this.upsertFile(...operationFiles)\n },\n }\n})\n","import type { PluginFactoryOptions } from '@kubb/core'\nimport { createGenerator as _createGenerator } from './generators/createGenerator.ts'\nimport { createReactGenerator as _createReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator as _Generator } from './generators/types.ts'\n\nexport type { CreateParserConfig, KeywordHandler } from './createParser.ts'\nexport { createParser, findSchemaKeyword } from './createParser.ts'\nexport type { OperationMethodResult } from './OperationGenerator.ts'\nexport { OperationGenerator } from './OperationGenerator.ts'\nexport { pluginOas, pluginOasName } from './plugin.ts'\nexport type {\n GetSchemaGeneratorOptions,\n SchemaGeneratorBuildOptions,\n SchemaGeneratorOptions,\n SchemaMethodResult,\n} from './SchemaGenerator.ts'\nexport { SchemaGenerator } from './SchemaGenerator.ts'\nexport type {\n Schema,\n SchemaKeyword,\n SchemaKeywordBase,\n SchemaKeywordMapper,\n SchemaMapper,\n SchemaTree,\n} from './SchemaMapper.ts'\nexport { isKeyword, schemaKeywords } from './SchemaMapper.ts'\nexport type * from './types.ts'\nexport { renderOperation, renderOperations, renderSchema } from './utils.tsx'\n\n/**\n * @deprecated use `import { createGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createGenerator = _createGenerator\n\n/**\n * @deprecated use `import { createReactGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createReactGenerator = _createReactGenerator\n\n/**\n * @deprecated use `import { Generator } from '@kubb/plugin-oas/generators'`\n */\nexport type Generator<TOptions extends PluginFactoryOptions> = _Generator<TOptions>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#options","#context","#matchesPattern","#isExcluded","#isIncluded","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../package.json","../src/plugin.ts","../src/index.ts"],"sourcesContent":["import { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper, SchemaTree } from './SchemaMapper.ts'\nimport { schemaKeywords } from './SchemaMapper.ts'\n\n/**\n * Helper type to create a SchemaTree with a specific current schema type\n */\ntype SchemaTreeWithKeyword<K extends keyof SchemaKeywordMapper> = Omit<SchemaTree, 'current'> & {\n current: SchemaKeywordMapper[K]\n}\n\n/**\n * Handler context with parse method available via `this`\n */\nexport type HandlerContext<TOutput, TOptions> = {\n parse: (tree: SchemaTree, options: TOptions) => TOutput | null | undefined\n}\n\n/**\n * Handler function type for custom keyword processing\n * Handlers can access the parse function via `this.parse`\n * The tree.current is typed based on the keyword K\n */\nexport type KeywordHandler<TOutput, TOptions, K extends keyof SchemaKeywordMapper = keyof SchemaKeywordMapper> = (\n this: HandlerContext<TOutput, TOptions>,\n tree: SchemaTreeWithKeyword<K>,\n options: TOptions,\n) => TOutput | null | undefined\n\n/**\n * Configuration for createParser\n */\nexport type CreateParserConfig<TOutput, TOptions> = {\n /**\n * The keyword mapper that maps schema keywords to output generators\n */\n mapper: SchemaMapper<TOutput>\n\n /**\n * Custom handlers for specific schema keywords\n * These provide the implementation for complex types that need special processing\n *\n * Use function syntax (not arrow functions) to enable use of `this` keyword:\n * ```typescript\n * handlers: {\n * enum(tree, options, parse) {\n * // Implementation\n * }\n * }\n * ```\n *\n * Common keywords that typically need handlers:\n * - union: Combine multiple schemas into a union\n * - and: Combine multiple schemas into an intersection\n * - array: Handle array types with items\n * - object: Handle object types with properties\n * - enum: Handle enum types\n * - tuple: Handle tuple types\n * - const: Handle literal/const types\n * - ref: Handle references to other schemas\n * - string/number/integer: Handle primitives with constraints (min/max)\n * - matches: Handle regex patterns\n * - default/describe/optional/nullable: Handle modifiers\n */\n handlers: Partial<{\n [K in keyof SchemaKeywordMapper]: KeywordHandler<TOutput, TOptions, K>\n }>\n}\n\n/**\n * Creates a parser function that converts schema trees to output using the provided mapper and handlers\n *\n * This function provides a framework for building parsers by:\n * 1. Checking for custom handlers for each keyword\n * 2. Falling back to the mapper for simple keywords\n * 3. Providing utilities for common operations (finding siblings, etc.)\n *\n * The generated parser is recursive and can handle nested schemas.\n *\n * **Type Safety**: Each handler receives a `tree` parameter where `tree.current` is automatically\n * typed as the specific schema keyword type (e.g., `SchemaKeywordMapper['ref']` for the `ref` handler).\n * This means you can access `tree.current.args` with full type safety without needing `isKeyword` checks,\n * though such checks can still be used as runtime guards if desired.\n *\n * @template TOutput - The output type (e.g., string for Zod/Faker, ts.TypeNode for TypeScript)\n * @template TOptions - The parser options type\n * @param config - Configuration object containing mapper and handlers\n * @returns A parse function that converts SchemaTree to TOutput\n *\n * @example\n * ```ts\n * // Create a simple string-based parser\n * const parse = createParser({\n * mapper: zodKeywordMapper,\n * handlers: {\n * // tree.current is typed as SchemaKeywordMapper['union']\n * union(tree, options) {\n * const items = tree.current.args // args is correctly typed as Schema[]\n * .map(it => this.parse({ ...tree, current: it }, options))\n * .filter(Boolean)\n * return `z.union([${items.join(', ')}])`\n * },\n * // tree.current is typed as SchemaKeywordMapper['string']\n * string(tree, options) {\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * },\n * // tree.current is typed as SchemaKeywordMapper['ref']\n * ref(tree, options) {\n * // No need for isKeyword check - tree.current.args is already properly typed\n * return `Ref: ${tree.current.args.name}`\n * }\n * }\n * })\n * ```\n */\nexport function createParser<TOutput, TOptions extends Record<string, any>>(\n config: CreateParserConfig<TOutput, TOptions>,\n): (tree: SchemaTree, options: TOptions) => TOutput | null | undefined {\n const { mapper, handlers } = config\n\n function parse(tree: SchemaTree, options: TOptions): TOutput | null | undefined {\n const { current } = tree\n\n // Check if there's a custom handler for this keyword\n const handler = handlers[current.keyword as keyof SchemaKeywordMapper]\n if (handler) {\n // Create context object with parse method accessible via `this`\n const context: HandlerContext<TOutput, TOptions> = { parse }\n // We need to cast tree here because TypeScript can't statically verify\n // that the handler type matches the current keyword at runtime\n return handler.call(context, tree as any, options)\n }\n\n // Fall back to simple mapper lookup\n const value = mapper[current.keyword as keyof typeof mapper]\n\n if (!value) {\n return undefined\n }\n\n // For simple keywords without args, call the mapper directly\n if (current.keyword in mapper) {\n return value()\n }\n\n return undefined\n }\n\n return parse\n}\n\n/**\n * Helper to find a schema keyword in siblings\n * Useful in handlers when you need to find related schemas (e.g., min/max for string)\n *\n * @example\n * ```ts\n * const minSchema = findSchemaKeyword(tree.siblings, 'min')\n * const maxSchema = findSchemaKeyword(tree.siblings, 'max')\n * return zodKeywordMapper.string(false, minSchema?.args, maxSchema?.args)\n * ```\n */\nexport function findSchemaKeyword<K extends keyof SchemaKeywordMapper>(siblings: Schema[], keyword: K): SchemaKeywordMapper[K] | undefined {\n return SchemaGenerator.find(siblings, schemaKeywords[keyword]) as SchemaKeywordMapper[K] | undefined\n}\n","import type { AsyncEventEmitter } from '@internals/utils'\nimport { pascalCase } from '@internals/utils'\nimport type { FileNode } from '@kubb/ast/types'\nimport type { FileMetaBase, KubbEvents, Plugin, PluginDriver, PluginFactoryOptions } from '@kubb/core'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { renderOperation, renderOperations } from './utils.tsx'\n\nexport type OperationMethodResult<TFileMeta extends FileMetaBase> = Promise<FileNode<TFileMeta> | Array<FileNode<TFileMeta>> | null>\n\ntype Context<TOptions, TPluginOptions extends PluginFactoryOptions> = {\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n driver: PluginDriver\n events?: AsyncEventEmitter<KubbEvents>\n /**\n * Current plugin\n */\n plugin: Plugin<TPluginOptions>\n mode: 'single' | 'split'\n UNSTABLE_NAMING?: true\n}\n\nexport class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> {\n #options: TPluginOptions['resolvedOptions']\n #context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>\n\n constructor(options: TPluginOptions['resolvedOptions'], context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>) {\n this.#options = options\n this.#context = context\n }\n\n get options(): TPluginOptions['resolvedOptions'] {\n return this.#options\n }\n\n set options(options: TPluginOptions['resolvedOptions']) {\n this.#options = { ...this.#options, ...options }\n }\n\n get context(): Context<TPluginOptions['resolvedOptions'], TPluginOptions> {\n return this.#context\n }\n #matchesPattern(operation: Operation, method: HttpMethod, type: string, pattern: RegExp | string): boolean {\n switch (type) {\n case 'tag':\n return operation.getTags().some((tag) => tag.name.match(pattern))\n case 'operationId':\n return !!operation.getOperationId({ friendlyCase: true }).match(pattern)\n case 'path':\n return !!operation.path.match(pattern)\n case 'method':\n return !!method.match(pattern)\n case 'contentType':\n return !!operation.getContentType().match(pattern)\n default:\n return false\n }\n }\n\n getOptions(operation: Operation, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']> {\n const { override = [] } = this.context\n\n return override.find(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))?.options || {}\n }\n\n #isExcluded(operation: Operation, method: HttpMethod): boolean {\n const { exclude = [] } = this.context\n\n return exclude.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n #isIncluded(operation: Operation, method: HttpMethod): boolean {\n const { include = [] } = this.context\n\n return include.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))\n }\n\n getSchemas(\n operation: Operation,\n {\n resolveName = (name) => name,\n }: {\n resolveName?: (name: string) => string\n } = {},\n ): OperationSchemas {\n const operationId = operation.getOperationId({ friendlyCase: true })\n const operationName = pascalCase(operationId)\n\n const resolveKeys = (schema?: SchemaObject) => (schema?.properties ? Object.keys(schema.properties) : undefined)\n\n const pathParamsSchema = this.context.oas.getParametersSchema(operation, 'path')\n const queryParamsSchema = this.context.oas.getParametersSchema(operation, 'query')\n const headerParamsSchema = this.context.oas.getParametersSchema(operation, 'header')\n const requestSchema = this.context.oas.getRequestSchema(operation)\n const statusCodes = operation.getResponseStatusCodes().map((statusCode) => {\n const name = statusCode === 'default' ? 'error' : statusCode\n const schema = this.context.oas.getResponseSchema(operation, statusCode)\n const keys = resolveKeys(schema)\n\n return {\n name: this.context.UNSTABLE_NAMING ? resolveName(pascalCase(`${operationId} status ${name}`)) : resolveName(pascalCase(`${operationId} ${name}`)),\n description: (operation.getResponseByStatusCode(statusCode) as OasTypes.ResponseObject)?.description,\n schema,\n operation,\n operationName,\n statusCode: name === 'error' ? undefined : Number(statusCode),\n keys,\n keysToOmit: keys?.filter((key) => (schema?.properties?.[key] as OasTypes.SchemaObject)?.writeOnly),\n }\n })\n\n const successful = statusCodes.filter((item) => item.statusCode?.toString().startsWith('2'))\n const errors = statusCodes.filter((item) => item.statusCode?.toString().startsWith('4') || item.statusCode?.toString().startsWith('5'))\n\n const request = withRequiredRequestBodySchema(\n requestSchema\n ? {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} RequestData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),\n description: (operation.schema.requestBody as OasTypes.RequestBodyObject)?.description,\n operation,\n operationName,\n schema: requestSchema,\n keys: resolveKeys(requestSchema),\n keysToOmit: resolveKeys(requestSchema)?.filter((key) => (requestSchema.properties?.[key] as OasTypes.SchemaObject)?.readOnly),\n }\n : undefined,\n )\n\n return {\n pathParams: pathParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} PathParams`)),\n operation,\n operationName,\n schema: pathParamsSchema,\n keys: resolveKeys(pathParamsSchema),\n }\n : undefined,\n queryParams: queryParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} QueryParams`)),\n operation,\n operationName,\n schema: queryParamsSchema,\n keys: resolveKeys(queryParamsSchema) || [],\n }\n : undefined,\n headerParams: headerParamsSchema\n ? {\n name: resolveName(pascalCase(`${operationId} HeaderParams`)),\n operation,\n operationName,\n schema: headerParamsSchema,\n keys: resolveKeys(headerParamsSchema),\n }\n : undefined,\n request,\n response: {\n name: this.context.UNSTABLE_NAMING\n ? resolveName(pascalCase(`${operationId} ResponseData`))\n : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),\n operation,\n operationName,\n schema: {\n oneOf: successful.map((item) => ({ ...item.schema, $ref: item.name })) || undefined,\n } as SchemaObject,\n },\n responses: successful,\n errors,\n statusCodes,\n }\n }\n\n async getOperations(): Promise<Array<{ path: string; method: HttpMethod; operation: Operation }>> {\n const { oas } = this.context\n\n const paths = oas.getPaths()\n\n return Object.entries(paths).flatMap(([path, methods]) =>\n Object.entries(methods)\n .map((values) => {\n const [method, operation] = values as [HttpMethod, Operation]\n if (this.#isExcluded(operation, method)) {\n return null\n }\n\n if (this.context.include && !this.#isIncluded(operation, method)) {\n return null\n }\n\n return operation ? { path, method: method as HttpMethod, operation } : null\n })\n .filter((x): x is { path: string; method: HttpMethod; operation: Operation } => x !== null),\n )\n }\n\n async build(...generators: Array<Generator<TPluginOptions>>): Promise<Array<FileNode<TFileMeta>>> {\n const operations = await this.getOperations()\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const results: Array<FileNode<TFileMeta>> = []\n\n for (const generator of generators) {\n if (!('type' in generator)) {\n continue\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions> | CoreGenerator<TPluginOptions>\n\n const opResultsFlat: Array<FileNode<TFileMeta>> = []\n\n for (const { operation, method } of operations) {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await renderOperation(operation, {\n config: this.context.driver.config,\n driver: this.context.driver,\n oas: this.context.oas,\n mode: this.context.mode,\n Component: v1Generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n } else {\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.driver.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n } as Plugin<TPluginOptions>['options'],\n },\n })\n\n opResultsFlat.push(...([result ?? []].flat() as Array<FileNode<TFileMeta>>))\n }\n }\n\n if (v1Generator.type === 'react') {\n await renderOperations(\n operations.map((op) => op.operation),\n {\n driver: this.context.driver,\n config: this.context.driver.config,\n oas: this.context.oas,\n mode: this.context.mode,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n continue\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.driver.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n results.push(...opResultsFlat, ...((operationsResult ?? []) as unknown as Array<FileNode<TFileMeta>>))\n }\n\n return results\n }\n}\n","","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, createPlugin, type KubbEvents, type UserGroup } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\nimport { version } from '../package.json'\nimport { jsonGenerator } from './generators'\nimport { OperationGenerator } from './OperationGenerator.ts'\nimport { SchemaGenerator } from './SchemaGenerator.ts'\nimport type { PluginOas } from './types.ts'\n\nexport const pluginOasName = 'plugin-oas' satisfies PluginOas['name']\n\nexport const pluginOas = createPlugin<PluginOas>((options) => {\n const {\n output = {\n path: 'schemas',\n },\n group,\n validate = true,\n generators = [jsonGenerator],\n serverIndex,\n serverVariables,\n contentType,\n oasClass,\n discriminator = 'strict',\n collisionDetection = false,\n } = options\n\n const getOas = async ({ validate, config, events }: { validate: boolean; config: Config; events: AsyncEventEmitter<KubbEvents> }): Promise<Oas> => {\n // needs to be in a different variable or the catch here will not work(return of a promise instead)\n const oas = await parseFromConfig(config, oasClass)\n\n oas.setOptions({\n contentType,\n discriminator,\n collisionDetection,\n })\n\n try {\n if (validate) {\n await oas.validate()\n }\n } catch (er) {\n const caughtError = er as Error\n const errorTimestamp = new Date()\n const error = new Error('OAS Validation failed', {\n cause: caughtError,\n })\n\n events.emit('info', caughtError.message)\n events.emit('debug', {\n date: errorTimestamp,\n logs: [`✗ ${error.message}`, caughtError.message],\n })\n }\n\n return oas\n }\n\n return {\n name: pluginOasName,\n version,\n options: {\n output,\n validate,\n discriminator,\n ...options,\n exclude: [],\n override: [],\n },\n inject() {\n const config = this.config\n const events = this.events\n\n let oas: Oas\n\n return {\n async getOas({ validate = false } = {}) {\n if (!oas) {\n oas = await getOas({ config, events, validate })\n }\n\n return oas\n },\n async getBaseURL() {\n const oas = await getOas({ config, events, validate: false })\n if (serverIndex === undefined) {\n return undefined\n }\n\n const server = oas.api.servers?.at(serverIndex)\n if (!server?.url) {\n return undefined\n }\n\n return resolveServerUrl(\n server as { url: string; variables?: Record<string, { default?: string | number; enum?: (string | number)[] }> },\n serverVariables,\n )\n },\n }\n },\n resolvePath(baseName, pathMode, options) {\n const root = this.root\n const mode = pathMode ?? this.getMode(output)\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: UserGroup['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\n }\n\n return path.resolve(root, output.path, baseName)\n },\n async buildStart() {\n const oas = await this.getOas({ validate })\n\n if (!output || generators.length === 0) {\n return\n }\n\n await oas.dereference()\n\n const schemaGenerator = new SchemaGenerator(\n {\n unknownType: 'unknown',\n emptySchemaType: 'unknown',\n dateType: 'date',\n transformers: {},\n ...this.plugin.options,\n },\n {\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override: undefined,\n mode: 'split',\n output: output.path,\n },\n )\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n oas,\n driver: this.driver,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude: undefined,\n include: undefined,\n override: undefined,\n mode: 'split',\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n\n await this.upsertFile(...operationFiles)\n },\n }\n})\n","import type { PluginFactoryOptions } from '@kubb/core'\nimport { createGenerator as _createGenerator } from './generators/createGenerator.ts'\nimport { createReactGenerator as _createReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator as _Generator } from './generators/types.ts'\n\nexport type { CreateParserConfig, KeywordHandler } from './createParser.ts'\nexport { createParser, findSchemaKeyword } from './createParser.ts'\nexport type { OperationMethodResult } from './OperationGenerator.ts'\nexport { OperationGenerator } from './OperationGenerator.ts'\nexport { pluginOas, pluginOasName } from './plugin.ts'\nexport type {\n GetSchemaGeneratorOptions,\n SchemaGeneratorBuildOptions,\n SchemaGeneratorOptions,\n SchemaMethodResult,\n} from './SchemaGenerator.ts'\nexport { SchemaGenerator } from './SchemaGenerator.ts'\nexport type {\n Schema,\n SchemaKeyword,\n SchemaKeywordBase,\n SchemaKeywordMapper,\n SchemaMapper,\n SchemaTree,\n} from './SchemaMapper.ts'\nexport { isKeyword, schemaKeywords } from './SchemaMapper.ts'\nexport type * from './types.ts'\nexport { renderOperation, renderOperations, renderSchema } from './utils.tsx'\n\n/**\n * @deprecated use `import { createGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createGenerator = _createGenerator\n\n/**\n * @deprecated use `import { createReactGenerator } from '@kubb/plugin-oas/generators'`\n */\nexport const createReactGenerator = _createReactGenerator\n\n/**\n * @deprecated use `import { Generator } from '@kubb/plugin-oas/generators'`\n */\nexport type Generator<TOptions extends PluginFactoryOptions> = _Generator<TOptions>\n"],"mappings":"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"}
|
package/dist/mocks.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { i as pascalCase } from "./getFooter-Dz4u5Mg4.js";
|
|
|
3
3
|
import { n as schemaKeywords, t as isKeyword } from "./SchemaMapper-CqMkO2T1.js";
|
|
4
4
|
import { KUBB_INLINE_REF_PREFIX, isDiscriminator, isNullable, isOpenApiV3_1Document, isReference } from "@kubb/oas";
|
|
5
5
|
import { isDeepEqual, isNumber, uniqueWith } from "remeda";
|
|
6
|
-
import {
|
|
7
|
-
import { jsx } from "@kubb/
|
|
6
|
+
import { KubbContext, OasContext, createRenderer, provide, unprovide } from "@kubb/renderer-jsx";
|
|
7
|
+
import { jsx } from "@kubb/renderer-jsx/jsx-runtime";
|
|
8
8
|
//#region ../../internals/utils/src/names.ts
|
|
9
9
|
/**
|
|
10
10
|
* Returns a unique name by appending an incrementing numeric suffix when the name has already been used.
|
|
@@ -80,76 +80,82 @@ function getSchemaFactory(oas) {
|
|
|
80
80
|
* Renders a React component for a list of operations (V1 generators).
|
|
81
81
|
*/
|
|
82
82
|
async function renderOperations(operations, options) {
|
|
83
|
-
const { config,
|
|
83
|
+
const { config, driver, plugin, oas, mode, Component, generator } = options;
|
|
84
84
|
if (!Component) return;
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
children: /* @__PURE__ */ jsx(Component, {
|
|
85
|
+
const renderer = createRenderer();
|
|
86
|
+
provide(KubbContext, {
|
|
87
|
+
driver,
|
|
88
|
+
plugin,
|
|
89
|
+
mode
|
|
90
|
+
});
|
|
91
|
+
provide(OasContext, oas);
|
|
92
|
+
try {
|
|
93
|
+
await renderer.render(/* @__PURE__ */ jsx(Component, {
|
|
95
94
|
config,
|
|
96
95
|
operations,
|
|
97
96
|
generator,
|
|
98
97
|
plugin
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
}));
|
|
99
|
+
} finally {
|
|
100
|
+
unprovide(OasContext);
|
|
101
|
+
unprovide(KubbContext);
|
|
102
|
+
}
|
|
103
|
+
driver.fileManager.upsert(...renderer.files);
|
|
104
|
+
renderer.unmount();
|
|
103
105
|
}
|
|
104
106
|
/**
|
|
105
107
|
* Renders a React component for a single operation (V1 generators).
|
|
106
108
|
*/
|
|
107
109
|
async function renderOperation(operation, options) {
|
|
108
|
-
const { config,
|
|
110
|
+
const { config, driver, plugin, oas, mode, Component, generator } = options;
|
|
109
111
|
if (!Component) return;
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
children: /* @__PURE__ */ jsx(Component, {
|
|
112
|
+
const renderer = createRenderer();
|
|
113
|
+
provide(KubbContext, {
|
|
114
|
+
driver,
|
|
115
|
+
plugin,
|
|
116
|
+
mode
|
|
117
|
+
});
|
|
118
|
+
provide(OasContext, oas);
|
|
119
|
+
try {
|
|
120
|
+
await renderer.render(/* @__PURE__ */ jsx(Component, {
|
|
120
121
|
config,
|
|
121
122
|
operation,
|
|
122
123
|
plugin,
|
|
123
124
|
generator
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
}));
|
|
126
|
+
} finally {
|
|
127
|
+
unprovide(OasContext);
|
|
128
|
+
unprovide(KubbContext);
|
|
129
|
+
}
|
|
130
|
+
driver.fileManager.upsert(...renderer.files);
|
|
131
|
+
renderer.unmount();
|
|
128
132
|
}
|
|
129
133
|
/**
|
|
130
134
|
* Renders a React component for a single schema (V1 generators).
|
|
131
135
|
*/
|
|
132
136
|
async function renderSchema(schema, options) {
|
|
133
|
-
const { config,
|
|
137
|
+
const { config, driver, plugin, oas, mode, Component, generator } = options;
|
|
134
138
|
if (!Component) return;
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
children: /* @__PURE__ */ jsx(Component, {
|
|
139
|
+
const renderer = createRenderer();
|
|
140
|
+
provide(KubbContext, {
|
|
141
|
+
driver,
|
|
142
|
+
plugin,
|
|
143
|
+
mode
|
|
144
|
+
});
|
|
145
|
+
provide(OasContext, oas);
|
|
146
|
+
try {
|
|
147
|
+
await renderer.render(/* @__PURE__ */ jsx(Component, {
|
|
145
148
|
config,
|
|
146
149
|
schema,
|
|
147
150
|
plugin,
|
|
148
151
|
generator
|
|
149
|
-
})
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
}));
|
|
153
|
+
} finally {
|
|
154
|
+
unprovide(OasContext);
|
|
155
|
+
unprovide(KubbContext);
|
|
156
|
+
}
|
|
157
|
+
driver.fileManager.upsert(...renderer.files);
|
|
158
|
+
renderer.unmount();
|
|
153
159
|
}
|
|
154
160
|
//#endregion
|
|
155
161
|
//#region src/SchemaGenerator.ts
|
|
@@ -1096,7 +1102,9 @@ var SchemaGenerator = class SchemaGenerator {
|
|
|
1096
1102
|
tree
|
|
1097
1103
|
}, {
|
|
1098
1104
|
config: this.context.driver.config,
|
|
1099
|
-
|
|
1105
|
+
driver: this.context.driver,
|
|
1106
|
+
oas: this.context.oas,
|
|
1107
|
+
mode: this.context.mode,
|
|
1100
1108
|
Component: v1Generator.Schema,
|
|
1101
1109
|
generator: this,
|
|
1102
1110
|
plugin: {
|
|
@@ -1161,4 +1169,4 @@ function withRequiredRequestBodySchema(operationSchema) {
|
|
|
1161
1169
|
//#endregion
|
|
1162
1170
|
export { renderOperations as a, renderOperation as i, withRequiredRequestBodySchema as n, renderSchema as o, SchemaGenerator as r, getSchemaFactory as s, isRequestBodyRequired as t };
|
|
1163
1171
|
|
|
1164
|
-
//# sourceMappingURL=requestBody-
|
|
1172
|
+
//# sourceMappingURL=requestBody-DMoaqEak.js.map
|