auto-api-hooks 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ir/helpers.ts","../src/parsers/openapi-parser.ts","../src/parsers/swagger-parser.ts","../src/parsers/graphql-parser.ts","../src/parsers/index.ts","../src/utils/naming.ts","../src/type-gen/typescript-emitter.ts","../src/type-gen/zod-emitter.ts","../src/generators/base-generator.ts","../src/generators/fetch-generator.ts","../src/generators/axios-generator.ts","../src/utils/cache-keys.ts","../src/generators/react-query-generator.ts","../src/generators/swr-generator.ts","../src/utils/errors.ts","../src/generators/index.ts","../src/mock-gen/faker-helpers.ts","../src/mock-gen/handler-emitter.ts","../src/mock-gen/index.ts","../src/utils/logger.ts","../src/utils/file-writer.ts","../src/index.ts"],"names":["isRef","HTTP_METHODS","convertSchema","mergeAllOf","hasObjectShape","convertObjectSchema","convertResponse","generateOperationId","SwaggerParser","mergeParameters","parseYaml","fileHeader","indent","inlineComment","safePropName","escapeString","jsdoc"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n ApiOperation,\n ApiSpec,\n ApiType,\n ApiObjectType,\n PaginationInfo,\n PaginationStrategy,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Cursor-based pagination indicators\n// ---------------------------------------------------------------------------\n\nconst CURSOR_PARAM_NAMES = new Set([\n 'cursor',\n 'after',\n 'before',\n 'page_token',\n 'pageToken',\n 'next_token',\n 'nextToken',\n 'starting_after',\n 'startingAfter',\n 'ending_before',\n 'endingBefore',\n])\n\n// ---------------------------------------------------------------------------\n// Offset/limit pagination indicators\n// ---------------------------------------------------------------------------\n\nconst OFFSET_PARAM_NAMES = new Set([\n 'offset',\n 'skip',\n])\n\nconst LIMIT_PARAM_NAMES = new Set([\n 'limit',\n 'count',\n 'size',\n 'per_page',\n 'perPage',\n 'page_size',\n 'pageSize',\n])\n\n// ---------------------------------------------------------------------------\n// Page-number pagination indicators\n// ---------------------------------------------------------------------------\n\nconst PAGE_NUMBER_PARAM_NAMES = new Set([\n 'page',\n 'page_number',\n 'pageNumber',\n 'p',\n])\n\n// ---------------------------------------------------------------------------\n// Response field indicators for cursor-based pagination\n// ---------------------------------------------------------------------------\n\nconst CURSOR_RESPONSE_FIELDS = new Set([\n 'next_cursor',\n 'nextCursor',\n 'cursor',\n 'next_page_token',\n 'nextPageToken',\n 'next_token',\n 'nextToken',\n 'endCursor',\n 'end_cursor',\n 'has_more',\n 'hasMore',\n])\n\n// ---------------------------------------------------------------------------\n// Response field indicators for items\n// ---------------------------------------------------------------------------\n\nconst ITEMS_FIELDS = new Set([\n 'items',\n 'data',\n 'results',\n 'records',\n 'edges',\n 'nodes',\n 'entries',\n 'list',\n 'rows',\n 'content',\n 'hits',\n])\n\n/**\n * Attempts to find an array property in an object type that likely represents\n * the list of items in a paginated response.\n */\nfunction findItemsPath(type: ApiType): string[] | undefined {\n if (type.kind !== 'object') return undefined\n for (const prop of type.properties) {\n if (ITEMS_FIELDS.has(prop.name) && prop.type.kind === 'array') {\n return [prop.name]\n }\n }\n // Fallback: if the response itself is an array, items are at root\n return undefined\n}\n\n/**\n * Attempts to find a cursor/next-page field in an object response type.\n * Returns the dot-path to the next-page value.\n */\nfunction findNextPagePath(type: ApiType): string[] | undefined {\n if (type.kind !== 'object') return undefined\n for (const prop of type.properties) {\n if (CURSOR_RESPONSE_FIELDS.has(prop.name)) {\n return [prop.name]\n }\n // Check nested \"pagination\" or \"meta\" objects\n if (\n (prop.name === 'pagination' || prop.name === 'meta' || prop.name === 'page_info' || prop.name === 'pageInfo') &&\n prop.type.kind === 'object'\n ) {\n for (const nested of (prop.type as ApiObjectType).properties) {\n if (CURSOR_RESPONSE_FIELDS.has(nested.name)) {\n return [prop.name, nested.name]\n }\n }\n }\n }\n return undefined\n}\n\n/**\n * Attempts to find total-count or total-pages fields in a response that\n * would confirm page-number pagination.\n */\nfunction findPageCountPath(type: ApiType): string[] | undefined {\n if (type.kind !== 'object') return undefined\n\n const PAGE_COUNT_FIELDS = new Set([\n 'total_pages', 'totalPages', 'total_count', 'totalCount',\n 'total', 'page_count', 'pageCount', 'last_page', 'lastPage',\n ])\n\n for (const prop of type.properties) {\n if (PAGE_COUNT_FIELDS.has(prop.name)) {\n return [prop.name]\n }\n if (\n (prop.name === 'pagination' || prop.name === 'meta') &&\n prop.type.kind === 'object'\n ) {\n for (const nested of (prop.type as ApiObjectType).properties) {\n if (PAGE_COUNT_FIELDS.has(nested.name)) {\n return [prop.name, nested.name]\n }\n }\n }\n }\n return undefined\n}\n\n/**\n * Detects whether an API operation uses pagination based on heuristic\n * analysis of its query parameters and response shape.\n *\n * @param op - The API operation to analyze.\n * @returns Pagination info if detected, or `undefined` if the operation does not appear paginated.\n */\nexport function detectPagination(op: ApiOperation): PaginationInfo | undefined {\n const queryParamNames = new Set(op.queryParams.map((p) => p.name))\n const responseType = op.response.type\n\n // --- Strategy 1: Cursor-based pagination ---\n for (const name of CURSOR_PARAM_NAMES) {\n if (queryParamNames.has(name)) {\n const nextPagePath = findNextPagePath(responseType) ?? [name]\n const itemsPath = findItemsPath(responseType) ?? []\n return {\n strategy: 'cursor' as PaginationStrategy,\n pageParam: name,\n nextPagePath,\n itemsPath,\n }\n }\n }\n\n // --- Strategy 2: Offset/limit pagination ---\n for (const offsetName of OFFSET_PARAM_NAMES) {\n if (queryParamNames.has(offsetName)) {\n const hasLimit = [...LIMIT_PARAM_NAMES].some((n) => queryParamNames.has(n))\n if (hasLimit) {\n const itemsPath = findItemsPath(responseType) ?? []\n return {\n strategy: 'offset-limit' as PaginationStrategy,\n pageParam: offsetName,\n nextPagePath: [offsetName],\n itemsPath,\n }\n }\n }\n }\n\n // --- Strategy 3: Page-number pagination ---\n for (const pageName of PAGE_NUMBER_PARAM_NAMES) {\n if (queryParamNames.has(pageName)) {\n const itemsPath = findItemsPath(responseType) ?? []\n const nextPagePath = findPageCountPath(responseType) ?? [pageName]\n return {\n strategy: 'page-number' as PaginationStrategy,\n pageParam: pageName,\n nextPagePath,\n itemsPath,\n }\n }\n }\n\n // --- Fallback: check response shape for cursor fields even without matching query params ---\n if (responseType.kind === 'object') {\n const cursorPath = findNextPagePath(responseType)\n const items = findItemsPath(responseType)\n if (cursorPath && items) {\n // There's a cursor in the response but we need to guess the param name\n const likelyCursorParam = [...CURSOR_PARAM_NAMES].find((n) => queryParamNames.has(n))\n ?? [...PAGE_NUMBER_PARAM_NAMES].find((n) => queryParamNames.has(n))\n if (likelyCursorParam) {\n return {\n strategy: 'cursor',\n pageParam: likelyCursorParam,\n nextPagePath: cursorPath,\n itemsPath: items,\n }\n }\n }\n }\n\n return undefined\n}\n\n/**\n * Runs pagination detection on all GET operations in the spec and attaches\n * `PaginationInfo` to each operation that appears to be paginated.\n *\n * @param spec - The API spec to process.\n * @returns A new API spec with pagination info attached to detected operations.\n */\nexport function applyPaginationDetection(spec: ApiSpec): ApiSpec {\n const operations = spec.operations.map((op) => {\n // Only detect pagination on GET / QUERY operations\n if (op.method !== 'GET' && op.method !== 'QUERY') {\n return op\n }\n // Don't overwrite existing pagination info\n if (op.pagination) {\n return op\n }\n const pagination = detectPagination(op)\n if (pagination) {\n return { ...op, pagination }\n }\n return op\n })\n\n return { ...spec, operations }\n}\n","import SwaggerParser from '@apidevtools/swagger-parser'\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\nimport type {\n ApiSpec,\n ApiOperation,\n ApiParam,\n ApiRequestBody,\n ApiResponse,\n ApiType,\n ApiObjectType,\n ApiArrayType,\n ApiPrimitiveType,\n ApiEnumType,\n ApiUnionType,\n ApiProperty,\n HttpMethod,\n} from '../ir/types'\nimport type { SpecParser, ParseOptions } from './types'\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject\ntype ReferenceObject = OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject\ntype ParameterObject = OpenAPIV3.ParameterObject\ntype RequestBodyObject = OpenAPIV3.RequestBodyObject\ntype ResponseObject = OpenAPIV3.ResponseObject\ntype MediaTypeObject = OpenAPIV3.MediaTypeObject\n\nfunction isRef(obj: unknown): obj is ReferenceObject {\n return typeof obj === 'object' && obj !== null && '$ref' in obj\n}\n\n// ---------------------------------------------------------------------------\n// HTTP method mapping\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'get', 'post', 'put', 'delete', 'patch', 'head', 'options',\n])\n\n// ---------------------------------------------------------------------------\n// JSON Schema -> ApiType conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively converts a JSON Schema (OpenAPI 3.x) object into the IR `ApiType`.\n * After dereferencing, `$ref` values are inlined as objects.\n */\nfunction convertSchema(schema: SchemaObject | undefined): ApiType {\n if (!schema) {\n return { kind: 'primitive', type: 'unknown' }\n }\n\n // Handle oneOf / anyOf -> union\n if (schema.oneOf && schema.oneOf.length > 0) {\n const variants = schema.oneOf\n .filter((s): s is SchemaObject => !isRef(s))\n .map((s) => convertSchema(s))\n return { kind: 'union', variants, description: schema.description } satisfies ApiUnionType\n }\n if (schema.anyOf && schema.anyOf.length > 0) {\n const variants = schema.anyOf\n .filter((s): s is SchemaObject => !isRef(s))\n .map((s) => convertSchema(s))\n return { kind: 'union', variants, description: schema.description } satisfies ApiUnionType\n }\n\n // Handle allOf -> merge into single object\n if (schema.allOf && schema.allOf.length > 0) {\n const merged = mergeAllOf(schema.allOf.filter((s): s is SchemaObject => !isRef(s)))\n const result = convertSchema(merged)\n if (schema.description && result.kind === 'object') {\n return { ...result, description: schema.description }\n }\n return result\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n return {\n kind: 'enum',\n values: schema.enum as (string | number)[],\n name: schema.title,\n description: schema.description,\n } satisfies ApiEnumType\n }\n\n // Handle array\n if (schema.type === 'array') {\n const arraySchema = schema as OpenAPIV3.ArraySchemaObject\n const items = isRef(arraySchema.items)\n ? ({ kind: 'primitive', type: 'unknown' } as ApiType)\n : convertSchema(arraySchema.items as SchemaObject)\n return { kind: 'array', items, description: schema.description } satisfies ApiArrayType\n }\n\n // Handle object (explicit or has properties)\n if (schema.type === 'object' || schema.properties || (!schema.type && hasObjectShape(schema))) {\n return convertObjectSchema(schema)\n }\n\n // Handle primitives\n if (schema.type === 'string' || schema.type === 'number' || schema.type === 'integer' || schema.type === 'boolean') {\n const result: ApiPrimitiveType = {\n kind: 'primitive',\n type: schema.type,\n description: schema.description,\n }\n if (schema.format) {\n result.format = schema.format\n }\n return result\n }\n\n // Nullable shorthand in OpenAPI 3.0\n if ((schema as OpenAPIV3.SchemaObject).nullable && schema.type) {\n const inner = convertSchema({ ...schema, nullable: undefined } as SchemaObject)\n return {\n kind: 'union',\n variants: [inner, { kind: 'primitive', type: 'null' }],\n description: schema.description,\n } satisfies ApiUnionType\n }\n\n return { kind: 'primitive', type: 'unknown', description: schema.description }\n}\n\n/**\n * Checks whether a schema object has properties that suggest it's an object type.\n */\nfunction hasObjectShape(schema: SchemaObject): boolean {\n return !!(schema.properties || schema.additionalProperties)\n}\n\n/**\n * Converts an object-type JSON Schema into an `ApiObjectType`.\n */\nfunction convertObjectSchema(schema: SchemaObject): ApiObjectType {\n const requiredSet = new Set<string>(schema.required ?? [])\n const properties: ApiProperty[] = []\n\n if (schema.properties) {\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n if (isRef(propSchema)) continue\n properties.push({\n name,\n type: convertSchema(propSchema as SchemaObject),\n required: requiredSet.has(name),\n description: (propSchema as SchemaObject).description,\n })\n }\n }\n\n const result: ApiObjectType = {\n kind: 'object',\n properties,\n description: schema.description,\n }\n\n if (schema.title) {\n result.name = schema.title\n }\n\n if (schema.additionalProperties !== undefined) {\n if (typeof schema.additionalProperties === 'boolean') {\n result.additionalProperties = schema.additionalProperties\n } else if (!isRef(schema.additionalProperties)) {\n result.additionalProperties = convertSchema(schema.additionalProperties as SchemaObject)\n }\n }\n\n return result\n}\n\n/**\n * Merges multiple schemas from an `allOf` composition into a single schema.\n */\nfunction mergeAllOf(schemas: SchemaObject[]): SchemaObject {\n const merged: SchemaObject = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n for (const schema of schemas) {\n if (schema.properties) {\n Object.assign(merged.properties!, schema.properties)\n }\n if (schema.required) {\n ;(merged.required as string[]).push(...schema.required)\n }\n if (schema.description && !merged.description) {\n merged.description = schema.description\n }\n }\n\n return merged\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion\n// ---------------------------------------------------------------------------\n\nfunction convertParameter(param: ParameterObject): ApiParam {\n const schema = param.schema && !isRef(param.schema)\n ? (param.schema as SchemaObject)\n : undefined\n\n return {\n name: param.name,\n required: param.required ?? (param.in === 'path'),\n type: convertSchema(schema),\n description: param.description,\n in: param.in as 'path' | 'query' | 'header',\n }\n}\n\n// ---------------------------------------------------------------------------\n// Request body conversion\n// ---------------------------------------------------------------------------\n\nfunction convertRequestBody(body: RequestBodyObject): ApiRequestBody | undefined {\n const jsonContent = body.content['application/json'] ?? body.content['*/*']\n if (!jsonContent) {\n // Try to find any content type\n const firstKey = Object.keys(body.content)[0]\n if (!firstKey) return undefined\n const mediaType = body.content[firstKey]\n return convertMediaTypeToBody(mediaType, firstKey, body)\n }\n\n return convertMediaTypeToBody(jsonContent, 'application/json', body)\n}\n\nfunction convertMediaTypeToBody(\n media: MediaTypeObject,\n contentType: string,\n body: RequestBodyObject,\n): ApiRequestBody {\n const schema = media.schema && !isRef(media.schema)\n ? (media.schema as SchemaObject)\n : undefined\n\n return {\n required: body.required ?? false,\n contentType,\n type: convertSchema(schema),\n description: body.description,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Response conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Finds the success response (200, 201, or first 2xx) from the responses object.\n */\nfunction convertResponse(\n responses: Record<string, ResponseObject | ReferenceObject>,\n): ApiResponse {\n // Priority order: 200, 201, first 2xx, default\n const successCodes = ['200', '201']\n let responseObj: ResponseObject | undefined\n let statusCode: number | 'default' = 200\n\n for (const code of successCodes) {\n const candidate = responses[code]\n if (candidate && !isRef(candidate)) {\n responseObj = candidate as ResponseObject\n statusCode = parseInt(code, 10)\n break\n }\n }\n\n if (!responseObj) {\n // Look for first 2xx\n for (const [code, value] of Object.entries(responses)) {\n if (code.startsWith('2') && !isRef(value)) {\n responseObj = value as ResponseObject\n statusCode = parseInt(code, 10)\n break\n }\n }\n }\n\n if (!responseObj) {\n // Fallback to default\n const defaultResp = responses['default']\n if (defaultResp && !isRef(defaultResp)) {\n responseObj = defaultResp as ResponseObject\n statusCode = 'default'\n }\n }\n\n if (!responseObj) {\n return {\n statusCode: 200,\n contentType: 'application/json',\n type: { kind: 'primitive', type: 'unknown' },\n }\n }\n\n const content = responseObj.content\n if (!content) {\n return {\n statusCode,\n contentType: 'application/json',\n type: { kind: 'primitive', type: 'unknown' },\n description: responseObj.description,\n }\n }\n\n const jsonMedia = content['application/json'] ?? content['*/*']\n if (jsonMedia) {\n const schema = jsonMedia.schema && !isRef(jsonMedia.schema)\n ? (jsonMedia.schema as SchemaObject)\n : undefined\n\n return {\n statusCode,\n contentType: 'application/json',\n type: convertSchema(schema),\n description: responseObj.description,\n }\n }\n\n // Fallback to first content type\n const firstKey = Object.keys(content)[0]\n if (firstKey) {\n const media = content[firstKey]\n const schema = media.schema && !isRef(media.schema)\n ? (media.schema as SchemaObject)\n : undefined\n\n return {\n statusCode,\n contentType: firstKey,\n type: convertSchema(schema),\n description: responseObj.description,\n }\n }\n\n return {\n statusCode,\n contentType: 'application/json',\n type: { kind: 'primitive', type: 'unknown' },\n description: responseObj.description,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Operation ID generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generates an operationId from the HTTP method and path when one is not\n * provided by the spec.\n *\n * @example generateOperationId('get', '/users/{id}/posts') => 'getUsersIdPosts'\n */\nfunction generateOperationId(method: string, path: string): string {\n const segments = path\n .split('/')\n .filter(Boolean)\n .map((seg) => {\n // Remove curly braces from path params\n const clean = seg.replace(/[{}]/g, '')\n return clean.charAt(0).toUpperCase() + clean.slice(1)\n })\n\n return method.toLowerCase() + segments.join('')\n}\n\n// ---------------------------------------------------------------------------\n// OpenAPI 3.x Parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parser for OpenAPI 3.x specifications.\n *\n * Uses `@apidevtools/swagger-parser` to dereference the spec, then walks\n * the `paths` object to build the IR `ApiOperation[]`. Named schemas from\n * `components.schemas` are extracted into `ApiSpec.types`.\n */\nexport const openApiParser: SpecParser = {\n canParse(input: unknown): boolean {\n if (typeof input !== 'object' || input === null) return false\n const doc = input as Record<string, unknown>\n return typeof doc.openapi === 'string' && doc.openapi.startsWith('3')\n },\n\n async parse(input: unknown, options?: ParseOptions): Promise<ApiSpec> {\n // Dereference the spec to inline all $ref pointers\n const derefed = await SwaggerParser.dereference(\n input as OpenAPIV3.Document,\n { dereference: { circular: 'ignore' } },\n )\n\n const doc = derefed as OpenAPIV3.Document\n const types = new Map<string, ApiType>()\n\n // Extract named schemas from components.schemas\n if (doc.components?.schemas) {\n for (const [name, schema] of Object.entries(doc.components.schemas)) {\n if (!isRef(schema)) {\n const converted = convertSchema(schema as SchemaObject)\n // Attach the schema name if it's an object or enum type\n if (converted.kind === 'object' && !converted.name) {\n ;(converted as ApiObjectType).name = name\n } else if (converted.kind === 'enum' && !converted.name) {\n ;(converted as ApiEnumType).name = name\n }\n types.set(name, converted)\n }\n }\n }\n\n // Determine base URL\n const baseUrl = options?.baseUrl\n ?? (doc.servers && doc.servers.length > 0 ? doc.servers[0].url : '')\n\n // Build operations from paths\n const operations: ApiOperation[] = []\n\n if (doc.paths) {\n for (const [path, pathItem] of Object.entries(doc.paths)) {\n if (!pathItem) continue\n\n // Gather path-level parameters\n const pathLevelParams: ParameterObject[] = (pathItem.parameters ?? [])\n .filter((p): p is ParameterObject => !isRef(p))\n\n for (const method of HTTP_METHODS) {\n const operationObj = (pathItem as Record<string, unknown>)[method] as\n | OpenAPIV3.OperationObject\n | undefined\n\n if (!operationObj) continue\n\n // Merge path-level + operation-level parameters (operation overrides)\n const opParams: ParameterObject[] = (operationObj.parameters ?? [])\n .filter((p): p is ParameterObject => !isRef(p))\n\n const mergedParams = mergeParameters(pathLevelParams, opParams)\n\n const pathParams: ApiParam[] = []\n const queryParams: ApiParam[] = []\n const headerParams: ApiParam[] = []\n\n for (const param of mergedParams) {\n const converted = convertParameter(param)\n switch (param.in) {\n case 'path':\n pathParams.push(converted)\n break\n case 'query':\n queryParams.push(converted)\n break\n case 'header':\n headerParams.push(converted)\n break\n }\n }\n\n // Request body\n let requestBody: ApiRequestBody | undefined\n if (operationObj.requestBody && !isRef(operationObj.requestBody)) {\n requestBody = convertRequestBody(operationObj.requestBody as RequestBodyObject)\n }\n\n // Response\n const response = convertResponse(\n operationObj.responses as Record<string, ResponseObject | ReferenceObject>,\n )\n\n // Tags\n const tags = operationObj.tags && operationObj.tags.length > 0\n ? operationObj.tags\n : ['default']\n\n // Operation ID\n const operationId = operationObj.operationId\n ?? generateOperationId(method, path)\n\n operations.push({\n operationId,\n summary: operationObj.summary,\n method: method.toUpperCase() as HttpMethod,\n path,\n tags,\n pathParams,\n queryParams,\n headerParams,\n requestBody,\n response,\n deprecated: operationObj.deprecated ?? false,\n })\n }\n }\n }\n\n return {\n title: doc.info?.title ?? 'Untitled API',\n baseUrl,\n version: doc.info?.version ?? '0.0.0',\n operations,\n types,\n }\n },\n}\n\n/**\n * Merges path-level and operation-level parameters. Operation-level parameters\n * with the same `name` and `in` override path-level parameters.\n */\nfunction mergeParameters(\n pathParams: ParameterObject[],\n opParams: ParameterObject[],\n): ParameterObject[] {\n const opParamKeys = new Set(opParams.map((p) => `${p.in}:${p.name}`))\n const filtered = pathParams.filter((p) => !opParamKeys.has(`${p.in}:${p.name}`))\n return [...filtered, ...opParams]\n}\n","import SwaggerParser from '@apidevtools/swagger-parser'\nimport type { OpenAPIV2 } from 'openapi-types'\nimport type {\n ApiSpec,\n ApiOperation,\n ApiParam,\n ApiRequestBody,\n ApiResponse,\n ApiType,\n ApiObjectType,\n ApiArrayType,\n ApiPrimitiveType,\n ApiEnumType,\n ApiUnionType,\n ApiProperty,\n HttpMethod,\n} from '../ir/types'\nimport type { SpecParser, ParseOptions } from './types'\n\n// ---------------------------------------------------------------------------\n// Type aliases\n// ---------------------------------------------------------------------------\n\ntype SchemaObject = OpenAPIV2.SchemaObject\ntype InBodyParameterObject = OpenAPIV2.InBodyParameterObject\ntype GeneralParameterObject = OpenAPIV2.GeneralParameterObject\ntype ResponseObject = OpenAPIV2.ResponseObject\ntype ReferenceObject = OpenAPIV2.ReferenceObject\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nfunction isRef(obj: unknown): obj is ReferenceObject {\n return typeof obj === 'object' && obj !== null && '$ref' in obj\n}\n\nfunction isBodyParam(param: OpenAPIV2.Parameter): param is InBodyParameterObject {\n return param.in === 'body'\n}\n\n// ---------------------------------------------------------------------------\n// HTTP method mapping\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'get', 'post', 'put', 'delete', 'patch', 'head', 'options',\n])\n\n// ---------------------------------------------------------------------------\n// JSON Schema -> ApiType conversion (Swagger 2.0 variant)\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively converts a Swagger 2.0 JSON Schema object into the IR `ApiType`.\n */\nfunction convertSchema(schema: SchemaObject | undefined): ApiType {\n if (!schema) {\n return { kind: 'primitive', type: 'unknown' }\n }\n\n // Handle oneOf / anyOf -> union\n if (schema.oneOf && schema.oneOf.length > 0) {\n const variants = schema.oneOf\n .filter((s): s is SchemaObject => !isRef(s))\n .map((s) => convertSchema(s as SchemaObject))\n return { kind: 'union', variants, description: schema.description } satisfies ApiUnionType\n }\n if (schema.anyOf && schema.anyOf.length > 0) {\n const variants = schema.anyOf\n .filter((s): s is SchemaObject => !isRef(s))\n .map((s) => convertSchema(s as SchemaObject))\n return { kind: 'union', variants, description: schema.description } satisfies ApiUnionType\n }\n\n // Handle allOf -> merge into object\n if (schema.allOf && schema.allOf.length > 0) {\n const merged = mergeAllOf(\n schema.allOf.filter((s): s is SchemaObject => !isRef(s)),\n )\n const result = convertSchema(merged)\n if (schema.description && result.kind === 'object') {\n return { ...result, description: schema.description }\n }\n return result\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n return {\n kind: 'enum',\n values: schema.enum as (string | number)[],\n name: schema.title,\n description: schema.description,\n } satisfies ApiEnumType\n }\n\n const schemaType = typeof schema.type === 'string' ? schema.type : undefined\n\n // Handle array\n if (schemaType === 'array') {\n let items: ApiType = { kind: 'primitive', type: 'unknown' }\n if (schema.items && !isRef(schema.items)) {\n items = convertSchema(schema.items as SchemaObject)\n }\n return { kind: 'array', items, description: schema.description } satisfies ApiArrayType\n }\n\n // Handle object\n if (schemaType === 'object' || schema.properties || (!schemaType && hasObjectShape(schema))) {\n return convertObjectSchema(schema)\n }\n\n // Handle primitives\n if (schemaType === 'string' || schemaType === 'number' || schemaType === 'integer' || schemaType === 'boolean') {\n const result: ApiPrimitiveType = {\n kind: 'primitive',\n type: schemaType,\n description: schema.description,\n }\n if (schema.format) {\n result.format = schema.format\n }\n return result\n }\n\n return { kind: 'primitive', type: 'unknown', description: schema.description }\n}\n\nfunction hasObjectShape(schema: SchemaObject): boolean {\n return !!(schema.properties || schema.additionalProperties)\n}\n\nfunction convertObjectSchema(schema: SchemaObject): ApiObjectType {\n const requiredSet = new Set<string>(schema.required ?? [])\n const properties: ApiProperty[] = []\n\n if (schema.properties) {\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n if (isRef(propSchema)) continue\n properties.push({\n name,\n type: convertSchema(propSchema as SchemaObject),\n required: requiredSet.has(name),\n description: (propSchema as SchemaObject).description,\n })\n }\n }\n\n const result: ApiObjectType = {\n kind: 'object',\n properties,\n description: schema.description,\n }\n\n if (schema.title) {\n result.name = schema.title\n }\n\n if (schema.additionalProperties !== undefined) {\n if (typeof schema.additionalProperties === 'boolean') {\n result.additionalProperties = schema.additionalProperties\n } else if (!isRef(schema.additionalProperties)) {\n result.additionalProperties = convertSchema(schema.additionalProperties as SchemaObject)\n }\n }\n\n return result\n}\n\nfunction mergeAllOf(schemas: SchemaObject[]): SchemaObject {\n const merged: SchemaObject = {\n type: 'object',\n properties: {},\n required: [],\n }\n for (const schema of schemas) {\n if (schema.properties) {\n Object.assign(merged.properties!, schema.properties)\n }\n if (schema.required) {\n ;(merged.required as string[]).push(...schema.required)\n }\n if (schema.description && !merged.description) {\n merged.description = schema.description\n }\n }\n return merged\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion (Swagger 2.0)\n// ---------------------------------------------------------------------------\n\n/**\n * Converts a non-body Swagger 2.0 parameter to an `ApiParam`.\n * For `in: \"body\"` parameters, use `convertBodyParam` instead.\n */\nfunction convertGeneralParam(param: GeneralParameterObject): ApiParam {\n const paramType = param.type as string | undefined\n let type: ApiType\n\n if (param.enum && param.enum.length > 0) {\n type = {\n kind: 'enum',\n values: param.enum as (string | number)[],\n }\n } else if (paramType === 'array' && param.items) {\n const itemSchema = isRef(param.items)\n ? ({ kind: 'primitive', type: 'unknown' } as ApiType)\n : convertItemsToType(param.items)\n type = { kind: 'array', items: itemSchema }\n } else {\n type = {\n kind: 'primitive',\n type: mapSwagger2Type(paramType),\n format: param.format,\n } as ApiPrimitiveType\n }\n\n return {\n name: param.name,\n required: param.required ?? (param.in === 'path'),\n type,\n description: param.description,\n in: param.in as 'path' | 'query' | 'header',\n }\n}\n\n/**\n * Converts a Swagger 2.0 `ItemsObject` to an `ApiType`.\n */\nfunction convertItemsToType(items: OpenAPIV2.ItemsObject): ApiType {\n if (items.enum && items.enum.length > 0) {\n return { kind: 'enum', values: items.enum as (string | number)[] }\n }\n if (items.type === 'array' && items.items && !isRef(items.items)) {\n return {\n kind: 'array',\n items: convertItemsToType(items.items as OpenAPIV2.ItemsObject),\n }\n }\n return {\n kind: 'primitive',\n type: mapSwagger2Type(items.type),\n format: items.format,\n } as ApiPrimitiveType\n}\n\n/**\n * Maps a Swagger 2.0 type string to the IR primitive type.\n */\nfunction mapSwagger2Type(\n t: string | undefined,\n): 'string' | 'number' | 'integer' | 'boolean' | 'null' | 'unknown' {\n switch (t) {\n case 'string':\n return 'string'\n case 'number':\n case 'float':\n case 'double':\n return 'number'\n case 'integer':\n case 'long':\n return 'integer'\n case 'boolean':\n return 'boolean'\n default:\n return 'unknown'\n }\n}\n\n/**\n * Converts a `in: \"body\"` parameter to `ApiRequestBody`.\n */\nfunction convertBodyParam(\n param: InBodyParameterObject,\n produces: string[],\n): ApiRequestBody {\n const schema = isRef(param.schema)\n ? undefined\n : (param.schema as SchemaObject | undefined)\n\n return {\n required: param.required ?? false,\n contentType: produces.includes('application/json')\n ? 'application/json'\n : (produces[0] ?? 'application/json'),\n type: convertSchema(schema),\n description: param.description,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Response conversion (Swagger 2.0)\n// ---------------------------------------------------------------------------\n\nfunction convertResponse(\n responses: OpenAPIV2.ResponsesObject,\n produces: string[],\n): ApiResponse {\n const successCodes = ['200', '201']\n let responseObj: ResponseObject | undefined\n let statusCode: number | 'default' = 200\n\n for (const code of successCodes) {\n const candidate = responses[code]\n if (candidate && !isRef(candidate)) {\n responseObj = candidate as ResponseObject\n statusCode = parseInt(code, 10)\n break\n }\n }\n\n if (!responseObj) {\n for (const [code, value] of Object.entries(responses)) {\n if (code.startsWith('2') && value && !isRef(value)) {\n responseObj = value as ResponseObject\n statusCode = parseInt(code, 10)\n break\n }\n }\n }\n\n if (!responseObj) {\n const defaultResp = responses['default']\n if (defaultResp && !isRef(defaultResp)) {\n responseObj = defaultResp as ResponseObject\n statusCode = 'default'\n }\n }\n\n if (!responseObj || !responseObj.schema) {\n return {\n statusCode,\n contentType: produces[0] ?? 'application/json',\n type: { kind: 'primitive', type: 'unknown' },\n description: responseObj?.description,\n }\n }\n\n const schema = isRef(responseObj.schema)\n ? undefined\n : (responseObj.schema as SchemaObject)\n\n const contentType = produces.includes('application/json')\n ? 'application/json'\n : (produces[0] ?? 'application/json')\n\n return {\n statusCode,\n contentType,\n type: convertSchema(schema),\n description: responseObj.description,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Operation ID generation\n// ---------------------------------------------------------------------------\n\nfunction generateOperationId(method: string, path: string): string {\n const segments = path\n .split('/')\n .filter(Boolean)\n .map((seg) => {\n const clean = seg.replace(/[{}]/g, '')\n return clean.charAt(0).toUpperCase() + clean.slice(1)\n })\n return method.toLowerCase() + segments.join('')\n}\n\n// ---------------------------------------------------------------------------\n// Swagger 2.0 Parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parser for Swagger 2.0 specifications.\n *\n * Uses `@apidevtools/swagger-parser` to dereference the spec. Schemas are\n * read from `definitions` (not `components.schemas`), body parameters become\n * `requestBody`, and `host` + `basePath` form the base URL.\n */\nexport const swaggerParser: SpecParser = {\n canParse(input: unknown): boolean {\n if (typeof input !== 'object' || input === null) return false\n const doc = input as Record<string, unknown>\n return doc.swagger === '2.0'\n },\n\n async parse(input: unknown, options?: ParseOptions): Promise<ApiSpec> {\n const derefed = await SwaggerParser.dereference(\n input as OpenAPIV2.Document,\n { dereference: { circular: 'ignore' } },\n )\n\n const doc = derefed as OpenAPIV2.Document\n const types = new Map<string, ApiType>()\n\n // Extract named schemas from definitions\n if (doc.definitions) {\n for (const [name, schema] of Object.entries(doc.definitions)) {\n if (!isRef(schema)) {\n const converted = convertSchema(schema as SchemaObject)\n if (converted.kind === 'object' && !converted.name) {\n ;(converted as ApiObjectType).name = name\n } else if (converted.kind === 'enum' && !converted.name) {\n ;(converted as ApiEnumType).name = name\n }\n types.set(name, converted)\n }\n }\n }\n\n // Determine base URL\n let baseUrl = options?.baseUrl ?? ''\n if (!baseUrl) {\n const scheme = doc.schemes && doc.schemes.length > 0\n ? doc.schemes[0]\n : 'https'\n const host = doc.host ?? ''\n const basePath = doc.basePath ?? ''\n if (host) {\n baseUrl = `${scheme}://${host}${basePath}`\n } else {\n baseUrl = basePath\n }\n }\n\n // Global produces\n const globalProduces = doc.produces ?? ['application/json']\n\n // Build operations from paths\n const operations: ApiOperation[] = []\n\n for (const [path, pathItem] of Object.entries(doc.paths)) {\n if (!pathItem) continue\n\n // Path-level parameters\n const pathLevelParams = (pathItem.parameters ?? [])\n .filter((p): p is OpenAPIV2.Parameter => !isRef(p))\n\n for (const method of HTTP_METHODS) {\n const operationObj = (pathItem as Record<string, unknown>)[method] as\n | OpenAPIV2.OperationObject\n | undefined\n\n if (!operationObj) continue\n\n // Merge path-level + operation-level parameters\n const opRawParams = (operationObj.parameters ?? [])\n .filter((p): p is OpenAPIV2.Parameter => !isRef(p))\n\n const mergedParams = mergeParameters(pathLevelParams, opRawParams)\n\n // Determine content type for this operation\n const produces = operationObj.produces ?? globalProduces\n\n const pathParams: ApiParam[] = []\n const queryParams: ApiParam[] = []\n const headerParams: ApiParam[] = []\n let requestBody: ApiRequestBody | undefined\n\n for (const param of mergedParams) {\n if (isBodyParam(param)) {\n requestBody = convertBodyParam(param, produces)\n } else {\n const generalParam = param as GeneralParameterObject\n const converted = convertGeneralParam(generalParam)\n switch (param.in) {\n case 'path':\n pathParams.push(converted)\n break\n case 'query':\n queryParams.push(converted)\n break\n case 'header':\n headerParams.push(converted)\n break\n // 'formData' params are not mapped to path/query/header\n }\n }\n }\n\n const response = convertResponse(operationObj.responses, produces)\n\n const tags = operationObj.tags && operationObj.tags.length > 0\n ? operationObj.tags\n : ['default']\n\n const operationId = operationObj.operationId\n ?? generateOperationId(method, path)\n\n operations.push({\n operationId,\n summary: operationObj.summary,\n method: method.toUpperCase() as HttpMethod,\n path,\n tags,\n pathParams,\n queryParams,\n headerParams,\n requestBody,\n response,\n deprecated: operationObj.deprecated ?? false,\n })\n }\n }\n\n return {\n title: doc.info?.title ?? 'Untitled API',\n baseUrl,\n version: doc.info?.version ?? '0.0.0',\n operations,\n types,\n }\n },\n}\n\n/**\n * Merges path-level and operation-level parameters. Operation-level parameters\n * with the same `name` and `in` override path-level ones.\n */\nfunction mergeParameters(\n pathParams: OpenAPIV2.Parameter[],\n opParams: OpenAPIV2.Parameter[],\n): OpenAPIV2.Parameter[] {\n const opParamKeys = new Set(opParams.map((p) => `${p.in}:${p.name}`))\n const filtered = pathParams.filter((p) => !opParamKeys.has(`${p.in}:${p.name}`))\n return [...filtered, ...opParams]\n}\n","import {\n buildClientSchema,\n buildSchema,\n isEnumType,\n isInputObjectType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n isUnionType,\n} from 'graphql'\nimport type {\n GraphQLSchema,\n GraphQLType,\n GraphQLArgument,\n GraphQLObjectType,\n GraphQLInputObjectType,\n IntrospectionQuery,\n} from 'graphql'\nimport type {\n ApiSpec,\n ApiOperation,\n ApiParam,\n ApiRequestBody,\n ApiResponse,\n ApiType,\n ApiProperty,\n OperationMethod,\n} from '../ir/types'\nimport type { SpecParser, ParseOptions } from './types'\n\n// ---------------------------------------------------------------------------\n// Introspection type guard\n// ---------------------------------------------------------------------------\n\ninterface IntrospectionResult {\n __schema: IntrospectionQuery['__schema']\n}\n\ninterface IntrospectionWrapper {\n data: IntrospectionResult\n}\n\nfunction isIntrospectionResult(input: unknown): input is IntrospectionResult {\n return typeof input === 'object' && input !== null && '__schema' in input\n}\n\nfunction isIntrospectionWrapper(input: unknown): input is IntrospectionWrapper {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'data' in input &&\n typeof (input as IntrospectionWrapper).data === 'object' &&\n (input as IntrospectionWrapper).data !== null &&\n '__schema' in (input as IntrospectionWrapper).data\n )\n}\n\n// ---------------------------------------------------------------------------\n// SDL detection\n// ---------------------------------------------------------------------------\n\nconst SDL_KEYWORDS = /^\\s*(type |schema |input |enum |union |interface |scalar |directive |extend )/\n\nfunction isSDLString(input: unknown): input is string {\n return typeof input === 'string' && SDL_KEYWORDS.test(input)\n}\n\n// ---------------------------------------------------------------------------\n// Scalar type mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Maps a GraphQL scalar type name to the IR primitive type.\n */\nfunction mapScalarType(\n name: string,\n): { type: 'string' | 'number' | 'integer' | 'boolean' | 'unknown'; format?: string } {\n switch (name) {\n case 'String':\n return { type: 'string' }\n case 'Int':\n return { type: 'number', format: 'int32' }\n case 'Float':\n return { type: 'number', format: 'float' }\n case 'Boolean':\n return { type: 'boolean' }\n case 'ID':\n return { type: 'string', format: 'id' }\n case 'DateTime':\n return { type: 'string', format: 'date-time' }\n case 'Date':\n return { type: 'string', format: 'date' }\n case 'JSON':\n case 'JSONObject':\n return { type: 'unknown' }\n default:\n return { type: 'string' }\n }\n}\n\n// ---------------------------------------------------------------------------\n// GraphQL type -> ApiType conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Set to track visited types and avoid infinite recursion with circular references.\n */\nconst visitedTypes = new Set<string>()\n\n/**\n * Converts a GraphQL type to the IR `ApiType`. Unwraps NonNull and List wrappers.\n * Returns `{ type, required }` where `required` is `true` when the outermost\n * wrapper is `GraphQLNonNull`.\n */\nfunction convertGraphQLType(\n graphqlType: GraphQLType,\n): { type: ApiType; required: boolean } {\n let required = false\n\n // Unwrap NonNull\n let unwrapped = graphqlType\n if (isNonNullType(unwrapped)) {\n required = true\n unwrapped = unwrapped.ofType\n }\n\n const apiType = convertInnerType(unwrapped)\n return { type: apiType, required }\n}\n\n/**\n * Converts the inner (non-null-unwrapped) GraphQL type to ApiType.\n */\nfunction convertInnerType(graphqlType: GraphQLType): ApiType {\n // List\n if (isListType(graphqlType)) {\n const inner = isNonNullType(graphqlType.ofType)\n ? convertInnerType(graphqlType.ofType.ofType)\n : convertInnerType(graphqlType.ofType)\n return { kind: 'array', items: inner }\n }\n\n // Scalar\n if (isScalarType(graphqlType)) {\n const mapped = mapScalarType(graphqlType.name)\n return {\n kind: 'primitive',\n type: mapped.type,\n format: mapped.format,\n description: graphqlType.description ?? undefined,\n }\n }\n\n // Enum\n if (isEnumType(graphqlType)) {\n return {\n kind: 'enum',\n name: graphqlType.name,\n values: graphqlType.getValues().map((v) => v.value as string),\n description: graphqlType.description ?? undefined,\n }\n }\n\n // Union\n if (isUnionType(graphqlType)) {\n const variants = graphqlType.getTypes().map((t) => convertInnerType(t))\n return {\n kind: 'union',\n variants,\n description: graphqlType.description ?? undefined,\n }\n }\n\n // Object\n if (isObjectType(graphqlType)) {\n return convertObjectType(graphqlType)\n }\n\n // InputObject\n if (isInputObjectType(graphqlType)) {\n return convertInputObjectType(graphqlType)\n }\n\n return { kind: 'primitive', type: 'unknown' }\n}\n\n/**\n * Converts a `GraphQLObjectType` to an `ApiObjectType`.\n */\nfunction convertObjectType(objType: GraphQLObjectType): ApiType {\n const name = objType.name\n\n // Guard against infinite recursion\n if (visitedTypes.has(name)) {\n return { kind: 'ref', name }\n }\n visitedTypes.add(name)\n\n try {\n const fields = objType.getFields()\n const properties: ApiProperty[] = []\n\n for (const [fieldName, field] of Object.entries(fields)) {\n const { type, required } = convertGraphQLType(field.type)\n properties.push({\n name: fieldName,\n type,\n required,\n description: field.description ?? undefined,\n })\n }\n\n return {\n kind: 'object',\n name,\n properties,\n description: objType.description ?? undefined,\n }\n } finally {\n visitedTypes.delete(name)\n }\n}\n\n/**\n * Converts a `GraphQLInputObjectType` to an `ApiObjectType`.\n */\nfunction convertInputObjectType(inputType: GraphQLInputObjectType): ApiType {\n const name = inputType.name\n\n if (visitedTypes.has(name)) {\n return { kind: 'ref', name }\n }\n visitedTypes.add(name)\n\n try {\n const fields = inputType.getFields()\n const properties: ApiProperty[] = []\n\n for (const [fieldName, field] of Object.entries(fields)) {\n const { type, required } = convertGraphQLType(field.type)\n properties.push({\n name: fieldName,\n type,\n required,\n description: field.description ?? undefined,\n })\n }\n\n return {\n kind: 'object',\n name,\n properties,\n description: inputType.description ?? undefined,\n }\n } finally {\n visitedTypes.delete(name)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Argument -> ApiParam conversion\n// ---------------------------------------------------------------------------\n\nfunction convertArgument(arg: GraphQLArgument): ApiParam {\n const { type, required } = convertGraphQLType(arg.type)\n return {\n name: arg.name,\n required,\n type,\n description: arg.description ?? undefined,\n in: 'query', // GraphQL args are conceptually similar to query params\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build operations from schema root types\n// ---------------------------------------------------------------------------\n\nfunction buildOperationsFromType(\n rootType: GraphQLObjectType | undefined | null,\n method: OperationMethod,\n tag: string,\n): ApiOperation[] {\n if (!rootType) return []\n\n const fields = rootType.getFields()\n const operations: ApiOperation[] = []\n\n for (const [fieldName, field] of Object.entries(fields)) {\n const args = field.args ?? []\n const queryParams = args.map(convertArgument)\n\n // Build request body from arguments if there are any\n let requestBody: ApiRequestBody | undefined\n if (args.length > 0) {\n const argProperties: ApiProperty[] = args.map((arg) => {\n const { type, required } = convertGraphQLType(arg.type)\n return {\n name: arg.name,\n type,\n required,\n description: arg.description ?? undefined,\n }\n })\n\n requestBody = {\n required: args.some((arg) => isNonNullType(arg.type)),\n contentType: 'application/json',\n type: {\n kind: 'object',\n properties: argProperties,\n },\n }\n }\n\n // Convert return type\n const { type: responseType } = convertGraphQLType(field.type)\n\n const response: ApiResponse = {\n statusCode: 200,\n contentType: 'application/json',\n type: responseType,\n description: field.description ?? undefined,\n }\n\n operations.push({\n operationId: fieldName,\n summary: field.description ?? undefined,\n method,\n path: fieldName,\n tags: [tag],\n pathParams: [],\n queryParams,\n headerParams: [],\n requestBody,\n response,\n deprecated: field.deprecationReason != null,\n })\n }\n\n return operations\n}\n\n// ---------------------------------------------------------------------------\n// Extract named types\n// ---------------------------------------------------------------------------\n\nfunction extractNamedTypes(schema: GraphQLSchema): Map<string, ApiType> {\n const types = new Map<string, ApiType>()\n const typeMap = schema.getTypeMap()\n\n for (const [name, graphqlType] of Object.entries(typeMap)) {\n // Skip introspection types\n if (name.startsWith('__')) continue\n\n // Skip built-in scalars\n if (isScalarType(graphqlType)) {\n const builtins = new Set(['String', 'Int', 'Float', 'Boolean', 'ID'])\n if (builtins.has(name)) continue\n }\n\n if (isObjectType(graphqlType)) {\n // Skip root types\n const queryType = schema.getQueryType()\n const mutationType = schema.getMutationType()\n const subscriptionType = schema.getSubscriptionType()\n if (\n graphqlType === queryType ||\n graphqlType === mutationType ||\n graphqlType === subscriptionType\n ) {\n continue\n }\n types.set(name, convertObjectType(graphqlType))\n } else if (isInputObjectType(graphqlType)) {\n types.set(name, convertInputObjectType(graphqlType))\n } else if (isEnumType(graphqlType)) {\n types.set(name, {\n kind: 'enum',\n name,\n values: graphqlType.getValues().map((v) => v.value as string),\n description: graphqlType.description ?? undefined,\n })\n } else if (isUnionType(graphqlType)) {\n types.set(name, {\n kind: 'union',\n variants: graphqlType.getTypes().map((t) => convertInnerType(t)),\n description: graphqlType.description ?? undefined,\n })\n }\n }\n\n return types\n}\n\n// ---------------------------------------------------------------------------\n// GraphQL Parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parser for GraphQL schemas.\n *\n * Accepts either:\n * - An introspection JSON result (has `__schema` or `data.__schema`)\n * - An SDL string (starts with `type `, `schema `, `input `, etc.)\n *\n * Uses the `graphql` package to build a schema, then maps Query fields\n * to `QUERY` operations, Mutation fields to `MUTATION` operations, and\n * Subscription fields to `SUBSCRIPTION` operations.\n */\nexport const graphqlParser: SpecParser = {\n canParse(input: unknown): boolean {\n if (isIntrospectionResult(input)) return true\n if (isIntrospectionWrapper(input)) return true\n if (isSDLString(input)) return true\n return false\n },\n\n async parse(input: unknown, options?: ParseOptions): Promise<ApiSpec> {\n let schema: GraphQLSchema\n\n if (isIntrospectionWrapper(input)) {\n schema = buildClientSchema(input.data as unknown as IntrospectionQuery)\n } else if (isIntrospectionResult(input)) {\n schema = buildClientSchema(input as unknown as IntrospectionQuery)\n } else if (typeof input === 'string') {\n schema = buildSchema(input)\n } else {\n throw new Error('GraphQL parser: unsupported input format')\n }\n\n // Clear the recursion guard between parse calls\n visitedTypes.clear()\n\n const operations: ApiOperation[] = [\n ...buildOperationsFromType(schema.getQueryType(), 'QUERY', 'queries'),\n ...buildOperationsFromType(schema.getMutationType(), 'MUTATION', 'mutations'),\n ...buildOperationsFromType(schema.getSubscriptionType(), 'SUBSCRIPTION', 'subscriptions'),\n ]\n\n const types = extractNamedTypes(schema)\n\n // Clear again after use\n visitedTypes.clear()\n\n return {\n title: 'GraphQL API',\n baseUrl: options?.baseUrl ?? '/graphql',\n version: '0.0.0',\n operations,\n types,\n }\n },\n}\n","import { readFile } from 'node:fs/promises'\nimport { extname } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport type { ApiSpec } from '../ir/types'\nimport { applyPaginationDetection } from '../ir/helpers'\nimport { openApiParser } from './openapi-parser'\nimport { swaggerParser } from './swagger-parser'\nimport { graphqlParser } from './graphql-parser'\nimport type { ParseOptions, SpecParser } from './types'\n\nexport type { ParseOptions, SpecParser } from './types'\n\n// ---------------------------------------------------------------------------\n// Parse error\n// ---------------------------------------------------------------------------\n\n/**\n * Error thrown when no parser can handle the given input, or when the input\n * file format is not recognized.\n */\nexport class ParseError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ParseError'\n }\n}\n\n// ---------------------------------------------------------------------------\n// Supported parsers (tried in order)\n// ---------------------------------------------------------------------------\n\nconst parsers: SpecParser[] = [openApiParser, swaggerParser, graphqlParser]\n\n// ---------------------------------------------------------------------------\n// File extension handling\n// ---------------------------------------------------------------------------\n\nconst YAML_EXTENSIONS = new Set(['.yaml', '.yml'])\nconst JSON_EXTENSIONS = new Set(['.json'])\nconst GRAPHQL_EXTENSIONS = new Set(['.graphql', '.gql'])\n\n/**\n * Reads a file and returns the parsed content as an object or string.\n * Supports YAML, JSON, and GraphQL SDL files.\n */\nasync function loadFile(filePath: string): Promise<unknown> {\n const content = await readFile(filePath, 'utf-8')\n const ext = extname(filePath).toLowerCase()\n\n if (YAML_EXTENSIONS.has(ext)) {\n return parseYaml(content)\n }\n\n if (JSON_EXTENSIONS.has(ext)) {\n return JSON.parse(content)\n }\n\n if (GRAPHQL_EXTENSIONS.has(ext)) {\n return content // Return raw SDL string\n }\n\n // Try JSON first, then YAML, then treat as raw string\n try {\n return JSON.parse(content)\n } catch {\n try {\n return parseYaml(content)\n } catch {\n return content\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Parses an API specification from a file path, URL, or in-memory object.\n *\n * Supports OpenAPI 3.x, Swagger 2.0, and GraphQL (introspection JSON or SDL).\n * File formats: `.yaml`, `.yml`, `.json`, `.graphql`, `.gql`.\n *\n * After parsing, automatic pagination detection is applied to all GET/QUERY\n * operations.\n *\n * @param input - A file path string, or an already-parsed object (JSON/YAML content or introspection result).\n * @param options - Optional parse configuration (e.g. base URL override).\n * @returns The parsed API specification in the IR format.\n * @throws {ParseError} If the input format is not recognized or no parser can handle it.\n *\n * @example\n * ```ts\n * // From file\n * const spec = await parseSpec('./openapi.yaml')\n *\n * // From object\n * const spec = await parseSpec(openapiDocument, { baseUrl: 'https://api.example.com' })\n *\n * // From GraphQL SDL\n * const spec = await parseSpec('./schema.graphql')\n * ```\n */\nexport async function parseSpec(\n input: string | object,\n options?: ParseOptions,\n): Promise<ApiSpec> {\n let resolved: unknown\n\n if (typeof input === 'string') {\n // Check if it looks like a file path (not SDL)\n const looksLikeFile = /\\.[a-z]{2,10}$/i.test(input) && !input.includes('\\n')\n if (looksLikeFile) {\n try {\n resolved = await loadFile(input)\n } catch (err) {\n throw new ParseError(\n `Failed to read spec file \"${input}\": ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n } else {\n // Could be inline SDL or JSON/YAML string\n try {\n resolved = JSON.parse(input)\n } catch {\n try {\n const parsed = parseYaml(input)\n // If YAML parsed to a plain string, it's likely SDL\n resolved = typeof parsed === 'string' ? input : parsed\n } catch {\n resolved = input\n }\n }\n }\n } else {\n resolved = input\n }\n\n // Try each parser in order\n for (const parser of parsers) {\n if (parser.canParse(resolved)) {\n const spec = await parser.parse(resolved, options)\n return applyPaginationDetection(spec)\n }\n }\n\n // Build a descriptive error message\n const inputType = typeof resolved\n let hint = ''\n if (inputType === 'object' && resolved !== null) {\n const keys = Object.keys(resolved as Record<string, unknown>).slice(0, 5)\n hint = ` Object keys: [${keys.join(', ')}].`\n } else if (inputType === 'string') {\n const preview = (resolved as string).slice(0, 80)\n hint = ` String starts with: \"${preview}...\".`\n }\n\n throw new ParseError(\n `Unable to detect API specification format.${hint} ` +\n 'Expected an OpenAPI 3.x document (with \"openapi\" field starting with \"3\"), ' +\n 'a Swagger 2.0 document (with \"swagger\": \"2.0\"), ' +\n 'or a GraphQL schema (introspection JSON with \"__schema\", or SDL string).',\n )\n}\n","/**\n * Naming conventions for generated hooks, types, and files.\n */\n\n/**\n * Simple pluralization rules (good enough for API resource names).\n */\nconst IRREGULAR_PLURALS: Record<string, string> = {\n person: 'people',\n child: 'children',\n man: 'men',\n woman: 'women',\n mouse: 'mice',\n goose: 'geese',\n tooth: 'teeth',\n foot: 'feet',\n datum: 'data',\n medium: 'media',\n criterion: 'criteria',\n analysis: 'analyses',\n status: 'statuses',\n}\n\nconst IRREGULAR_SINGULARS: Record<string, string> = Object.fromEntries(\n Object.entries(IRREGULAR_PLURALS).map(([s, p]) => [p, s]),\n)\n\n/**\n * Attempt to singularize a word.\n */\nexport function singularize(word: string): string {\n const lower = word.toLowerCase()\n if (IRREGULAR_SINGULARS[lower]) {\n return preserveCase(word, IRREGULAR_SINGULARS[lower])\n }\n if (lower.endsWith('ies') && lower.length > 4) {\n return word.slice(0, -3) + 'y'\n }\n if (lower.endsWith('ses') || lower.endsWith('xes') || lower.endsWith('zes') || lower.endsWith('ches') || lower.endsWith('shes')) {\n return word.slice(0, -2)\n }\n if (lower.endsWith('s') && !lower.endsWith('ss') && !lower.endsWith('us') && lower.length > 2) {\n return word.slice(0, -1)\n }\n return word\n}\n\nfunction preserveCase(original: string, replacement: string): string {\n if (original[0] === original[0].toUpperCase()) {\n return replacement[0].toUpperCase() + replacement.slice(1)\n }\n return replacement\n}\n\n/**\n * Convert a string to PascalCase.\n */\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[a-z]/, (char) => char.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Convert a string to camelCase.\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str)\n return pascal[0].toLowerCase() + pascal.slice(1)\n}\n\n/**\n * Extract the primary resource name from a URL path.\n * `/api/v1/users/{id}/posts` → 'posts'\n * `/users` → 'users'\n * `/users/{id}` → 'users'\n */\nexport function extractResource(path: string): string {\n const segments = path.split('/').filter((s) => s && !s.startsWith('{'))\n // Skip common prefixes like 'api', 'v1', 'v2', etc.\n const meaningful = segments.filter((s) => !/^(api|v\\d+)$/i.test(s))\n return meaningful[meaningful.length - 1] || segments[segments.length - 1] || 'unknown'\n}\n\n/**\n * Determine if a path is a detail (single resource) endpoint.\n * `/users/{id}` → true\n * `/users` → false\n * `/users/{id}/posts/{postId}` → true\n */\nexport function isDetailEndpoint(path: string): boolean {\n const segments = path.split('/').filter(Boolean)\n const last = segments[segments.length - 1]\n return !!last && last.startsWith('{')\n}\n\n/**\n * Generate a hook name from an operation.\n *\n * Priority:\n * 1. If operationId is provided → `use` + PascalCase(operationId)\n * 2. Otherwise derive from method + path\n */\nexport function getHookName(\n operationId: string | undefined,\n method: string,\n path: string,\n): string {\n if (operationId) {\n const name = toPascalCase(operationId)\n return `use${name}`\n }\n\n const resource = extractResource(path)\n const isDetail = isDetailEndpoint(path)\n const resourceName = isDetail ? singularize(resource) : resource\n\n const methodMap: Record<string, string> = {\n GET: isDetail ? 'Get' : 'Get',\n POST: 'Create',\n PUT: 'Update',\n PATCH: 'Patch',\n DELETE: 'Delete',\n QUERY: 'Get',\n MUTATION: '',\n SUBSCRIPTION: 'Subscribe',\n }\n\n const prefix = methodMap[method.toUpperCase()] || method\n return `use${prefix}${toPascalCase(resourceName)}`\n}\n\n/**\n * Generate a TypeScript interface name from a type name.\n */\nexport function getTypeName(name: string): string {\n return toPascalCase(name)\n}\n\n/**\n * Generate a file-safe name from a string (kebab-case).\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase()\n}\n\n/**\n * Generate a unique name by appending a suffix if needed.\n */\nexport function uniqueName(name: string, existing: Set<string>): string {\n if (!existing.has(name)) {\n existing.add(name)\n return name\n }\n let i = 2\n while (existing.has(`${name}${i}`)) {\n i++\n }\n const unique = `${name}${i}`\n existing.add(unique)\n return unique\n}\n","/**\n * TypeScript source code emitter.\n *\n * Converts IR types into plain TypeScript string output that can be\n * written directly to a `.ts` file. No ts-morph dependency — just\n * fast string concatenation.\n */\nimport type {\n ApiArrayType,\n ApiEnumType,\n ApiObjectType,\n ApiOperation,\n ApiParam,\n ApiPrimitiveType,\n ApiRefType,\n ApiSpec,\n ApiType,\n ApiUnionType,\n} from '../ir/types'\nimport { toPascalCase } from '../utils/naming'\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a complete TypeScript `types.ts` file from the API specification.\n *\n * The output includes:\n * - All named types from `spec.types` as interfaces / type aliases\n * - Per-operation params, request body, and response types\n * - JSDoc comments where descriptions are available\n *\n * Every exported symbol is prefixed with `export`.\n */\nexport function emitTypeScriptTypes(spec: ApiSpec): string {\n const chunks: string[] = []\n\n chunks.push(fileHeader(spec))\n\n // --- Named types ---------------------------------------------------------\n for (const [name, type] of spec.types) {\n chunks.push(emitNamedType(name, type))\n }\n\n // --- Per-operation types -------------------------------------------------\n for (const op of spec.operations) {\n const params = emitParamsInterface(op)\n if (params) {\n chunks.push(params)\n }\n\n const body = emitRequestBodyType(op)\n if (body) {\n chunks.push(body)\n }\n\n chunks.push(emitResponseType(op))\n }\n\n return chunks.join('\\n')\n}\n\n/**\n * Convert an {@link ApiType} into its TypeScript string representation.\n *\n * Handles all discriminated union kinds recursively:\n * - `primitive` -> `string`, `number`, `boolean`, `null`, `unknown`\n * - `object` -> inline `{ ... }` literal\n * - `array` -> `Array<T>`\n * - `enum` -> string/number literal union\n * - `union` -> `A | B | C`\n * - `ref` -> PascalCase type name\n */\nexport function emitTypeString(type: ApiType): string {\n switch (type.kind) {\n case 'primitive':\n return emitPrimitive(type)\n case 'object':\n return emitObjectInline(type)\n case 'array':\n return emitArray(type)\n case 'enum':\n return emitEnum(type)\n case 'union':\n return emitUnion(type)\n case 'ref':\n return emitRef(type)\n }\n}\n\n/**\n * Emit a params interface for an operation by combining path, query, and\n * header parameters.\n *\n * Returns `null` if the operation has no parameters.\n *\n * The interface is named `{PascalCase(operationId)}Params`.\n */\nexport function emitParamsInterface(op: ApiOperation): string | null {\n const allParams: ApiParam[] = [\n ...op.pathParams,\n ...op.queryParams,\n ...op.headerParams,\n ]\n\n if (allParams.length === 0) {\n return null\n }\n\n const name = `${toPascalCase(op.operationId)}Params`\n const lines: string[] = []\n\n if (op.summary) {\n lines.push(jsdoc(op.summary))\n }\n lines.push(`export interface ${name} {`)\n\n for (const param of allParams) {\n if (param.description) {\n lines.push(indent(jsdoc(param.description)))\n }\n const optional = param.required ? '' : '?'\n lines.push(indent(`${safePropName(param.name)}${optional}: ${emitTypeString(param.type)}`))\n }\n\n lines.push('}')\n lines.push('')\n return lines.join('\\n')\n}\n\n/**\n * Emit a request body type alias for an operation.\n *\n * Returns `null` if the operation has no request body.\n *\n * The type is named `{PascalCase(operationId)}Body`.\n */\nexport function emitRequestBodyType(op: ApiOperation): string | null {\n if (!op.requestBody) {\n return null\n }\n\n const name = `${toPascalCase(op.operationId)}Body`\n const lines: string[] = []\n\n if (op.requestBody.description) {\n lines.push(jsdoc(op.requestBody.description))\n }\n lines.push(`export type ${name} = ${emitTypeString(op.requestBody.type)}`)\n lines.push('')\n return lines.join('\\n')\n}\n\n/**\n * Emit a response type alias for an operation.\n *\n * The type is named `{PascalCase(operationId)}Response`.\n */\nexport function emitResponseType(op: ApiOperation): string {\n const name = `${toPascalCase(op.operationId)}Response`\n const lines: string[] = []\n\n if (op.response.description) {\n lines.push(jsdoc(op.response.description))\n }\n lines.push(`export type ${name} = ${emitTypeString(op.response.type)}`)\n lines.push('')\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Produce the file header comment. */\nfunction fileHeader(spec: ApiSpec): string {\n const lines: string[] = [\n '/* eslint-disable */',\n '/* tslint:disable */',\n `/**`,\n ` * Auto-generated TypeScript types for ${spec.title} (v${spec.version}).`,\n ` * DO NOT EDIT — this file is regenerated on every run.`,\n ` */`,\n '',\n ]\n return lines.join('\\n')\n}\n\n/** Map an IR primitive to its TypeScript equivalent. */\nfunction emitPrimitive(type: ApiPrimitiveType): string {\n switch (type.type) {\n case 'string':\n return 'string'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'null':\n return 'null'\n case 'unknown':\n return 'unknown'\n }\n}\n\n/** Emit an inline object literal type: `{ prop: Type; ... }`. */\nfunction emitObjectInline(type: ApiObjectType): string {\n if (type.properties.length === 0 && !type.additionalProperties) {\n return 'Record<string, unknown>'\n }\n\n const members: string[] = []\n\n for (const prop of type.properties) {\n const optional = prop.required ? '' : '?'\n const comment = prop.description ? ` ${inlineComment(prop.description)}` : ''\n members.push(\n `${safePropName(prop.name)}${optional}: ${emitTypeString(prop.type)}${comment}`,\n )\n }\n\n if (type.additionalProperties !== undefined) {\n if (type.additionalProperties === true) {\n members.push('[key: string]: unknown')\n } else if (type.additionalProperties !== false) {\n members.push(`[key: string]: ${emitTypeString(type.additionalProperties)}`)\n }\n }\n\n return `{\\n${members.map((m) => indent(m)).join('\\n')}\\n}`\n}\n\n/** Emit `Array<T>`. */\nfunction emitArray(type: ApiArrayType): string {\n const inner = emitTypeString(type.items)\n // Use Array<T> form for complex inner types to avoid ambiguity.\n if (inner.includes('|') || inner.includes('{')) {\n return `Array<${inner}>`\n }\n return `${inner}[]`\n}\n\n/** Emit a string/number literal union for enums. */\nfunction emitEnum(type: ApiEnumType): string {\n if (type.values.length === 0) {\n return 'never'\n }\n return type.values\n .map((v) => (typeof v === 'string' ? `'${escapeString(v)}'` : String(v)))\n .join(' | ')\n}\n\n/** Emit `A | B | C`. */\nfunction emitUnion(type: ApiUnionType): string {\n if (type.variants.length === 0) {\n return 'never'\n }\n if (type.variants.length === 1) {\n return emitTypeString(type.variants[0])\n }\n return type.variants.map((v) => emitTypeString(v)).join(' | ')\n}\n\n/** Emit a reference to a named type. */\nfunction emitRef(type: ApiRefType): string {\n return toPascalCase(type.name)\n}\n\n/**\n * Emit a named type as either an `interface` (for objects) or a `type` alias.\n */\nfunction emitNamedType(name: string, type: ApiType): string {\n const tsName = toPascalCase(name)\n const lines: string[] = []\n\n if (type.kind !== 'ref' && type.description) {\n lines.push(jsdoc(type.description))\n }\n\n if (type.kind === 'object') {\n lines.push(...emitInterface(tsName, type))\n } else {\n lines.push(`export type ${tsName} = ${emitTypeString(type)}`)\n }\n\n lines.push('')\n return lines.join('\\n')\n}\n\n/** Emit a full `export interface` block. */\nfunction emitInterface(name: string, type: ApiObjectType): string[] {\n const lines: string[] = []\n lines.push(`export interface ${name} {`)\n\n for (const prop of type.properties) {\n if (prop.description) {\n lines.push(indent(jsdoc(prop.description)))\n }\n const optional = prop.required ? '' : '?'\n lines.push(indent(`${safePropName(prop.name)}${optional}: ${emitTypeString(prop.type)}`))\n }\n\n if (type.additionalProperties !== undefined) {\n if (type.additionalProperties === true) {\n lines.push(indent('[key: string]: unknown'))\n } else if (type.additionalProperties !== false) {\n lines.push(indent(`[key: string]: ${emitTypeString(type.additionalProperties)}`))\n }\n }\n\n lines.push('}')\n return lines\n}\n\n// ---------------------------------------------------------------------------\n// Formatting utilities\n// ---------------------------------------------------------------------------\n\n/** Wrap text in a JSDoc comment block. */\nfunction jsdoc(text: string): string {\n const trimmed = text.trim()\n if (!trimmed.includes('\\n')) {\n return `/** ${trimmed} */`\n }\n const lines = trimmed.split('\\n')\n return ['/**', ...lines.map((l) => ` * ${l.trimEnd()}`), ' */'].join('\\n')\n}\n\n/** Produce a short inline JSDoc comment. */\nfunction inlineComment(text: string): string {\n const single = text.replace(/\\n/g, ' ').trim()\n return `/** ${single} */`\n}\n\n/** Indent a string by two spaces. */\nfunction indent(str: string): string {\n return str\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')\n}\n\n/**\n * Ensure a property name is safe for TypeScript.\n *\n * Names that contain characters other than `[a-zA-Z0-9_$]` or that start\n * with a digit are wrapped in quotes.\n */\nfunction safePropName(name: string): string {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) {\n return name\n }\n return `'${escapeString(name)}'`\n}\n\n/** Escape single-quote characters inside a string literal. */\nfunction escapeString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")\n}\n","/**\n * Zod schema source code emitter.\n *\n * Converts IR types into Zod schema definitions as plain TypeScript\n * strings. The output can be written directly to a `schemas.ts` file.\n */\nimport type {\n ApiArrayType,\n ApiEnumType,\n ApiObjectType,\n ApiOperation,\n ApiPrimitiveType,\n ApiProperty,\n ApiRefType,\n ApiSpec,\n ApiType,\n ApiUnionType,\n} from '../ir/types'\nimport { toCamelCase } from '../utils/naming'\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a complete Zod `schemas.ts` file from the API specification.\n *\n * The output includes:\n * - `import { z } from 'zod'`\n * - A `const …Schema = z.…` for every named type in `spec.types`\n * - A response schema for every operation\n * - Re-exports of all schemas\n */\nexport function emitZodSchemas(spec: ApiSpec): string {\n const chunks: string[] = []\n\n chunks.push(fileHeader(spec))\n chunks.push(\"import { z } from 'zod'\")\n chunks.push('')\n\n // --- Collect names so we can topologically reference them ----------------\n // We emit schemas lazily via z.lazy() for forward-referenced types,\n // but for simplicity we rely on JS hoisting of `const` in the same scope\n // being fine if consumers use the schemas after module evaluation.\n // For truly circular refs users should wrap in z.lazy — we emit plain\n // references here because most OpenAPI specs are DAG-structured.\n\n // --- Named type schemas -------------------------------------------------\n for (const [name, type] of spec.types) {\n chunks.push(emitNamedSchema(name, type))\n }\n\n // --- Per-operation response schemas -------------------------------------\n for (const op of spec.operations) {\n chunks.push(emitOperationResponseSchema(op))\n }\n\n return chunks.join('\\n')\n}\n\n/**\n * Convert an {@link ApiType} into its Zod schema string representation.\n *\n * Handles every discriminated union kind recursively:\n * - `primitive` -> `z.string()`, `z.number()`, etc. with format refinements\n * - `object` -> `z.object({ ... })`\n * - `array` -> `z.array(...)`\n * - `enum` -> `z.enum([...])` for strings, `z.union([z.literal(...), ...])` for mixed\n * - `union` -> `z.union([...])`\n * - `ref` -> camelCase schema variable name\n */\nexport function emitZodType(type: ApiType): string {\n switch (type.kind) {\n case 'primitive':\n return emitZodPrimitive(type)\n case 'object':\n return emitZodObject(type)\n case 'array':\n return emitZodArray(type)\n case 'enum':\n return emitZodEnum(type)\n case 'union':\n return emitZodUnion(type)\n case 'ref':\n return emitZodRef(type)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal — per-kind emitters\n// ---------------------------------------------------------------------------\n\n/**\n * Map an IR primitive to the corresponding Zod schema, including\n * format-specific refinements for common string formats.\n */\nfunction emitZodPrimitive(type: ApiPrimitiveType): string {\n switch (type.type) {\n case 'string':\n return applyStringFormat('z.string()', type.format)\n case 'number':\n return 'z.number()'\n case 'integer':\n return 'z.number().int()'\n case 'boolean':\n return 'z.boolean()'\n case 'null':\n return 'z.null()'\n case 'unknown':\n return 'z.unknown()'\n }\n}\n\n/** Apply format-specific Zod refinements to a `z.string()` base. */\nfunction applyStringFormat(base: string, format: string | undefined): string {\n if (!format) {\n return base\n }\n switch (format) {\n case 'date-time':\n return `${base}.datetime()`\n case 'email':\n return `${base}.email()`\n case 'uuid':\n return `${base}.uuid()`\n case 'uri':\n case 'url':\n return `${base}.url()`\n default:\n // Unknown formats are left as plain z.string().\n return base\n }\n}\n\n/** Emit `z.object({ ... })` with optional properties wrapped in `.optional()`. */\nfunction emitZodObject(type: ApiObjectType): string {\n if (type.properties.length === 0 && !type.additionalProperties) {\n return 'z.record(z.string(), z.unknown())'\n }\n\n const members = type.properties.map((prop) => emitZodProperty(prop))\n\n // Handle additionalProperties as a passthrough / catchall.\n let suffix = ''\n if (type.additionalProperties !== undefined) {\n if (type.additionalProperties === true) {\n suffix = '.catchall(z.unknown())'\n } else if (type.additionalProperties !== false) {\n suffix = `.catchall(${emitZodType(type.additionalProperties)})`\n }\n }\n\n if (members.length === 0) {\n return `z.object({})${suffix}`\n }\n\n const body = members.map((m) => indent(m)).join('\\n')\n return `z.object({\\n${body}\\n})${suffix}`\n}\n\n/** Emit a single object property as `name: schema` or `name: schema.optional()`. */\nfunction emitZodProperty(prop: ApiProperty): string {\n const schema = emitZodType(prop.type)\n const optionalSuffix = prop.required ? '' : '.optional()'\n const comment = prop.description ? ` ${inlineComment(prop.description)}` : ''\n return `${safePropName(prop.name)}: ${schema}${optionalSuffix},${comment}`\n}\n\n/** Emit `z.array(...)`. */\nfunction emitZodArray(type: ApiArrayType): string {\n return `z.array(${emitZodType(type.items)})`\n}\n\n/**\n * Emit a Zod enum schema.\n *\n * - All-string values: `z.enum(['a', 'b', 'c'])`\n * - Mixed or numeric values: `z.union([z.literal(1), z.literal('a')])`\n */\nfunction emitZodEnum(type: ApiEnumType): string {\n if (type.values.length === 0) {\n return 'z.never()'\n }\n\n const allStrings = type.values.every((v) => typeof v === 'string')\n if (allStrings) {\n const items = type.values\n .map((v) => `'${escapeString(String(v))}'`)\n .join(', ')\n return `z.enum([${items}])`\n }\n\n // Mixed types — use z.union of z.literal\n const literals = type.values\n .map((v) =>\n typeof v === 'string' ? `z.literal('${escapeString(v)}')` : `z.literal(${v})`,\n )\n .join(', ')\n return `z.union([${literals}])`\n}\n\n/** Emit `z.union([...])`. */\nfunction emitZodUnion(type: ApiUnionType): string {\n if (type.variants.length === 0) {\n return 'z.never()'\n }\n if (type.variants.length === 1) {\n return emitZodType(type.variants[0])\n }\n const members = type.variants.map((v) => emitZodType(v)).join(', ')\n return `z.union([${members}])`\n}\n\n/** Emit a reference to a named schema variable. */\nfunction emitZodRef(type: ApiRefType): string {\n return schemaVarName(type.name)\n}\n\n// ---------------------------------------------------------------------------\n// Named type & operation schema helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Emit a named schema declaration:\n * ```\n * export const userSchema = z.object({ ... })\n * ```\n */\nfunction emitNamedSchema(name: string, type: ApiType): string {\n const varName = schemaVarName(name)\n const lines: string[] = []\n\n if (type.kind !== 'ref' && type.description) {\n lines.push(jsdoc(type.description))\n }\n\n lines.push(`export const ${varName} = ${emitZodType(type)}`)\n lines.push('')\n return lines.join('\\n')\n}\n\n/**\n * Emit a response schema for an operation:\n * ```\n * export const getUserResponseSchema = z.object({ ... })\n * ```\n */\nfunction emitOperationResponseSchema(op: ApiOperation): string {\n const varName = `${toCamelCase(op.operationId)}ResponseSchema`\n const lines: string[] = []\n\n if (op.response.description) {\n lines.push(jsdoc(op.response.description))\n }\n\n lines.push(`export const ${varName} = ${emitZodType(op.response.type)}`)\n lines.push('')\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Formatting utilities\n// ---------------------------------------------------------------------------\n\n/** Derive the schema variable name from a type name: `User` -> `userSchema`. */\nfunction schemaVarName(name: string): string {\n return `${toCamelCase(name)}Schema`\n}\n\n/** Produce the file header comment. */\nfunction fileHeader(spec: ApiSpec): string {\n const lines = [\n '/* eslint-disable */',\n '/* tslint:disable */',\n `/**`,\n ` * Auto-generated Zod schemas for ${spec.title} (v${spec.version}).`,\n ` * DO NOT EDIT — this file is regenerated on every run.`,\n ` */`,\n '',\n ]\n return lines.join('\\n')\n}\n\n/** Wrap text in a JSDoc comment block. */\nfunction jsdoc(text: string): string {\n const trimmed = text.trim()\n if (!trimmed.includes('\\n')) {\n return `/** ${trimmed} */`\n }\n const lines = trimmed.split('\\n')\n return ['/**', ...lines.map((l) => ` * ${l.trimEnd()}`), ' */'].join('\\n')\n}\n\n/** Produce a short inline JSDoc comment. */\nfunction inlineComment(text: string): string {\n const single = text.replace(/\\n/g, ' ').trim()\n return `/** ${single} */`\n}\n\n/** Indent a string by two spaces. */\nfunction indent(str: string): string {\n return str\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')\n}\n\n/**\n * Ensure a property name is safe as a JS identifier in an object literal.\n *\n * Names containing characters other than `[a-zA-Z0-9_$]` or starting with\n * a digit are quoted.\n */\nfunction safePropName(name: string): string {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) {\n return name\n }\n return `'${escapeString(name)}'`\n}\n\n/** Escape single-quote characters inside a string literal. */\nfunction escapeString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")\n}\n","/**\n * Abstract base class for all hook generators.\n *\n * Provides shared functionality: type file generation, grouping by tags,\n * barrel index generation, client config.\n */\nimport type { ApiSpec, ApiOperation } from '../ir/types'\nimport type { HookGenerator, GeneratorOptions } from './types'\nimport type { GeneratedFile } from '../utils/file-writer'\nimport { emitTypeScriptTypes } from '../type-gen/typescript-emitter'\nimport { emitZodSchemas } from '../type-gen/zod-emitter'\nimport { toKebabCase, toPascalCase, getHookName } from '../utils/naming'\n\nexport abstract class BaseHookGenerator implements HookGenerator {\n /**\n * Generate all files for the given spec.\n */\n generate(spec: ApiSpec, options: GeneratorOptions): GeneratedFile[] {\n const files: GeneratedFile[] = []\n\n // 1. Generate types file\n files.push({\n path: 'types.ts',\n content: emitTypeScriptTypes(spec),\n })\n\n // 2. Generate Zod schemas (if enabled)\n if (options.zod) {\n files.push({\n path: 'schemas.ts',\n content: emitZodSchemas(spec),\n })\n }\n\n // 3. Generate client config\n files.push(this.generateClientConfig(spec, options))\n\n // 4. Group operations by tag\n const groups = this.groupByTag(spec.operations)\n\n // 5. Generate hook files per group\n const hookExports: string[] = []\n\n for (const [tag, operations] of groups) {\n const groupFiles = this.generateHookGroup(tag, operations, spec, options)\n files.push(...groupFiles)\n hookExports.push(tag)\n }\n\n // 6. Generate barrel index\n files.push(this.generateBarrelIndex(hookExports, options))\n\n return files\n }\n\n /**\n * Generate hooks for a single tag group.\n * Subclasses implement generateHookFile for each operation.\n */\n protected generateHookGroup(\n tag: string,\n operations: ApiOperation[],\n spec: ApiSpec,\n options: GeneratorOptions,\n ): GeneratedFile[] {\n const files: GeneratedFile[] = []\n const tagDir = toKebabCase(tag)\n const exportNames: string[] = []\n\n for (const op of operations) {\n const hookName = getHookName(op.operationId, op.method, op.path)\n const fileName = toKebabCase(hookName.replace(/^use/, ''))\n\n const hookFile = this.generateHookFile(op, hookName, spec, options)\n files.push({\n path: `${tagDir}/${fileName}.ts`,\n content: hookFile,\n })\n\n exportNames.push(hookName)\n\n // Generate infinite query variant if applicable\n if (options.infiniteQueries && op.pagination && this.supportsInfiniteQueries()) {\n const infiniteName = `${hookName}Infinite`\n const infiniteFile = this.generateInfiniteHookFile(op, infiniteName, spec, options)\n if (infiniteFile) {\n files.push({\n path: `${tagDir}/${fileName}-infinite.ts`,\n content: infiniteFile,\n })\n exportNames.push(infiniteName)\n }\n }\n }\n\n // Group barrel index\n const groupExports = exportNames\n .map((name) => {\n const fileName = toKebabCase(name.replace(/^use/, ''))\n return `export { ${name} } from './${fileName}'`\n })\n .join('\\n')\n\n files.push({\n path: `${tagDir}/index.ts`,\n content: `${groupExports}\\n`,\n })\n\n return files\n }\n\n /**\n * Generate the base API client configuration file.\n */\n protected generateClientConfig(spec: ApiSpec, options: GeneratorOptions): GeneratedFile {\n const baseUrl = options.baseUrl || spec.baseUrl || ''\n return {\n path: 'client.ts',\n content: [\n `/**`,\n ` * API client configuration.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n ``,\n `export const API_BASE_URL = '${baseUrl}'`,\n ``,\n `export interface ClientConfig {`,\n ` baseUrl: string`,\n ` headers?: Record<string, string>`,\n `}`,\n ``,\n `let _config: ClientConfig = {`,\n ` baseUrl: API_BASE_URL,`,\n `}`,\n ``,\n `/**`,\n ` * Configure the API client.`,\n ` */`,\n `export function configureClient(config: Partial<ClientConfig>): void {`,\n ` _config = { ..._config, ...config }`,\n `}`,\n ``,\n `/**`,\n ` * Get the current client configuration.`,\n ` */`,\n `export function getClientConfig(): ClientConfig {`,\n ` return _config`,\n `}`,\n ``,\n ].join('\\n'),\n }\n }\n\n /**\n * Generate the barrel index file.\n */\n protected generateBarrelIndex(\n tagGroups: string[],\n options: GeneratorOptions,\n ): GeneratedFile {\n const lines: string[] = [\n `/**`,\n ` * Auto-generated API hooks.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n ``,\n `export * from './types'`,\n `export * from './client'`,\n ]\n\n if (options.zod) {\n lines.push(`export * from './schemas'`)\n }\n\n for (const tag of tagGroups) {\n lines.push(`export * from './${toKebabCase(tag)}'`)\n }\n\n lines.push(``)\n\n return {\n path: 'index.ts',\n content: lines.join('\\n'),\n }\n }\n\n /**\n * Group operations by their first tag.\n */\n protected groupByTag(operations: ApiOperation[]): Map<string, ApiOperation[]> {\n const groups = new Map<string, ApiOperation[]>()\n\n for (const op of operations) {\n const tag = op.tags[0] || 'default'\n const group = groups.get(tag) || []\n group.push(op)\n groups.set(tag, group)\n }\n\n return groups\n }\n\n /**\n * Get the params type name for an operation.\n */\n protected getParamsTypeName(operationId: string): string {\n return `${toPascalCase(operationId)}Params`\n }\n\n /**\n * Get the request body type name for an operation.\n */\n protected getBodyTypeName(operationId: string): string {\n return `${toPascalCase(operationId)}Body`\n }\n\n /**\n * Get the response type name for an operation.\n */\n protected getResponseTypeName(operationId: string): string {\n return `${toPascalCase(operationId)}Response`\n }\n\n /**\n * Check if an operation is a \"read\" operation (GET or QUERY).\n */\n protected isReadOperation(op: ApiOperation): boolean {\n return op.method === 'GET' || op.method === 'QUERY'\n }\n\n /**\n * Check if an operation is a \"write\" operation (POST, PUT, PATCH, DELETE, MUTATION).\n */\n protected isWriteOperation(op: ApiOperation): boolean {\n return !this.isReadOperation(op)\n }\n\n /**\n * Whether this generator supports infinite queries.\n * Override in subclasses that support them (react-query, swr).\n */\n protected supportsInfiniteQueries(): boolean {\n return false\n }\n\n /**\n * Generate a single hook file for an operation.\n * Subclasses must implement this.\n */\n protected abstract generateHookFile(\n op: ApiOperation,\n hookName: string,\n spec: ApiSpec,\n options: GeneratorOptions,\n ): string\n\n /**\n * Generate an infinite query hook file for a paginated operation.\n * Override in subclasses that support infinite queries.\n */\n protected generateInfiniteHookFile(\n _op: ApiOperation,\n _hookName: string,\n _spec: ApiSpec,\n _options: GeneratorOptions,\n ): string | null {\n return null\n }\n}\n","/**\n * Plain fetch hook generator.\n *\n * Generates React hooks using useState + useEffect + fetch.\n */\nimport type { ApiOperation, ApiSpec } from '../ir/types'\nimport type { GeneratorOptions } from './types'\nimport { BaseHookGenerator } from './base-generator'\nimport { toPascalCase } from '../utils/naming'\n\nexport class FetchGenerator extends BaseHookGenerator {\n protected generateHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const bodyType = op.requestBody ? this.getBodyTypeName(op.operationId) : null\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const isRead = this.isReadOperation(op)\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { useState, useEffect, useCallback, useRef } from 'react'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${[paramsType, responseType, bodyType].filter(Boolean).join(', ')} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n const schemaName = `${toPascalCase(op.operationId)}ResponseSchema`\n lines.push(`import { ${schemaName.charAt(0).toLowerCase() + schemaName.slice(1)} } from '../schemas'`)\n }\n\n lines.push(``)\n\n if (isRead) {\n lines.push(...this.generateReadHook(op, hookName, paramsType, responseType, hasParams, options))\n } else {\n lines.push(...this.generateWriteHook(op, hookName, paramsType, responseType, bodyType, hasParams, options))\n }\n\n return lines.join('\\n') + '\\n'\n }\n\n private generateReadHook(\n op: ApiOperation,\n hookName: string,\n paramsType: string,\n responseType: string,\n hasParams: boolean,\n options: GeneratorOptions,\n ): string[] {\n const paramArg = hasParams ? `params: ${paramsType}` : ''\n const enabledArg = `options?: { enabled?: boolean }`\n const args = [paramArg, enabledArg].filter(Boolean).join(', ')\n\n return [\n `export interface ${hookName}Result {`,\n ` data: ${responseType} | null`,\n ` error: Error | null`,\n ` isLoading: boolean`,\n ` refetch: () => void`,\n `}`,\n ``,\n `export function ${hookName}(${args}): ${hookName}Result {`,\n ` const [data, setData] = useState<${responseType} | null>(null)`,\n ` const [error, setError] = useState<Error | null>(null)`,\n ` const [isLoading, setIsLoading] = useState(false)`,\n ` const abortRef = useRef<AbortController | null>(null)`,\n ``,\n ` const fetchData = useCallback(async () => {`,\n ` if (options?.enabled === false) return`,\n ` abortRef.current?.abort()`,\n ` const controller = new AbortController()`,\n ` abortRef.current = controller`,\n ``,\n ` setIsLoading(true)`,\n ` setError(null)`,\n ``,\n ` try {`,\n ` const config = getClientConfig()`,\n ` const url = buildUrl(config.baseUrl, ${hasParams ? 'params' : 'undefined'})`,\n ` const res = await fetch(url, {`,\n ` method: '${op.method}',`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n ` signal: controller.signal,`,\n ` })`,\n ``,\n ` if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n ``,\n options.zod\n ? ` const json = await res.json()\\n const parsed = ${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema.parse(json)\\n setData(parsed as ${responseType})`\n : ` const json = await res.json()\\n setData(json as ${responseType})`,\n ` } catch (err) {`,\n ` if (err instanceof Error && err.name !== 'AbortError') {`,\n ` setError(err)`,\n ` }`,\n ` } finally {`,\n ` setIsLoading(false)`,\n ` }`,\n ` // eslint-disable-next-line react-hooks/exhaustive-deps`,\n ` }, [${hasParams ? 'JSON.stringify(params)' : ''}])`,\n ``,\n ` useEffect(() => {`,\n ` fetchData()`,\n ` return () => { abortRef.current?.abort() }`,\n ` }, [fetchData])`,\n ``,\n ` return { data, error, isLoading, refetch: fetchData }`,\n `}`,\n ``,\n ...this.generateBuildUrl(op),\n ]\n }\n\n private generateWriteHook(\n op: ApiOperation,\n hookName: string,\n paramsType: string,\n responseType: string,\n bodyType: string | null,\n hasParams: boolean,\n options: GeneratorOptions,\n ): string[] {\n const mutateArgs: string[] = []\n if (hasParams) mutateArgs.push(`params: ${paramsType}`)\n if (bodyType) mutateArgs.push(`body: ${bodyType}`)\n const mutateArgStr = mutateArgs.join(', ')\n\n return [\n `export interface ${hookName}Result {`,\n ` data: ${responseType} | null`,\n ` error: Error | null`,\n ` isLoading: boolean`,\n ` mutate: (${mutateArgStr}) => Promise<${responseType}>`,\n ` reset: () => void`,\n `}`,\n ``,\n `export function ${hookName}(): ${hookName}Result {`,\n ` const [data, setData] = useState<${responseType} | null>(null)`,\n ` const [error, setError] = useState<Error | null>(null)`,\n ` const [isLoading, setIsLoading] = useState(false)`,\n ``,\n ` const mutate = useCallback(async (${mutateArgStr}): Promise<${responseType}> => {`,\n ` setIsLoading(true)`,\n ` setError(null)`,\n ``,\n ` try {`,\n ` const config = getClientConfig()`,\n ` const url = buildUrl(config.baseUrl, ${hasParams ? 'params' : 'undefined'})`,\n ` const res = await fetch(url, {`,\n ` method: '${op.method}',`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n bodyType ? ` body: JSON.stringify(body),` : '',\n ` })`,\n ``,\n ` if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n ``,\n options.zod\n ? ` const json = await res.json()\\n const parsed = ${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema.parse(json)\\n setData(parsed as ${responseType})\\n return parsed as ${responseType}`\n : ` const json = await res.json()\\n setData(json as ${responseType})\\n return json as ${responseType}`,\n ` } catch (err) {`,\n ` const error = err instanceof Error ? err : new Error(String(err))`,\n ` setError(error)`,\n ` throw error`,\n ` } finally {`,\n ` setIsLoading(false)`,\n ` }`,\n ` }, [])`,\n ``,\n ` const reset = useCallback(() => {`,\n ` setData(null)`,\n ` setError(null)`,\n ` setIsLoading(false)`,\n ` }, [])`,\n ``,\n ` return { data, error, isLoading, mutate, reset }`,\n `}`,\n ``,\n ...this.generateBuildUrl(op),\n ].filter(Boolean)\n }\n\n private generateBuildUrl(op: ApiOperation): string[] {\n const hasPathParams = op.pathParams.length > 0\n const hasQueryParams = op.queryParams.length > 0\n const paramsType = this.getParamsTypeName(op.operationId)\n const hasAnyParams = hasPathParams || hasQueryParams\n\n if (!hasAnyParams) {\n return [\n `function buildUrl(baseUrl: string, _params: undefined): string {`,\n ` return \\`\\${baseUrl}${op.path}\\``,\n `}`,\n ]\n }\n\n let pathTemplate = op.path\n for (const p of op.pathParams) {\n pathTemplate = pathTemplate.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n\n const lines: string[] = [\n `function buildUrl(baseUrl: string, params: ${paramsType}): string {`,\n ` let url = \\`\\${baseUrl}${pathTemplate}\\``,\n ]\n\n if (hasQueryParams) {\n lines.push(\n ` const query = new URLSearchParams()`,\n )\n for (const p of op.queryParams) {\n lines.push(\n ` if (params.${p.name} !== undefined) query.set('${p.name}', String(params.${p.name}))`,\n )\n }\n lines.push(\n ` const qs = query.toString()`,\n ` if (qs) url += \\`?\\${qs}\\``,\n )\n }\n\n lines.push(\n ` return url`,\n `}`,\n )\n\n return lines\n }\n}\n","/**\n * Axios hook generator.\n *\n * Generates React hooks using useState + useEffect + axios.\n */\nimport type { ApiOperation, ApiSpec } from '../ir/types'\nimport type { GeneratorOptions } from './types'\nimport { BaseHookGenerator } from './base-generator'\nimport { toPascalCase } from '../utils/naming'\n\nexport class AxiosGenerator extends BaseHookGenerator {\n protected generateClientConfig(spec: ApiSpec, options: GeneratorOptions) {\n const baseUrl = options.baseUrl || spec.baseUrl || ''\n return {\n path: 'client.ts',\n content: [\n `/**`,\n ` * Axios API client configuration.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import axios from 'axios'`,\n ``,\n `export const API_BASE_URL = '${baseUrl}'`,\n ``,\n `export const apiClient = axios.create({`,\n ` baseURL: API_BASE_URL,`,\n ` headers: { 'Content-Type': 'application/json' },`,\n `})`,\n ``,\n `/**`,\n ` * Configure the API client.`,\n ` */`,\n `export function configureClient(config: { baseUrl?: string; headers?: Record<string, string> }): void {`,\n ` if (config.baseUrl) apiClient.defaults.baseURL = config.baseUrl`,\n ` if (config.headers) Object.assign(apiClient.defaults.headers.common, config.headers)`,\n `}`,\n ``,\n ].join('\\n'),\n }\n }\n\n protected generateHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const bodyType = op.requestBody ? this.getBodyTypeName(op.operationId) : null\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const isRead = this.isReadOperation(op)\n\n const imports: string[] = [\n `import type { ${[paramsType, responseType, bodyType].filter(Boolean).join(', ')} } from '../types'`,\n `import { apiClient } from '../client'`,\n ]\n\n if (isRead) {\n imports.unshift(`import { useState, useEffect, useCallback, useRef } from 'react'`)\n } else {\n imports.unshift(`import { useState, useCallback } from 'react'`)\n }\n\n if (options.zod) {\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n imports.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n ...imports,\n ``,\n ].filter(Boolean)\n\n if (isRead) {\n lines.push(...this.generateReadHook(op, hookName, paramsType, responseType, hasParams, options))\n } else {\n lines.push(...this.generateWriteHook(op, hookName, paramsType, responseType, bodyType, hasParams, options))\n }\n\n return lines.join('\\n') + '\\n'\n }\n\n private generateReadHook(\n op: ApiOperation,\n hookName: string,\n paramsType: string,\n responseType: string,\n hasParams: boolean,\n options: GeneratorOptions,\n ): string[] {\n const paramArg = hasParams ? `params: ${paramsType}` : ''\n const args = [paramArg, `options?: { enabled?: boolean }`].filter(Boolean).join(', ')\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const queryParams = op.queryParams.length > 0\n ? `params: { ${op.queryParams.map((p) => `${p.name}: params.${p.name}`).join(', ')} },`\n : ''\n\n return [\n `export interface ${hookName}Result {`,\n ` data: ${responseType} | null`,\n ` error: Error | null`,\n ` isLoading: boolean`,\n ` refetch: () => void`,\n `}`,\n ``,\n `export function ${hookName}(${args}): ${hookName}Result {`,\n ` const [data, setData] = useState<${responseType} | null>(null)`,\n ` const [error, setError] = useState<Error | null>(null)`,\n ` const [isLoading, setIsLoading] = useState(false)`,\n ` const cancelRef = useRef<(() => void) | null>(null)`,\n ``,\n ` const fetchData = useCallback(async () => {`,\n ` if (options?.enabled === false) return`,\n ` cancelRef.current?.()`,\n ` const source = new AbortController()`,\n ` cancelRef.current = () => source.abort()`,\n ``,\n ` setIsLoading(true)`,\n ` setError(null)`,\n ``,\n ` try {`,\n ` const res = await apiClient.get<${responseType}>(${pathExpr}, {`,\n queryParams ? ` ${queryParams}` : '',\n ` signal: source.signal,`,\n ` })`,\n options.zod\n ? ` const parsed = ${schemaVar}.parse(res.data)\\n setData(parsed as ${responseType})`\n : ` setData(res.data)`,\n ` } catch (err) {`,\n ` if (!source.signal.aborted) {`,\n ` setError(err instanceof Error ? err : new Error(String(err)))`,\n ` }`,\n ` } finally {`,\n ` setIsLoading(false)`,\n ` }`,\n ` // eslint-disable-next-line react-hooks/exhaustive-deps`,\n ` }, [${hasParams ? 'JSON.stringify(params)' : ''}])`,\n ``,\n ` useEffect(() => {`,\n ` fetchData()`,\n ` return () => { cancelRef.current?.() }`,\n ` }, [fetchData])`,\n ``,\n ` return { data, error, isLoading, refetch: fetchData }`,\n `}`,\n ].filter(Boolean)\n }\n\n private generateWriteHook(\n op: ApiOperation,\n hookName: string,\n paramsType: string,\n responseType: string,\n bodyType: string | null,\n hasParams: boolean,\n options: GeneratorOptions,\n ): string[] {\n const mutateArgs: string[] = []\n if (hasParams) mutateArgs.push(`params: ${paramsType}`)\n if (bodyType) mutateArgs.push(`body: ${bodyType}`)\n const mutateArgStr = mutateArgs.join(', ')\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const methodLower = op.method.toLowerCase()\n const axiosCall = bodyType\n ? `apiClient.${methodLower}<${responseType}>(${pathExpr}, body)`\n : `apiClient.${methodLower}<${responseType}>(${pathExpr})`\n\n return [\n `export interface ${hookName}Result {`,\n ` data: ${responseType} | null`,\n ` error: Error | null`,\n ` isLoading: boolean`,\n ` mutate: (${mutateArgStr}) => Promise<${responseType}>`,\n ` reset: () => void`,\n `}`,\n ``,\n `export function ${hookName}(): ${hookName}Result {`,\n ` const [data, setData] = useState<${responseType} | null>(null)`,\n ` const [error, setError] = useState<Error | null>(null)`,\n ` const [isLoading, setIsLoading] = useState(false)`,\n ``,\n ` const mutate = useCallback(async (${mutateArgStr}): Promise<${responseType}> => {`,\n ` setIsLoading(true)`,\n ` setError(null)`,\n ``,\n ` try {`,\n ` const res = await ${axiosCall}`,\n options.zod\n ? ` const parsed = ${schemaVar}.parse(res.data)\\n setData(parsed as ${responseType})\\n return parsed as ${responseType}`\n : ` setData(res.data)\\n return res.data`,\n ` } catch (err) {`,\n ` const error = err instanceof Error ? err : new Error(String(err))`,\n ` setError(error)`,\n ` throw error`,\n ` } finally {`,\n ` setIsLoading(false)`,\n ` }`,\n ` }, [])`,\n ``,\n ` const reset = useCallback(() => {`,\n ` setData(null)`,\n ` setError(null)`,\n ` setIsLoading(false)`,\n ` }, [])`,\n ``,\n ` return { data, error, isLoading, mutate, reset }`,\n `}`,\n ]\n }\n}\n","/**\n * Smart cache key derivation for React Query and SWR.\n */\nimport type { ApiOperation } from '../ir/types'\nimport { extractResource, toCamelCase, isDetailEndpoint, toPascalCase } from './naming'\n\n/**\n * Represents a cache key factory for a resource group.\n *\n * Example output for \"users\" resource:\n * ```ts\n * export const userKeys = {\n * all: ['users'] as const,\n * lists: () => [...userKeys.all, 'list'] as const,\n * list: (params?: ListUsersParams) => [...userKeys.lists(), params] as const,\n * details: () => [...userKeys.all, 'detail'] as const,\n * detail: (id: string) => [...userKeys.details(), id] as const,\n * }\n * ```\n */\nexport interface CacheKeyFactory {\n /** Resource name (e.g. 'user') */\n resource: string\n /** Variable name (e.g. 'userKeys') */\n variableName: string\n /** Root key segments (e.g. ['users']) */\n rootKey: string[]\n /** Whether this resource has list operations */\n hasList: boolean\n /** Whether this resource has detail operations */\n hasDetail: boolean\n}\n\n/**\n * Derive cache key factories from a group of operations.\n */\nexport function deriveCacheKeyFactories(\n operations: ApiOperation[],\n): CacheKeyFactory[] {\n // Group by primary resource\n const resourceMap = new Map<string, { hasList: boolean; hasDetail: boolean }>()\n\n for (const op of operations) {\n if (op.method !== 'GET' && op.method !== 'QUERY') continue\n\n const resource = extractResource(op.path)\n const existing = resourceMap.get(resource) || { hasList: false, hasDetail: false }\n\n if (isDetailEndpoint(op.path)) {\n existing.hasDetail = true\n } else {\n existing.hasList = true\n }\n\n resourceMap.set(resource, existing)\n }\n\n const factories: CacheKeyFactory[] = []\n\n for (const [resource, info] of resourceMap) {\n const singular = toCamelCase(resource)\n factories.push({\n resource: singular,\n variableName: `${singular}Keys`,\n rootKey: [resource],\n hasList: info.hasList,\n hasDetail: info.hasDetail,\n })\n }\n\n return factories\n}\n\n/**\n * Get the cache key expression for a specific operation.\n * Returns the key factory call expression as a string.\n */\nexport function getCacheKeyForOperation(op: ApiOperation): string {\n const resource = extractResource(op.path)\n const singular = toCamelCase(resource)\n const keysVar = `${singular}Keys`\n\n if (isDetailEndpoint(op.path)) {\n // Detail endpoint — extract path param\n const pathParam = op.pathParams[op.pathParams.length - 1]\n if (pathParam) {\n return `${keysVar}.detail(${pathParam.name})`\n }\n return `${keysVar}.details()`\n }\n\n // List endpoint\n if (op.queryParams.length > 0) {\n return `${keysVar}.list(params)`\n }\n return `${keysVar}.lists()`\n}\n\n/**\n * Generate a SWR-style string cache key from an operation.\n */\nexport function getSwrKey(op: ApiOperation): string {\n const pathParams = op.pathParams.map((p) => p.name)\n let key = op.path\n\n // Replace {param} with template literal expressions\n for (const param of pathParams) {\n key = key.replace(`{${param}}`, `\\${${param}}`)\n }\n\n if (op.queryParams.length > 0) {\n return `\\`${key}?\\${new URLSearchParams(params as Record<string, string>).toString()}\\``\n }\n\n if (pathParams.length > 0) {\n return `\\`${key}\\``\n }\n\n return `'${op.path}'`\n}\n\n/**\n * Get the React Query query key for an operation (as code string).\n */\nexport function getQueryKey(op: ApiOperation): string {\n const resource = extractResource(op.path)\n const parts: string[] = [`'${resource}'`]\n\n if (isDetailEndpoint(op.path)) {\n parts.push(`'detail'`)\n for (const p of op.pathParams) {\n parts.push(p.name)\n }\n } else {\n parts.push(`'list'`)\n if (op.queryParams.length > 0) {\n parts.push('params')\n }\n }\n\n return `[${parts.join(', ')}] as const`\n}\n\n/**\n * Get the resource name for a query key factory variable.\n */\nexport function getKeyFactoryName(tag: string): string {\n return `${toCamelCase(tag)}Keys`\n}\n\n/**\n * Get the params type name for a specific operation.\n */\nexport function getParamsTypeName(operationId: string): string {\n return `${toPascalCase(operationId)}Params`\n}\n","/**\n * TanStack React Query v5 hook generator.\n *\n * Generates:\n * - useQuery hooks for GET operations\n * - useMutation hooks for POST/PUT/PATCH/DELETE operations\n * - useInfiniteQuery hooks for paginated GET operations\n * - Cache key factory objects per resource\n */\nimport type { ApiOperation, ApiSpec, PaginationInfo } from '../ir/types'\nimport type { GeneratorOptions } from './types'\nimport type { GeneratedFile } from '../utils/file-writer'\nimport { BaseHookGenerator } from './base-generator'\nimport { toPascalCase } from '../utils/naming'\nimport { deriveCacheKeyFactories, getQueryKey } from '../utils/cache-keys'\n\nexport class ReactQueryGenerator extends BaseHookGenerator {\n protected supportsInfiniteQueries(): boolean {\n return true\n }\n\n generate(spec: ApiSpec, options: GeneratorOptions): GeneratedFile[] {\n const files = super.generate(spec, options)\n\n // Add query keys file\n files.push(this.generateQueryKeysFile(spec))\n\n return files\n }\n\n /**\n * Generate the query-keys.ts file with cache key factories.\n */\n private generateQueryKeysFile(spec: ApiSpec): GeneratedFile {\n const factories = deriveCacheKeyFactories(spec.operations)\n const lines: string[] = [\n `/**`,\n ` * Query key factories for TanStack React Query.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n ``,\n ]\n\n for (const factory of factories) {\n lines.push(\n `export const ${factory.variableName} = {`,\n ` all: [${factory.rootKey.map((k) => `'${k}'`).join(', ')}] as const,`,\n )\n if (factory.hasList) {\n lines.push(\n ` lists: () => [...${factory.variableName}.all, 'list'] as const,`,\n ` list: (params?: Record<string, unknown>) => [...${factory.variableName}.lists(), params] as const,`,\n )\n }\n if (factory.hasDetail) {\n lines.push(\n ` details: () => [...${factory.variableName}.all, 'detail'] as const,`,\n ` detail: (id: string | number) => [...${factory.variableName}.details(), id] as const,`,\n )\n }\n lines.push(`} as const`, ``)\n }\n\n return {\n path: 'query-keys.ts',\n content: lines.join('\\n'),\n }\n }\n\n protected generateBarrelIndex(\n tagGroups: string[],\n options: GeneratorOptions,\n ): GeneratedFile {\n const base = super.generateBarrelIndex(tagGroups, options)\n // Add query-keys export\n const content = base.content.replace(\n `export * from './client'`,\n `export * from './client'\\nexport * from './query-keys'`,\n )\n return { ...base, content }\n }\n\n protected generateHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string {\n const isRead = this.isReadOperation(op)\n return isRead\n ? this.generateQueryHook(op, hookName, options)\n : this.generateMutationHook(op, hookName, options)\n }\n\n protected generateInfiniteHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string | null {\n if (!op.pagination) return null\n return this.generateInfiniteQueryHook(op, hookName, op.pagination, options)\n }\n\n // ---------------------------------------------------------------------------\n // useQuery\n // ---------------------------------------------------------------------------\n\n private generateQueryHook(\n op: ApiOperation,\n hookName: string,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const queryKey = getQueryKey(op)\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n const paramArg = hasParams ? `params: ${paramsType}` : ''\n const optionsArg = `options?: Partial<UseQueryOptions<${responseType}, Error>>`\n const args = [paramArg, optionsArg].filter(Boolean).join(', ')\n\n const fetcherBody = this.generateFetcherBody(op, options)\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { useQuery } from '@tanstack/react-query'`,\n `import type { UseQueryOptions } from '@tanstack/react-query'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${[paramsType, responseType].filter(Boolean).join(', ')} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n lines.push(\n ``,\n `export function ${hookName}(${args}) {`,\n ` return useQuery<${responseType}, Error>({`,\n ` queryKey: ${queryKey},`,\n ` queryFn: async () => {`,\n ...fetcherBody.map((l) => ` ${l}`),\n ` },`,\n ` ...options,`,\n ` })`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // useMutation\n // ---------------------------------------------------------------------------\n\n private generateMutationHook(\n op: ApiOperation,\n hookName: string,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const bodyType = op.requestBody ? this.getBodyTypeName(op.operationId) : null\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n // Build the mutation variables type\n const varFields: string[] = []\n if (hasParams) varFields.push(`params: ${paramsType}`)\n if (bodyType) varFields.push(`body: ${bodyType}`)\n const varsType = varFields.length > 0 ? `{ ${varFields.join('; ')} }` : 'void'\n\n const fetcherBody = this.generateMutationFetcherBody(op, options)\n\n const typeImports = [paramsType, responseType, bodyType].filter(Boolean).join(', ')\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { useMutation } from '@tanstack/react-query'`,\n `import type { UseMutationOptions } from '@tanstack/react-query'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${typeImports} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n lines.push(\n ``,\n `export function ${hookName}(options?: UseMutationOptions<${responseType}, Error, ${varsType}>) {`,\n ` return useMutation<${responseType}, Error, ${varsType}>({`,\n ` mutationFn: async (${varFields.length > 0 ? 'vars' : ''}) => {`,\n ...fetcherBody.map((l) => ` ${l}`),\n ` },`,\n ` ...options,`,\n ` })`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // useInfiniteQuery\n // ---------------------------------------------------------------------------\n\n private generateInfiniteQueryHook(\n op: ApiOperation,\n hookName: string,\n pagination: PaginationInfo,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.queryParams.length > 1 || op.pathParams.length > 0 // >1 because one is the page param\n const queryKey = getQueryKey(op)\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n const pageParamType = pagination.strategy === 'cursor' ? 'string | undefined' : 'number'\n const initialPageParam = pagination.strategy === 'cursor' ? 'undefined' : pagination.strategy === 'offset-limit' ? '0' : '1'\n const nextPagePath = pagination.nextPagePath.join('?.')\n\n const paramArg = hasParams ? `params: Omit<${paramsType}, '${pagination.pageParam}'>` : ''\n const optionsArg = `options?: Partial<UseInfiniteQueryOptions<${responseType}, Error>>`\n const args = [paramArg, optionsArg].filter(Boolean).join(', ')\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`} (infinite)`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { useInfiniteQuery } from '@tanstack/react-query'`,\n `import type { UseInfiniteQueryOptions } from '@tanstack/react-query'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${[paramsType, responseType].filter(Boolean).join(', ')} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n // Build the fetcher path\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n lines.push(\n ``,\n `export function ${hookName}(${args}) {`,\n ` return useInfiniteQuery<${responseType}, Error>({`,\n ` queryKey: ${queryKey},`,\n ` queryFn: async ({ pageParam }) => {`,\n ` const config = getClientConfig()`,\n ` const url = new URL(${pathExpr}, config.baseUrl)`,\n )\n\n // Add query params\n for (const p of op.queryParams) {\n if (p.name === pagination.pageParam) {\n lines.push(` if (pageParam !== undefined) url.searchParams.set('${p.name}', String(pageParam))`)\n } else {\n lines.push(` if (${hasParams ? `params.${p.name}` : 'undefined'} !== undefined) url.searchParams.set('${p.name}', String(${hasParams ? `params.${p.name}` : ''}))`)\n }\n }\n\n lines.push(\n ` const res = await fetch(url.toString(), {`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n ` })`,\n ` if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n ` const json = await res.json()`,\n ` return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(` return (await res.json()) as ${responseType}`)\n }\n\n lines.push(\n ` },`,\n ` initialPageParam: ${initialPageParam} as ${pageParamType},`,\n ` getNextPageParam: (lastPage) => (lastPage as Record<string, unknown>)?.${nextPagePath} as ${pageParamType},`,\n ` ...options,`,\n ` })`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // Shared fetcher body generators\n // ---------------------------------------------------------------------------\n\n private generateFetcherBody(op: ApiOperation, options: GeneratorOptions): string[] {\n const responseType = this.getResponseTypeName(op.operationId)\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const lines: string[] = [\n `const config = getClientConfig()`,\n `const url = new URL(${pathExpr}, config.baseUrl)`,\n ]\n\n for (const p of op.queryParams) {\n lines.push(`if (params.${p.name} !== undefined) url.searchParams.set('${p.name}', String(params.${p.name}))`)\n }\n\n lines.push(\n `const res = await fetch(url.toString(), {`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n `})`,\n `if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n `const json = await res.json()`,\n `return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(`return (await res.json()) as ${responseType}`)\n }\n\n return lines\n }\n\n private generateMutationFetcherBody(op: ApiOperation, options: GeneratorOptions): string[] {\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const hasBody = !!op.requestBody\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${vars.params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const lines: string[] = [\n `const config = getClientConfig()`,\n `const url = new URL(${pathExpr}, config.baseUrl)`,\n ]\n\n if (hasParams) {\n for (const p of op.queryParams) {\n lines.push(`if (vars.params.${p.name} !== undefined) url.searchParams.set('${p.name}', String(vars.params.${p.name}))`)\n }\n }\n\n lines.push(\n `const res = await fetch(url.toString(), {`,\n ` method: '${op.method}',`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n )\n\n if (hasBody) {\n lines.push(` body: JSON.stringify(vars.body),`)\n }\n\n lines.push(\n `})`,\n `if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n `const json = await res.json()`,\n `return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(`return (await res.json()) as ${responseType}`)\n }\n\n return lines\n }\n}\n","/**\n * SWR hook generator.\n *\n * Generates:\n * - useSWR hooks for GET operations\n * - useSWRMutation hooks for POST/PUT/PATCH/DELETE operations\n * - useSWRInfinite hooks for paginated GET operations\n */\nimport type { ApiOperation, ApiSpec, PaginationInfo } from '../ir/types'\nimport type { GeneratorOptions } from './types'\nimport { BaseHookGenerator } from './base-generator'\nimport { toPascalCase } from '../utils/naming'\nimport { getSwrKey } from '../utils/cache-keys'\n\nexport class SwrGenerator extends BaseHookGenerator {\n protected supportsInfiniteQueries(): boolean {\n return true\n }\n\n protected generateHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string {\n const isRead = this.isReadOperation(op)\n return isRead\n ? this.generateSwrHook(op, hookName, options)\n : this.generateSwrMutationHook(op, hookName, options)\n }\n\n protected generateInfiniteHookFile(\n op: ApiOperation,\n hookName: string,\n _spec: ApiSpec,\n options: GeneratorOptions,\n ): string | null {\n if (!op.pagination) return null\n return this.generateSwrInfiniteHook(op, hookName, op.pagination, options)\n }\n\n // ---------------------------------------------------------------------------\n // useSWR\n // ---------------------------------------------------------------------------\n\n private generateSwrHook(\n op: ApiOperation,\n hookName: string,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const swrKey = getSwrKey(op)\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n const paramArg = hasParams ? `params: ${paramsType}` : ''\n const optionsArg = `options?: { enabled?: boolean }`\n const args = [paramArg, optionsArg].filter(Boolean).join(', ')\n\n const fetcherBody = this.generateFetcherBody(op, options)\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import useSWR from 'swr'`,\n `import type { SWRConfiguration } from 'swr'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${[paramsType, responseType].filter(Boolean).join(', ')} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n lines.push(\n ``,\n `export function ${hookName}(${args}) {`,\n ` const key = options?.enabled === false ? null : ${swrKey}`,\n ``,\n ` return useSWR<${responseType}, Error>(key, async () => {`,\n ...fetcherBody.map((l) => ` ${l}`),\n ` })`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // useSWRMutation\n // ---------------------------------------------------------------------------\n\n private generateSwrMutationHook(\n op: ApiOperation,\n hookName: string,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const bodyType = op.requestBody ? this.getBodyTypeName(op.operationId) : null\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n // Build the arg type\n const argFields: string[] = []\n if (hasParams) argFields.push(`params: ${paramsType}`)\n if (bodyType) argFields.push(`body: ${bodyType}`)\n const argType = argFields.length > 0 ? `{ ${argFields.join('; ')} }` : 'void'\n\n const typeImports = [paramsType, responseType, bodyType].filter(Boolean).join(', ')\n\n const fetcherBody = this.generateMutationFetcherBody(op, options)\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`}`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import useSWRMutation from 'swr/mutation'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${typeImports} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n lines.push(\n ``,\n `export function ${hookName}() {`,\n ` return useSWRMutation<${responseType}, Error, string, ${argType}>(`,\n ` '${op.method} ${op.path}',`,\n ` async (_key: string, { arg }: { arg: ${argType} }) => {`,\n ...fetcherBody.map((l) => ` ${l}`),\n ` },`,\n ` )`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // useSWRInfinite\n // ---------------------------------------------------------------------------\n\n private generateSwrInfiniteHook(\n op: ApiOperation,\n hookName: string,\n pagination: PaginationInfo,\n options: GeneratorOptions,\n ): string {\n const paramsType = this.getParamsTypeName(op.operationId)\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.queryParams.length > 1 || op.pathParams.length > 0\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n const nextPagePath = pagination.nextPagePath.join('?.')\n\n const paramArg = hasParams ? `params: Omit<${paramsType}, '${pagination.pageParam}'>` : ''\n const args = [paramArg].filter(Boolean).join(', ')\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const lines: string[] = [\n `/**`,\n ` * ${op.summary || `${op.method} ${op.path}`} (infinite)`,\n ` *`,\n ` * \\`${op.method} ${op.path}\\``,\n op.deprecated ? ` * @deprecated` : '',\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import useSWRInfinite from 'swr/infinite'`,\n `import { getClientConfig } from '../client'`,\n `import type { ${[paramsType, responseType].filter(Boolean).join(', ')} } from '../types'`,\n ].filter(Boolean)\n\n if (options.zod) {\n lines.push(`import { ${schemaVar} } from '../schemas'`)\n }\n\n lines.push(\n ``,\n `export function ${hookName}(${args}) {`,\n ` const getKey = (pageIndex: number, previousPageData: ${responseType} | null) => {`,\n ` if (previousPageData && !(previousPageData as Record<string, unknown>)?.${nextPagePath}) return null`,\n ` const pageParam = pageIndex === 0`,\n ` ? undefined`,\n ` : (previousPageData as Record<string, unknown>)?.${nextPagePath}`,\n ` return [${pathExpr}, pageParam${hasParams ? ', params' : ''}] as const`,\n ` }`,\n ``,\n ` return useSWRInfinite<${responseType}, Error>(getKey, async ([_path, pageParam]) => {`,\n ` const config = getClientConfig()`,\n ` const url = new URL(${pathExpr}, config.baseUrl)`,\n )\n\n for (const p of op.queryParams) {\n if (p.name === pagination.pageParam) {\n lines.push(` if (pageParam !== undefined) url.searchParams.set('${p.name}', String(pageParam))`)\n } else {\n lines.push(` if (${hasParams ? `params.${p.name}` : 'undefined'} !== undefined) url.searchParams.set('${p.name}', String(${hasParams ? `params.${p.name}` : ''}))`)\n }\n }\n\n lines.push(\n ` const res = await fetch(url.toString(), {`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n ` })`,\n ` if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n ` const json = await res.json()`,\n ` return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(` return (await res.json()) as ${responseType}`)\n }\n\n lines.push(\n ` })`,\n `}`,\n ``,\n )\n\n return lines.join('\\n')\n }\n\n // ---------------------------------------------------------------------------\n // Shared fetcher body generators\n // ---------------------------------------------------------------------------\n\n private generateFetcherBody(op: ApiOperation, options: GeneratorOptions): string[] {\n const responseType = this.getResponseTypeName(op.operationId)\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const lines: string[] = [\n `const config = getClientConfig()`,\n `const url = new URL(${pathExpr}, config.baseUrl)`,\n ]\n\n for (const p of op.queryParams) {\n lines.push(`if (params.${p.name} !== undefined) url.searchParams.set('${p.name}', String(params.${p.name}))`)\n }\n\n lines.push(\n `const res = await fetch(url.toString(), {`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n `})`,\n `if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n `const json = await res.json()`,\n `return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(`return (await res.json()) as ${responseType}`)\n }\n\n return lines\n }\n\n private generateMutationFetcherBody(op: ApiOperation, options: GeneratorOptions): string[] {\n const responseType = this.getResponseTypeName(op.operationId)\n const hasParams = op.pathParams.length > 0 || op.queryParams.length > 0\n const hasBody = !!op.requestBody\n const schemaVar = `${toPascalCase(op.operationId).charAt(0).toLowerCase() + toPascalCase(op.operationId).slice(1)}ResponseSchema`\n\n let pathExpr = `'${op.path}'`\n if (op.pathParams.length > 0) {\n let tmpl = op.path\n for (const p of op.pathParams) {\n tmpl = tmpl.replace(`{${p.name}}`, `\\${arg.params.${p.name}}`)\n }\n pathExpr = `\\`${tmpl}\\``\n }\n\n const lines: string[] = [\n `const config = getClientConfig()`,\n `const url = new URL(${pathExpr}, config.baseUrl)`,\n ]\n\n if (hasParams) {\n for (const p of op.queryParams) {\n lines.push(`if (arg.params.${p.name} !== undefined) url.searchParams.set('${p.name}', String(arg.params.${p.name}))`)\n }\n }\n\n lines.push(\n `const res = await fetch(url.toString(), {`,\n ` method: '${op.method}',`,\n ` headers: { 'Content-Type': 'application/json', ...config.headers },`,\n )\n\n if (hasBody) {\n lines.push(` body: JSON.stringify(arg.body),`)\n }\n\n lines.push(\n `})`,\n `if (!res.ok) throw new Error(\\`HTTP \\${res.status}: \\${res.statusText}\\`)`,\n )\n\n if (options.zod) {\n lines.push(\n `const json = await res.json()`,\n `return ${schemaVar}.parse(json) as ${responseType}`,\n )\n } else {\n lines.push(`return (await res.json()) as ${responseType}`)\n }\n\n return lines\n }\n}\n","/**\n * Custom error classes for auto-api-hooks.\n */\n\nexport class AutoApiHooksError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'AutoApiHooksError'\n }\n}\n\nexport class ParseError extends AutoApiHooksError {\n constructor(message: string) {\n super(message)\n this.name = 'ParseError'\n }\n}\n\nexport class GeneratorError extends AutoApiHooksError {\n constructor(message: string) {\n super(message)\n this.name = 'GeneratorError'\n }\n}\n\nexport class FileWriteError extends AutoApiHooksError {\n constructor(message: string) {\n super(message)\n this.name = 'FileWriteError'\n }\n}\n\nexport class ValidationError extends AutoApiHooksError {\n constructor(message: string) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n","/**\n * Generator factory and public API.\n */\nimport type { ApiSpec } from '../ir/types'\nimport type { FetcherStrategy, GeneratorOptions, HookGenerator } from './types'\nimport type { GeneratedFile } from '../utils/file-writer'\nimport { FetchGenerator } from './fetch-generator'\nimport { AxiosGenerator } from './axios-generator'\nimport { ReactQueryGenerator } from './react-query-generator'\nimport { SwrGenerator } from './swr-generator'\nimport { GeneratorError } from '../utils/errors'\n\n/**\n * Create a hook generator for the specified fetcher strategy.\n */\nexport function createGenerator(strategy: FetcherStrategy): HookGenerator {\n switch (strategy) {\n case 'fetch':\n return new FetchGenerator()\n case 'axios':\n return new AxiosGenerator()\n case 'react-query':\n return new ReactQueryGenerator()\n case 'swr':\n return new SwrGenerator()\n default:\n throw new GeneratorError(`Unknown fetcher strategy: ${strategy as string}`)\n }\n}\n\n/**\n * Generate hooks from a parsed API spec.\n */\nexport function generateHooks(\n spec: ApiSpec,\n options: GeneratorOptions,\n): GeneratedFile[] {\n const generator = createGenerator(options.fetcher)\n return generator.generate(spec, options)\n}\n\nexport type { FetcherStrategy, GeneratorOptions, HookGenerator } from './types'\n","/**\n * Deterministic mock data generation from IR types.\n *\n * No faker.js dependency — generates simple, predictable values\n * so the generated mock code has zero runtime dependencies.\n */\nimport type { ApiType, ApiSpec, ApiOperation } from '../ir/types'\n\nlet counter = 0\n\nfunction resetCounter(): void {\n counter = 0\n}\n\n/**\n * Generate a mock value expression (as a code string) for a given type.\n */\nexport function emitMockValue(type: ApiType, spec: ApiSpec, depth = 0): string {\n if (depth > 5) return `null`\n\n switch (type.kind) {\n case 'primitive':\n return emitPrimitiveMock(type.type, type.format)\n case 'object':\n return emitObjectMock(type, spec, depth)\n case 'array':\n return `[${emitMockValue(type.items, spec, depth + 1)}]`\n case 'enum':\n if (type.values.length === 0) return `null`\n const val = type.values[0]\n return typeof val === 'string' ? `'${val}'` : String(val)\n case 'union':\n if (type.variants.length === 0) return `null`\n return emitMockValue(type.variants[0], spec, depth + 1)\n case 'ref': {\n const resolved = spec.types.get(type.name)\n if (resolved) return emitMockValue(resolved, spec, depth + 1)\n return `{}`\n }\n default:\n return `null`\n }\n}\n\nfunction emitPrimitiveMock(type: string, format?: string): string {\n switch (type) {\n case 'string':\n return emitStringMock(format)\n case 'number':\n case 'integer':\n return String(counter++)\n case 'boolean':\n return 'true'\n case 'null':\n return 'null'\n default:\n return `'unknown'`\n }\n}\n\nfunction emitStringMock(format?: string): string {\n switch (format) {\n case 'date-time':\n return `'2024-01-01T00:00:00Z'`\n case 'date':\n return `'2024-01-01'`\n case 'email':\n return `'user@example.com'`\n case 'uuid':\n return `'00000000-0000-0000-0000-000000000001'`\n case 'uri':\n case 'url':\n return `'https://example.com'`\n case 'hostname':\n return `'example.com'`\n case 'ipv4':\n return `'127.0.0.1'`\n case 'ipv6':\n return `'::1'`\n default:\n return `'string-value-${counter++}'`\n }\n}\n\nfunction emitObjectMock(type: ApiType & { kind: 'object' }, spec: ApiSpec, depth: number): string {\n if (type.properties.length === 0) {\n return `{}`\n }\n\n const props = type.properties\n .map((p) => ` ${safeKey(p.name)}: ${emitMockValue(p.type, spec, depth + 1)}`)\n .join(',\\n')\n\n return `{\\n${props}\\n}`\n}\n\nfunction safeKey(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`\n}\n\n/**\n * Generate a mock data function for an operation's response type.\n */\nexport function emitMockDataFunction(\n op: ApiOperation,\n spec: ApiSpec,\n): string {\n resetCounter()\n const fnName = `generate${op.operationId.charAt(0).toUpperCase() + op.operationId.slice(1)}Mock`\n const mockValue = emitMockValue(op.response.type, spec)\n\n return [\n `export function ${fnName}() {`,\n ` return ${mockValue}`,\n `}`,\n ].join('\\n')\n}\n\n/**\n * Generate the full mock data file.\n */\nexport function emitMockDataFile(spec: ApiSpec): string {\n const lines: string[] = [\n `/**`,\n ` * Mock data generators.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n ``,\n ]\n\n for (const op of spec.operations) {\n resetCounter()\n lines.push(emitMockDataFunction(op, spec))\n lines.push(``)\n }\n\n return lines.join('\\n')\n}\n","/**\n * MSW v2 request handler generator.\n */\nimport type { ApiSpec, ApiOperation, HttpMethod } from '../ir/types'\n\n/**\n * Generate MSW handler file content.\n */\nexport function emitMswHandlers(spec: ApiSpec): string {\n const lines: string[] = [\n `/**`,\n ` * MSW request handlers.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { http, HttpResponse } from 'msw'`,\n `import * as mocks from './data'`,\n ``,\n `export const handlers = [`,\n ]\n\n for (const op of spec.operations) {\n // Skip non-HTTP operations (GraphQL queries/mutations/subscriptions)\n if (!isHttpMethod(op.method)) continue\n\n const mswMethod = op.method.toLowerCase()\n const mswPath = convertPathToMsw(op.path, spec.baseUrl)\n const mockFnName = `generate${op.operationId.charAt(0).toUpperCase() + op.operationId.slice(1)}Mock`\n const statusCode = getStatusCode(op)\n\n lines.push(\n ` http.${mswMethod}('${mswPath}', () => {`,\n ` return HttpResponse.json(mocks.${mockFnName}(), { status: ${statusCode} })`,\n ` }),`,\n )\n }\n\n lines.push(\n `]`,\n ``,\n )\n\n return lines.join('\\n')\n}\n\n/**\n * Generate the MSW server setup file (Node.js).\n */\nexport function emitMswServerSetup(): string {\n return [\n `/**`,\n ` * MSW server setup for Node.js (tests, SSR).`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { setupServer } from 'msw/node'`,\n `import { handlers } from './handlers'`,\n ``,\n `export const server = setupServer(...handlers)`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Generate the MSW browser setup file.\n */\nexport function emitMswBrowserSetup(): string {\n return [\n `/**`,\n ` * MSW browser setup for development.`,\n ` * Generated by auto-api-hooks — do not edit manually.`,\n ` */`,\n `import { setupWorker } from 'msw/browser'`,\n `import { handlers } from './handlers'`,\n ``,\n `export const worker = setupWorker(...handlers)`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Generate the barrel index for mocks.\n */\nexport function emitMockIndex(): string {\n return [\n `export { handlers } from './handlers'`,\n `export * from './data'`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Convert an OpenAPI path to MSW path format.\n * `/users/{id}` → `/users/:id`\n */\nfunction convertPathToMsw(path: string, baseUrl: string): string {\n const mswPath = path.replace(/\\{(\\w+)\\}/g, ':$1')\n if (baseUrl) {\n return `${baseUrl}${mswPath}`\n }\n return mswPath\n}\n\nfunction isHttpMethod(method: string): method is HttpMethod {\n return ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method)\n}\n\nfunction getStatusCode(op: ApiOperation): number {\n if (op.response.statusCode !== 'default' && typeof op.response.statusCode === 'number') {\n return op.response.statusCode\n }\n // Default status codes by method\n switch (op.method) {\n case 'POST':\n return 201\n case 'DELETE':\n return 204\n default:\n return 200\n }\n}\n","/**\n * Mock generation public API.\n */\nimport type { ApiSpec } from '../ir/types'\nimport type { GeneratedFile } from '../utils/file-writer'\nimport { emitMockDataFile } from './faker-helpers'\nimport { emitMswHandlers, emitMswServerSetup, emitMswBrowserSetup, emitMockIndex } from './handler-emitter'\n\n/**\n * Generate all mock-related files.\n */\nexport function generateMockFiles(spec: ApiSpec): GeneratedFile[] {\n return [\n { path: 'mocks/data.ts', content: emitMockDataFile(spec) },\n { path: 'mocks/handlers.ts', content: emitMswHandlers(spec) },\n { path: 'mocks/server.ts', content: emitMswServerSetup() },\n { path: 'mocks/browser.ts', content: emitMswBrowserSetup() },\n { path: 'mocks/index.ts', content: emitMockIndex() },\n ]\n}\n\nexport { emitMockDataFile, emitMockDataFunction, emitMockValue } from './faker-helpers'\nexport { emitMswHandlers, emitMswServerSetup, emitMswBrowserSetup, emitMockIndex } from './handler-emitter'\n","/**\n * Colored console logger using picocolors.\n */\nimport pc from 'picocolors'\n\nexport interface Logger {\n info(message: string): void\n success(message: string): void\n warn(message: string): void\n error(message: string): void\n verbose(message: string): void\n}\n\nlet _verbose = false\n\nexport function setVerbose(v: boolean): void {\n _verbose = v\n}\n\nexport const logger: Logger = {\n info(message: string) {\n console.log(pc.cyan('ℹ'), message)\n },\n success(message: string) {\n console.log(pc.green('✔'), message)\n },\n warn(message: string) {\n console.log(pc.yellow('⚠'), message)\n },\n error(message: string) {\n console.error(pc.red('✖'), message)\n },\n verbose(message: string) {\n if (_verbose) {\n console.log(pc.gray(' ▸'), pc.gray(message))\n }\n },\n}\n","/**\n * Write generated files to disk.\n */\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\nimport { FileWriteError } from './errors'\nimport { logger } from './logger'\n\nexport interface GeneratedFile {\n /** Relative path from output directory. */\n path: string\n /** Generated source code. */\n content: string\n}\n\n/**\n * Write an array of generated files to the output directory.\n */\nexport async function writeFiles(\n outputDir: string,\n files: GeneratedFile[],\n): Promise<void> {\n for (const file of files) {\n const fullPath = join(outputDir, file.path)\n const dir = dirname(fullPath)\n\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(fullPath, file.content, 'utf-8')\n logger.verbose(`Wrote ${file.path}`)\n } catch (err) {\n throw new FileWriteError(\n `Failed to write ${fullPath}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n}\n","/**\n * auto-api-hooks — Auto-generate type-safe React hooks from API specs.\n *\n * @example\n * ```ts\n * import { generate } from 'auto-api-hooks'\n *\n * await generate({\n * spec: './openapi.yaml',\n * fetcher: 'react-query',\n * outputDir: './src/hooks',\n * zod: true,\n * mock: true,\n * })\n * ```\n */\nimport { parseSpec } from './parsers/index'\nimport { generateHooks } from './generators/index'\nimport { generateMockFiles } from './mock-gen/index'\nimport { writeFiles } from './utils/file-writer'\nimport type { FetcherStrategy } from './generators/types'\nimport type { GeneratedFile } from './utils/file-writer'\n\nexport interface GenerateOptions {\n /** Path to the API spec file, or a parsed object. */\n spec: string | object\n /** Fetching strategy. */\n fetcher: FetcherStrategy\n /** Output directory. If provided, files are written to disk. */\n outputDir?: string\n /** Override base URL from the spec. */\n baseUrl?: string\n /** Generate Zod validation schemas. */\n zod?: boolean\n /** Generate MSW mock server handlers. */\n mock?: boolean\n /** Generate infinite query hooks for paginated endpoints. */\n infiniteQueries?: boolean\n}\n\n/**\n * Generate type-safe React hooks from an API specification.\n *\n * @param options - Generation options\n * @returns Array of generated files (path + content)\n */\nexport async function generate(options: GenerateOptions): Promise<GeneratedFile[]> {\n const {\n spec: input,\n fetcher,\n outputDir,\n baseUrl,\n zod = false,\n mock = false,\n infiniteQueries = true,\n } = options\n\n // 1. Parse spec\n const spec = await parseSpec(input, { baseUrl })\n\n // 2. Generate hook files\n const hookFiles = generateHooks(spec, {\n fetcher,\n zod,\n mock: false,\n outputDir: outputDir || './src/hooks',\n baseUrl,\n infiniteQueries,\n })\n\n // 3. Generate mock files (if enabled)\n const mockFiles = mock ? generateMockFiles(spec) : []\n\n const allFiles = [...hookFiles, ...mockFiles]\n\n // 4. Write to disk (if outputDir provided)\n if (outputDir) {\n await writeFiles(outputDir, allFiles)\n }\n\n return allFiles\n}\n\n// Re-exports\nexport { parseSpec } from './parsers/index'\nexport { generateHooks, createGenerator } from './generators/index'\nexport { generateMockFiles } from './mock-gen/index'\nexport { emitTypeScriptTypes, emitTypeString } from './type-gen/index'\nexport { emitZodSchemas, emitZodType } from './type-gen/index'\n\n// Type re-exports\nexport type { GeneratedFile } from './utils/file-writer'\nexport type { FetcherStrategy, GeneratorOptions, HookGenerator } from './generators/types'\nexport type { ParseOptions } from './parsers/types'\nexport type {\n ApiSpec,\n ApiOperation,\n ApiType,\n ApiPrimitiveType,\n ApiObjectType,\n ApiArrayType,\n ApiEnumType,\n ApiUnionType,\n ApiRefType,\n ApiParam,\n ApiRequestBody,\n ApiResponse,\n ApiProperty,\n PaginationInfo,\n PaginationStrategy,\n HttpMethod,\n OperationMethod,\n} from './ir/types'\n"]}