@kubb/plugin-oas 4.34.0 → 4.35.1

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.
Files changed (40) hide show
  1. package/dist/{createGenerator-Z5-TQKKC.d.ts → createGenerator-CBXpHeVY.d.ts} +51 -56
  2. package/dist/{generators-CBlzDhTh.cjs → generators-CyWd3UXA.cjs} +3 -1
  3. package/dist/generators-CyWd3UXA.cjs.map +1 -0
  4. package/dist/{generators-DRPPf38p.js → generators-D7C3CXsN.js} +3 -1
  5. package/dist/generators-D7C3CXsN.js.map +1 -0
  6. package/dist/generators.cjs +1 -1
  7. package/dist/generators.d.ts +2 -2
  8. package/dist/generators.js +1 -1
  9. package/dist/hooks.cjs +24 -0
  10. package/dist/hooks.cjs.map +1 -1
  11. package/dist/hooks.d.ts +23 -2
  12. package/dist/hooks.js +24 -1
  13. package/dist/hooks.js.map +1 -1
  14. package/dist/index.cjs +10 -8
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.ts +39 -32
  17. package/dist/index.js +10 -8
  18. package/dist/index.js.map +1 -1
  19. package/dist/{requestBody-BDtQ-KsD.cjs → requestBody-DIM-iDpM.cjs} +108 -55
  20. package/dist/requestBody-DIM-iDpM.cjs.map +1 -0
  21. package/dist/{requestBody-CB2dFgmS.js → requestBody-mUXoBwsu.js} +108 -55
  22. package/dist/requestBody-mUXoBwsu.js.map +1 -0
  23. package/dist/utils.cjs +1 -1
  24. package/dist/utils.d.ts +1 -1
  25. package/dist/utils.js +1 -1
  26. package/package.json +5 -5
  27. package/src/OperationGenerator.ts +18 -10
  28. package/src/SchemaGenerator.ts +20 -8
  29. package/src/generators/createGenerator.ts +15 -10
  30. package/src/generators/createReactGenerator.ts +15 -10
  31. package/src/generators/types.ts +39 -4
  32. package/src/hooks/index.ts +1 -0
  33. package/src/hooks/useRootNode.ts +25 -0
  34. package/src/index.ts +1 -1
  35. package/src/plugin.ts +1 -1
  36. package/src/utils.tsx +138 -42
  37. package/dist/generators-CBlzDhTh.cjs.map +0 -1
  38. package/dist/generators-DRPPf38p.js.map +0 -1
  39. package/dist/requestBody-BDtQ-KsD.cjs.map +0 -1
  40. package/dist/requestBody-CB2dFgmS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["SchemaGenerator","schemaKeywords","#options","#context","#matchesPattern","pascalCase","withRequiredRequestBodySchema","#isExcluded","#isIncluded","pLimit","buildOperation","buildOperations","jsonGenerator","path","camelCase","SchemaGenerator","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../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, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { Fabric } from '@kubb/react-fabric'\nimport pLimit from 'p-limit'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { buildOperation, buildOperations } 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: Fabric\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n pluginManager: PluginManager\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 // Increased parallelism for better performance\n // - generatorLimit increased from 1 to 3 to allow parallel generator processing\n // - operationLimit increased from 10 to 30 to process more operations concurrently\n const generatorLimit = pLimit(3)\n const operationLimit = pLimit(30)\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const writeTasks = generators.map((generator) =>\n generatorLimit(async () => {\n const operationTasks = operations.map(({ operation, method }) =>\n operationLimit(async () => {\n const options = this.getOptions(operation, method)\n\n if (generator.type === 'react') {\n await buildOperation(operation, {\n config: this.context.pluginManager.config,\n fabric: this.context.fabric,\n Component: generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return []\n }\n\n const result = await generator.operation?.({\n generator: this,\n config: this.context.pluginManager.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return result ?? []\n }),\n )\n\n const operationResults = await Promise.all(operationTasks)\n const opResultsFlat = operationResults.flat()\n\n if (generator.type === 'react') {\n await buildOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.pluginManager.config,\n Component: generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n return []\n }\n\n const operationsResult = await generator.operations?.({\n generator: this,\n config: this.context.pluginManager.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n return [...opResultsFlat, ...(operationsResult ?? [])] as unknown as KubbFile.File<TFileMeta>\n }),\n )\n\n const nestedResults = await Promise.all(writeTasks)\n\n return nestedResults.flat()\n }\n}\n","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, definePlugin, type Group, getMode, type KubbEvents } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\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 = definePlugin<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 options: {\n output,\n validate,\n discriminator,\n ...options,\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 = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? getMode(path.resolve(root, output.path))\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: Group['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 install() {\n const oas = await this.getOas({ validate })\n\n if (!output) {\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 pluginManager: this.pluginManager,\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 pluginManager: this.pluginManager,\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 { buildOperation, buildOperations, buildSchema } 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","pLimit","buildOperation","buildOperations","jsonGenerator","path","camelCase","SchemaGenerator","_createGenerator","_createReactGenerator"],"sources":["../src/createParser.ts","../src/OperationGenerator.ts","../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 { pascalCase } from '@internals/utils'\nimport type { AsyncEventEmitter, FileMetaBase, KubbEvents, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { Fabric } from '@kubb/react-fabric'\nimport pLimit from 'p-limit'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator, Version } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { buildOperation, buildOperations } 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: Fabric\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n pluginManager: PluginManager\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, Version>>): Promise<Array<KubbFile.File<TFileMeta>>> {\n const operations = await this.getOperations()\n\n // Increased parallelism for better performance\n // - generatorLimit increased from 1 to 3 to allow parallel generator processing\n // - operationLimit increased from 10 to 30 to process more operations concurrently\n const generatorLimit = pLimit(3)\n const operationLimit = pLimit(30)\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const writeTasks = generators.map((generator) =>\n generatorLimit(async () => {\n if (generator.version === '2') {\n return []\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions, '1'> | CoreGenerator<TPluginOptions, '1'>\n\n const operationTasks = operations.map(({ operation, method }) =>\n operationLimit(async () => {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await buildOperation(operation, {\n config: this.context.pluginManager.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 },\n },\n })\n\n return []\n }\n\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.pluginManager.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return result ?? []\n }),\n )\n\n const operationResults = await Promise.all(operationTasks)\n const opResultsFlat = operationResults.flat()\n\n if (v1Generator.type === 'react') {\n await buildOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.pluginManager.config,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n return []\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.pluginManager.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n return [...opResultsFlat, ...(operationsResult ?? [])] as unknown as KubbFile.File<TFileMeta>\n }),\n )\n\n const nestedResults = await Promise.all(writeTasks)\n\n return nestedResults.flat()\n }\n}\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\nimport type { AsyncEventEmitter } from '@kubb/core'\nimport { type Config, definePlugin, type Group, getMode, type KubbEvents } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\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 = definePlugin<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 options: {\n output,\n validate,\n discriminator,\n ...options,\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 = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? getMode(path.resolve(root, output.path))\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: Group['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 install() {\n const oas = await this.getOas({ validate })\n\n if (!output) {\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 pluginManager: this.pluginManager,\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 pluginManager: this.pluginManager,\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 { buildOperation, buildOperations, buildSchema } 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, TVersion extends import('./generators/types.ts').Version = '1'> = _Generator<TOptions, TVersion>\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
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$1, s as SchemaGenerator, u as SchemaMethodResult, v as Override, x as Refs, y as PluginOas } from "./createGenerator-Z5-TQKKC.js";
2
+ import { C as ResolvePathOptions, S as Refs, _ as OperationSchemas, a as ReactGenerator, b as PluginOas, c as SchemaGenerator, d as SchemaMethodResult, f as OperationGenerator, g as OperationSchema, h as Include, i as Version, l as SchemaGeneratorBuildOptions, m as Exclude, n as createGenerator$1, o as createReactGenerator$1, p as OperationMethodResult, r as Generator$1, s as GetSchemaGeneratorOptions, u as SchemaGeneratorOptions, v as Options, w as Resolver, x as Ref, y as Override } from "./createGenerator-CBXpHeVY.js";
3
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-SneuY1wg.js";
4
4
  import { Operation, SchemaObject } from "@kubb/oas";
5
5
  import { Fabric } from "@kubb/react-fabric";
6
6
  import * as _kubb_core0 from "@kubb/core";
7
7
  import { Config, Plugin, PluginFactoryOptions } from "@kubb/core";
8
+ import { OperationNode, SchemaNode } from "@kubb/ast/types";
8
9
 
9
10
  //#region src/createParser.d.ts
10
11
  /**
@@ -128,52 +129,58 @@ declare const pluginOasName = "plugin-oas";
128
129
  declare const pluginOas: (options?: Options | undefined) => _kubb_core0.UserPluginWithLifeCycle<PluginOas>;
129
130
  //#endregion
130
131
  //#region src/utils.d.ts
131
- type BuildOperationsOptions<TOptions extends PluginFactoryOptions> = {
132
+ type BuildOperationsBaseOptions<TOptions extends PluginFactoryOptions> = {
132
133
  config: Config;
133
134
  fabric: Fabric;
134
- Component: ReactGenerator<any>['Operations'];
135
- generator: Omit<OperationGenerator<TOptions>, 'build'>;
136
135
  plugin: Plugin<TOptions>;
137
136
  };
138
- declare function buildOperations<TOptions extends PluginFactoryOptions>(operations: Array<Operation>, {
139
- config,
140
- fabric,
141
- plugin,
142
- generator,
143
- Component
144
- }: BuildOperationsOptions<TOptions>): Promise<void>;
145
- type BuildOperationOptions<TOptions extends PluginFactoryOptions> = {
137
+ type BuildOperationsV1Options<TOptions extends PluginFactoryOptions> = BuildOperationsBaseOptions<TOptions> & {
138
+ version?: '1';
139
+ Component: ReactGenerator<any, '1'>['Operations'];
140
+ generator: Omit<OperationGenerator<TOptions>, 'build'>;
141
+ };
142
+ type BuildOperationsV2Options<TOptions extends PluginFactoryOptions> = BuildOperationsBaseOptions<TOptions> & {
143
+ version: '2';
144
+ Component: ReactGenerator<any, '2'>['Operations'];
145
+ };
146
+ declare function buildOperations<TOptions extends PluginFactoryOptions>(operations: Array<Operation>, options: BuildOperationsV1Options<TOptions>): Promise<void>;
147
+ declare function buildOperations<TOptions extends PluginFactoryOptions>(nodes: Array<OperationNode>, options: BuildOperationsV2Options<TOptions>): Promise<void>;
148
+ type BuildOperationBaseOptions<TOptions extends PluginFactoryOptions> = {
146
149
  config: Config;
147
150
  fabric: Fabric;
148
- Component: ReactGenerator<any>['Operation'];
149
- generator: Omit<OperationGenerator<TOptions>, 'build'>;
150
151
  plugin: Plugin<TOptions>;
151
152
  };
152
- declare function buildOperation<TOptions extends PluginFactoryOptions>(operation: Operation, {
153
- config,
154
- fabric,
155
- plugin,
156
- generator,
157
- Component
158
- }: BuildOperationOptions<TOptions>): Promise<void>;
159
- type BuildSchemaOptions<TOptions extends PluginFactoryOptions> = {
153
+ type BuildOperationV1Options<TOptions extends PluginFactoryOptions> = BuildOperationBaseOptions<TOptions> & {
154
+ version?: '1';
155
+ Component: ReactGenerator<any, '1'>['Operation'];
156
+ generator: Omit<OperationGenerator<TOptions>, 'build'>;
157
+ };
158
+ type BuildOperationV2Options<TOptions extends PluginFactoryOptions> = BuildOperationBaseOptions<TOptions> & {
159
+ version: '2';
160
+ Component: ReactGenerator<any, '2'>['Operation'];
161
+ };
162
+ declare function buildOperation<TOptions extends PluginFactoryOptions>(operation: Operation, options: BuildOperationV1Options<TOptions>): Promise<void>;
163
+ declare function buildOperation<TOptions extends PluginFactoryOptions>(node: OperationNode, options: BuildOperationV2Options<TOptions>): Promise<void>;
164
+ type BuildSchemaBaseOptions<TOptions extends PluginFactoryOptions> = {
160
165
  config: Config;
161
166
  fabric: Fabric;
162
- Component: ReactGenerator<any>['Schema'];
163
- generator: Omit<SchemaGenerator<SchemaGeneratorOptions, TOptions>, 'build'>;
164
167
  plugin: Plugin<TOptions>;
165
168
  };
169
+ type BuildSchemaV1Options<TOptions extends PluginFactoryOptions> = BuildSchemaBaseOptions<TOptions> & {
170
+ version?: '1';
171
+ Component: ReactGenerator<any, '1'>['Schema'];
172
+ generator: Omit<SchemaGenerator<SchemaGeneratorOptions, TOptions>, 'build'>;
173
+ };
174
+ type BuildSchemaV2Options<TOptions extends PluginFactoryOptions> = BuildSchemaBaseOptions<TOptions> & {
175
+ version: '2';
176
+ Component: ReactGenerator<any, '2'>['Schema'];
177
+ };
166
178
  declare function buildSchema<TOptions extends PluginFactoryOptions>(schema: {
167
179
  name: string;
168
180
  tree: Array<Schema>;
169
181
  value: SchemaObject;
170
- }, {
171
- config,
172
- fabric,
173
- plugin,
174
- Component,
175
- generator
176
- }: BuildSchemaOptions<TOptions>): Promise<void>;
182
+ }, options: BuildSchemaV1Options<TOptions>): Promise<void>;
183
+ declare function buildSchema<TOptions extends PluginFactoryOptions>(schema: SchemaNode, options: BuildSchemaV2Options<TOptions>): Promise<void>;
177
184
  //#endregion
178
185
  //#region src/index.d.ts
179
186
  /**
@@ -187,7 +194,7 @@ declare const createReactGenerator: typeof createReactGenerator$1;
187
194
  /**
188
195
  * @deprecated use `import { Generator } from '@kubb/plugin-oas/generators'`
189
196
  */
190
- type Generator<TOptions extends PluginFactoryOptions> = Generator$1<TOptions>;
197
+ type Generator<TOptions extends PluginFactoryOptions, TVersion extends Version = '1'> = Generator$1<TOptions, TVersion>;
191
198
  //#endregion
192
199
  export { type CreateParserConfig, Exclude, Generator, type GetSchemaGeneratorOptions, Include, type KeywordHandler, OperationGenerator, type OperationMethodResult, OperationSchema, OperationSchemas, Options, Override, PluginOas, Ref, Refs, ResolvePathOptions, Resolver, type Schema, SchemaGenerator, type SchemaGeneratorBuildOptions, type SchemaGeneratorOptions, type SchemaKeyword, type SchemaKeywordBase, type SchemaKeywordMapper, type SchemaMapper, type SchemaMethodResult, type SchemaTree, buildOperation, buildOperations, buildSchema, createGenerator, createParser, createReactGenerator, findSchemaKeyword, isKeyword, pluginOas, pluginOasName, schemaKeywords };
193
200
  //# sourceMappingURL=index.d.ts.map
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-DRPPf38p.js";
2
+ import { n as createReactGenerator$1, r as createGenerator$1, t as jsonGenerator } from "./generators-D7C3CXsN.js";
3
3
  import { i as pascalCase, r as camelCase } from "./getFooter-Pw3tLCiV.js";
4
- import { a as buildOperations, c as pLimit, i as buildOperation, n as withRequiredRequestBodySchema, o as buildSchema, r as SchemaGenerator } from "./requestBody-CB2dFgmS.js";
4
+ import { a as buildOperations, c as pLimit, i as buildOperation, n as withRequiredRequestBodySchema, o as buildSchema, r as SchemaGenerator } from "./requestBody-mUXoBwsu.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";
@@ -221,13 +221,15 @@ var OperationGenerator = class {
221
221
  logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`]
222
222
  });
223
223
  const writeTasks = generators.map((generator) => generatorLimit(async () => {
224
+ if (generator.version === "2") return [];
225
+ const v1Generator = generator;
224
226
  const operationTasks = operations.map(({ operation, method }) => operationLimit(async () => {
225
227
  const options = this.getOptions(operation, method);
226
- if (generator.type === "react") {
228
+ if (v1Generator.type === "react") {
227
229
  await buildOperation(operation, {
228
230
  config: this.context.pluginManager.config,
229
231
  fabric: this.context.fabric,
230
- Component: generator.Operation,
232
+ Component: v1Generator.Operation,
231
233
  generator: this,
232
234
  plugin: {
233
235
  ...this.context.plugin,
@@ -239,7 +241,7 @@ var OperationGenerator = class {
239
241
  });
240
242
  return [];
241
243
  }
242
- return await generator.operation?.({
244
+ return await v1Generator.operation?.({
243
245
  generator: this,
244
246
  config: this.context.pluginManager.config,
245
247
  operation,
@@ -253,17 +255,17 @@ var OperationGenerator = class {
253
255
  }) ?? [];
254
256
  }));
255
257
  const opResultsFlat = (await Promise.all(operationTasks)).flat();
256
- if (generator.type === "react") {
258
+ if (v1Generator.type === "react") {
257
259
  await buildOperations(operations.map((op) => op.operation), {
258
260
  fabric: this.context.fabric,
259
261
  config: this.context.pluginManager.config,
260
- Component: generator.Operations,
262
+ Component: v1Generator.Operations,
261
263
  generator: this,
262
264
  plugin: this.context.plugin
263
265
  });
264
266
  return [];
265
267
  }
266
- const operationsResult = await generator.operations?.({
268
+ const operationsResult = await v1Generator.operations?.({
267
269
  generator: this,
268
270
  config: this.context.pluginManager.config,
269
271
  operations: operations.map((op) => op.operation),
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","../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, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { Fabric } from '@kubb/react-fabric'\nimport pLimit from 'p-limit'\nimport type { Generator } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { buildOperation, buildOperations } 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: Fabric\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n pluginManager: PluginManager\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 // Increased parallelism for better performance\n // - generatorLimit increased from 1 to 3 to allow parallel generator processing\n // - operationLimit increased from 10 to 30 to process more operations concurrently\n const generatorLimit = pLimit(3)\n const operationLimit = pLimit(30)\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const writeTasks = generators.map((generator) =>\n generatorLimit(async () => {\n const operationTasks = operations.map(({ operation, method }) =>\n operationLimit(async () => {\n const options = this.getOptions(operation, method)\n\n if (generator.type === 'react') {\n await buildOperation(operation, {\n config: this.context.pluginManager.config,\n fabric: this.context.fabric,\n Component: generator.Operation,\n generator: this,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return []\n }\n\n const result = await generator.operation?.({\n generator: this,\n config: this.context.pluginManager.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return result ?? []\n }),\n )\n\n const operationResults = await Promise.all(operationTasks)\n const opResultsFlat = operationResults.flat()\n\n if (generator.type === 'react') {\n await buildOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.pluginManager.config,\n Component: generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n return []\n }\n\n const operationsResult = await generator.operations?.({\n generator: this,\n config: this.context.pluginManager.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n return [...opResultsFlat, ...(operationsResult ?? [])] as unknown as KubbFile.File<TFileMeta>\n }),\n )\n\n const nestedResults = await Promise.all(writeTasks)\n\n return nestedResults.flat()\n }\n}\n","import path from 'node:path'\nimport type { AsyncEventEmitter } from '@internals/utils'\nimport { camelCase } from '@internals/utils'\nimport { type Config, definePlugin, type Group, getMode, type KubbEvents } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\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 = definePlugin<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 options: {\n output,\n validate,\n discriminator,\n ...options,\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 = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? getMode(path.resolve(root, output.path))\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: Group['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 install() {\n const oas = await this.getOas({ validate })\n\n if (!output) {\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 pluginManager: this.pluginManager,\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 pluginManager: this.pluginManager,\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 { buildOperation, buildOperations, buildSchema } 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","../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 { pascalCase } from '@internals/utils'\nimport type { AsyncEventEmitter, FileMetaBase, KubbEvents, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'\nimport type { Fabric } from '@kubb/react-fabric'\nimport pLimit from 'p-limit'\nimport type { CoreGenerator } from './generators/createGenerator.ts'\nimport type { ReactGenerator } from './generators/createReactGenerator.ts'\nimport type { Generator, Version } from './generators/types.ts'\nimport type { Exclude, Include, OperationSchemas, Override } from './types.ts'\nimport { withRequiredRequestBodySchema } from './utils/requestBody.ts'\nimport { buildOperation, buildOperations } 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: Fabric\n oas: Oas\n exclude: Array<Exclude> | undefined\n include: Array<Include> | undefined\n override: Array<Override<TOptions>> | undefined\n contentType: contentType | undefined\n pluginManager: PluginManager\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, Version>>): Promise<Array<KubbFile.File<TFileMeta>>> {\n const operations = await this.getOperations()\n\n // Increased parallelism for better performance\n // - generatorLimit increased from 1 to 3 to allow parallel generator processing\n // - operationLimit increased from 10 to 30 to process more operations concurrently\n const generatorLimit = pLimit(3)\n const operationLimit = pLimit(30)\n\n this.context.events?.emit('debug', {\n date: new Date(),\n logs: [`Building ${operations.length} operations`, ` • Generators: ${generators.length}`],\n })\n\n const writeTasks = generators.map((generator) =>\n generatorLimit(async () => {\n if (generator.version === '2') {\n return []\n }\n\n // After the v2 guard above, all generators here are v1\n const v1Generator = generator as ReactGenerator<TPluginOptions, '1'> | CoreGenerator<TPluginOptions, '1'>\n\n const operationTasks = operations.map(({ operation, method }) =>\n operationLimit(async () => {\n const options = this.getOptions(operation, method)\n\n if (v1Generator.type === 'react') {\n await buildOperation(operation, {\n config: this.context.pluginManager.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 },\n },\n })\n\n return []\n }\n\n const result = await v1Generator.operation?.({\n generator: this,\n config: this.context.pluginManager.config,\n operation,\n plugin: {\n ...this.context.plugin,\n options: {\n ...this.options,\n ...options,\n },\n },\n })\n\n return result ?? []\n }),\n )\n\n const operationResults = await Promise.all(operationTasks)\n const opResultsFlat = operationResults.flat()\n\n if (v1Generator.type === 'react') {\n await buildOperations(\n operations.map((op) => op.operation),\n {\n fabric: this.context.fabric,\n config: this.context.pluginManager.config,\n Component: v1Generator.Operations,\n generator: this,\n plugin: this.context.plugin,\n },\n )\n\n return []\n }\n\n const operationsResult = await v1Generator.operations?.({\n generator: this,\n config: this.context.pluginManager.config,\n operations: operations.map((op) => op.operation),\n plugin: this.context.plugin,\n })\n\n return [...opResultsFlat, ...(operationsResult ?? [])] as unknown as KubbFile.File<TFileMeta>\n }),\n )\n\n const nestedResults = await Promise.all(writeTasks)\n\n return nestedResults.flat()\n }\n}\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\nimport type { AsyncEventEmitter } from '@kubb/core'\nimport { type Config, definePlugin, type Group, getMode, type KubbEvents } from '@kubb/core'\nimport type { Oas } from '@kubb/oas'\nimport { parseFromConfig, resolveServerUrl } from '@kubb/oas'\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 = definePlugin<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 options: {\n output,\n validate,\n discriminator,\n ...options,\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 = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? getMode(path.resolve(root, output.path))\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: Group['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 install() {\n const oas = await this.getOas({ validate })\n\n if (!output) {\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 pluginManager: this.pluginManager,\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 pluginManager: this.pluginManager,\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 { buildOperation, buildOperations, buildSchema } 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, TVersion extends import('./generators/types.ts').Version = '1'> = _Generator<TOptions, TVersion>\n"],"mappings":"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"}