@cushin/api-codegen 5.0.7 → 6.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.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}', 'max');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n baseClient = createAPIClient(apiConfig, authCallbacks) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later if auth is needed)\nexport let serverClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\n// Initialize without auth by default\nserverClient = createAPIClient(apiConfig) as any;\n\n/**\n * Initialize server-side API client with auth callbacks\n * Call this in Server Actions or Route Handlers where you need authentication\n *\n * @example\n * // In a Server Action or API Route:\n * import { cookies } from 'next/headers';\n *\n * const authCallbacks = {\n * getTokens: async () => {\n * const token = cookies().get('auth_token')?.value;\n * return token ? { accessToken: token } : null;\n * },\n * onAuthError: () => {\n * // Handle auth error (e.g., redirect, clear cookies)\n * }\n * };\n *\n * initializeServerClient(authCallbacks);\n */\nexport const initializeServerClient = (authCallbacks: AuthCallbacks) => {\n serverClient = createAPIClient(apiConfig, authCallbacks) as any;\n return serverClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":"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","names":["path","context","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","context","path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts","../src/swagger/parser.ts","../src/swagger/config-generator.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Path to Swagger/OpenAPI specification file (JSON or YAML)\n * When provided, endpoints will be generated from this spec\n * @optional\n */\n swaggerSource?: string;\n\n /**\n * Split generated endpoints into separate files by tags\n * When true with swaggerSource, each tag becomes a separate module file\n * @default false\n */\n splitByTags?: boolean;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n swaggerSourcePath?: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n const swaggerSourcePath = userConfig.swaggerSource\n ? path.resolve(rootDir, userConfig.swaggerSource)\n : undefined;\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n swaggerSourcePath,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { parseOpenAPISpec, extractEndpoints } from \"../swagger/parser.js\";\nimport {\n generateConfigFile,\n groupEndpointsByTags,\n generateModuleFile,\n generateIndexFile,\n} from \"../swagger/config-generator.js\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // If swagger source is provided, generate config file first\n if (this.config.swaggerSourcePath) {\n await this.generateConfigFromSwagger();\n }\n\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n /**\n * Generate single config file (no split)\n */\n private async generateSingleConfigFile(\n endpoints: any[],\n spec: any,\n ): Promise<void> {\n const configContent = generateConfigFile(endpoints, spec, this.config.baseUrl);\n\n // Ensure the directory exists\n const endpointsDir = path.dirname(this.config.endpointsPath);\n await fs.mkdir(endpointsDir, { recursive: true });\n\n // Write config file\n await fs.writeFile(this.config.endpointsPath, configContent, \"utf-8\");\n\n console.log(`✓ Generated endpoint config at ${this.config.endpointsPath}`);\n }\n\n /**\n * Generate multiple module files split by tags\n */\n private async generateMultipleModuleFiles(\n endpoints: any[],\n spec: any,\n ): Promise<void> {\n // Group endpoints by tags\n const grouped = groupEndpointsByTags(endpoints);\n console.log(`✓ Grouped into ${grouped.size} modules by tags`);\n\n // Create modules directory\n const endpointsDir = path.dirname(this.config.endpointsPath);\n const modulesDir = path.join(endpointsDir, \"modules\");\n await fs.mkdir(modulesDir, { recursive: true });\n\n // Generate each module file\n for (const [tag, tagEndpoints] of grouped.entries()) {\n const moduleFileName = tag.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n const moduleFilePath = path.join(modulesDir, `${moduleFileName}.ts`);\n\n const moduleContent = generateModuleFile(tag, tagEndpoints, spec);\n await fs.writeFile(moduleFilePath, moduleContent, \"utf-8\");\n\n console.log(` ✓ ${tag}: ${tagEndpoints.length} endpoints → ${moduleFileName}.ts`);\n }\n\n // Generate index file\n const indexContent = generateIndexFile(grouped, spec, this.config.baseUrl);\n const indexPath = path.join(modulesDir, \"index.ts\");\n await fs.writeFile(indexPath, indexContent, \"utf-8\");\n\n console.log(`✓ Generated index.ts at ${modulesDir}/index.ts`);\n\n // Also write a re-export at the main endpoints path\n const mainExportContent = `export * from \"./modules/index.js\";\\n`;\n await fs.mkdir(endpointsDir, { recursive: true });\n await fs.writeFile(this.config.endpointsPath, mainExportContent, \"utf-8\");\n\n console.log(`✓ Generated main export at ${this.config.endpointsPath}`);\n }\n\n /**\n * Generate endpoint config file from Swagger/OpenAPI spec\n */\n private async generateConfigFromSwagger(): Promise<void> {\n if (!this.config.swaggerSourcePath) {\n return;\n }\n\n try {\n console.log(`📄 Parsing Swagger spec from ${this.config.swaggerSourcePath}...`);\n\n // Parse OpenAPI spec\n const spec = await parseOpenAPISpec(this.config.swaggerSourcePath);\n\n console.log(`✓ Found OpenAPI ${spec.openapi} specification`);\n console.log(` Title: ${spec.info.title} (v${spec.info.version})`);\n\n // Extract endpoints\n const endpoints = extractEndpoints(spec);\n console.log(`✓ Extracted ${endpoints.length} endpoints`);\n\n // Check if split by tags is enabled\n if (this.config.splitByTags) {\n await this.generateMultipleModuleFiles(endpoints, spec);\n } else {\n await this.generateSingleConfigFile(endpoints, spec);\n }\n } catch (error) {\n throw new Error(\n `Failed to generate config from Swagger: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}', 'max');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks and optional global headers\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks, {\n * 'X-Client-ID': 'my-app',\n * 'X-Environment': 'production',\n * });\n */\nexport const initializeAPIClient = (\n authCallbacks: AuthCallbacks,\n globalHeaders?: Record<string, string>,\n) => {\n baseClient = createAPIClient(apiConfig, authCallbacks, globalHeaders) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later if auth is needed)\nexport let serverClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\n// Initialize without auth by default\nserverClient = createAPIClient(apiConfig) as any;\n\n/**\n * Initialize server-side API client with auth callbacks and optional global headers\n * Call this in Server Actions or Route Handlers where you need authentication\n *\n * @example\n * // In a Server Action or API Route:\n * import { cookies } from 'next/headers';\n *\n * const authCallbacks = {\n * getTokens: async () => {\n * const token = cookies().get('auth_token')?.value;\n * return token ? { accessToken: token } : null;\n * },\n * onAuthError: () => {\n * // Handle auth error (e.g., redirect, clear cookies)\n * }\n * };\n *\n * initializeServerClient(authCallbacks, {\n * 'X-Server-ID': 'server-1',\n * 'X-Request-ID': requestId,\n * });\n */\nexport const initializeServerClient = (\n authCallbacks: AuthCallbacks,\n globalHeaders?: Record<string, string>,\n) => {\n serverClient = createAPIClient(apiConfig, authCallbacks, globalHeaders) as any;\n return serverClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport type {\n OpenAPISpec,\n OpenAPIPathItem,\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ParsedEndpoint,\n ParsedParameter,\n} from \"./types.js\";\n\n/**\n * Parse OpenAPI spec from file\n */\nexport async function parseOpenAPISpec(\n filePath: string,\n): Promise<OpenAPISpec> {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n const ext = path.extname(filePath).toLowerCase();\n\n let spec: OpenAPISpec;\n\n if (ext === \".json\") {\n spec = JSON.parse(content);\n } else if (ext === \".yaml\" || ext === \".yml\") {\n // We'll need to install yaml package for YAML support\n const yaml = await import(\"yaml\");\n spec = yaml.parse(content);\n } else {\n throw new Error(\n `Unsupported file format: ${ext}. Only .json, .yaml, and .yml are supported.`,\n );\n }\n\n // Validate OpenAPI version\n if (!spec.openapi || !spec.openapi.startsWith(\"3.\")) {\n throw new Error(\n `Unsupported OpenAPI version: ${spec.openapi}. Only OpenAPI 3.0 and 3.1 are supported.`,\n );\n }\n\n return spec;\n}\n\n/**\n * Extract all endpoints from OpenAPI spec\n */\nexport function extractEndpoints(spec: OpenAPISpec): ParsedEndpoint[] {\n const endpoints: ParsedEndpoint[] = [];\n\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n const methods = [\n \"get\",\n \"post\",\n \"put\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n ] as const;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const endpoint = parseOperation(\n path,\n method,\n operation,\n pathItem,\n spec,\n );\n endpoints.push(endpoint);\n }\n }\n\n return endpoints;\n}\n\n/**\n * Parse a single operation into our internal format\n */\nfunction parseOperation(\n path: string,\n method: string,\n operation: OpenAPIOperation,\n pathItem: OpenAPIPathItem,\n spec: OpenAPISpec,\n): ParsedEndpoint {\n // Combine path-level and operation-level parameters\n const allParameters = [\n ...(pathItem.parameters || []),\n ...(operation.parameters || []),\n ];\n\n const pathParams: ParsedParameter[] = [];\n const queryParams: ParsedParameter[] = [];\n\n for (const param of allParameters) {\n const resolved = resolveParameter(param, spec);\n const parsed: ParsedParameter = {\n name: resolved.name,\n type: schemaToTypeString(resolved.schema),\n required: resolved.required ?? resolved.in === \"path\",\n description: resolved.description,\n schema: resolved.schema, // Keep original schema\n };\n\n if (resolved.in === \"path\") {\n pathParams.push(parsed);\n } else if (resolved.in === \"query\") {\n queryParams.push(parsed);\n }\n }\n\n // Parse request body\n let requestBody;\n if (operation.requestBody) {\n const resolved = resolveRequestBody(operation.requestBody, spec);\n const content = resolved.content?.[\"application/json\"];\n if (content) {\n requestBody = {\n type: schemaToTypeString(content.schema),\n required: resolved.required ?? false,\n description: resolved.description,\n schema: content.schema,\n };\n }\n }\n\n // Parse response (use 200, 201, or first 2xx response)\n let response;\n const responses = operation.responses;\n const successStatus =\n responses[\"200\"] || responses[\"201\"] || responses[\"204\"];\n\n if (successStatus) {\n const statusCode = responses[\"200\"]\n ? \"200\"\n : responses[\"201\"]\n ? \"201\"\n : \"204\";\n const resolved = resolveResponse(successStatus, spec);\n const content = resolved.content?.[\"application/json\"];\n\n if (content || statusCode === \"204\") {\n response = {\n statusCode,\n type: content ? schemaToTypeString(content.schema) : \"void\",\n description: resolved.description,\n schema: content?.schema || { type: \"null\" },\n };\n }\n }\n\n // If no explicit 2xx response, try to find any 2xx response\n if (!response) {\n for (const [statusCode, res] of Object.entries(responses)) {\n if (statusCode.startsWith(\"2\")) {\n const resolved = resolveResponse(res, spec);\n const content = resolved.content?.[\"application/json\"];\n response = {\n statusCode,\n type: content ? schemaToTypeString(content.schema) : \"void\",\n description: resolved.description,\n schema: content?.schema || { type: \"null\" },\n };\n break;\n }\n }\n }\n\n return {\n path,\n method: method.toUpperCase(),\n operationId: operation.operationId,\n summary: operation.summary,\n description: operation.description,\n tags: operation.tags,\n pathParams: pathParams.length > 0 ? pathParams : undefined,\n queryParams: queryParams.length > 0 ? queryParams : undefined,\n requestBody,\n response,\n };\n}\n\n/**\n * Resolve $ref in parameter\n */\nfunction resolveParameter(\n param: OpenAPIParameter,\n spec: OpenAPISpec,\n): OpenAPIParameter {\n if (\"$ref\" in param && param.$ref) {\n const refPath = param.$ref.replace(\"#/components/parameters/\", \"\");\n const resolved = spec.components?.parameters?.[refPath];\n if (!resolved) {\n throw new Error(`Cannot resolve parameter reference: ${param.$ref}`);\n }\n return resolved;\n }\n return param;\n}\n\n/**\n * Resolve $ref in request body\n */\nfunction resolveRequestBody(requestBody: any, spec: OpenAPISpec): any {\n if (\"$ref\" in requestBody && requestBody.$ref) {\n const refPath = requestBody.$ref.replace(\"#/components/requestBodies/\", \"\");\n const resolved = spec.components?.requestBodies?.[refPath];\n if (!resolved) {\n throw new Error(`Cannot resolve request body reference: ${requestBody.$ref}`);\n }\n return resolved;\n }\n return requestBody;\n}\n\n/**\n * Resolve $ref in response\n */\nfunction resolveResponse(response: any, spec: OpenAPISpec): any {\n if (\"$ref\" in response && response.$ref) {\n const refPath = response.$ref.replace(\"#/components/responses/\", \"\");\n const resolved = spec.components?.responses?.[refPath];\n if (!resolved) {\n throw new Error(`Cannot resolve response reference: ${response.$ref}`);\n }\n return resolved;\n }\n return response;\n}\n\n/**\n * Convert OpenAPI schema to a simplified type string\n * This is a basic implementation - you might want to make it more sophisticated\n */\nfunction schemaToTypeString(schema: OpenAPISchema): string {\n if (!schema) return \"any\";\n\n // Handle $ref\n if (schema.$ref) {\n const parts = schema.$ref.split(\"/\");\n return parts[parts.length - 1];\n }\n\n // Handle basic types\n if (schema.type) {\n switch (schema.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"array\":\n if (schema.items) {\n return `${schemaToTypeString(schema.items)}[]`;\n }\n return \"any[]\";\n case \"object\":\n return \"object\";\n default:\n return \"any\";\n }\n }\n\n // Handle allOf, oneOf, anyOf\n if (schema.allOf) {\n return schema.allOf.map(schemaToTypeString).join(\" & \");\n }\n if (schema.oneOf || schema.anyOf) {\n const schemas = schema.oneOf || schema.anyOf;\n return schemas!.map(schemaToTypeString).join(\" | \");\n }\n\n return \"any\";\n}\n","import type { ParsedEndpoint, OpenAPISchema, OpenAPISpec } from \"./types.js\";\n\n/**\n * Group endpoints by their tags\n */\nexport function groupEndpointsByTags(\n endpoints: ParsedEndpoint[],\n): Map<string, ParsedEndpoint[]> {\n const grouped = new Map<string, ParsedEndpoint[]>();\n\n for (const endpoint of endpoints) {\n // Use first tag, or \"default\" if no tags\n const tag = endpoint.tags && endpoint.tags.length > 0 ? endpoint.tags[0] : \"default\";\n\n if (!grouped.has(tag)) {\n grouped.set(tag, []);\n }\n grouped.get(tag)!.push(endpoint);\n }\n\n return grouped;\n}\n\n/**\n * Generate endpoint config file content from parsed endpoints\n */\nexport function generateConfigFile(\n endpoints: ParsedEndpoint[],\n spec: OpenAPISpec,\n baseUrl?: string,\n): string {\n const lines: string[] = [];\n\n // Add imports\n lines.push('import { defineConfig, defineEndpoint } from \"@cushin/api-runtime\";');\n lines.push('import { z } from \"zod\";');\n lines.push(\"\");\n\n // Generate schema definitions for components\n if (spec.components?.schemas) {\n lines.push(\"// Schema definitions from OpenAPI components\");\n for (const [name, schema] of Object.entries(spec.components.schemas)) {\n const zodSchema = convertSchemaToZod(schema, spec);\n lines.push(`const ${name}Schema = ${zodSchema};`);\n }\n lines.push(\"\");\n }\n\n // Generate endpoint definitions\n lines.push(\"// Endpoint definitions\");\n const endpointNames: string[] = [];\n\n for (const endpoint of endpoints) {\n const name = generateEndpointName(endpoint);\n endpointNames.push(name);\n\n // Convert OpenAPI path format {param} to :param\n const path = convertPathFormat(endpoint.path);\n\n lines.push(`const ${name} = defineEndpoint({`);\n lines.push(` path: \"${path}\",`);\n lines.push(` method: \"${endpoint.method}\",`);\n\n // Add params schema if exists\n if (endpoint.pathParams && endpoint.pathParams.length > 0) {\n const paramsSchema = generateParamsSchema(endpoint.pathParams, spec);\n lines.push(` params: ${paramsSchema},`);\n }\n\n // Add query schema if exists\n if (endpoint.queryParams && endpoint.queryParams.length > 0) {\n const querySchema = generateQuerySchema(endpoint.queryParams, spec);\n lines.push(` query: ${querySchema},`);\n }\n\n // Add body schema if exists\n if (endpoint.requestBody) {\n const bodySchema = convertSchemaToZod(endpoint.requestBody.schema, spec);\n lines.push(` body: ${bodySchema},`);\n }\n\n // Add response schema\n if (endpoint.response) {\n const responseSchema = convertSchemaToZod(endpoint.response.schema, spec);\n lines.push(` response: ${responseSchema},`);\n } else {\n lines.push(` response: z.any(),`);\n }\n\n // Add tags if exists\n if (endpoint.tags && endpoint.tags.length > 0) {\n const tagsStr = endpoint.tags.map((t) => `\"${t}\"`).join(\", \");\n lines.push(` tags: [${tagsStr}],`);\n }\n\n // Add description if exists\n if (endpoint.description || endpoint.summary) {\n const desc = endpoint.description || endpoint.summary;\n lines.push(` description: \"${escapeString(desc)}\",`);\n }\n\n lines.push(\"});\");\n lines.push(\"\");\n }\n\n // Generate config export\n lines.push(\"// API Configuration\");\n lines.push(\"export const apiConfig = defineConfig({\");\n\n if (baseUrl) {\n lines.push(` baseUrl: \"${baseUrl}\",`);\n } else if (spec.servers && spec.servers.length > 0) {\n lines.push(` baseUrl: \"${spec.servers[0].url}\",`);\n }\n\n lines.push(\" endpoints: {\");\n for (const name of endpointNames) {\n lines.push(` ${name},`);\n }\n lines.push(\" },\");\n lines.push(\"});\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate a camelCase name for an endpoint\n */\nfunction generateEndpointName(endpoint: ParsedEndpoint): string {\n // Use operationId if available\n if (endpoint.operationId) {\n return toCamelCase(endpoint.operationId);\n }\n\n // Generate from method and path\n const method = endpoint.method.toLowerCase();\n const pathParts = endpoint.path\n .split(\"/\")\n .filter((p) => p && !p.startsWith(\":\"))\n .map((p) => p.replace(/[^a-zA-Z0-9]/g, \"\"));\n\n const parts = [method, ...pathParts];\n return toCamelCase(parts.join(\"_\"));\n}\n\n/**\n * Convert string to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^(.)/, (c) => c.toLowerCase());\n}\n\n/**\n * Generate Zod schema for path parameters\n */\nfunction generateParamsSchema(params: any[], spec: OpenAPISpec): string {\n const props: string[] = [];\n for (const param of params) {\n const zodType = convertSchemaToZod(param.schema, spec);\n props.push(` ${param.name}: ${zodType}`);\n }\n return `z.object({\\n${props.join(\",\\n\")}\\n })`;\n}\n\n/**\n * Generate Zod schema for query parameters\n */\nfunction generateQuerySchema(params: any[], spec: OpenAPISpec): string {\n const props: string[] = [];\n for (const param of params) {\n let zodType = convertSchemaToZod(param.schema, spec);\n if (!param.required) {\n zodType += \".optional()\";\n }\n props.push(` ${param.name}: ${zodType}`);\n }\n return `z.object({\\n${props.join(\",\\n\")}\\n })`;\n}\n\n/**\n * Convert OpenAPI schema to Zod schema string\n */\nfunction convertSchemaToZod(schema: OpenAPISchema, spec: OpenAPISpec): string {\n if (!schema) return \"z.any()\";\n\n // Handle $ref\n if (schema.$ref) {\n const refName = schema.$ref.split(\"/\").pop();\n // Check if schema exists in components\n if (refName && spec.components?.schemas?.[refName]) {\n return `${refName}Schema`;\n }\n return \"z.any()\";\n }\n\n // Handle type\n if (schema.type) {\n switch (schema.type) {\n case \"string\":\n if (schema.enum) {\n const values = schema.enum.map((v) => `\"${v}\"`).join(\", \");\n return `z.enum([${values}])`;\n }\n return \"z.string()\";\n\n case \"number\":\n case \"integer\":\n return \"z.number()\";\n\n case \"boolean\":\n return \"z.boolean()\";\n\n case \"array\":\n if (schema.items) {\n const itemSchema = convertSchemaToZod(schema.items, spec);\n return `z.array(${itemSchema})`;\n }\n return \"z.array(z.any())\";\n\n case \"object\":\n if (schema.properties) {\n const props: string[] = [];\n const required = schema.required || [];\n\n for (const [propName, propSchema] of Object.entries(\n schema.properties,\n )) {\n let zodType = convertSchemaToZod(propSchema, spec);\n if (!required.includes(propName)) {\n zodType += \".optional()\";\n }\n props.push(` ${propName}: ${zodType}`);\n }\n\n return `z.object({\\n${props.join(\",\\n\")}\\n })`;\n }\n return \"z.object({})\";\n\n case \"null\":\n return \"z.null()\";\n\n default:\n return \"z.any()\";\n }\n }\n\n // Handle allOf (intersection)\n if (schema.allOf) {\n const schemas = schema.allOf.map((s) => convertSchemaToZod(s, spec));\n return schemas.join(\".and(\");\n }\n\n // Handle oneOf/anyOf (union)\n if (schema.oneOf || schema.anyOf) {\n const schemas = (schema.oneOf || schema.anyOf)!.map((s) =>\n convertSchemaToZod(s, spec),\n );\n return `z.union([${schemas.join(\", \")}])`;\n }\n\n return \"z.any()\";\n}\n\n/**\n * Convert primitive type string to Zod type\n */\nfunction primitiveToZodType(type: string): string {\n switch (type.toLowerCase()) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n case \"integer\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n default:\n return \"z.any()\";\n }\n}\n\n/**\n * Escape special characters in strings\n */\nfunction escapeString(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n}\n\n/**\n * Convert OpenAPI path format {param} to :param\n */\nfunction convertPathFormat(path: string): string {\n return path.replace(/\\{([^}]+)\\}/g, \":$1\");\n}\n\n/**\n * Generate a module file for a specific tag\n */\nexport function generateModuleFile(\n tag: string,\n endpoints: ParsedEndpoint[],\n spec: OpenAPISpec,\n): string {\n const lines: string[] = [];\n\n // Add imports\n lines.push('import { defineEndpoint } from \"@cushin/api-runtime\";');\n lines.push('import { z } from \"zod\";');\n lines.push(\"\");\n\n // Collect all schemas used by this module's endpoints\n const usedSchemas = new Set<string>();\n for (const endpoint of endpoints) {\n collectUsedSchemas(endpoint, usedSchemas, spec);\n }\n\n // Generate schema definitions (sorted by dependencies)\n if (usedSchemas.size > 0 && spec.components?.schemas) {\n lines.push(\"// Schema definitions\");\n\n const sortedSchemas = sortSchemasByDependencies(Array.from(usedSchemas), spec);\n\n for (const schemaName of sortedSchemas) {\n const schema = spec.components.schemas[schemaName];\n if (schema) {\n const zodSchema = convertSchemaToZod(schema, spec);\n lines.push(`const ${schemaName}Schema = ${zodSchema};`);\n }\n }\n lines.push(\"\");\n }\n\n // Generate endpoint definitions\n lines.push(\"// Endpoint definitions\");\n const endpointNames: string[] = [];\n\n for (const endpoint of endpoints) {\n const name = generateEndpointName(endpoint);\n endpointNames.push(name);\n\n const path = convertPathFormat(endpoint.path);\n\n lines.push(`export const ${name} = defineEndpoint({`);\n lines.push(` path: \"${path}\",`);\n lines.push(` method: \"${endpoint.method}\",`);\n\n if (endpoint.pathParams && endpoint.pathParams.length > 0) {\n const paramsSchema = generateParamsSchema(endpoint.pathParams, spec);\n lines.push(` params: ${paramsSchema},`);\n }\n\n if (endpoint.queryParams && endpoint.queryParams.length > 0) {\n const querySchema = generateQuerySchema(endpoint.queryParams, spec);\n lines.push(` query: ${querySchema},`);\n }\n\n if (endpoint.requestBody) {\n const bodySchema = convertSchemaToZod(endpoint.requestBody.schema, spec);\n lines.push(` body: ${bodySchema},`);\n }\n\n if (endpoint.response) {\n const responseSchema = convertSchemaToZod(endpoint.response.schema, spec);\n lines.push(` response: ${responseSchema},`);\n } else {\n lines.push(` response: z.any(),`);\n }\n\n if (endpoint.tags && endpoint.tags.length > 0) {\n const tagsStr = endpoint.tags.map((t) => `\"${t}\"`).join(\", \");\n lines.push(` tags: [${tagsStr}],`);\n }\n\n if (endpoint.description || endpoint.summary) {\n const desc = endpoint.description || endpoint.summary;\n lines.push(` description: \"${escapeString(desc)}\",`);\n }\n\n lines.push(\"});\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Sort schemas by dependencies (schemas with no dependencies first)\n */\nfunction sortSchemasByDependencies(\n schemaNames: string[],\n spec: OpenAPISpec,\n): string[] {\n const sorted: string[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n // Circular dependency - add anyway\n return;\n }\n\n visiting.add(name);\n\n const schema = spec.components?.schemas?.[name];\n if (schema) {\n const deps = new Set<string>();\n extractSchemaNames(schema, deps, spec);\n\n // Visit dependencies first\n for (const dep of deps) {\n if (dep !== name && schemaNames.includes(dep)) {\n visit(dep);\n }\n }\n }\n\n visiting.delete(name);\n if (!visited.has(name)) {\n visited.add(name);\n sorted.push(name);\n }\n }\n\n for (const name of schemaNames) {\n visit(name);\n }\n\n return sorted;\n}\n\n/**\n * Collect all schema names used by an endpoint\n */\nfunction collectUsedSchemas(\n endpoint: ParsedEndpoint,\n usedSchemas: Set<string>,\n spec: OpenAPISpec,\n): void {\n // Check request body\n if (endpoint.requestBody?.schema) {\n extractSchemaNames(endpoint.requestBody.schema, usedSchemas, spec);\n }\n\n // Check response\n if (endpoint.response?.schema) {\n extractSchemaNames(endpoint.response.schema, usedSchemas, spec);\n }\n\n // Check parameters\n if (endpoint.pathParams) {\n for (const param of endpoint.pathParams) {\n extractSchemaNames(param.schema, usedSchemas, spec);\n }\n }\n\n if (endpoint.queryParams) {\n for (const param of endpoint.queryParams) {\n extractSchemaNames(param.schema, usedSchemas, spec);\n }\n }\n}\n\n/**\n * Extract schema names from an OpenAPI schema (including nested refs)\n */\nfunction extractSchemaNames(\n schema: OpenAPISchema,\n names: Set<string>,\n spec: OpenAPISpec,\n): void {\n if (!schema) return;\n\n if (schema.$ref) {\n const schemaName = schema.$ref.split(\"/\").pop();\n if (schemaName) {\n names.add(schemaName);\n\n // Recursively extract schemas used by this schema\n const referencedSchema = spec.components?.schemas?.[schemaName];\n if (referencedSchema) {\n extractSchemaNames(referencedSchema, names, spec);\n }\n }\n return;\n }\n\n if (schema.properties) {\n for (const prop of Object.values(schema.properties)) {\n extractSchemaNames(prop, names, spec);\n }\n }\n\n if (schema.items) {\n extractSchemaNames(schema.items, names, spec);\n }\n\n if (schema.allOf) {\n for (const s of schema.allOf) {\n extractSchemaNames(s, names, spec);\n }\n }\n\n if (schema.oneOf) {\n for (const s of schema.oneOf) {\n extractSchemaNames(s, names, spec);\n }\n }\n\n if (schema.anyOf) {\n for (const s of schema.anyOf) {\n extractSchemaNames(s, names, spec);\n }\n }\n}\n\n/**\n * Generate index.ts file that combines all modules\n */\nexport function generateIndexFile(\n tagModules: Map<string, ParsedEndpoint[]>,\n spec: OpenAPISpec,\n baseUrl?: string,\n): string {\n const lines: string[] = [];\n\n lines.push('import { defineConfig } from \"@cushin/api-runtime\";');\n lines.push(\"\");\n\n // Import all endpoints from modules\n for (const [tag] of tagModules) {\n const moduleFileName = tag.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n lines.push(`import * as ${toCamelCase(tag)}Module from \"./${moduleFileName}.js\";`);\n }\n lines.push(\"\");\n\n // Generate config export\n lines.push(\"export const apiConfig = defineConfig({\");\n\n const url = baseUrl || (spec.servers && spec.servers.length > 0 ? spec.servers[0].url : undefined);\n if (url) {\n lines.push(` baseUrl: \"${url}\",`);\n }\n\n lines.push(\" endpoints: {\");\n\n for (const [tag] of tagModules) {\n lines.push(` ...${toCamelCase(tag)}Module,`);\n }\n\n lines.push(\" },\");\n lines.push(\"});\");\n lines.push(\"\");\n\n // Re-export all modules\n for (const [tag] of tagModules) {\n lines.push(`export * from \"./${tag.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}.js\";`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["path","context","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","context","fs","path","fs","path","path","path","path","fs","path"]}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,18 @@ interface UserConfig {
16
16
  * Path to the endpoints configuration file
17
17
  */
18
18
  endpoints: string;
19
+ /**
20
+ * Path to Swagger/OpenAPI specification file (JSON or YAML)
21
+ * When provided, endpoints will be generated from this spec
22
+ * @optional
23
+ */
24
+ swaggerSource?: string;
25
+ /**
26
+ * Split generated endpoints into separate files by tags
27
+ * When true with swaggerSource, each tag becomes a separate module file
28
+ * @default false
29
+ */
30
+ splitByTags?: boolean;
19
31
  /**
20
32
  * Provider type: 'vite' | 'nextjs'
21
33
  */
@@ -79,6 +91,7 @@ interface ResolvedConfig extends UserConfig {
79
91
  rootDir: string;
80
92
  endpointsPath: string;
81
93
  outputDir: string;
94
+ swaggerSourcePath?: string;
82
95
  apiConfig?: APIConfig;
83
96
  }
84
97
  declare function loadConfig(configPath?: string): Promise<ResolvedConfig | null>;
@@ -91,6 +104,18 @@ declare class CodegenCore {
91
104
  private config;
92
105
  constructor(config: ResolvedConfig);
93
106
  execute(): Promise<void>;
107
+ /**
108
+ * Generate single config file (no split)
109
+ */
110
+ private generateSingleConfigFile;
111
+ /**
112
+ * Generate multiple module files split by tags
113
+ */
114
+ private generateMultipleModuleFiles;
115
+ /**
116
+ * Generate endpoint config file from Swagger/OpenAPI spec
117
+ */
118
+ private generateConfigFromSwagger;
94
119
  private loadAPIConfig;
95
120
  }
96
121